def add(a: int, b: int) -> int: ...

class Dense:
    def __init__(self, prev_layer_size: int, this_size: int) -> None: ...
    def forward(self, x: ndarray) -> ndarray: ...
    def backward(self, dval: ndarray) -> ndarray: ...
    def weights(self) -> ndarray: ...
    def biases(self) -> ndarray: ...
    def dweights(self) -> ndarray: ...
    def dbiases(self) -> ndarray: ...

class ReLU:
    def __init__(self) -> None: ...
    def forward(self, x: ndarray) -> ndarray: ...
    def backward(self, dval: ndarray) -> ndarray: ...

class Softmax:
    def __init__(self) -> None: ...
    def forward(self, x: ndarray) -> ndarray: ...
    def backward(self, dval: ndarray) -> ndarray: ...

class CCE:
    def __init__(self) -> None: ...
    def forward(self, outputs: ndarray, y_true: ndarray) -> float: ...
    def backward(self, outputs: ndarray, y_true: ndarray) -> ndarray: ...

class SGD:
    def __init__(self) -> None: ...
    def optimize(self, layer: Dense) -> None: ...

class Model:
    def __init__(self) -> None: ...
    def forwardGA(self, x: ndarray) -> ndarray: ...
    def randomize(self, strength: float) -> None: ...
    def save_model(self, path: str) -> None: ...
    def load_model(self, path: str) -> None: ...
    def add_softmax(self) -> None: ...
    def add_relu(self) -> None: ...
    def add_layer(self, prev_size: int, cur_size: int) -> None: ...

class TestActivation:
    def __init__(self)-> None: ...
    def forward(self, x: ndarray) -> ndarray: ...
    def backward(self, x: ndarray) -> ndarray: ...

class ReLU:
    def __init__(self, alpha: float)-> None: ...
    def forward(self, x: ndarray) -> ndarray: ...
    def backward(self, x: ndarray) -> ndarray: ...

class Linear:
    def __init__(self, m: float, b: float, flow: bool)-> None: ...
    def forward(self, x: ndarray) -> ndarray: ...
    def backward(self, x: ndarray) -> ndarray: ...

class Sigmoid:
    def __init__(self)-> None: ...
    def forward(self, x: ndarray) -> ndarray: ...
    def backward(self, x: ndarray) -> ndarray: ...

class LeakyReLU:
    def __init__(self, minimum: float, alpha: float)-> None: ...
    def forward(self, x: ndarray) -> ndarray: ...
    def backward(self, x: ndarray) -> ndarray: ...

class Step:
    def __init__(self, minimum: float, maximum: float, flip: float)-> None: ...
    def forward(self, x: ndarray) -> ndarray: ...
    def backward(self, x: ndarray) -> ndarray: ...

class Softmax:
    def __init__(self)-> None: ...
    def forward(self, x: ndarray) -> ndarray: ...
    def backward(self, x: ndarray) -> ndarray: ...

class ReverseReLU:
    def __init__(self, maximum: float)-> None: ...
    def forward(self, x: ndarray) -> ndarray: ...
    def backward(self, x: ndarray) -> ndarray: ...

class CCE64:
    def __init__(self, maximum: float)-> None: ...
    def forward(self, x: ndarray, y_true: ndarray) -> float: ...
    def backward(self, x: ndarray, y_true: ndarray) -> ndarray: ...

class ndarray:
    def __init__(self, shape: tuple, zeros: bool, dtype: str, scalar: float | int) -> None: ...
    
    def __getitem__(self, key: int | tuple[int, ...]) -> float | int: ...
    def __setitem__(self, key: int | tuple[int, ...], value: float | int) -> None: ...

    def __add__(self, other: float | int | ndarray) -> ndarray: ...
    def __radd__(self, other: float | int | ndarray) -> ndarray: ...

    def __sub__(self, other: float | int | ndarray) -> ndarray: ...
    def __rsub__(self, other: float | int | ndarray) -> ndarray: ...

    def __mul__(self, other: float | int | ndarray) -> ndarray: ...
    def __rmul__(self, other: float | int | ndarray) -> ndarray: ...

    def __truediv__(self, other: float | int | ndarray) -> ndarray: ...
    def __rtruediv__(self, other: float | int | ndarray) -> ndarray: ...

    def __iadd__(self, other: float | int | ndarray) -> None: ...
    def __isub__(self, other: float | int | ndarray) -> None: ...
    def __imul__(self, other: float | int | ndarray) -> None: ...
    def __itruediv__(self, other: float | int | ndarray) -> None: ...

    def transpose() -> ndarray: ...
    def shape(self) -> tuple: ...
    def dot(self, B: ndarray) -> ndarray: ...

    def add(self, x: float | int) -> None: ...
    def sub(self, x: float | int) -> None: ...
    def mult(self, x: float | int) -> None: ...
    def div(self, x: float | int) -> None: ...


def breed_models(model1: Model, model2: Model, prop: float) -> Model: ...
def copy_model(model: Model) -> Model: ...