102 lines
3.5 KiB
C#
102 lines
3.5 KiB
C#
/*
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
|
|
[CreateAssetMenu(menuName = "Passer/NanoBrain")]
|
|
public class NanoBrain : ScriptableObject, ISerializationCallbackReceiver {
|
|
public List<Neuroid> nuclei = new();
|
|
public List<Perceptoid> perceptei = new();
|
|
public List<Receptor> 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<INucleus> 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<INucleus> visitedNuclei, INucleus nucleus) {
|
|
if (nucleus is null)
|
|
return;
|
|
|
|
if (nucleus.brain == null)
|
|
nucleus.brain = this;
|
|
|
|
visitedNuclei.Add(nucleus);
|
|
if (nucleus.synapses != null) {
|
|
HashSet<Synapse> 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<Receiver> 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);
|
|
}
|
|
}
|
|
|
|
}
|
|
*/ |