Fix array extension for clusters

This commit is contained in:
Pascal Serrarens 2026-02-17 13:02:43 +01:00
parent 36e73081f9
commit e262447174
2 changed files with 41 additions and 31 deletions

View File

@ -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<Nucleus> 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<Neuron> _outputs = null;
protected List<Neuron> _outputs = null;
public List<Neuron> outputs {
get {
if (this._outputs == null) {

View File

@ -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<Nucleus> _clusterReceivers = null;
// public override List<Nucleus> 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;