Source code for axon_sdk.networks.functional.adder

from axon_sdk.networks import LinearCombinatorNetwork
from axon_sdk.primitives import DataEncoder

from typing import Optional


[docs] class AdderNetwork(LinearCombinatorNetwork): """ Wrapper around the linear combinator that performs signed 2-addition: out = x1 + x2 """ def __init__(self, encoder: DataEncoder, module_name: Optional[str] = None): coeffs = [1.0, 1.0] super().__init__(encoder=encoder, N=2, coeff=coeffs, module_name=module_name) self.input1_plus = self.input_plus[0] self.input1_minus = self.input_minus[0] self.input2_plus = self.input_plus[1] self.input2_minus = self.input_minus[1]
if __name__ == "__main__": from axon_sdk.simulator import Simulator inp1 = 0.2 inp2 = -0.4 assert inp1 + inp2 <= 1.0, "inp1 + inp2 must be smaller than 1.0" encoder = DataEncoder(Tmin=10.0, Tcod=100.0) net = AdderNetwork(encoder, module_name='adder_net') sim = Simulator(net, encoder, dt=0.01) if inp1 >= 0: sim.apply_input_value(abs(inp1), net.input1_plus) else: sim.apply_input_value(abs(inp1), net.input1_minus) if inp2 >= 0: sim.apply_input_value(abs(inp2), net.input2_plus) else: sim.apply_input_value(abs(inp2), net.input2_minus) sim.simulate(450) print("\n==========================") expected = inp1 + inp2 print(f"Expected linear combination: {expected:.3f}") plus_spikes = sim.spike_log.get(net.output_plus.uid, []) minus_spikes = sim.spike_log.get(net.output_minus.uid, []) if expected > 0: assert len(plus_spikes) == 2, "Expected 2 + spikes since expected is > 0" interval = plus_spikes[1] - plus_spikes[0] print(f"Decoded value: {encoder.decode_interval(interval)}") else: assert len(minus_spikes) == 2, "Expected 2 - spikes since expected is > 0" interval = minus_spikes[1] - minus_spikes[0] print(f"Decoded value: -{encoder.decode_interval(interval)}")