Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
48 changes: 48 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class

# Distribution / packaging
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
*.egg-info/
.installed.cfg
*.egg
MANIFEST

# Unit test / coverage reports
htmlcov/
.tox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*.cover
.hypothesis/
.pytest_cache/

# pyenv
.python-version

# Environments
.env
.venv
env/
venv/
ENV/
env.bak/
venv.bak/

24 changes: 23 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1 +1,23 @@
# tracers.py
# tracers.py

> `tracers.py` is a visualization library for Python.

This repository is part of the project [Algorithm Visualizer](https://github.com/algorithm-visualizer).

## Installation

```bash
TODO
```

## Usage

```python
TODO
```

Check out the [API reference](https://github.com/algorithm-visualizer/algorithm-visualizer/wiki) for more information.

## Contributing

Check out the [contributing guidelines](https://github.com/algorithm-visualizer/tracers.py/blob/master/CONTRIBUTING.md).
Empty file added tracer/__init__.py
Empty file.
106 changes: 106 additions & 0 deletions tracer/randomize.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
import abc
import random
import string
from typing import List, NoReturn, Sequence, Union

_Number = Union[float, int]


class Randomizer(metaclass=abc.ABCMeta):
@abc.abstractmethod
def create(self) -> NoReturn:
raise NotImplementedError


class Integer(Randomizer):
def __init__(self, min: int = 1, max: int = 9):
self._min = min
self._max = max

def create(self) -> int:
return random.randint(self._min, self._max)


class Double(Randomizer):
def __init__(self, min: _Number = 0, max: _Number = 1):
self._min = min
self._max = max

def create(self) -> float:
return random.uniform(self._min, self._max)


class String(Randomizer):
def __init__(self, length: int = 16, letters: Sequence[str] = string.ascii_lowercase):
self._length = length
self._letters = letters

def create(self) -> str:
text = random.choices(self._letters, k=self._length)
return "".join(text)


class Array1D(Randomizer):
def __init__(self, N: int = 10, randomizer: Randomizer = Integer()):
self._N = N
self._randomizer = randomizer
self._sorted = False

def sorted(self, sorted: bool = True) -> "Array1D":
self._sorted = sorted
return self

def create(self) -> List:
array = [self._randomizer.create() for _ in range(self._N)]
if self._sorted:
array.sort()

return array


class Array2D(Array1D):
def __init__(self, N: int = 10, M: int = 10, randomizer: Randomizer = Integer()):
super().__init__(N, randomizer)
self._M = M

def sorted(self, sorted: bool = True) -> "Array2D":
self._sorted = sorted
return self

def create(self) -> List[List]:
return [super().create() for _ in range(self._N)]


class Graph(Randomizer):
def __init__(self, N: int = 5, ratio: _Number = 0.3, randomizer: Randomizer = Integer()):
self._N = N
self._ratio = ratio
self._randomizer = randomizer
self._directed = True
self._weighted = False

def directed(self, directed: bool = True) -> "Graph":
self._directed = directed
return self

def weighted(self, weighted: bool = True) -> "Graph":
self._weighted = weighted
return self

def create(self) -> List[List]:
graph = [[None] * self._N for _ in range(self._N)]
for i in range(self._N):
for j in range(self._N):
if i == j:
graph[i][j] = 0
elif self._directed or i < j:
if random.random() >= self._ratio:
graph[i][j] = 0
elif self._weighted:
graph[i][j] = self._randomizer.create()
else:
graph[i][j] = 1
else:
graph[i][j] = graph[j][i]

return graph