From e26244717462733e8a0f3a1eb0dba4c3eb7ff762 Mon Sep 17 00:00:00 2001 From: Pascal Serrarens Date: Tue, 17 Feb 2026 13:02:43 +0100 Subject: [PATCH] Fix array extension for clusters --- Cluster.cs | 39 ++++++++++++++++++++++++++++++--------- ClusterReceptor.cs | 33 +++++++++++---------------------- 2 files changed, 41 insertions(+), 31 deletions(-) diff --git a/Cluster.cs b/Cluster.cs index aaa6429..a2bc161 100644 --- a/Cluster.cs +++ b/Cluster.cs @@ -151,16 +151,27 @@ public class Cluster : Nucleus { return sortedOrder; } - public override Nucleus Clone(ClusterPrefab prefab) { - Neuron clone = new(prefab, this.name); + public override Nucleus Clone(ClusterPrefab parent) { + Cluster clone = new(this.prefab, parent); foreach (Synapse synapse in this.synapses) { Synapse clonedSynapse = clone.AddSynapse(synapse.nucleus); clonedSynapse.weight = synapse.weight; } - // foreach (Nucleus receiver in this.receivers) { - // clone.AddReceiver(receiver); - // } + + foreach (Neuron output in this.outputs) { + foreach (Nucleus receiver in output.receivers) { + int ix = GetNucleusIndex(this.clusterNuclei.ToArray(), output); + if (ix < 0) + continue; + + if (clone.clusterNuclei[ix] is not Neuron clonedOutput) + continue; + + clonedOutput.AddReceiver(receiver); + } + } + return clone; } @@ -172,9 +183,19 @@ public class Cluster : Nucleus { return clone; } - private int GetNucleusIndex(Nucleus[] nucleiArray, Nucleus nucleus) { - for (int i = 0; i < nucleiArray.Length; i++) { - if (nucleus == nucleiArray[i]) + protected int GetNucleusIndex(Nucleus[] nuclei, Nucleus nucleus) { + for (int i = 0; i < nuclei.Length; i++) { + if (nucleus == nuclei[i]) + return i; + } + return -1; + } + + protected int GetNucleusIndex(List nuclei, Nucleus nucleus) { + int i = 0; + foreach (Nucleus nucleiElement in nuclei) { + //for (int i = 0; i < nuclei.Length; i++) { + if (nucleus == nucleiElement) return i; } return -1; @@ -318,7 +339,7 @@ public class Cluster : Nucleus { return null; } } - private List _outputs = null; + protected List _outputs = null; public List outputs { get { if (this._outputs == null) { diff --git a/ClusterReceptor.cs b/ClusterReceptor.cs index e72cdd7..8e13779 100644 --- a/ClusterReceptor.cs +++ b/ClusterReceptor.cs @@ -32,9 +32,20 @@ public class ClusterReceptor : Cluster, IReceptor { Synapse clonedSynapse = clone.AddSynapse(synapse.nucleus); clonedSynapse.weight = synapse.weight; } + // foreach (Nucleus receiver in this.receivers) { // clone.AddReceiver(receiver); // } + + this._outputs = null; // Make sure the output are regenerated + foreach (Neuron output in this.outputs) { + int ix = GetNucleusIndex(this.clusterNuclei, output); + if (ix < 0 || clone.clusterNuclei[ix] is not Neuron clonedOutput) + continue; + + foreach (Nucleus receiver in output.receivers) + clonedOutput.AddReceiver(receiver); + } return clone; } @@ -45,28 +56,6 @@ public class ClusterReceptor : Cluster, IReceptor { set { _array = value; } } - #region Receivers - - private List _clusterReceivers = null; - // public override List receivers { - // get { - // if (_clusterReceivers == null || _clusterReceivers.Count == 0) { - // _clusterReceivers = new(); - // foreach (Nucleus output in this.clusterNuclei) { - // _clusterReceivers.AddRange(output.receivers); - // } - // } - // return _clusterReceivers; - // } - // } - // public override void AddReceiver(Nucleus receivingNucleus, float weight = 1) { - // string nucleusName = this. - // this.output.receivers.Add(receivingNucleus); - // receivingNucleus.AddSynapse(this.output, weight); - // } - - #endregion Receivers - public override void UpdateStateIsolated() { float3 sum = this.bias;