diff --git a/.gitignore b/.gitignore index 197e3bb3..c8c46f5e 100644 --- a/.gitignore +++ b/.gitignore @@ -22,4 +22,5 @@ dist/* logs/* .pytest_cache/* .vscode/* +.idea data/* \ No newline at end of file diff --git a/bindsnet/network/topology.py b/bindsnet/network/topology.py index cb5fafa1..731291d1 100644 --- a/bindsnet/network/topology.py +++ b/bindsnet/network/topology.py @@ -395,6 +395,7 @@ def __init__( pipeline: list = [], manual_update: bool = False, traces: bool = False, + mask: torch.Tensor = None, **kwargs, ) -> None: # language=rst @@ -408,11 +409,13 @@ def __init__( :param manual_update: Set to :code:`True` to disable automatic updates (applying learning rules) to connection features. False by default, updates called after each time step :param traces: Set to :code:`True` to record history of connection activity (for monitors) + :param mask: A mask to zero out weights """ super().__init__(source, target, device, pipeline, **kwargs) self.traces = traces self.manual_update = manual_update + self.mask = mask if self.traces: self.activity = None @@ -487,6 +490,8 @@ def update(self, **kwargs) -> None: # Pipeline learning for f in self.pipeline: f.update(**kwargs) + if type(f).__name__ == 'Weight' and self.mask is not None: + f.value.masked_fill_(self.mask, 0) def normalize(self) -> None: # language=rst diff --git a/examples/dosidicus/network.py b/examples/dosidicus/network.py new file mode 100644 index 00000000..81e0e203 --- /dev/null +++ b/examples/dosidicus/network.py @@ -0,0 +1,37 @@ +import torch + +from bindsnet.network import Network +from bindsnet.network.nodes import LIFNodes +from bindsnet.network.topology import MulticompartmentConnection +from bindsnet.network.topology_features import Weight, Bias +from bindsnet.learning.MCC_learning import PostPre + + +network = Network(dt=1.0) +neurons_number = 7 +layer = LIFNodes(n=neurons_number, traces=True) +network.add_layer(layer, name="input") +network.add_layer(layer, name="output") +mask = ~torch.tril(torch.ones((neurons_number, neurons_number)), diagonal=-1).bool() +weight = Weight( + name='weight_feature', + value=torch.rand(neurons_number, neurons_number) * mask, + learning_rule=PostPre, + nu=(1e-4, 1e-2) +) +bias = Bias( + name='bias_feature', + value=torch.rand(neurons_number, neurons_number) +) +connection = MulticompartmentConnection( + source=layer, + target=layer, + pipeline=[weight, bias], + mask=mask, + device='cpu' +) +network.add_connection(connection, source="input", target="output") +network.run( + inputs={"input": torch.bernoulli(torch.rand(250, neurons_number)).byte()}, + time=250 +) \ No newline at end of file