/* using UnityEngine; using Unity.Mathematics; using static Unity.Mathematics.math; [System.Serializable] public class Neuroid : Neuron { public bool average = false; public Neuroid(Cluster brain, string name) : base(name) { this.cluster = brain; if (this.cluster != null) { this.cluster.nuclei.Add(this); } else Debug.LogError("No neuroid network"); } public Neuroid(string name) : base(name) { } public override INucleus Clone() { Neuroid clone = new(this.name) { cluster = this.cluster, array = this.array, curve = this.curve, curvePreset = this.curvePreset, curveMax = this.curveMax, average = this.average }; if (clone.cluster != null) clone.cluster.nuclei.Add(clone); foreach (Synapse synapse in this.synapses) { Synapse clonedSynapse = clone.AddSynapse(synapse.nucleus); clonedSynapse.weight = synapse.weight; } foreach (INucleus receiver in this.receivers) { clone.AddReceiver(receiver); } return clone; } public override void UpdateState() { float3 sum = new(0, 0, 0); int n = 0; //Applying the weight factgors foreach (Synapse synapse in this.synapses) { sum = sum + (synapse.weight * synapse.nucleus.outputValue); if (lengthsq(synapse.nucleus.outputValue) != 0) n++; } if (average) sum /= n; // Activation function Vector3 result; switch (this.curvePreset) { case CurvePresets.Linear: result = sum; break; case CurvePresets.Sqrt: result = normalize(sum) * System.MathF.Sqrt(length(sum)); break; case CurvePresets.Power: result = normalize(sum) * System.MathF.Pow(length(sum), 2); break; case CurvePresets.Reciprocal: result = normalize(sum) * (1 / length(sum)); break; default: float activatedValue = this.curve.Evaluate(length(sum)); result = normalize(sum) * activatedValue; break; } UpdateResult(result); } } */