Skip to content

phepy.toys.circle

CircleToyExample

CircleToyExample(rng: np.random.Generator, N: int = 10000)

Bases: ToyExample

Source code in phepy/toys/circle.py
def __init__(
    self, rng: np.random.Generator, N: int = 10_000
) -> CircleToyExample:
    Y = np.sin(np.linspace(0, np.pi * 8.0, N))

    X1 = np.sin(np.linspace(0, np.pi * 2.0, N)) * (5 + Y)
    X2 = np.cos(np.linspace(0, np.pi * 2.0, N)) * (5 + Y)

    X1 += rng.normal(loc=0.0, scale=0.1, size=N)
    X2 += rng.normal(loc=0.0, scale=0.1, size=N)

    self.__X_train = np.stack([X1, X2], axis=1)
    self.__Y_train = Y

    X1 = np.sin(np.linspace(0, np.pi * 2.0, N)) * (5 + Y)
    X2 = np.cos(np.linspace(0, np.pi * 2.0, N)) * (5 + Y)

    X1 += rng.normal(loc=0.0, scale=0.1, size=N)
    X2 += rng.normal(loc=0.0, scale=0.1, size=N)

    self.__X_valid = np.stack([X1, X2], axis=1)
    self.__Y_valid = Y

    X1T, X2T = np.mgrid[-7.5:7.5:0.01, -7.5:7.5:0.01]
    X1T = X1T.flatten()
    X2T = X2T.flatten()

    self.__X_test = np.stack([X1T, X2T], axis=1)

X_test property

X_test: np.ndarray

X_train property

X_train: np.ndarray

X_valid property

X_valid: np.ndarray

Y_train property

Y_train: np.ndarray

Y_valid property

Y_valid: np.ndarray

aspect_ratio property

aspect_ratio: float

is_in_distribution

is_in_distribution(X: np.ndarray) -> np.ndarray
Source code in phepy/toys/circle.py
def is_in_distribution(self, X: np.ndarray) -> np.ndarray:
    # Two standard deviations off the mean -> 95.45% interval
    return np.linalg.norm(X - self.reconstruct(X), axis=1) <= 0.2

plot

plot(
    conf: np.ndarray,
    ax: mpl.axes.Axes,
    cmap: Union[str, mpl.colors.Colormap],
    with_scatter: bool = True,
)
Source code in phepy/toys/circle.py
def plot(
    self,
    conf: np.ndarray,
    ax: mpl.axes.Axes,
    cmap: Union[str, mpl.colors.Colormap],
    with_scatter: bool = True,
):
    N_skip = len(self.X_train) // 40

    ax.imshow(
        conf.reshape(np.mgrid[-7.5:7.5:0.01, -7.5:7.5:0.01][0].shape).T,
        cmap=cmap,
        vmin=0.0,
        vmax=1.0,
        extent=[-7.5, 7.5, -7.5, 7.5],
        origin="lower",
        interpolation="bicubic",
        rasterized=True,
    )

    ax.set_xlim(-7.5, 7.5)
    ax.set_ylim(-7.5, 7.5)

    if with_scatter:
        ax.scatter(
            self.X_train[::N_skip, 0],
            self.X_train[::N_skip, 1],
            c="white",
            marker="x",
            lw=3,
            s=48,
        )
        ax.scatter(
            self.X_train[::N_skip, 0],
            self.X_train[::N_skip, 1],
            c="black",
            marker="x",
        )

    ax.axis("off")

reconstruct

reconstruct(X: np.ndarray) -> np.ndarray
Source code in phepy/toys/circle.py
def reconstruct(self, X: np.ndarray) -> np.ndarray:
    # Project X onto the sin-perturbed circle
    angle = _my_arctan2(X[:, 0], X[:, 1])

    Y = np.sin(angle * 4.0)

    X1 = np.sin(angle) * (5.0 + Y)
    X2 = np.cos(angle) * (5.0 + Y)

    # return np.stack([X1, X2], axis=1)
    return X1.reshape((len(X), 1)) * np.array([[1, 0]]) + X2.reshape(
        (len(X), 1)
    ) * np.array([[0, 1]])