NanoBrain-unitypackage/MemoryCell.cs

95 lines
2.9 KiB
C#

using System;
using UnityEngine;
using Unity.Mathematics;
using static Unity.Mathematics.math;
[Serializable]
public class MemoryCell : Neuron, INucleus {
public MemoryCell(ClusterPrefab cluster, string name) : base(cluster, name) { }
public MemoryCell(Cluster parent, string name) : base(parent, name) { }
// this.parent = parent;
// this.name = name;
// this.parent?.nuclei.Add(this);
// }
public override IReceptor ShallowCloneTo(Cluster newParent) {
MemoryCell clone = new(newParent, this.name) {
array = this.array,
curve = this.curve,
curvePreset = this.curvePreset,
curveMax = this.curveMax,
average = this.average
};
return clone;
}
#region State
private float3 _memorizedValue;
private float _memorizedTime;
// public override void UpdateState(float3 bias) {
// // A memorycell does not have an activation function
// float3 result = bias;
// int n = 0;
// //Applying the weight factgors
// foreach (Synapse synapse in this.synapses) {
// result += synapse.weight * synapse.nucleus.outputValue;
// if (lengthsq(synapse.nucleus.outputValue) != 0)
// n++;
// }
// if (this.average)
// result /= n;
// UpdateResult(result);
// }
public override void UpdateStateIsolated() {
float3 bias = new(0, 0, 0);
UpdateStateIsolated(bias);
}
public override void UpdateStateIsolated(float3 bias) {
// A memorycell does not have an activation function
float3 result = bias;
int n = 0;
//Applying the weight factgors
foreach (Synapse synapse in this.synapses) {
result += synapse.weight * synapse.nucleus.outputValue;
if (lengthsq(synapse.nucleus.outputValue) != 0)
n++;
}
if (this.average)
result /= n;
this.outputValue = this._memorizedValue;
// Store the result for the next time
this._memorizedValue = result;
this._memorizedTime = Time.time;
}
// public override void UpdateResult(Vector3 result) {
// // output value is the previous value
// // if (this.deltaValue) {
// // float deltaTime = Time.time - this._memorizedTime;
// // this._outputValue = this._memorizedValue * deltaTime;
// // }
// //else
// this.outputValue = this._memorizedValue;
// // Store the result for the next time
// this._memorizedValue = result;
// this._memorizedTime = Time.time;
// foreach (INucleus receiver in this.receivers)
// receiver.UpdateState();
// }
#endregion State
}