diff --git a/Editor/Cluster_Drawer.cs b/Editor/Cluster_Drawer.cs index d1e3778..acc8eb3 100644 --- a/Editor/Cluster_Drawer.cs +++ b/Editor/Cluster_Drawer.cs @@ -150,20 +150,20 @@ namespace NanoBrain.Unity { else if (selectedTarget is GameObject g) gameObject = g; - // Handles.color = Color.yellow; - // if (Cluster_Drawer.currentClusterView.selectedSynapseNeuron != null) { - // foreach (Cluster sibling in Cluster_Drawer.currentClusterView.selectedSynapseNeuron.parent.instances) { - // Neuron siblingNeuron = sibling.GetNeuron(Cluster_Drawer.currentClusterView.selectedSynapseNeuron.name); - // Vector3 worldVector = gameObject.transform.TransformVector(siblingNeuron.outputValue); - // Handles.DrawLine(gameObject.transform.position, gameObject.transform.position + worldVector); - // } - // } - // else { - // if (Cluster_Drawer.currentClusterView.currentNucleus is Neuron currentNeuron) { - // Vector3 worldVector = gameObject.transform.TransformVector(currentNeuron.outputValue); - // Handles.DrawLine(gameObject.transform.position, gameObject.transform.position + worldVector); - // } - // } + Handles.color = Color.yellow; + if (Cluster_Drawer.currentClusterView.selectedSynapseNeuron != null) { + foreach (Cluster sibling in Cluster_Drawer.currentClusterView.selectedSynapseNeuron.parent.instances) { + Neuron siblingNeuron = sibling.GetNeuron(Cluster_Drawer.currentClusterView.selectedSynapseNeuron.name); + Vector3 worldVector = gameObject.transform.TransformVector(siblingNeuron.outputValue); + Handles.DrawLine(gameObject.transform.position, gameObject.transform.position + worldVector); + } + } + else { + if (Cluster_Drawer.currentClusterView.currentNucleus is Neuron currentNeuron) { + Vector3 worldVector = gameObject.transform.TransformVector(currentNeuron.outputValue); + Handles.DrawLine(gameObject.transform.position, gameObject.transform.position + worldVector); + } + } } } diff --git a/Runtime/Scripts/Core/Neuron.cs b/Runtime/Scripts/Core/Neuron.cs index c8a74e3..58e1946 100644 --- a/Runtime/Scripts/Core/Neuron.cs +++ b/Runtime/Scripts/Core/Neuron.cs @@ -355,14 +355,15 @@ namespace NanoBrain { Debug.Break(); } - var combination = Combinator(this.bias, this.synapses); - this.outputValue = Activator(combination); + this.combinationValue = Combinator(this.bias, this.synapses); + this.outputValue = Activator(this.combinationValue); this.lastUpdate = Time.time; } #region Combinator #if UNITY_MATHEMATICS + public float3 combinationValue; /// /// The combinator which combines the bias with the values from all synapses @@ -418,6 +419,7 @@ namespace NanoBrain } #else + public Vector3 combinationValue; /// /// The combinator which combines the bias with the values from all synapses @@ -716,9 +718,23 @@ namespace NanoBrain // loss is a derivative of error // Backpropagation = loss * d(combinator) - // Assuming linear activation function. - // Derivative of this (f'()) would be 1. - Vector3 delta2 = loss * 1; + Vector3 delta2; + switch (activator) + { + case ActivationType.Linear: + // Derivative of this (f'()) would be 1. + delta2 = loss * 1; + break; + case ActivationType.Power: + delta2 = loss * (2 * this.combinationValue); + break; + case ActivationType.Reciprocal: + delta2 = loss * (-1 / (this.combinationValue * this.combinationValue)); + break; + default: + delta2 = loss; + break; + } Vector3 scaledOutput = Vector3.Scale(delta2, synapse.neuron.outputValue); float deltaWeight = Mathf.Abs(scaledOutput.x) + Mathf.Abs(scaledOutput.y) + Mathf.Abs(scaledOutput.z);