86 lines
2.5 KiB
Python
86 lines
2.5 KiB
Python
|
# Copyright ExplsionAI GmbH, released under BSD.
|
||
|
from __future__ import print_function
|
||
|
|
||
|
import numpy as np
|
||
|
|
||
|
np.random.seed(0)
|
||
|
from numpy.testing import assert_allclose
|
||
|
|
||
|
from hypothesis import assume
|
||
|
from hypothesis.strategies import tuples, integers, floats
|
||
|
from hypothesis.extra.numpy import arrays
|
||
|
|
||
|
|
||
|
def lengths(lo=1, hi=10):
|
||
|
return integers(min_value=lo, max_value=hi)
|
||
|
|
||
|
|
||
|
def shapes(min_rows=1, max_rows=100, min_cols=1, max_cols=100):
|
||
|
return tuples(lengths(lo=min_rows, hi=max_rows), lengths(lo=min_cols, hi=max_cols))
|
||
|
|
||
|
|
||
|
def ndarrays_of_shape(shape, lo=-1000.0, hi=1000.0, dtype="float64"):
|
||
|
width = 64 if dtype == "float64" else 32
|
||
|
return arrays(
|
||
|
dtype, shape=shape, elements=floats(min_value=lo, max_value=hi, width=width)
|
||
|
)
|
||
|
|
||
|
|
||
|
def ndarrays(
|
||
|
min_len=0, max_len=10, min_val=-10000000.0, max_val=1000000.0, dtype="float64"
|
||
|
):
|
||
|
return lengths(lo=min_len, hi=max_len).flatmap(
|
||
|
lambda n: ndarrays_of_shape(n, lo=min_val, hi=max_val, dtype=dtype)
|
||
|
)
|
||
|
|
||
|
|
||
|
def matrices(
|
||
|
min_rows=1,
|
||
|
max_rows=10,
|
||
|
min_cols=1,
|
||
|
max_cols=10,
|
||
|
min_value=-10000000.0,
|
||
|
max_value=1000000.0,
|
||
|
dtype="float64",
|
||
|
):
|
||
|
return shapes(
|
||
|
min_rows=min_rows, max_rows=max_rows, min_cols=min_cols, max_cols=max_cols
|
||
|
).flatmap(lambda mn: ndarrays_of_shape(mn, lo=min_value, hi=max_value, dtype=dtype))
|
||
|
|
||
|
|
||
|
def positive_ndarrays(min_len=0, max_len=10, max_val=100000.0, dtype="float64"):
|
||
|
return ndarrays(
|
||
|
min_len=min_len, max_len=max_len, min_val=0, max_val=max_val, dtype=dtype
|
||
|
)
|
||
|
|
||
|
|
||
|
def negative_ndarrays(min_len=0, max_len=10, min_val=-100000.0, dtype="float64"):
|
||
|
return ndarrays(
|
||
|
min_len=min_len, max_len=max_len, min_val=min_val, max_val=-1e-10, dtype=dtype
|
||
|
)
|
||
|
|
||
|
|
||
|
def parse_layer(layer_data):
|
||
|
# Get the first row, excluding the first column
|
||
|
x = layer_data[0, 1:]
|
||
|
# Get the first column, excluding the first row
|
||
|
# .ascontiguousarray is support important here!!!!
|
||
|
b = np.ascontiguousarray(layer_data[1:, 0], dtype="float64")
|
||
|
# Slice out the row and the column used for the X and the bias
|
||
|
W = layer_data[1:, 1:]
|
||
|
assert x.ndim == 1
|
||
|
assert b.ndim == 1
|
||
|
assert b.shape[0] == W.shape[0]
|
||
|
assert x.shape[0] == W.shape[1]
|
||
|
assume(not np.isnan(W.sum()))
|
||
|
assume(not np.isnan(x.sum()))
|
||
|
assume(not np.isnan(b.sum()))
|
||
|
assume(not any(np.isinf(val) for val in W.flatten()))
|
||
|
assume(not any(np.isinf(val) for val in x))
|
||
|
assume(not any(np.isinf(val) for val in b))
|
||
|
return x, b, W
|
||
|
|
||
|
|
||
|
def split_row(layer_data):
|
||
|
return (layer_data[0, :], layer_data[:, :])
|