Skip to content
Open
Show file tree
Hide file tree
Changes from all 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
9 changes: 7 additions & 2 deletions ampyc/noise.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@

from abc import ABC, abstractmethod
import numpy as np
from polytope import extreme

from ampyc.utils import Polytope, qhull

Expand Down Expand Up @@ -98,7 +99,9 @@ class PolytopeVerticesNoise(NoiseBase):

def __init__(self, W: Polytope, seed: int | None = None) -> None:
assert seed is None or seed >= 0
self.V = W.V
np.random.seed(0) # get deterministic behavior of `extreme`
# create new polytope to force re-computation
self.V = extreme(Polytope(W.A, W.b))
self.rng = np.random.default_rng(seed)

def _generate(self, N: int | None = None) -> np.ndarray:
Expand All @@ -116,7 +119,9 @@ class PolytopeNoise(NoiseBase):

def __init__(self, W: Polytope, seed: int | None = None) -> None:
assert seed is None or seed >= 0
self.V = W.V
np.random.seed(0) # get deterministic behavior of `extreme`
# create new polytope to force re-computation
self.V = extreme(Polytope(W.A, W.b))
self.rng = np.random.default_rng(seed)

def _generate(self, N: int | None = None) -> np.ndarray:
Expand Down
35 changes: 35 additions & 0 deletions tests/noise/test_noise.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
from typing import Callable
from ampyc.noise import GaussianNoise, NoiseBase, PolytopeNoise, PolytopeVerticesNoise
from ampyc.utils import Polytope
import pytest
import numpy as np


def get_unit_cube_polytope(noise_dim):
A = np.zeros((2 * noise_dim, noise_dim))
b = np.zeros((2 * noise_dim,))
for i in range(noise_dim):
A[2 * i, i] = 1
b[2 * i] = 1
A[2 * i + 1, i] = -1
b[2 * i + 1] = 1
return Polytope(A, b)


@pytest.mark.parametrize(
"noise_factory",
[
lambda noise_dim: GaussianNoise(
mean=np.zeros((noise_dim,)), covariance=np.eye(noise_dim)
),
lambda noise_dim: PolytopeNoise(get_unit_cube_polytope(noise_dim)),
lambda noise_dim: PolytopeVerticesNoise(get_unit_cube_polytope(noise_dim)),
],
)
def test_noise_is_deterministic_with_seed(noise_factory: Callable[[int], NoiseBase]):
noise_dim = 6
noise1 = noise_factory(noise_dim)
noise2 = noise_factory(noise_dim)
noise1.seed(5)
noise2.seed(5)
assert np.all(noise1.generate() == noise2.generate())