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; return sortedOrder;
} }
public override Nucleus Clone(ClusterPrefab prefab) { public override Nucleus Clone(ClusterPrefab parent) {
Neuron clone = new(prefab, this.name); Cluster clone = new(this.prefab, parent);
foreach (Synapse synapse in this.synapses) { foreach (Synapse synapse in this.synapses) {
Synapse clonedSynapse = clone.AddSynapse(synapse.nucleus); Synapse clonedSynapse = clone.AddSynapse(synapse.nucleus);
clonedSynapse.weight = synapse.weight; 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; return clone;
} }
@ -172,9 +183,19 @@ public class Cluster : Nucleus {
return clone; return clone;
} }
private int GetNucleusIndex(Nucleus[] nucleiArray, Nucleus nucleus) { protected int GetNucleusIndex(Nucleus[] nuclei, Nucleus nucleus) {
for (int i = 0; i < nucleiArray.Length; i++) { for (int i = 0; i < nuclei.Length; i++) {
if (nucleus == nucleiArray[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 i;
} }
return -1; return -1;
@ -318,7 +339,7 @@ public class Cluster : Nucleus {
return null; return null;
} }
} }
private List<Neuron> _outputs = null; protected List<Neuron> _outputs = null;
public List<Neuron> outputs { public List<Neuron> outputs {
get { get {
if (this._outputs == null) { if (this._outputs == null) {

View File

@ -32,9 +32,20 @@ public class ClusterReceptor : Cluster, IReceptor {
Synapse clonedSynapse = clone.AddSynapse(synapse.nucleus); Synapse clonedSynapse = clone.AddSynapse(synapse.nucleus);
clonedSynapse.weight = synapse.weight; clonedSynapse.weight = synapse.weight;
} }
// foreach (Nucleus receiver in this.receivers) { // foreach (Nucleus receiver in this.receivers) {
// clone.AddReceiver(receiver); // 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; return clone;
} }
@ -45,28 +56,6 @@ public class ClusterReceptor : Cluster, IReceptor {
set { _array = value; } 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() { public override void UpdateStateIsolated() {
float3 sum = this.bias; float3 sum = this.bias;