/* using System; using System.Collections.Generic; using UnityEngine; [CreateAssetMenu(menuName = "Passer/NanoBrain")] public class NanoBrain : ScriptableObject, ISerializationCallbackReceiver { public List nuclei = new(); public List perceptei = new(); public List receptors = new(); // This is probably always the first element in the nuclei list... [System.NonSerialized] public Nucleus output; public int rootId; public NanoBrain() { // this.cluster = new(); // this.output = new Neuroid(this.cluster, "Root"); } public Cluster cluster; public void AddReceiver(INucleus receiver) { output.AddReceiver(receiver); } public Neuroid AddNeuron(string name) { Neuroid neuroid = new(this.cluster, name); return neuroid; } public void UpdateNuclei() { foreach (Nucleus nucleus in nuclei) nucleus.IncreaseAge(); foreach (Perceptoid perception in perceptei) perception.IncreaseAge(); } public void OnBeforeSerialize() { if (output != null) { this.rootId = output.id; } } public void OnAfterDeserialize() { try { foreach (Nucleus nucleus in this.nuclei.ToArray()) { if (this.rootId == nucleus.id) this.output = nucleus; nucleus.Rebuild(this); } foreach (Perceptoid perceptoid in this.perceptei.ToArray()) perceptoid.Rebuild(this); } catch (System.Exception) { } if (this.cluster != null) this.cluster.GarbageCollection(); } public void GarbageCollection() { HashSet visitedNuclei = new(); MarkNuclei(visitedNuclei, this.output); //Debug.Log($"Garbage collection found {visitedNuclei.Count} Nuclei"); this.nuclei.RemoveAll(nucleus => visitedNuclei.Contains(nucleus) == false); this.perceptei.RemoveAll(perceptoid => visitedNuclei.Contains(perceptoid) == false); } public void MarkNuclei(HashSet visitedNuclei, INucleus nucleus) { if (nucleus is null) return; if (nucleus.brain == null) nucleus.brain = this; visitedNuclei.Add(nucleus); if (nucleus.synapses != null) { HashSet visitedSynapses = new(); foreach (Synapse synapse in nucleus.synapses) { if (synapse != null && synapse.nucleus != null) { visitedSynapses.Add(synapse); MarkNuclei(visitedNuclei, synapse.nucleus); } } nucleus.synapses.RemoveAll(synapse => visitedSynapses.Contains(synapse) == false); } if (nucleus.receivers != null) { HashSet visitedReceivers = new(); foreach (Receiver receiver in nucleus.receivers) { if (receiver != null && receiver.nucleus != null) { visitedReceivers.Add(receiver); visitedNuclei.Add(receiver.nucleus); } } nucleus.receivers.RemoveAll(receiver => visitedReceivers.Contains(receiver) == false); } } } */