95 lines
2.9 KiB
C#
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 INucleus 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
|
|
}
|