Skip to content

Commit 55db114

Browse files
MarkKoz64json
authored andcommitted
Add randomizers
1 parent bbecb96 commit 55db114

File tree

1 file changed

+106
-0
lines changed

1 file changed

+106
-0
lines changed

tracer/randomize.py

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
import abc
2+
import random
3+
import string
4+
from typing import List, NoReturn, Sequence, Union
5+
6+
_Number = Union[float, int]
7+
8+
9+
class Randomizer(metaclass=abc.ABCMeta):
10+
@abc.abstractmethod
11+
def create(self) -> NoReturn:
12+
raise NotImplementedError
13+
14+
15+
class Integer(Randomizer):
16+
def __init__(self, min: int = 1, max: int = 9):
17+
self._min = min
18+
self._max = max
19+
20+
def create(self) -> int:
21+
return random.randint(self._min, self._max)
22+
23+
24+
class Double(Randomizer):
25+
def __init__(self, min: _Number = 0, max: _Number = 1):
26+
self._min = min
27+
self._max = max
28+
29+
def create(self) -> float:
30+
return random.uniform(self._min, self._max)
31+
32+
33+
class String(Randomizer):
34+
def __init__(self, length: int = 16, letters: Sequence[str] = string.ascii_lowercase):
35+
self._length = length
36+
self._letters = letters
37+
38+
def create(self) -> str:
39+
text = random.choices(self._letters, k=self._length)
40+
return "".join(text)
41+
42+
43+
class Array1D(Randomizer):
44+
def __init__(self, N: int = 10, randomizer: Randomizer = Integer()):
45+
self._N = N
46+
self._randomizer = randomizer
47+
self._sorted = False
48+
49+
def sorted(self, sorted: bool = True) -> "Array1D":
50+
self._sorted = sorted
51+
return self
52+
53+
def create(self) -> List:
54+
array = [self._randomizer.create() for _ in range(self._N)]
55+
if self._sorted:
56+
array.sort()
57+
58+
return array
59+
60+
61+
class Array2D(Array1D):
62+
def __init__(self, N: int = 10, M: int = 10, randomizer: Randomizer = Integer()):
63+
super().__init__(N, randomizer)
64+
self._M = M
65+
66+
def sorted(self, sorted: bool = True) -> "Array2D":
67+
self._sorted = sorted
68+
return self
69+
70+
def create(self) -> List[List]:
71+
return [super().create() for _ in range(self._N)]
72+
73+
74+
class Graph(Randomizer):
75+
def __init__(self, N: int = 5, ratio: _Number = 0.3, randomizer: Randomizer = Integer()):
76+
self._N = N
77+
self._ratio = ratio
78+
self._randomizer = randomizer
79+
self._directed = True
80+
self._weighted = False
81+
82+
def directed(self, directed: bool = True) -> "Graph":
83+
self._directed = directed
84+
return self
85+
86+
def weighted(self, weighted: bool = True) -> "Graph":
87+
self._weighted = weighted
88+
return self
89+
90+
def create(self) -> List[List]:
91+
graph = [[None] * self._N for _ in range(self._N)]
92+
for i in range(self._N):
93+
for j in range(self._N):
94+
if i == j:
95+
graph[i][j] = 0
96+
elif self._directed or i < j:
97+
if random.random() >= self._ratio:
98+
graph[i][j] = 0
99+
elif self._weighted:
100+
graph[i][j] = self._randomizer.create()
101+
else:
102+
graph[i][j] = 1
103+
else:
104+
graph[i][j] = graph[j][i]
105+
106+
return graph

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy