From 6341d827e9ff64bba0afc9c6087136c92527e96f Mon Sep 17 00:00:00 2001 From: Pascal Serrarens Date: Wed, 7 Jan 2026 14:51:15 +0100 Subject: [PATCH] Spherical UpdateState (finally) --- .../NanoBrain/LinearAlgebra/src/Direction.cs | 5 ++ .../NanoBrain/LinearAlgebra/src/Spherical.cs | 12 +++- Assets/NanoBrain/Neuroid.cs | 69 +------------------ 3 files changed, 16 insertions(+), 70 deletions(-) diff --git a/Assets/NanoBrain/LinearAlgebra/src/Direction.cs b/Assets/NanoBrain/LinearAlgebra/src/Direction.cs index a1ff8f3..fd25b98 100644 --- a/Assets/NanoBrain/LinearAlgebra/src/Direction.cs +++ b/Assets/NanoBrain/LinearAlgebra/src/Direction.cs @@ -188,6 +188,11 @@ namespace LinearAlgebra } #endif + public static Direction operator -(Direction d) { + AngleFloat horizontal = d.horizontal + AngleFloat.deg180; + AngleFloat vertical = -d.vertical; + return new Direction(horizontal, vertical); + } /// /// Tests the equality of two directions diff --git a/Assets/NanoBrain/LinearAlgebra/src/Spherical.cs b/Assets/NanoBrain/LinearAlgebra/src/Spherical.cs index 2f3f801..2d6b6ed 100644 --- a/Assets/NanoBrain/LinearAlgebra/src/Spherical.cs +++ b/Assets/NanoBrain/LinearAlgebra/src/Spherical.cs @@ -17,8 +17,14 @@ namespace LinearAlgebra { /// The distance in meters /// The direction of the vector public Spherical(float distance, Direction direction) { - this.distance = distance; - this.direction = direction; + if (distance > 0) { + this.distance = distance; + this.direction = direction; + } + else { + this.distance = -distance; + this.direction = -direction; + } } /// @@ -315,7 +321,7 @@ namespace LinearAlgebra { return new Spherical(rAvg, new Direction(horizontalAvg, verticalAvg)); } - */ + */ public static Spherical Average(IEnumerable vectors) { diff --git a/Assets/NanoBrain/Neuroid.cs b/Assets/NanoBrain/Neuroid.cs index 71e48e7..7196a11 100644 --- a/Assets/NanoBrain/Neuroid.cs +++ b/Assets/NanoBrain/Neuroid.cs @@ -75,57 +75,7 @@ public class Neuroid : Nucleus { } public override void UpdateState() { - // Vector3 resultVector = Vector3.zero; - // foreach (Synapse synapse in this.synapses) { - // Nucleus synapseNucleus = synapse.nucleus; - // if (synapseNucleus is Neuroid neuroid && neuroid.isSleeping) - // continue; - - // Vector3 direction = synapseNucleus.outputValue.direction.ToVector3(); - - // float weight = synapse.weight; - // float activatedValue = curve.Evaluate(synapseNucleus.outputValue.magnitude); - // float magnitude = weight * activatedValue; - // //Debug.Log($"{this.name} {synapseNucleus.outputValue.direction} {synapseNucleus.outputValue.direction.horizontal}{synapseNucleus.outputValue.direction.vertical} {direction}"); - // Vector3 a = direction * magnitude; - // //Debug.Log($"A {direction} {magnitude} {a}"); - // resultVector += a; - // } - // if (average && this.synapses.Count > 0) - // resultVector /= this.synapses.Count; - /* - List v3s = new(); - foreach (Synapse synapse in this.synapses) { - Nucleus synapseNucleus = synapse.nucleus; - if (synapseNucleus is Neuroid neuroid && neuroid.isSleeping) - continue; - - Vector3 direction = synapseNucleus.outputValue.direction.ToVector3(); - - float weight = synapse.weight; - float activatedValue = curve.Evaluate(synapseNucleus.outputValue.magnitude); - float magnitude = weight * activatedValue; - //Debug.Log($"{this.name} {synapseNucleus.outputValue.direction} {synapseNucleus.outputValue.direction.horizontal}{synapseNucleus.outputValue.direction.vertical} {direction}"); - Vector3 a = direction * magnitude; - //Debug.Log($"A {direction} {magnitude} {a}"); - v3s.Add(a); - } - Vector3 sum = Vector3.zero; // Start with a zero vector - - // Sum all vectors - foreach (Vector3 vector in v3s) - sum += vector; - - // Calculate average - Vector3 averagevs = sum / v3s.Count; - Vector3 result1 = averagevs * v3s.Count; - // if (average && this.synapses.Count > 0) - // resultVector /= this.synapses.Count; - - Spherical result = Spherical.FromVector3(result1); - */ List sVectors = new(); - List cVectors = new(); foreach (Synapse synapse in this.synapses) { if (synapse.nucleus.isSleeping) continue; @@ -134,29 +84,14 @@ public class Neuroid : Nucleus { float activatedValue = curve.Evaluate(synapse.nucleus.outputValue.magnitude); float magnitude = weight * activatedValue; Spherical sVector = new(magnitude, synapse.nucleus.outputValue.direction); - //Debug.Log($"B {synapse.nucleus.outputValue.direction.ToVector3()} {magnitude} {vector.ToVector3()}"); - sVectors.Add(sVector); //synapse.nucleus.outputValue); - - Vector3 direction = synapse.nucleus.outputValue.direction.ToVector3(); - Vector3 cVector = direction * magnitude; - cVectors.Add(cVector); + sVectors.Add(sVector); } - Vector3 cResult = Vector3.zero; - foreach (Vector3 vector in cVectors) - cResult += vector; Spherical sResult = Spherical.Average(sVectors); if (average == false) sResult *= sVectors.Count; - if (sResult != Spherical.FromVector3(cResult)) - Debug.Log($"spherical different {sResult} != {Spherical.FromVector3(cResult)}"); - //if (sResult.ToVector3() != cResult) - Debug.Log($"vector different {sResult.ToVector3()} != {cResult}"); - - - UpdateResult(Spherical.FromVector3(cResult)); - + UpdateResult(sResult); } }