diff --git a/Runtime/Scripts/Core/Cluster.cs b/Runtime/Scripts/Core/Cluster.cs index 75883a0..56133a0 100644 --- a/Runtime/Scripts/Core/Cluster.cs +++ b/Runtime/Scripts/Core/Cluster.cs @@ -180,30 +180,61 @@ namespace NanoBrain { foreach (NeuronData neuronData in clusterData.neurons) { Neuron receiver = this.GetNeuron(neuronData.name); foreach (SynapseData synapseData in neuronData.synapses) { + // If the synapse points to another cluster if (synapseData.clusterName != this.name) { // Add reference to external cluster - ClusterPrefab extPrefab = Resources.Load(synapseData.clusterName) as ClusterPrefab; - if (extPrefab == null) - Debug.LogError($"Could not find cluster Resource {synapseData.clusterName}"); - else { - uint instanceCount = 1; - ExternalClusterData externalClusterData = null; - foreach (ExternalClusterData externalCluster in clusterData.clusters) { - if (externalCluster.clusterName == synapseData.clusterName) { - instanceCount = externalCluster.instanceCount; - externalClusterData = externalCluster; - } - } - if (this.nuclei.Find(nucleus => nucleus.name == synapseData.clusterName) is not Cluster extCluster) { - extCluster = new(extPrefab, this, instanceCount); - if (externalClusterData != null) - extCluster.name = externalClusterData.name; - //extCluster.name = clusterData.name; - } - Neuron extNeuron = extCluster.GetNeuron(synapseData.neuronName); - Debug.Log("Add receiver for external"); + // Do we know the external cluster already? + Cluster extCluster = this.GetCluster(synapseData.clusterName); + if (extCluster == null) { + // if not: create new external cluster + Debug.Log("New ext cluster"); + ExternalClusterData externalClusterData = clusterData.GetCluster(synapseData.clusterName); + ClusterPrefab extPrefab = Resources.Load(externalClusterData.prefabName) as ClusterPrefab; + extCluster = new(extPrefab, this, instanceCount) { + name = externalClusterData.name + }; + } + // Do we have the synapse already? + Neuron extNeuron = extCluster.GetNeuron(synapseData.neuronName); + Synapse synapse = receiver.GetSynapse(extNeuron); //extCluster, synapseData.neuronName); + if (synapse == null) { + Debug.Log("new receiver for external"); + // If not: create new synapse extNeuron.AddReceiver(receiver); } + + //Cluster foundCluster = this.nuclei.Find(nucleus => nucleus is Cluster cluster && cluster.prefab.name == synapseData.clusterName) as Cluster; + + + /* + ClusterPrefab extPrefab = Resources.Load(synapseData.clusterName) as ClusterPrefab; + if (extPrefab == null) + Debug.LogError($"Could not find cluster Resource {synapseData.clusterName}"); + else { + uint instanceCount = 1; + ExternalClusterData externalClusterData = null; + foreach (ExternalClusterData externalCluster in clusterData.clusters) { + if (externalCluster.prefabName == synapseData.clusterName) { + instanceCount = externalCluster.instanceCount; + externalClusterData = externalCluster; + } + } + Nucleus foundNucleus = this.nuclei.Find(nucleus => nucleus is Cluster cluster && cluster.prefab.name == synapseData.clusterName); + if (foundNucleus is not Cluster extCluster) { + Debug.Log("New ext cluster"); + extCluster = new(extPrefab, this, instanceCount); + if (externalClusterData != null) + extCluster.name = externalClusterData.name; + //extCluster.name = clusterData.name; + } + Neuron extNeuron = extCluster.GetNeuron(synapseData.neuronName); + Synapse synapse = receiver.GetSynapse(extCluster, synapseData.neuronName); + if (synapse == null) { + Debug.Log("Add receiver for external"); + extNeuron.AddReceiver(receiver); + } + } + */ } else { Neuron sender = this.GetNeuron(synapseData.neuronName); @@ -413,7 +444,7 @@ namespace NanoBrain { } } } - + } #endregion Init @@ -951,17 +982,25 @@ namespace NanoBrain { } } } + + public ExternalClusterData GetCluster(string clusterName) { + foreach (ExternalClusterData cluster in this.clusters) { + if (cluster.name == clusterName) + return cluster; + } + return null; + } } [Serializable] public class ExternalClusterData { public string name; - public string clusterName; + public string prefabName; public uint instanceCount; public ExternalClusterData(Cluster cluster) { this.name = cluster.name; - this.clusterName = cluster.prefab.name; + this.prefabName = cluster.prefab.name; this.instanceCount = (uint)cluster.instanceCount; } } diff --git a/Runtime/Scripts/Core/Neuron.cs b/Runtime/Scripts/Core/Neuron.cs index 7261f2c..24aea7d 100644 --- a/Runtime/Scripts/Core/Neuron.cs +++ b/Runtime/Scripts/Core/Neuron.cs @@ -95,6 +95,12 @@ namespace NanoBrain { return this.GetSynapse(sender); } + public Synapse GetSynapse(Cluster cluster, string senderNeuronName) { + Neuron sender = cluster.GetNeuron(senderNeuronName); + if (sender == null) + return null; + return this.GetSynapse(sender); + } /// /// Remove a synapse from a Nucleus diff --git a/Runtime/Scripts/Core/Synapse.cs b/Runtime/Scripts/Core/Synapse.cs index d92af2f..a791a74 100644 --- a/Runtime/Scripts/Core/Synapse.cs +++ b/Runtime/Scripts/Core/Synapse.cs @@ -144,10 +144,11 @@ namespace NanoBrain { public bool trainable; public SynapseData(Synapse synapse) { - if (synapse.neuron.parent.prefab != null) - this.clusterName = synapse.neuron.parent.prefab.name; - else - this.clusterName = synapse.neuron.parent.name; + // if (synapse.neuron.parent.prefab != null) + // this.clusterName = synapse.neuron.parent.prefab.name; + // else + // this.clusterName = synapse.neuron.parent.name; + this.clusterName = synapse.neuron.parent.name; this.neuronName = synapse.neuron.name; this.weight = synapse.weight; this.trainable = synapse.trainable;