class Lif:
    def repeat(self, n:int)                             -> list[Lif]: ...
    def tau(self, tau:float)                            -> Lif: ...
    def v_rest(self, v_rest:float)                      -> Lif: ...
    def v_thres(self, v_thres:float)                    -> Lif: ...
    def v_reset(self, v_reset:float)                    -> Lif: ...
    def t_refractory(self, t_refractory:float)          -> Lif: ...
    def activity_window(self, start:float, end:float)   -> Lif: ...
    def get_voltage(self)                               -> float: ...
    def get_tau(self)                                   -> float: ...
    def get_v_rest(self)                                -> float: ...
    def get_v_thres(self)                               -> float: ...
    def get_v_reset(self)                               -> float: ...
    def get_t_refractory(self)                          -> float: ...
        

class Instance:
    def __init__(spikes: list[tuple[float,int]]) -> Instance: ...
    def get_spikes(self)                         -> list[tuple[float,int]]: ...

class PoissonGenerator:
    def new(rates: list[float], max_time:float) -> PoissonGenerator: ...
    def to_instance(self)                       -> Instance: ...
    def get_spikes(self)                        -> list[list[float]]: ...
    def concat(self, other:PoissonGenerator)    -> PoissonGenerator: ...


class Response:
    def outputs(self)                           ->list[int]: ...
    def spk_times(self)                         ->list[list[float]]: ...
    def spk_count(self)                         ->list[int]: ...
    def v_trace(self)                           ->list[list[float]]: ...
    def v_state(self)                           ->list[float]: ...
    def time(self)                              ->list[float]: ...
    def resolution(self, new_resolution:float)  ->Response: ...


class Network:
    def new(neurons: list[Lif])-> Network: ...
    def synapses_in(self,synapses: list[ tuple[float,int] ] )   -> Network: ...
    def synapses_net(self,synapses: list[ tuple[float,int] ])   -> Network: ...
    def weights_in(self, weights:list[float])                   -> Network: ...
    def weights_net(self, weights:list[float])                  -> Network: ...
    def weights(self, weights:list[float])                      -> Network: ...
    def outputs(self, outputs:list[int])                        -> Network: ...
    def mode(self, modes: list[str])                            -> Network: ...
    def get_voltages(self)                                      -> list[float]: ...
    def simulate(self, instance: Instance, max_time:float)      -> Response: ...
    
