Cleanup
This commit is contained in:
parent
f8a6f579ea
commit
133804a154
@ -85,8 +85,6 @@ namespace NanoBrain {
|
||||
this.parent = parent;
|
||||
this.parent?.nuclei.Add(this);
|
||||
ClonePrefab();
|
||||
// _ = this.inputs;
|
||||
//this.sortedNuclei = TopologicalSort(this.nuclei);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -102,8 +100,6 @@ namespace NanoBrain {
|
||||
this.parent = parent.cluster;
|
||||
|
||||
ClonePrefab();
|
||||
// _ = this.inputs;
|
||||
//this.sortedNuclei = TopologicalSort(this.nuclei);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -169,15 +165,11 @@ namespace NanoBrain {
|
||||
}
|
||||
}
|
||||
|
||||
//if (Application.isPlaying) {
|
||||
// Only create cluster siblings at runtime
|
||||
foreach (Nucleus clonedNucleus in clonedNuclei) {
|
||||
if (clonedNucleus is not Cluster clonedCluster)
|
||||
continue;
|
||||
|
||||
List<Cluster> siblings = new() {
|
||||
clonedCluster
|
||||
};
|
||||
List<Cluster> siblings = new() { clonedCluster };
|
||||
for (int instanceIx = 1; instanceIx < clonedCluster.instanceCount; instanceIx++) {
|
||||
// Create another sibling
|
||||
Cluster sibling = new(clonedCluster.prefab, this) {
|
||||
@ -186,7 +178,7 @@ namespace NanoBrain {
|
||||
instanceCount = this.instanceCount,
|
||||
};
|
||||
siblings.Add(sibling);
|
||||
CopyAllExternalReceivers(clonedCluster, sibling, clonedCluster.prefab, this);
|
||||
CopyAllExternalReceivers(clonedCluster, sibling, this);
|
||||
}
|
||||
Cluster[] siblingClusters = siblings.ToArray();
|
||||
foreach (Cluster sibling in siblings)
|
||||
@ -198,7 +190,6 @@ namespace NanoBrain {
|
||||
if (clonedNucleus is not Cluster)
|
||||
clonedNucleus.UpdateStateIsolated();
|
||||
}
|
||||
//}
|
||||
}
|
||||
|
||||
/// \copydoc NanoBrain::Nucleus::ShallowCloneTo
|
||||
@ -209,13 +200,11 @@ namespace NanoBrain {
|
||||
parent = this.parent,
|
||||
instanceCount = this.instanceCount,
|
||||
};
|
||||
// Somehow siblingClusters should be cloned too. Believe I do this in ClonePrefab right now.
|
||||
|
||||
return clone;
|
||||
}
|
||||
|
||||
private static void CopyAllExternalReceivers(Cluster sourceCluster, Cluster sibling, ClusterPrefab prefabParent, Cluster clonedParent) {
|
||||
|
||||
private static void CopyAllExternalReceivers(Cluster sourceCluster, Cluster sibling, Cluster clonedParent) {
|
||||
for (int nucleusIx = 0; nucleusIx < sourceCluster.nuclei.Count; nucleusIx++) {
|
||||
Nucleus sourceNucleus = sourceCluster.nuclei[nucleusIx];
|
||||
if (sourceNucleus is not Neuron sourceNeuron)
|
||||
@ -517,43 +506,6 @@ namespace NanoBrain {
|
||||
return false;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Get a nucleus in this cluster
|
||||
/// </summary>
|
||||
/// <param name="nucleusName">The name of the nucleus to find</param>
|
||||
/// <returns>The found nucleus or null when it is not found</returns>
|
||||
// public Nucleus GetNucleus(string nucleusName) {
|
||||
// int dotPosition = nucleusName.IndexOf('.');
|
||||
// if (dotPosition >= 0) {
|
||||
// string clusterName = nucleusName[..dotPosition];
|
||||
// string clusterName0 = clusterName + ": 0";
|
||||
// foreach (Nucleus nucleus in this.nuclei) {
|
||||
// if (nucleus is Cluster cluster) {
|
||||
// if (cluster.name == clusterName || cluster.name == clusterName0) {
|
||||
// // cluster.CheckInstances();
|
||||
// string subNucleusName = nucleusName[(dotPosition + 1)..];
|
||||
// return cluster.GetNucleus(subNucleusName);
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// return null;
|
||||
// }
|
||||
// else {
|
||||
// string nucleusName0 = nucleusName + ": 0";
|
||||
// foreach (Nucleus nucleus in this.nuclei) {
|
||||
// if (nucleus is Cluster cluster) {
|
||||
// if (nucleus.name == nucleusName || nucleus.name == nucleusName0) {
|
||||
// // cluster.CheckInstances();
|
||||
// return nucleus;
|
||||
// }
|
||||
// }
|
||||
// else if (nucleus.name == nucleusName)
|
||||
// return nucleus;
|
||||
// }
|
||||
// return null;
|
||||
// }
|
||||
// }
|
||||
|
||||
/// <summary>
|
||||
/// Get a neuron in this cluster
|
||||
/// </summary>
|
||||
|
||||
@ -144,146 +144,6 @@ namespace NanoBrain {
|
||||
//this.curve = GenerateCurve();
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// The curve representing the activation function
|
||||
/// </summary>
|
||||
// [HideInInspector]
|
||||
// public AnimationCurve curve;
|
||||
/// <summary>
|
||||
/// The maximum value of the curve
|
||||
/// </summary>
|
||||
// [HideInInspector]
|
||||
// public float curveMax = 1.0f;
|
||||
|
||||
/// <summary>
|
||||
/// Generate the curve for the current activation function
|
||||
/// </summary>
|
||||
/// <returns>The curve </returns>
|
||||
// public AnimationCurve GenerateCurve() {
|
||||
// switch (this.activator) {
|
||||
// case ActivationType.Linear:
|
||||
// this.curveMax = 1;
|
||||
// return Presets.Linear(1);
|
||||
// case ActivationType.Power:
|
||||
// this.curveMax = 1;
|
||||
// return Presets.Power(2.0f, 1);
|
||||
// case ActivationType.Sqrt:
|
||||
// this.curveMax = 1;
|
||||
// return Presets.Power(0.5f, 1);
|
||||
// case ActivationType.Reciprocal:
|
||||
// this.curveMax = 1 / 0.01f * 1;
|
||||
// return Presets.Reciprocal(1);
|
||||
// case ActivationType.Tanh:
|
||||
// this.curveMax = 1;
|
||||
// return Presets.Tanh(1);
|
||||
// case ActivationType.Binary:
|
||||
// this.curveMax = 1;
|
||||
// return Presets.Binary();
|
||||
// case ActivationType.Normalized:
|
||||
// this.curveMax = 1;
|
||||
// return Presets.Binary();
|
||||
// default:
|
||||
// this.curveMax = 1;
|
||||
// return this.curve;
|
||||
// }
|
||||
// }
|
||||
|
||||
/// <summary>
|
||||
/// The curve presets for the activation functions
|
||||
/// </summary>
|
||||
public static class Presets {
|
||||
/// <summary>
|
||||
/// The number of samples in the curve
|
||||
/// </summary>
|
||||
private const int samples = 32;
|
||||
/// <summary>
|
||||
/// Generate a curve for the linear activation function
|
||||
/// </summary>
|
||||
/// <param name="weight">The maximum value for the function</param>
|
||||
/// <returns>The curve preset</returns>
|
||||
public static AnimationCurve Linear(float weight) {
|
||||
return AnimationCurve.Linear(0f, 0f, 1000f, weight * 1000);
|
||||
}
|
||||
/// <summary>
|
||||
/// Generate a curve for the power activation function
|
||||
/// </summary>
|
||||
/// <param name="exponent">The exponent of the power function</param>
|
||||
/// <param name="weight">The maximum value for the function</param>
|
||||
/// <returns>The curve preset</returns>
|
||||
public static AnimationCurve Power(float exponent, float weight) {
|
||||
// build keyframes
|
||||
Keyframe[] keys = new Keyframe[samples];
|
||||
for (int i = 0; i < samples; i++) {
|
||||
float t = i / (float)(samples - 1);
|
||||
float v = Mathf.Pow(t, exponent) * weight;
|
||||
keys[i] = new Keyframe(t, v);
|
||||
}
|
||||
|
||||
AnimationCurve curve = new(keys);
|
||||
|
||||
// set tangent modes for each key to Auto (smooth). Use Linear if you prefer straight segments.
|
||||
for (int i = 0; i < curve.length; i++) {
|
||||
AnimationUtility.SetKeyLeftTangentMode(curve, i, AnimationUtility.TangentMode.Auto);
|
||||
AnimationUtility.SetKeyRightTangentMode(curve, i, AnimationUtility.TangentMode.Auto);
|
||||
}
|
||||
|
||||
return curve;
|
||||
}
|
||||
/// <summary>
|
||||
/// Generate a curve for the reciprocal activation function
|
||||
/// </summary>
|
||||
/// <param name="weight">The maximum value for the function</param>
|
||||
/// <returns>The curve preset</returns>
|
||||
public static AnimationCurve Reciprocal(float weight) {
|
||||
int samples = 128;
|
||||
float xMin = 0.001f;
|
||||
float xMax = 1;
|
||||
var keys = new Keyframe[samples];
|
||||
for (int i = 0; i < samples; i++) {
|
||||
float t = i / (float)(samples - 1);
|
||||
float x = Mathf.Lerp(xMin, xMax, t);
|
||||
float y = 1f / x * weight;
|
||||
keys[i] = new Keyframe(x, y);
|
||||
}
|
||||
var curve = new AnimationCurve(keys);
|
||||
for (int i = 0; i < curve.length; i++) {
|
||||
AnimationUtility.SetKeyLeftTangentMode(curve, i, AnimationUtility.TangentMode.Linear);
|
||||
AnimationUtility.SetKeyRightTangentMode(curve, i, AnimationUtility.TangentMode.Linear);
|
||||
}
|
||||
return curve;
|
||||
}
|
||||
/// <summary>
|
||||
/// Generate a curve for the tanh activation function
|
||||
/// </summary>
|
||||
/// <param name="weight">The maximum value for the function</param>
|
||||
/// <returns>The curve preset</returns>
|
||||
public static AnimationCurve Tanh(float weight) {
|
||||
//int samples = 128;
|
||||
float xMin = 0.001f;
|
||||
float xMax = 1;
|
||||
var keys = new Keyframe[samples];
|
||||
for (int i = 0; i < samples; i++) {
|
||||
float t = i / (float)(samples - 1);
|
||||
float x = Mathf.Lerp(xMin, xMax, t);
|
||||
float y = MathF.Tanh(x * weight);
|
||||
keys[i] = new Keyframe(x, y);
|
||||
}
|
||||
var curve = new AnimationCurve(keys);
|
||||
for (int i = 0; i < curve.length; i++) {
|
||||
AnimationUtility.SetKeyLeftTangentMode(curve, i, AnimationUtility.TangentMode.Linear);
|
||||
AnimationUtility.SetKeyRightTangentMode(curve, i, AnimationUtility.TangentMode.Linear);
|
||||
}
|
||||
return curve;
|
||||
|
||||
}
|
||||
/// <summary>
|
||||
/// Generate a curve for the binary activation function
|
||||
/// </summary>
|
||||
/// <returns>The curve preset</returns>
|
||||
public static AnimationCurve Binary() {
|
||||
return AnimationCurve.Linear(0, 0, 1, 1);
|
||||
}
|
||||
}
|
||||
|
||||
#endregion Serialization
|
||||
|
||||
@ -401,9 +261,7 @@ namespace NanoBrain {
|
||||
clone.bias = this.bias;
|
||||
clone.persistOutput = this.persistOutput;
|
||||
clone.combinator = this.combinator;
|
||||
// clone.curve = this.curve;
|
||||
clone.activator = this.activator;
|
||||
// clone.curveMax = this.curveMax;
|
||||
clone.breakOnUpdate = this.breakOnUpdate;
|
||||
}
|
||||
|
||||
|
||||
@ -17,15 +17,6 @@ namespace NanoBrain.Unity {
|
||||
//[HideInInspector]
|
||||
public int version;
|
||||
|
||||
/// <summary>
|
||||
/// Retrieve a nucleus in this cluster
|
||||
/// </summary>
|
||||
/// <param name="nucleusName">The name of the nucleus</param>
|
||||
/// <returns>The Nucleus with the given name or null if no such Nucleus could be found</returns>
|
||||
// public Nucleus GetNucleus(string nucleusName) {
|
||||
// return cluster.GetNucleus(nucleusName);
|
||||
// }
|
||||
|
||||
/// <summary>
|
||||
/// Call this function to ensure that there is at least one nucleus
|
||||
/// </summary>
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user