diff --git a/.gitea/workflows/copy_documentation.yml b/.gitea/workflows/copy_documentation.yml
new file mode 100644
index 0000000..74f14f6
--- /dev/null
+++ b/.gitea/workflows/copy_documentation.yml
@@ -0,0 +1,34 @@
+name: Copy Documentation to webserver
+
+on:
+ push:
+ branches:
+ - '**'
+ pull_request:
+ branches:
+ - '**'
+
+jobs:
+ copy-documentation:
+ runs-on: ubuntu-latest
+
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v2
+
+ - name: Install Dependencies
+ run: |
+ apt-get update
+ apt-get install -y rsync # Install required packages
+
+ - name: Ensure destination exists
+ run: |
+ mkdir -p /web/nanobrain
+ chown -R $USER:$USER /web/nanobrain
+
+ - name: Copy html folder
+ run: |
+ rsync -av --delete Documentation/html/ /web/nanobrain 2>&1
+ echo $HOSTNAME
+ ps aux | head
+ find / -path '*/web/nanobrain/*'
diff --git a/doxygen.meta b/Documentation.meta
similarity index 100%
rename from doxygen.meta
rename to Documentation.meta
diff --git a/Documentation/DoxyWarnLogfile.txt b/Documentation/DoxyWarnLogfile.txt
new file mode 100644
index 0000000..e0dc472
--- /dev/null
+++ b/Documentation/DoxyWarnLogfile.txt
@@ -0,0 +1,106 @@
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/ScriptableObjects/ClusterPrefab.cs:84: warning: Member EnsureInitialization() (function) of class NanoBrain.ClusterPrefab is not documented.
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/ScriptableObjects/ClusterPrefab.cs:96: warning: Member GarbageCollection() (function) of class NanoBrain.ClusterPrefab is not documented.
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/ScriptableObjects/ClusterPrefab.cs:12: warning: Member cluster (variable) of class NanoBrain.ClusterPrefab is not documented.
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/MemoryCell.cs:16: warning: Member MemoryCell(Cluster parent, string name) (function) of class NanoBrain.MemoryCell is not documented.
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/MemoryCell.cs:28: warning: Member ShallowCloneTo(Cluster newParent) (function) of class NanoBrain.MemoryCell is not documented.
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/MemoryCell.cs:45: warning: Member UpdateStateIsolated() (function) of class NanoBrain.MemoryCell is not documented.
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:151: warning: Member GenerateCurve() (function) of class NanoBrain.Neuron is not documented.
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:282: warning: Member SleepCheck() (function) of class NanoBrain.Neuron is not documented.
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:398: warning: Member CombinatorSum() (function) of class NanoBrain.Neuron is not documented.
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:425: warning: Member CombinatorSum() (function) of class NanoBrain.Neuron is not documented.
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:407: warning: Member CombinatorProduct() (function) of class NanoBrain.Neuron is not documented.
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:432: warning: Member CombinatorProduct() (function) of class NanoBrain.Neuron is not documented.
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:441: warning: Member CombinatorMax() (function) of class NanoBrain.Neuron is not documented.
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:588: warning: Member AddReceiver(Nucleus receiverToAdd, float weight=1) (function) of class NanoBrain.Neuron is not documented.
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:597: warning: Member RemoveReceiver(Nucleus receiverToRemove) (function) of class NanoBrain.Neuron is not documented.
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:333: warning: Member Delete(Nucleus nucleus) (function) of class NanoBrain.Neuron is not documented.
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/MemoryCell.cs:18: warning: Member staticMemory (variable) of class NanoBrain.MemoryCell is not documented.
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:140: warning: Member _curvePreset (variable) of class NanoBrain.Neuron is not documented.
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:148: warning: Member curve (variable) of class NanoBrain.Neuron is not documented.
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:149: warning: Member curveMax (variable) of class NanoBrain.Neuron is not documented.
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:278: warning: Member WhenFiring (variable) of class NanoBrain.Neuron is not documented.
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:280: warning: Member persistOutput (variable) of class NanoBrain.Neuron is not documented.
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:299: warning: Member timeToSleep (variable) of class NanoBrain.Neuron is not documented.
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:324: warning: Member CloneFields(Neuron clone) (function) of class NanoBrain.Neuron is not documented.
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:383: warning: Member CheckSleepingSynapses() (function) of class NanoBrain.Neuron is not documented.
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:489: warning: Member ActivatorLinear(float3 input) (function) of class NanoBrain.Neuron is not documented.
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:546: warning: Member ActivatorLinear(Vector3 input) (function) of class NanoBrain.Neuron is not documented.
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:493: warning: Member ActivatorSqrt(float3 input) (function) of class NanoBrain.Neuron is not documented.
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:550: warning: Member ActivatorSqrt(Vector3 input) (function) of class NanoBrain.Neuron is not documented.
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:498: warning: Member ActivatorPower(float3 input) (function) of class NanoBrain.Neuron is not documented.
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:555: warning: Member ActivatorPower(Vector3 input) (function) of class NanoBrain.Neuron is not documented.
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:503: warning: Member ActivatorReciprocal(float3 input) (function) of class NanoBrain.Neuron is not documented.
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:560: warning: Member ActivatorReciprocal(Vector3 input) (function) of class NanoBrain.Neuron is not documented.
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:512: warning: Member ActivatorTanh(float3 input) (function) of class NanoBrain.Neuron is not documented.
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:517: warning: Member ActivatorBinary(float3 input) (function) of class NanoBrain.Neuron is not documented.
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:523: warning: Member ActivatorNormalized(float3 input) (function) of class NanoBrain.Neuron is not documented.
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:530: warning: Member ActivatorCustom(float3 input) (function) of class NanoBrain.Neuron is not documented.
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:569: warning: Member ActivatorCustom(Vector3 input) (function) of class NanoBrain.Neuron is not documented.
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:250: warning: Member _outputValue (variable) of class NanoBrain.Neuron is not documented.
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:264: warning: Member _outputValue (variable) of class NanoBrain.Neuron is not documented.
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/MemoryCell.cs:19: warning: Member isSleeping (property) of class NanoBrain.MemoryCell is not documented.
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:141: warning: Member curvePreset (property) of class NanoBrain.Neuron is not documented.
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:251: warning: Member outputValue (property) of class NanoBrain.Neuron is not documented.
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:265: warning: Member outputValue (property) of class NanoBrain.Neuron is not documented.
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:259: warning: Member outputMagnitude (property) of class NanoBrain.Neuron is not documented.
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:260: warning: Member outputSqrMagnitude (property) of class NanoBrain.Neuron is not documented.
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:277: warning: Member isFiring (property) of class NanoBrain.Neuron is not documented.
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:392: warning: Member Combinator (property) of class NanoBrain.Neuron is not documented.
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:418: warning: Member Combinator (property) of class NanoBrain.Neuron is not documented.
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:478: warning: Member Activator (property) of class NanoBrain.Neuron is not documented.
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:538: warning: Member Activator (property) of class NanoBrain.Neuron is not documented.
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:583: warning: Member receivers (property) of class NanoBrain.Neuron is not documented.
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:616: warning: argument 'thingId' of command @param is not found in the argument list of NanoBrain.Neuron::ProcessStimulus(Vector3 inputValue)
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:616: warning: argument 'thingName' of command @param is not found in the argument list of NanoBrain.Neuron::ProcessStimulus(Vector3 inputValue)
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:151: warning: Member GenerateCurve() (function) of class NanoBrain.Neuron is not documented.
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:282: warning: Member SleepCheck() (function) of class NanoBrain.Neuron is not documented.
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:377: warning: Member UpdateStateIsolated() (function) of class NanoBrain.Neuron is not documented.
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:398: warning: Member CombinatorSum() (function) of class NanoBrain.Neuron is not documented.
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:407: warning: Member CombinatorProduct() (function) of class NanoBrain.Neuron is not documented.
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:425: warning: Member CombinatorSum() (function) of class NanoBrain.Neuron is not documented.
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:432: warning: Member CombinatorProduct() (function) of class NanoBrain.Neuron is not documented.
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:441: warning: Member CombinatorMax() (function) of class NanoBrain.Neuron is not documented.
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:588: warning: Member AddReceiver(Nucleus receiverToAdd, float weight=1) (function) of class NanoBrain.Neuron is not documented.
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:597: warning: Member RemoveReceiver(Nucleus receiverToRemove) (function) of class NanoBrain.Neuron is not documented.
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:333: warning: Member Delete(Nucleus nucleus) (function) of class NanoBrain.Neuron is not documented.
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:140: warning: Member _curvePreset (variable) of class NanoBrain.Neuron is not documented.
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:148: warning: Member curve (variable) of class NanoBrain.Neuron is not documented.
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:149: warning: Member curveMax (variable) of class NanoBrain.Neuron is not documented.
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:278: warning: Member WhenFiring (variable) of class NanoBrain.Neuron is not documented.
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:280: warning: Member persistOutput (variable) of class NanoBrain.Neuron is not documented.
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:299: warning: Member timeToSleep (variable) of class NanoBrain.Neuron is not documented.
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:324: warning: Member CloneFields(Neuron clone) (function) of class NanoBrain.Neuron is not documented.
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:383: warning: Member CheckSleepingSynapses() (function) of class NanoBrain.Neuron is not documented.
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:489: warning: Member ActivatorLinear(float3 input) (function) of class NanoBrain.Neuron is not documented.
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:493: warning: Member ActivatorSqrt(float3 input) (function) of class NanoBrain.Neuron is not documented.
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:498: warning: Member ActivatorPower(float3 input) (function) of class NanoBrain.Neuron is not documented.
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:503: warning: Member ActivatorReciprocal(float3 input) (function) of class NanoBrain.Neuron is not documented.
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:512: warning: Member ActivatorTanh(float3 input) (function) of class NanoBrain.Neuron is not documented.
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:517: warning: Member ActivatorBinary(float3 input) (function) of class NanoBrain.Neuron is not documented.
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:523: warning: Member ActivatorNormalized(float3 input) (function) of class NanoBrain.Neuron is not documented.
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:530: warning: Member ActivatorCustom(float3 input) (function) of class NanoBrain.Neuron is not documented.
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:546: warning: Member ActivatorLinear(Vector3 input) (function) of class NanoBrain.Neuron is not documented.
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:550: warning: Member ActivatorSqrt(Vector3 input) (function) of class NanoBrain.Neuron is not documented.
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:555: warning: Member ActivatorPower(Vector3 input) (function) of class NanoBrain.Neuron is not documented.
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:560: warning: Member ActivatorReciprocal(Vector3 input) (function) of class NanoBrain.Neuron is not documented.
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:569: warning: Member ActivatorCustom(Vector3 input) (function) of class NanoBrain.Neuron is not documented.
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:250: warning: Member _outputValue (variable) of class NanoBrain.Neuron is not documented.
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:264: warning: Member _outputValue (variable) of class NanoBrain.Neuron is not documented.
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:141: warning: Member curvePreset (property) of class NanoBrain.Neuron is not documented.
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:251: warning: Member outputValue (property) of class NanoBrain.Neuron is not documented.
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:259: warning: Member outputMagnitude (property) of class NanoBrain.Neuron is not documented.
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:260: warning: Member outputSqrMagnitude (property) of class NanoBrain.Neuron is not documented.
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:265: warning: Member outputValue (property) of class NanoBrain.Neuron is not documented.
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:277: warning: Member isFiring (property) of class NanoBrain.Neuron is not documented.
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:281: warning: Member isSleeping (property) of class NanoBrain.Neuron is not documented.
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:392: warning: Member Combinator (property) of class NanoBrain.Neuron is not documented.
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:418: warning: Member Combinator (property) of class NanoBrain.Neuron is not documented.
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:478: warning: Member Activator (property) of class NanoBrain.Neuron is not documented.
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:538: warning: Member Activator (property) of class NanoBrain.Neuron is not documented.
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:583: warning: Member receivers (property) of class NanoBrain.Neuron is not documented.
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:302: warning: argument 'parent' of command @param is not found in the argument list of NanoBrain.Neuron::ShallowCloneTo(Cluster newParent)
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:302: warning: The following parameter of NanoBrain.Neuron.ShallowCloneTo(Cluster newParent) is not documented:
+ parameter 'newParent'
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:616: warning: argument 'thingId' of command @param is not found in the argument list of NanoBrain.Neuron::ProcessStimulus(Vector3 inputValue)
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs:616: warning: argument 'thingName' of command @param is not found in the argument list of NanoBrain.Neuron::ProcessStimulus(Vector3 inputValue)
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Synapse.cs:32: warning: Member isSleeping (property) of class NanoBrain.Synapse is not documented.
diff --git a/doxygen/DoxyWarnLogfile.txt.meta b/Documentation/DoxyWarnLogfile.txt.meta
similarity index 100%
rename from doxygen/DoxyWarnLogfile.txt.meta
rename to Documentation/DoxyWarnLogfile.txt.meta
diff --git a/doxygen/Doxyfile b/Documentation/Doxyfile
similarity index 100%
rename from doxygen/Doxyfile
rename to Documentation/Doxyfile
diff --git a/doxygen/Doxyfile.meta b/Documentation/Doxyfile.meta
similarity index 100%
rename from doxygen/Doxyfile.meta
rename to Documentation/Doxyfile.meta
diff --git a/doxygen/DoxygenLayout.xml b/Documentation/DoxygenLayout.xml
similarity index 100%
rename from doxygen/DoxygenLayout.xml
rename to Documentation/DoxygenLayout.xml
diff --git a/doxygen/DoxygenLayout.xml.meta b/Documentation/DoxygenLayout.xml.meta
similarity index 100%
rename from doxygen/DoxygenLayout.xml.meta
rename to Documentation/DoxygenLayout.xml.meta
diff --git a/Documentation/Installation.md b/Documentation/Installation.md
new file mode 100644
index 0000000..c89f3d1
--- /dev/null
+++ b/Documentation/Installation.md
@@ -0,0 +1,14 @@
+Package Installation
+====================
+
+You can import the NanoBrain Ant package in Unity directly with the Package Manager git package importer.
+
+See Unity: [Installing from a Git URL](https://docs.unity3d.com/Manual/upm-ui-giturl.html)
+
+Use the link from 'Clone with HTTP' (for example: https://git.passer.life/CreatureControl/Ant.git) In this way you can always retrieve the latest version by pressing the Update button in the Package Manager.
+
+Optionally, you can use a tag to retrieve a specific version. For example: https://git.passer.life/CreatureControl/Ant.git#0.1.0. This will give you a stable version which does not change. Updating can be done by retrieving the package with a link to a new release.
+
+Samples Installation
+--------------------
+In the Unity Package manager, select the NanoBrain Ant package and look for the `Samples` tab in the details pane on the right. There you can import the `Models`.
\ No newline at end of file
diff --git a/Documentation/Installation.md.meta b/Documentation/Installation.md.meta
new file mode 100644
index 0000000..2e15366
--- /dev/null
+++ b/Documentation/Installation.md.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: e27e748d8b619ce38b068b30c1117989
+TextScriptImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Documentation/ToC.md b/Documentation/ToC.md
new file mode 100644
index 0000000..527bac5
--- /dev/null
+++ b/Documentation/ToC.md
@@ -0,0 +1,5 @@
+\mainpage
+
+Table of Contents
+-----------------
+- [Installation](Installation.md)
diff --git a/Documentation/ToC.md.meta b/Documentation/ToC.md.meta
new file mode 100644
index 0000000..878ff22
--- /dev/null
+++ b/Documentation/ToC.md.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: e08bd11eb9f534ac18df9a9c3c93d151
+TextScriptImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/doxygen/custom_doxygen.css b/Documentation/custom_doxygen.css
similarity index 100%
rename from doxygen/custom_doxygen.css
rename to Documentation/custom_doxygen.css
diff --git a/doxygen/custom_doxygen.css.meta b/Documentation/custom_doxygen.css.meta
similarity index 100%
rename from doxygen/custom_doxygen.css.meta
rename to Documentation/custom_doxygen.css.meta
diff --git a/LinearAlgebra.meta b/Documentation/html.meta
similarity index 77%
rename from LinearAlgebra.meta
rename to Documentation/html.meta
index d18b73b..9a5d394 100644
--- a/LinearAlgebra.meta
+++ b/Documentation/html.meta
@@ -1,5 +1,5 @@
fileFormatVersion: 2
-guid: a4c7dfe43bdf504e29c5c97919d7a1c0
+guid: c38c04e6e8570a9bdb3f50169d7a2691
folderAsset: yes
DefaultImporter:
externalObjects: {}
diff --git a/doxygen/images/PasserLifeLogoRight1_300.png b/Documentation/html/PasserLifeLogoRight1_300.png
similarity index 100%
rename from doxygen/images/PasserLifeLogoRight1_300.png
rename to Documentation/html/PasserLifeLogoRight1_300.png
diff --git a/Documentation/html/PasserLifeLogoRight1_300.png.meta b/Documentation/html/PasserLifeLogoRight1_300.png.meta
new file mode 100644
index 0000000..44b1805
--- /dev/null
+++ b/Documentation/html/PasserLifeLogoRight1_300.png.meta
@@ -0,0 +1,117 @@
+fileFormatVersion: 2
+guid: 02ece4d43b8f3df958ad4f1703bbb927
+TextureImporter:
+ internalIDToNameTable: []
+ externalObjects: {}
+ serializedVersion: 13
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 1
+ sRGBTexture: 1
+ linearTexture: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapsPreserveCoverage: 0
+ alphaTestReferenceValue: 0.5
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ flipGreenChannel: 0
+ isReadable: 0
+ streamingMipmaps: 0
+ streamingMipmapsPriority: 0
+ vTOnly: 0
+ ignoreMipmapLimit: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 6
+ cubemapConvolution: 0
+ seamlessCubemap: 0
+ textureFormat: 1
+ maxTextureSize: 2048
+ textureSettings:
+ serializedVersion: 2
+ filterMode: 1
+ aniso: 1
+ mipBias: 0
+ wrapU: 0
+ wrapV: 0
+ wrapW: 0
+ nPOTScale: 1
+ lightmap: 0
+ compressionQuality: 50
+ spriteMode: 0
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: 0.5, y: 0.5}
+ spritePixelsToUnits: 100
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spriteGenerateFallbackPhysicsShape: 1
+ alphaUsage: 1
+ alphaIsTransparency: 0
+ spriteTessellationDetail: -1
+ textureType: 0
+ textureShape: 1
+ singleChannelComponent: 0
+ flipbookRows: 1
+ flipbookColumns: 1
+ maxTextureSizeSet: 0
+ compressionQualitySet: 0
+ textureFormatSet: 0
+ ignorePngGamma: 0
+ applyGammaDecoding: 0
+ swizzle: 50462976
+ cookieLightType: 0
+ platformSettings:
+ - serializedVersion: 4
+ buildTarget: DefaultTexturePlatform
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: Standalone
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ spriteSheet:
+ serializedVersion: 2
+ sprites: []
+ outline: []
+ customData:
+ physicsShape: []
+ bones: []
+ spriteID:
+ internalID: 0
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ secondaryTextures: []
+ spriteCustomMetadata:
+ entries: []
+ nameFileIdTable: {}
+ mipmapLimitGroupName:
+ pSDRemoveMatte: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Documentation/html/annotated.html b/Documentation/html/annotated.html
new file mode 100644
index 0000000..a7d0e0e
--- /dev/null
+++ b/Documentation/html/annotated.html
@@ -0,0 +1,95 @@
+
+
+
+
+
+
+
+Nano Brain for Unity: Class List
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Nano Brain for Unity v0.1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+
+
+
+
Here are the classes, structs, unions and interfaces with brief descriptions:
+
[detail level 1 2 ]
+ ▼ N NanoBrain The Nanobrain namespace
+ C Brain The NanoBrain Unity Componnent
+ C Cluster A Cluster combines a collection of Nuclei to implement reusable behaviour
+ C ClusterPrefab The Unity ScriptableObject to implement re-usable Cluster Prefabs
+ C MemoryCell A MemoryCell stored its value for one update
+ C Neuron A neuron is a basic Nucleus
+ C Nucleus A Nucleus is a basic element in a brain cluster
+ C Synapse A Synapse connects the ouput of a Neuron to another Neuron
+
+
+
+
+
+
+
diff --git a/Documentation/html/annotated.html.meta b/Documentation/html/annotated.html.meta
new file mode 100644
index 0000000..8b2df70
--- /dev/null
+++ b/Documentation/html/annotated.html.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 1ed8b017b4a8dbbca941f6581073f398
+TextScriptImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Documentation/html/bc_s.png b/Documentation/html/bc_s.png
new file mode 100644
index 0000000..927cda7
Binary files /dev/null and b/Documentation/html/bc_s.png differ
diff --git a/Documentation/html/bc_s.png.meta b/Documentation/html/bc_s.png.meta
new file mode 100644
index 0000000..1c994ac
--- /dev/null
+++ b/Documentation/html/bc_s.png.meta
@@ -0,0 +1,117 @@
+fileFormatVersion: 2
+guid: 247c674a55eeeb38cb5fc8e73124b7e0
+TextureImporter:
+ internalIDToNameTable: []
+ externalObjects: {}
+ serializedVersion: 13
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 1
+ sRGBTexture: 1
+ linearTexture: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapsPreserveCoverage: 0
+ alphaTestReferenceValue: 0.5
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ flipGreenChannel: 0
+ isReadable: 0
+ streamingMipmaps: 0
+ streamingMipmapsPriority: 0
+ vTOnly: 0
+ ignoreMipmapLimit: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 6
+ cubemapConvolution: 0
+ seamlessCubemap: 0
+ textureFormat: 1
+ maxTextureSize: 2048
+ textureSettings:
+ serializedVersion: 2
+ filterMode: 1
+ aniso: 1
+ mipBias: 0
+ wrapU: 0
+ wrapV: 0
+ wrapW: 0
+ nPOTScale: 1
+ lightmap: 0
+ compressionQuality: 50
+ spriteMode: 0
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: 0.5, y: 0.5}
+ spritePixelsToUnits: 100
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spriteGenerateFallbackPhysicsShape: 1
+ alphaUsage: 1
+ alphaIsTransparency: 0
+ spriteTessellationDetail: -1
+ textureType: 0
+ textureShape: 1
+ singleChannelComponent: 0
+ flipbookRows: 1
+ flipbookColumns: 1
+ maxTextureSizeSet: 0
+ compressionQualitySet: 0
+ textureFormatSet: 0
+ ignorePngGamma: 0
+ applyGammaDecoding: 0
+ swizzle: 50462976
+ cookieLightType: 0
+ platformSettings:
+ - serializedVersion: 4
+ buildTarget: DefaultTexturePlatform
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: Standalone
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ spriteSheet:
+ serializedVersion: 2
+ sprites: []
+ outline: []
+ customData:
+ physicsShape: []
+ bones: []
+ spriteID:
+ internalID: 0
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ secondaryTextures: []
+ spriteCustomMetadata:
+ entries: []
+ nameFileIdTable: {}
+ mipmapLimitGroupName:
+ pSDRemoveMatte: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Documentation/html/bc_sd.png b/Documentation/html/bc_sd.png
new file mode 100644
index 0000000..b278e21
Binary files /dev/null and b/Documentation/html/bc_sd.png differ
diff --git a/Documentation/html/bc_sd.png.meta b/Documentation/html/bc_sd.png.meta
new file mode 100644
index 0000000..da109d4
--- /dev/null
+++ b/Documentation/html/bc_sd.png.meta
@@ -0,0 +1,117 @@
+fileFormatVersion: 2
+guid: 948d52c1ed15d9864aa67a179d5d815a
+TextureImporter:
+ internalIDToNameTable: []
+ externalObjects: {}
+ serializedVersion: 13
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 1
+ sRGBTexture: 1
+ linearTexture: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapsPreserveCoverage: 0
+ alphaTestReferenceValue: 0.5
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ flipGreenChannel: 0
+ isReadable: 0
+ streamingMipmaps: 0
+ streamingMipmapsPriority: 0
+ vTOnly: 0
+ ignoreMipmapLimit: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 6
+ cubemapConvolution: 0
+ seamlessCubemap: 0
+ textureFormat: 1
+ maxTextureSize: 2048
+ textureSettings:
+ serializedVersion: 2
+ filterMode: 1
+ aniso: 1
+ mipBias: 0
+ wrapU: 0
+ wrapV: 0
+ wrapW: 0
+ nPOTScale: 1
+ lightmap: 0
+ compressionQuality: 50
+ spriteMode: 0
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: 0.5, y: 0.5}
+ spritePixelsToUnits: 100
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spriteGenerateFallbackPhysicsShape: 1
+ alphaUsage: 1
+ alphaIsTransparency: 0
+ spriteTessellationDetail: -1
+ textureType: 0
+ textureShape: 1
+ singleChannelComponent: 0
+ flipbookRows: 1
+ flipbookColumns: 1
+ maxTextureSizeSet: 0
+ compressionQualitySet: 0
+ textureFormatSet: 0
+ ignorePngGamma: 0
+ applyGammaDecoding: 0
+ swizzle: 50462976
+ cookieLightType: 0
+ platformSettings:
+ - serializedVersion: 4
+ buildTarget: DefaultTexturePlatform
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: Standalone
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ spriteSheet:
+ serializedVersion: 2
+ sprites: []
+ outline: []
+ customData:
+ physicsShape: []
+ bones: []
+ spriteID:
+ internalID: 0
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ secondaryTextures: []
+ spriteCustomMetadata:
+ entries: []
+ nameFileIdTable: {}
+ mipmapLimitGroupName:
+ pSDRemoveMatte: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Documentation/html/class_nano_brain_1_1_brain-members.html b/Documentation/html/class_nano_brain_1_1_brain-members.html
new file mode 100644
index 0000000..37f4bd4
--- /dev/null
+++ b/Documentation/html/class_nano_brain_1_1_brain-members.html
@@ -0,0 +1,93 @@
+
+
+
+
+
+
+
+Nano Brain for Unity: Member List
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Nano Brain for Unity v0.1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+
+
+
+
+
+
+
This is the complete list of members for NanoBrain.Brain , including all inherited members.
+
+
+
+
+
diff --git a/Documentation/html/class_nano_brain_1_1_brain-members.html.meta b/Documentation/html/class_nano_brain_1_1_brain-members.html.meta
new file mode 100644
index 0000000..d38ca95
--- /dev/null
+++ b/Documentation/html/class_nano_brain_1_1_brain-members.html.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 8071cad6602a92ea19518fd77d9740d8
+TextScriptImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Documentation/html/class_nano_brain_1_1_brain.html b/Documentation/html/class_nano_brain_1_1_brain.html
new file mode 100644
index 0000000..0e343da
--- /dev/null
+++ b/Documentation/html/class_nano_brain_1_1_brain.html
@@ -0,0 +1,175 @@
+
+
+
+
+
+
+
+Nano Brain for Unity: NanoBrain.Brain Class Reference
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Nano Brain for Unity v0.1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+
+
+
+
+
+
+
The NanoBrain Unity Componnent.
+
This implements the top-level NanoBrain Cluster
+
+
+
Inherits MonoBehaviour.
+
+
+static void UpdateWeight (Cluster brain , string name, float weight)
+ Update the weight for all Synapses coming from the Neuron with the given name.
+
+
+
+
+ClusterPrefab brainPrefab
+ The Cluster prefab from which the cluster is created.
+
+
+
+
+Cluster brain [get]
+ The cluster isntance.
+
+
+
+
+
◆ UpdateWeight()
+
+
+
+
+
+
+
+
+ static void NanoBrain.Brain.UpdateWeight
+ (
+ Cluster
+ brain ,
+
+
+
+
+ string
+ name ,
+
+
+
+
+ float
+ weight
+
+
+
+ )
+
+
+
+
+
+static
+
+
+
+
+
Update the weight for all Synapses coming from the Neuron with the given name.
+
Parameters
+
+ brain The cluster in which the synapses are updated
+ name The name of the Neuron for which the weights are updated
+ weight The new Synapse weight
+
+
+
+
+
+
+
The documentation for this class was generated from the following file:
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Brain.cs
+
+
+
+
+
+
diff --git a/Documentation/html/class_nano_brain_1_1_brain.html.meta b/Documentation/html/class_nano_brain_1_1_brain.html.meta
new file mode 100644
index 0000000..0d9d3db
--- /dev/null
+++ b/Documentation/html/class_nano_brain_1_1_brain.html.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 82b2d108fb097c36b83582ed8d34c407
+TextScriptImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Documentation/html/class_nano_brain_1_1_cluster-members.html b/Documentation/html/class_nano_brain_1_1_cluster-members.html
new file mode 100644
index 0000000..f5b4d74
--- /dev/null
+++ b/Documentation/html/class_nano_brain_1_1_cluster-members.html
@@ -0,0 +1,124 @@
+
+
+
+
+
+
+
+Nano Brain for Unity: Member List
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Nano Brain for Unity v0.1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+
+
+
+
+
+
+
This is the complete list of members for NanoBrain.Cluster , including all inherited members.
+
+
+
+
+
diff --git a/Documentation/html/class_nano_brain_1_1_cluster-members.html.meta b/Documentation/html/class_nano_brain_1_1_cluster-members.html.meta
new file mode 100644
index 0000000..39a0cfa
--- /dev/null
+++ b/Documentation/html/class_nano_brain_1_1_cluster-members.html.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: c7c7546d58e3a816b99fba6c9d216a58
+TextScriptImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Documentation/html/class_nano_brain_1_1_cluster.html b/Documentation/html/class_nano_brain_1_1_cluster.html
new file mode 100644
index 0000000..f2503ab
--- /dev/null
+++ b/Documentation/html/class_nano_brain_1_1_cluster.html
@@ -0,0 +1,987 @@
+
+
+
+
+
+
+
+Nano Brain for Unity: NanoBrain.Cluster Class Reference
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Nano Brain for Unity v0.1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+
+
+
+
+
+
+
A Cluster combines a collection of Nuclei to implement reusable behaviour.
+
A Cluster is an instantiation of a ClusterPrefab. Clusters can be nested inside other clusters.
+
+
+
+
+
+
+
+
+
+
+enum Type { None
+, Neuron
+, MemoryCell
+, Cluster
+ }
+ Function to clone a nucleus to a Cluster prefab. More...
+
+
+
+ Cluster (ClusterPrefab prefab , Cluster parent )
+ Instantiate a new copy of a ClusterPrefab in the given parent.
+
+ Cluster (ClusterPrefab prefab , ClusterPrefab parent =null)
+ Add a new cluster to a ClusterPrefab.
+
+override Nucleus ShallowCloneTo (Cluster parent )
+ Toggle for printing debugging trace data.
+
+void AddInstance ()
+ Increase the number of instances in an multi-cluster.
+
+void AddInstance (ClusterPrefab prefab )
+ Create an new instance in a multi-cluster.
+
+
+void RemoveInstance ()
+ Decrease the number of instance in a multi-cluster.
+
+
+void RefreshComputeOrders ()
+ Refresh the order in which neurons should be computed.
+
+
+void RefreshOutputs ()
+ Reset the list of outputs such that they will be re-determined.
+
+bool TryGetNucleus (string nucleusName, out Nucleus foundNucleus)
+ Try to find a nucleus in this cluster.
+
+Nucleus GetNucleus (string nucleusName)
+ Get a nucleus in this cluster.
+
+Neuron GetNeuron (string neuronName)
+ Get a neuron in this cluster.
+
+Neuron GetNeuron (int thingId, string neuronName, string thingName=null)
+ Get a neuron in an instance of a multi-cluster.
+
+bool DeleteNucleus (Nucleus nucleus)
+ Delete a nucleus from this clsuter.
+
+virtual List< Nucleus > CollectReceivers (bool removeDuplicates=false)
+ Collect all receiving nuclei of signals from this cluster.
+
+List< Synapse > CollectSynapsesTo (Cluster otherCluster)
+ Collect all connections to receivers of signals from this cluster.
+
+void UpdateFromNucleus (Nucleus startNucleus)
+ Update the state of the nucleus and all nuclei receiving from it.
+
+override void UpdateStateIsolated ()
+ Update the state without updating other Nuclei.
+
+void Refresh ()
+ Recalculate derived properties.
+
+virtual void UpdateNuclei ()
+ Update the state and recursively all Nuclei receiving data from this Nucleus.
+
+
+
+ClusterPrefab prefab
+ The prefab used to create this cluster.
+
+Cluster [] instances
+ All cluster instance of a multi-cluster.
+
+int instanceCount = 1
+ The number of cluster instances in a multi-cluster.
+
+Dictionary< int, Cluster > thingClusters = new()
+ The mapping from things to cluster instances.
+
+
+List< Nucleus > nuclei = new()
+ All nuclei in this cluster.
+
+
+string name
+ The name of the Nucleus.
+
+Cluster parent
+ The cluster prefab in which the nucleus is located.
+
+
+
+List< Neuron > _outputs = null
+ The neurons without outgoing connections.
+
+
+
+
+string baseName [get]
+ The base name of the cluster. I don't think this is actively used at this moment.
+
+
+Dictionary< Nucleus , List< Nucleus > > computeOrders [get]
+ This gives the order in which nuclei should be computed when a nucleus is updated.
+
+
+virtual Neuron defaultOutput [get]
+ The first nucleus in a cluster is the default output.
+
+List< Neuron > outputs [get]
+ The neurons without outgoing connections.
+
+
+
+
+
◆ Type
+
+
+
+
+
Function to clone a nucleus to a Cluster prefab.
+
Parameters
+
+
+
+
Returns
+
The types of Nucleus
+
+
+
+
+
+
◆ Cluster() [1/2]
+
+
+
+
+
+ NanoBrain.Cluster.Cluster
+ (
+ ClusterPrefab
+ prefab ,
+
+
+
+
+ Cluster
+ parent
+
+
+
+ )
+
+
+
+
+
+
Instantiate a new copy of a ClusterPrefab in the given parent.
+
Parameters
+
+ prefab The prefab to use
+ parent The cluster in which this new cluster will be placed
+
+
+
+
+
+
+
+
◆ Cluster() [2/2]
+
+
+
+
+
Add a new cluster to a ClusterPrefab.
+
Parameters
+
+ prefab The prefab to copy
+ parent The prefab in which the new copy is placed
+
+
+
+
+
+
+
+
+
◆ ShallowCloneTo()
+
+
+
+
+
+ override Nucleus NanoBrain.Cluster.ShallowCloneTo
+ (
+ Cluster
+ parent )
+
+
+
+
+
+
Toggle for printing debugging trace data.
+
Function to make a partial clone of this nucleus
+
Parameters
+
+ parent The cluster in which the cloned nucleus should be placed
+
+
+
+
Returns
+
+
+
+
+
◆ GetNucleusIndex() [1/2]
+
+
+
+
+
+
+
+
+ static int NanoBrain.Cluster.GetNucleusIndex
+ (
+ List< Nucleus >
+ nuclei ,
+
+
+
+
+ Nucleus
+ nucleus
+
+
+
+ )
+
+
+
+
+
+static
+
+
+
+
+
Get the index of a nucleus in a list of nuclei.
+
Parameters
+
+ nuclei The list of nuclei to search
+ nucleus The nucleus to find
+
+
+
+
Returns The index of the nucleus in the list or -1 when it has not been found
+
+
+
+
+
◆ GetNucleusIndex() [2/2]
+
+
+
+
+
+
+
+
+ static int NanoBrain.Cluster.GetNucleusIndex
+ (
+ List< Nucleus >
+ nuclei ,
+
+
+
+
+ string
+ nucleusName
+
+
+
+ )
+
+
+
+
+
+static
+
+
+
+
+
Get the index of a nucleus with the given name in a list of nuclei.
+
Parameters
+
+ nuclei The list of nuclei to search
+ nucleusName The name of the nucleus to find
+
+
+
+
Returns The index of the nucleus in the list or -1 when it has not been found
+
+
+
+
+
◆ AddInstance() [1/2]
+
+
+
+
+
+ void NanoBrain.Cluster.AddInstance
+ (
+ )
+
+
+
+
+
+
Increase the number of instances in an multi-cluster.
+
/remark Note this does not create the instances. This is only intended to be used for prefabs.
+
+
+
+
+
◆ AddInstance() [2/2]
+
+
+
+
+
+ void NanoBrain.Cluster.AddInstance
+ (
+ ClusterPrefab
+ prefab )
+
+
+
+
+
+
Create an new instance in a multi-cluster.
+
Parameters
+
+ prefab The prefab to use to create the new instance
+
+
+
+
/remark This does not change the instanceCount. It should only be used at runtime.
+
+
+
+
+
◆ TryGetNucleus()
+
+
+
+
+
+ bool NanoBrain.Cluster.TryGetNucleus
+ (
+ string
+ nucleusName ,
+
+
+
+
+ out Nucleus
+ foundNucleus
+
+
+
+ )
+
+
+
+
+
+
Try to find a nucleus in this cluster.
+
Parameters
+
+ nucleusName The name of the nucleus to find
+ foundNucleus The found nucleus or null if it is not found
+
+
+
+
Returns True when the nucleus is found, false otherwise
+
+
+
+
+
◆ GetNucleus()
+
+
+
+
+
+ Nucleus NanoBrain.Cluster.GetNucleus
+ (
+ string
+ nucleusName )
+
+
+
+
+
+
Get a nucleus in this cluster.
+
Parameters
+
+ nucleusName The name of the nucleus to find
+
+
+
+
Returns The found nucleus or null when it is not found
+
+
+
+
+
◆ GetNeuron() [1/2]
+
+
+
+
+
+ Neuron NanoBrain.Cluster.GetNeuron
+ (
+ string
+ neuronName )
+
+
+
+
+
+
Get a neuron in this cluster.
+
Parameters
+
+ neuronName The name of the neuron to find
+
+
+
+
Returns The found neuron or null when it is not found
+
+
+
+
+
◆ GetNeuron() [2/2]
+
+
+
+
+
+ Neuron NanoBrain.Cluster.GetNeuron
+ (
+ int
+ thingId ,
+
+
+
+
+ string
+ neuronName ,
+
+
+
+
+ string
+ thingName = null
+
+
+
+ )
+
+
+
+
+
+
Get a neuron in an instance of a multi-cluster.
+
Parameters
+
+ thingId The id of the thing mapped to the cluster instance
+ neuronName The name of the neuron to find
+ thingName The name of the thing mapped to the cluster instance
+
+
+
+
Returns The found neuron or null when it is not found
+
The cluster instance mapped to the thing will be neuron.parent if a neuron is found.
+
+
+
+
+
◆ DeleteNucleus()
+
+
+
+
+
+ bool NanoBrain.Cluster.DeleteNucleus
+ (
+ Nucleus
+ nucleus )
+
+
+
+
+
+
Delete a nucleus from this clsuter.
+
Parameters
+
+ nucleus The nucleus to delete
+
+
+
+
Returns True if a nucleus was deleted, false if the nucleus could not be found
+
+
+
+
+
◆ CollectReceivers()
+
+
+
+
+
+
+
+
+ virtual List< Nucleus > NanoBrain.Cluster.CollectReceivers
+ (
+ bool
+ removeDuplicates = false)
+
+
+
+
+
+virtual
+
+
+
+
+
Collect all receiving nuclei of signals from this cluster.
+
Parameters
+
+ removeDuplicates Ensure that a receiver is only listed once in the result
+
+
+
+
Returns The list of receivers
+
+
+
+
+
◆ CollectSynapsesTo()
+
+
+
+
+
+ List< Synapse > NanoBrain.Cluster.CollectSynapsesTo
+ (
+ Cluster
+ otherCluster )
+
+
+
+
+
+
Collect all connections to receivers of signals from this cluster.
+
Returns A list of pairs of the sending neuron in this cluster and the matching receiving nucleus
+
Collect all synapses of senders in another cluster of signals to this cluster
+
Parameters
+
+ otherCluster The other cluster with sending neurons
+
+
+
+
Returns A list of synapses to the neurons in the other clusters
+
+
+
+
+
◆ UpdateFromNucleus()
+
+
+
+
+
+ void NanoBrain.Cluster.UpdateFromNucleus
+ (
+ Nucleus
+ startNucleus )
+
+
+
+
+
+
Update the state of the nucleus and all nuclei receiving from it.
+
Parameters
+
+ startNucleus The nucleus to start updating
+
+
+
+
+
+
+
+
◆ UpdateStateIsolated()
+
+
+
+
+
+ override void NanoBrain.Cluster.UpdateStateIsolated
+ (
+ )
+
+
+
+
+
+
Update the state without updating other Nuclei.
+
+
+
+
+
◆ Refresh()
+
+
+
+
+
+ void NanoBrain.Cluster.Refresh
+ (
+ )
+
+
+
+
+
+
Recalculate derived properties.
+
This can be used to recalculate derived properties after the set of nuclei has been changed
+
+
+
+
+
◆ UpdateNuclei()
+
+
+
+
+
+
+
+
+ virtual void NanoBrain.Nucleus.UpdateNuclei
+ (
+ )
+
+
+
+
+
+virtual inherited
+
+
+
+
+
Update the state and recursively all Nuclei receiving data from this Nucleus.
+
+
Reimplemented in NanoBrain.MemoryCell .
+
+
+
+
+
+
◆ prefab
+
+
+
+
+
The prefab used to create this cluster.
+
Cluster should always be created from prefabs
+
+
+
+
+
◆ instances
+
+
+
+
+
+ Cluster [] NanoBrain.Cluster.instances
+
+
+
+
+
All cluster instance of a multi-cluster.
+
A cluster is a multi-cluster when there is more than one instance. The actual instances are only created at runtime. The value instanceCount determines how many instances will be present at runtime.
+
+
+
+
+
◆ instanceCount
+
+
+
+
+
+ int NanoBrain.Cluster.instanceCount = 1
+
+
+
+
+
The number of cluster instances in a multi-cluster.
+
A cluster is a multi-clsuter when there is more than one instance.
+
+
+
+
+
◆ thingClusters
+
+
+
+
+
+ Dictionary<int, Cluster > NanoBrain.Cluster.thingClusters = new()
+
+
+
+
+
The mapping from things to cluster instances.
+
In a multi-cluster each instance can be used for a thing. Cluster instance may also not (yet) be mapped to a thing.
+
+
+
+
+
◆ _outputs
+
+
+
+
+
+
+
+
+ List<Neuron > NanoBrain.Cluster._outputs = null
+
+
+
+
+protected
+
+
+
+
+
The neurons without outgoing connections.
+
These neurons can potentially be connected to neurons in other clusters
+
+
+
+
+
◆ parent
+
+
+
+
+
+
+
+
+ Cluster NanoBrain.Nucleus.parent
+
+
+
+
+inherited
+
+
+
+
+
The cluster prefab in which the nucleus is located.
+
The cluster instance in which the nucleus is located
+
+
+
+
+
+
◆ outputs
+
+
+
+
+
+
+
+
+ List<Neuron > NanoBrain.Cluster.outputs
+
+
+
+
+get
+
+
+
+
+
The neurons without outgoing connections.
+
These neurons can potentially be connected to neurons in other clusters
+
+
+
+
The documentation for this class was generated from the following file:
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Cluster.cs
+
+
+
+
+
+
diff --git a/Documentation/html/class_nano_brain_1_1_cluster.html.meta b/Documentation/html/class_nano_brain_1_1_cluster.html.meta
new file mode 100644
index 0000000..e84b307
--- /dev/null
+++ b/Documentation/html/class_nano_brain_1_1_cluster.html.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: d883df8710f53b84da21f41d7c2eac46
+TextScriptImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Documentation/html/class_nano_brain_1_1_cluster.png b/Documentation/html/class_nano_brain_1_1_cluster.png
new file mode 100644
index 0000000..b808c35
Binary files /dev/null and b/Documentation/html/class_nano_brain_1_1_cluster.png differ
diff --git a/Documentation/html/class_nano_brain_1_1_cluster.png.meta b/Documentation/html/class_nano_brain_1_1_cluster.png.meta
new file mode 100644
index 0000000..632f19f
--- /dev/null
+++ b/Documentation/html/class_nano_brain_1_1_cluster.png.meta
@@ -0,0 +1,117 @@
+fileFormatVersion: 2
+guid: 3878265f9758bf721932a8e8dd4356db
+TextureImporter:
+ internalIDToNameTable: []
+ externalObjects: {}
+ serializedVersion: 13
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 1
+ sRGBTexture: 1
+ linearTexture: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapsPreserveCoverage: 0
+ alphaTestReferenceValue: 0.5
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ flipGreenChannel: 0
+ isReadable: 0
+ streamingMipmaps: 0
+ streamingMipmapsPriority: 0
+ vTOnly: 0
+ ignoreMipmapLimit: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 6
+ cubemapConvolution: 0
+ seamlessCubemap: 0
+ textureFormat: 1
+ maxTextureSize: 2048
+ textureSettings:
+ serializedVersion: 2
+ filterMode: 1
+ aniso: 1
+ mipBias: 0
+ wrapU: 0
+ wrapV: 0
+ wrapW: 0
+ nPOTScale: 1
+ lightmap: 0
+ compressionQuality: 50
+ spriteMode: 0
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: 0.5, y: 0.5}
+ spritePixelsToUnits: 100
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spriteGenerateFallbackPhysicsShape: 1
+ alphaUsage: 1
+ alphaIsTransparency: 0
+ spriteTessellationDetail: -1
+ textureType: 0
+ textureShape: 1
+ singleChannelComponent: 0
+ flipbookRows: 1
+ flipbookColumns: 1
+ maxTextureSizeSet: 0
+ compressionQualitySet: 0
+ textureFormatSet: 0
+ ignorePngGamma: 0
+ applyGammaDecoding: 0
+ swizzle: 50462976
+ cookieLightType: 0
+ platformSettings:
+ - serializedVersion: 4
+ buildTarget: DefaultTexturePlatform
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: Standalone
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ spriteSheet:
+ serializedVersion: 2
+ sprites: []
+ outline: []
+ customData:
+ physicsShape: []
+ bones: []
+ spriteID:
+ internalID: 0
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ secondaryTextures: []
+ spriteCustomMetadata:
+ entries: []
+ nameFileIdTable: {}
+ mipmapLimitGroupName:
+ pSDRemoveMatte: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Documentation/html/class_nano_brain_1_1_cluster_prefab-members.html b/Documentation/html/class_nano_brain_1_1_cluster_prefab-members.html
new file mode 100644
index 0000000..6346ec2
--- /dev/null
+++ b/Documentation/html/class_nano_brain_1_1_cluster_prefab-members.html
@@ -0,0 +1,94 @@
+
+
+
+
+
+
+
+Nano Brain for Unity: Member List
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Nano Brain for Unity v0.1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+
+
+
+
+
+
+
This is the complete list of members for NanoBrain.ClusterPrefab , including all inherited members.
+
+
+
+
+
diff --git a/Documentation/html/class_nano_brain_1_1_cluster_prefab-members.html.meta b/Documentation/html/class_nano_brain_1_1_cluster_prefab-members.html.meta
new file mode 100644
index 0000000..22eca56
--- /dev/null
+++ b/Documentation/html/class_nano_brain_1_1_cluster_prefab-members.html.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: d62eadc52c471f7a6895cb870994bece
+TextScriptImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Documentation/html/class_nano_brain_1_1_cluster_prefab.html b/Documentation/html/class_nano_brain_1_1_cluster_prefab.html
new file mode 100644
index 0000000..a532610
--- /dev/null
+++ b/Documentation/html/class_nano_brain_1_1_cluster_prefab.html
@@ -0,0 +1,145 @@
+
+
+
+
+
+
+
+Nano Brain for Unity: NanoBrain.ClusterPrefab Class Reference
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Nano Brain for Unity v0.1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+
+
+
+
+
+
+
The Unity ScriptableObject to implement re-usable Cluster Prefabs.
+
+
Inherits ScriptableObject.
+
+
+Nucleus GetNucleus (string nucleusName)
+ Retrieve a nucleus in this cluster.
+
+
+void EnsureInitialization ()
+
+
+void GarbageCollection ()
+
+
+
+
+
◆ GetNucleus()
+
+
+
+
+
+ Nucleus NanoBrain.ClusterPrefab.GetNucleus
+ (
+ string
+ nucleusName )
+
+
+
+
+
+
Retrieve a nucleus in this cluster.
+
Parameters
+
+ nucleusName The name of the nucleus
+
+
+
+
Returns The Nucleus with the given name or null if no such Nucleus could be found
+
+
+
+
The documentation for this class was generated from the following file:
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/ScriptableObjects/ClusterPrefab.cs
+
+
+
+
+
+
diff --git a/Documentation/html/class_nano_brain_1_1_cluster_prefab.html.meta b/Documentation/html/class_nano_brain_1_1_cluster_prefab.html.meta
new file mode 100644
index 0000000..5e321e4
--- /dev/null
+++ b/Documentation/html/class_nano_brain_1_1_cluster_prefab.html.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: ae719a769b822db4ca83831d25c49276
+TextScriptImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Documentation/html/class_nano_brain_1_1_memory_cell-members.html b/Documentation/html/class_nano_brain_1_1_memory_cell-members.html
new file mode 100644
index 0000000..b030598
--- /dev/null
+++ b/Documentation/html/class_nano_brain_1_1_memory_cell-members.html
@@ -0,0 +1,155 @@
+
+
+
+
+
+
+
+Nano Brain for Unity: Member List
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Nano Brain for Unity v0.1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+
+
+
+
+
+
+
This is the complete list of members for NanoBrain.MemoryCell , including all inherited members.
+
+
+
+
+
diff --git a/Documentation/html/class_nano_brain_1_1_memory_cell-members.html.meta b/Documentation/html/class_nano_brain_1_1_memory_cell-members.html.meta
new file mode 100644
index 0000000..3e7465c
--- /dev/null
+++ b/Documentation/html/class_nano_brain_1_1_memory_cell-members.html.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: d9a689a3c38bd27d28e94b7fe1865ffd
+TextScriptImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Documentation/html/class_nano_brain_1_1_memory_cell.html b/Documentation/html/class_nano_brain_1_1_memory_cell.html
new file mode 100644
index 0000000..41baf4a
--- /dev/null
+++ b/Documentation/html/class_nano_brain_1_1_memory_cell.html
@@ -0,0 +1,687 @@
+
+
+
+
+
+
+
+Nano Brain for Unity: NanoBrain.MemoryCell Class Reference
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Nano Brain for Unity v0.1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+
+
+
+
+
+
+
A MemoryCell stored its value for one update.
+
When the input for a Memory Cell changes, it will output the previous value
+
+
+
+
+
+
+
+
+
+
+
+
+enum CombinatorType { Sum
+, Product
+ }
+ The type of combinators. More...
+
+ enum ActivationType {
+ Linear
+, Power
+, Sqrt
+, Reciprocal
+,
+ Tanh
+, Binary
+, Normalized
+, Custom
+
+ }
+ The type of.
+
+enum Type { None
+, Neuron
+, MemoryCell
+, Cluster
+ }
+ Function to clone a nucleus to a Cluster prefab. More...
+
+
+
+
+ MemoryCell (Cluster parent , string name )
+
+
+override Nucleus ShallowCloneTo (Cluster newParent)
+
+
+override void UpdateStateIsolated ()
+
+override void UpdateNuclei ()
+ Update the state and recursively all Nuclei receiving data from this Nucleus.
+
+Synapse AddSynapse (Neuron sendingNucleus, float weight=1)
+ Add a new synapse to this nuclues.
+
+Synapse GetSynapse (Nucleus sender)
+ Find a synapse.
+
+void RemoveSynapse (Nucleus sendingNucleus)
+ Remove a synapse from a Nucleus.
+
+virtual void SetBias (Vector3 inputValue)
+ Set the bias, recalculate the output and update all Nuclei receiving from this Nucleus.
+
+
+AnimationCurve GenerateCurve ()
+
+
+void SleepCheck ()
+
+
+float3 CombinatorSum ()
+
+
+Vector3 CombinatorSum ()
+
+
+float3 CombinatorProduct ()
+
+
+Vector3 CombinatorProduct ()
+
+
+Vector3 CombinatorMax ()
+
+
+virtual void AddReceiver (Nucleus receiverToAdd, float weight=1)
+
+
+virtual void RemoveReceiver (Nucleus receiverToRemove)
+
+virtual void ProcessStimulus (Vector3 inputValue)
+ Process an external stimulus.
+
+
+
+
+static void Delete (Nucleus nucleus)
+
+
+
+
+bool staticMemory = false
+
+Vector3 bias = Vector3.zero
+ Create a new Neuron in a Cluster Prefab.
+
+
+CombinatorType combinator = CombinatorType.Sum
+ The type of combinator used for this Neuron.
+
+
+ActivationType _curvePreset
+
+
+AnimationCurve curve
+
+
+float curveMax = 1.0f
+
+
+Action WhenFiring
+
+
+bool persistOutput = false
+
+
+float lastUpdate = 0
+ Toggle for printing debugging trace data.
+
+
+readonly float timeToSleep = 1f
+
+
+string name
+ The name of the Nucleus.
+
+Cluster parent
+ The cluster prefab in which the nucleus is located.
+
+
+
+
+virtual void CloneFields (Neuron clone)
+
+
+void CheckSleepingSynapses ()
+
+
+float3 ActivatorLinear (float3 input)
+
+
+Vector3 ActivatorLinear (Vector3 input)
+
+
+float3 ActivatorSqrt (float3 input)
+
+
+Vector3 ActivatorSqrt (Vector3 input)
+
+
+float3 ActivatorPower (float3 input)
+
+
+Vector3 ActivatorPower (Vector3 input)
+
+
+float3 ActivatorReciprocal (float3 input)
+
+
+Vector3 ActivatorReciprocal (Vector3 input)
+
+
+float3 ActivatorTanh (float3 input)
+
+
+float3 ActivatorBinary (float3 input)
+
+
+float3 ActivatorNormalized (float3 input)
+
+
+float3 ActivatorCustom (float3 input)
+
+
+Vector3 ActivatorCustom (Vector3 input)
+
+
+
+
+float3 _outputValue
+
+
+Vector3 _outputValue
+
+
+
+
+override bool isSleeping [get]
+
+
+List< Synapse > synapses [get]
+ The synapses of the nucleus.
+
+
+ActivationType curvePreset [get, set]
+
+
+virtual float3 outputValue [get, set]
+
+
+virtual Vector3 outputValue [get, set]
+
+
+float outputMagnitude [get]
+
+
+float outputSqrMagnitude [get]
+
+
+bool isFiring [get]
+
+
+Func< float3 > Combinator [get]
+
+
+Func< Vector3 > Combinator [get]
+
+
+Func< float3, float3 > Activator [get]
+
+
+Func< Vector3, Vector3 > Activator [get]
+
+
+virtual List< Nucleus > receivers [get, set]
+
+
+
+
+
◆ CombinatorType
+
+
+
+
+
The type of combinators.
+
A combinator combines the weighted values of the synapses to a single value
+
+Enumerator Sum Add the weighted values together.
+
+ Product Multiply the weighted values.
+
+
+
+
+
+
+
◆ Type
+
+
+
+
+
Function to clone a nucleus to a Cluster prefab.
+
Parameters
+
+
+
+
Returns
+
The types of Nucleus
+
+
+
+
+
+
◆ UpdateNuclei()
+
+
+
+
+
+
+
+
+ override void NanoBrain.MemoryCell.UpdateNuclei
+ (
+ )
+
+
+
+
+
+virtual
+
+
+
+
+
Update the state and recursively all Nuclei receiving data from this Nucleus.
+
+
Reimplemented from NanoBrain.Nucleus .
+
+
+
+
+
◆ AddSynapse()
+
+
+
+
+
+
+
+
+ Synapse NanoBrain.Neuron.AddSynapse
+ (
+ Neuron
+ sendingNucleus ,
+
+
+
+
+ float
+ weight = 1
+
+
+
+ )
+
+
+
+
+
+inherited
+
+
+
+
+
Add a new synapse to this nuclues.
+
Parameters
+
+ sendingNucleus The nucleus from which the signals may originate
+ weight The weight applied to the input. Default value = 1
+
+
+
+
Returns The created Synapse
+
This will add a new input to this nucleus with the given weight.
+
+
+
+
+
◆ GetSynapse()
+
+
+
+
+
Find a synapse.
+
Parameters
+
+ sender The sender of the input to the Synapse
+
+
+
+
Returns The found Synapse or null when the sender has no synapse to this nucleus.
+
+
+
+
+
◆ RemoveSynapse()
+
+
+
+
+
+
+
+
+ void NanoBrain.Neuron.RemoveSynapse
+ (
+ Nucleus
+ sendingNucleus )
+
+
+
+
+
+inherited
+
+
+
+
+
Remove a synapse from a Nucleus.
+
Parameters
+
+ sendingNucleus Remote the synapse connecting to this Nucleus
+
+
+
+
+
+
+
+
◆ SetBias()
+
+
+
+
+
+
+
+
+ virtual void NanoBrain.Neuron.SetBias
+ (
+ Vector3
+ inputValue )
+
+
+
+
+
+virtual inherited
+
+
+
+
+
Set the bias, recalculate the output and update all Nuclei receiving from this Nucleus.
+
Parameters
+
+
+
+
+
+
+
+
◆ ProcessStimulus()
+
+
+
+
+
+
+
+
+ virtual void NanoBrain.Neuron.ProcessStimulus
+ (
+ Vector3
+ inputValue )
+
+
+
+
+
+virtual inherited
+
+
+
+
+
Process an external stimulus.
+
Parameters
+
+ inputValue The value of the stimulus
+ thingId The id of the thing causing the stimulus
+ thingName The name of the thing causing the stimulus
+
+
+
+
+
+
+
+
+
◆ bias
+
+
+
+
+
+
+
+
+ Vector3 NanoBrain.Neuron.bias = Vector3.zero
+
+
+
+
+inherited
+
+
+
+
+
Create a new Neuron in a Cluster Prefab.
+
Parameters
+
+ prefab The Cluster Preafb in which the new Neuron should be created
+ name The name of the new Neuron
+
+
+
+
The bias
+
The bias which a value which is always added to the combined value of the neuron It does not have a synapse and therefore no weight of source nucleus
+
+
+
+
+
◆ parent
+
+
+
+
+
+
+
+
+ Cluster NanoBrain.Nucleus.parent
+
+
+
+
+inherited
+
+
+
+
+
The cluster prefab in which the nucleus is located.
+
The cluster instance in which the nucleus is located
+
+
+
+
The documentation for this class was generated from the following file:
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/MemoryCell.cs
+
+
+
+
+
+
diff --git a/Documentation/html/class_nano_brain_1_1_memory_cell.html.meta b/Documentation/html/class_nano_brain_1_1_memory_cell.html.meta
new file mode 100644
index 0000000..2f17bed
--- /dev/null
+++ b/Documentation/html/class_nano_brain_1_1_memory_cell.html.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: ffd30c6234d869c9d94518fcb20604bb
+TextScriptImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Documentation/html/class_nano_brain_1_1_memory_cell.png b/Documentation/html/class_nano_brain_1_1_memory_cell.png
new file mode 100644
index 0000000..9fc1c66
Binary files /dev/null and b/Documentation/html/class_nano_brain_1_1_memory_cell.png differ
diff --git a/Documentation/html/class_nano_brain_1_1_memory_cell.png.meta b/Documentation/html/class_nano_brain_1_1_memory_cell.png.meta
new file mode 100644
index 0000000..bd2b2f8
--- /dev/null
+++ b/Documentation/html/class_nano_brain_1_1_memory_cell.png.meta
@@ -0,0 +1,117 @@
+fileFormatVersion: 2
+guid: 97d984c9627ec94b49e6a7178691389c
+TextureImporter:
+ internalIDToNameTable: []
+ externalObjects: {}
+ serializedVersion: 13
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 1
+ sRGBTexture: 1
+ linearTexture: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapsPreserveCoverage: 0
+ alphaTestReferenceValue: 0.5
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ flipGreenChannel: 0
+ isReadable: 0
+ streamingMipmaps: 0
+ streamingMipmapsPriority: 0
+ vTOnly: 0
+ ignoreMipmapLimit: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 6
+ cubemapConvolution: 0
+ seamlessCubemap: 0
+ textureFormat: 1
+ maxTextureSize: 2048
+ textureSettings:
+ serializedVersion: 2
+ filterMode: 1
+ aniso: 1
+ mipBias: 0
+ wrapU: 0
+ wrapV: 0
+ wrapW: 0
+ nPOTScale: 1
+ lightmap: 0
+ compressionQuality: 50
+ spriteMode: 0
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: 0.5, y: 0.5}
+ spritePixelsToUnits: 100
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spriteGenerateFallbackPhysicsShape: 1
+ alphaUsage: 1
+ alphaIsTransparency: 0
+ spriteTessellationDetail: -1
+ textureType: 0
+ textureShape: 1
+ singleChannelComponent: 0
+ flipbookRows: 1
+ flipbookColumns: 1
+ maxTextureSizeSet: 0
+ compressionQualitySet: 0
+ textureFormatSet: 0
+ ignorePngGamma: 0
+ applyGammaDecoding: 0
+ swizzle: 50462976
+ cookieLightType: 0
+ platformSettings:
+ - serializedVersion: 4
+ buildTarget: DefaultTexturePlatform
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: Standalone
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ spriteSheet:
+ serializedVersion: 2
+ sprites: []
+ outline: []
+ customData:
+ physicsShape: []
+ bones: []
+ spriteID:
+ internalID: 0
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ secondaryTextures: []
+ spriteCustomMetadata:
+ entries: []
+ nameFileIdTable: {}
+ mipmapLimitGroupName:
+ pSDRemoveMatte: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Documentation/html/class_nano_brain_1_1_neuron-members.html b/Documentation/html/class_nano_brain_1_1_neuron-members.html
new file mode 100644
index 0000000..e07f2b8
--- /dev/null
+++ b/Documentation/html/class_nano_brain_1_1_neuron-members.html
@@ -0,0 +1,153 @@
+
+
+
+
+
+
+
+Nano Brain for Unity: Member List
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Nano Brain for Unity v0.1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+
+
+
+
+
+
+
This is the complete list of members for NanoBrain.Neuron , including all inherited members.
+
+
+
+
+
diff --git a/Documentation/html/class_nano_brain_1_1_neuron-members.html.meta b/Documentation/html/class_nano_brain_1_1_neuron-members.html.meta
new file mode 100644
index 0000000..49e8daa
--- /dev/null
+++ b/Documentation/html/class_nano_brain_1_1_neuron-members.html.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: a111018414f6d529ebcd4b286ab52dfa
+TextScriptImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Documentation/html/class_nano_brain_1_1_neuron.html b/Documentation/html/class_nano_brain_1_1_neuron.html
new file mode 100644
index 0000000..90365be
--- /dev/null
+++ b/Documentation/html/class_nano_brain_1_1_neuron.html
@@ -0,0 +1,708 @@
+
+
+
+
+
+
+
+Nano Brain for Unity: NanoBrain.Neuron Class Reference
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Nano Brain for Unity v0.1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+
+
+
+
+
+
+
A neuron is a basic Nucleus.
+
+
+
+
+
+
+
+
+
+
+
+enum CombinatorType { Sum
+, Product
+ }
+ The type of combinators. More...
+
+ enum ActivationType {
+ Linear
+, Power
+, Sqrt
+, Reciprocal
+,
+ Tanh
+, Binary
+, Normalized
+, Custom
+
+ }
+ The type of.
+
+enum Type { None
+, Neuron
+, MemoryCell
+, Cluster
+ }
+ Function to clone a nucleus to a Cluster prefab. More...
+
+
+
+ Neuron (Cluster parent , string name )
+ Create a new Neuron in a Cluster instance.
+
+Synapse AddSynapse (Neuron sendingNucleus, float weight=1)
+ Add a new synapse to this nuclues.
+
+Synapse GetSynapse (Nucleus sender)
+ Find a synapse.
+
+void RemoveSynapse (Nucleus sendingNucleus)
+ Remove a synapse from a Nucleus.
+
+virtual void SetBias (Vector3 inputValue)
+ Set the bias, recalculate the output and update all Nuclei receiving from this Nucleus.
+
+
+AnimationCurve GenerateCurve ()
+
+
+void SleepCheck ()
+
+override Nucleus ShallowCloneTo (Cluster newParent)
+ Toggle for printing debugging trace data.
+
+
+override void UpdateStateIsolated ()
+
+
+float3 CombinatorSum ()
+
+
+float3 CombinatorProduct ()
+
+
+Vector3 CombinatorSum ()
+
+
+Vector3 CombinatorProduct ()
+
+
+Vector3 CombinatorMax ()
+
+
+virtual void AddReceiver (Nucleus receiverToAdd, float weight=1)
+
+
+virtual void RemoveReceiver (Nucleus receiverToRemove)
+
+virtual void ProcessStimulus (Vector3 inputValue)
+ Process an external stimulus.
+
+virtual void UpdateNuclei ()
+ Update the state and recursively all Nuclei receiving data from this Nucleus.
+
+
+
+
+static void Delete (Nucleus nucleus)
+
+
+
+Vector3 bias = Vector3.zero
+ Create a new Neuron in a Cluster Prefab.
+
+
+CombinatorType combinator = CombinatorType.Sum
+ The type of combinator used for this Neuron.
+
+
+ActivationType _curvePreset
+
+
+AnimationCurve curve
+
+
+float curveMax = 1.0f
+
+
+Action WhenFiring
+
+
+bool persistOutput = false
+
+
+float lastUpdate = 0
+ Toggle for printing debugging trace data.
+
+
+readonly float timeToSleep = 1f
+
+
+string name
+ The name of the Nucleus.
+
+Cluster parent
+ The cluster prefab in which the nucleus is located.
+
+
+
+
+virtual void CloneFields (Neuron clone)
+
+
+void CheckSleepingSynapses ()
+
+
+float3 ActivatorLinear (float3 input)
+
+
+float3 ActivatorSqrt (float3 input)
+
+
+float3 ActivatorPower (float3 input)
+
+
+float3 ActivatorReciprocal (float3 input)
+
+
+float3 ActivatorTanh (float3 input)
+
+
+float3 ActivatorBinary (float3 input)
+
+
+float3 ActivatorNormalized (float3 input)
+
+
+float3 ActivatorCustom (float3 input)
+
+
+Vector3 ActivatorLinear (Vector3 input)
+
+
+Vector3 ActivatorSqrt (Vector3 input)
+
+
+Vector3 ActivatorPower (Vector3 input)
+
+
+Vector3 ActivatorReciprocal (Vector3 input)
+
+
+Vector3 ActivatorCustom (Vector3 input)
+
+
+
+
+float3 _outputValue
+
+
+Vector3 _outputValue
+
+
+
+
+List< Synapse > synapses [get]
+ The synapses of the nucleus.
+
+
+ActivationType curvePreset [get, set]
+
+
+virtual float3 outputValue [get, set]
+
+
+float outputMagnitude [get]
+
+
+float outputSqrMagnitude [get]
+
+
+virtual Vector3 outputValue [get, set]
+
+
+bool isFiring [get]
+
+
+virtual bool isSleeping [get]
+
+
+Func< float3 > Combinator [get]
+
+
+Func< Vector3 > Combinator [get]
+
+
+Func< float3, float3 > Activator [get]
+
+
+Func< Vector3, Vector3 > Activator [get]
+
+
+virtual List< Nucleus > receivers [get, set]
+
+
+
+
+
◆ CombinatorType
+
+
+
+
+
The type of combinators.
+
A combinator combines the weighted values of the synapses to a single value
+
+Enumerator Sum Add the weighted values together.
+
+ Product Multiply the weighted values.
+
+
+
+
+
+
+
◆ Type
+
+
+
+
+
Function to clone a nucleus to a Cluster prefab.
+
Parameters
+
+
+
+
Returns
+
The types of Nucleus
+
+
+
+
+
+
◆ Neuron()
+
+
+
+
+
+ NanoBrain.Neuron.Neuron
+ (
+ Cluster
+ parent ,
+
+
+
+
+ string
+ name
+
+
+
+ )
+
+
+
+
+
+
Create a new Neuron in a Cluster instance.
+
Parameters
+
+ parent The parent cluster in which the new Neuron should be created
+ name The name of the new Neuron
+
+
+
+
+
+
+
+
+
◆ AddSynapse()
+
+
+
+
+
+ Synapse NanoBrain.Neuron.AddSynapse
+ (
+ Neuron
+ sendingNucleus ,
+
+
+
+
+ float
+ weight = 1
+
+
+
+ )
+
+
+
+
+
+
Add a new synapse to this nuclues.
+
Parameters
+
+ sendingNucleus The nucleus from which the signals may originate
+ weight The weight applied to the input. Default value = 1
+
+
+
+
Returns The created Synapse
+
This will add a new input to this nucleus with the given weight.
+
+
+
+
+
◆ GetSynapse()
+
+
+
+
+
Find a synapse.
+
Parameters
+
+ sender The sender of the input to the Synapse
+
+
+
+
Returns The found Synapse or null when the sender has no synapse to this nucleus.
+
+
+
+
+
◆ RemoveSynapse()
+
+
+
+
+
+ void NanoBrain.Neuron.RemoveSynapse
+ (
+ Nucleus
+ sendingNucleus )
+
+
+
+
+
+
Remove a synapse from a Nucleus.
+
Parameters
+
+ sendingNucleus Remote the synapse connecting to this Nucleus
+
+
+
+
+
+
+
+
◆ SetBias()
+
+
+
+
+
+
+
+
+ virtual void NanoBrain.Neuron.SetBias
+ (
+ Vector3
+ inputValue )
+
+
+
+
+
+virtual
+
+
+
+
+
Set the bias, recalculate the output and update all Nuclei receiving from this Nucleus.
+
Parameters
+
+
+
+
+
+
+
+
◆ ShallowCloneTo()
+
+
+
+
+
+ override Nucleus NanoBrain.Neuron.ShallowCloneTo
+ (
+ Cluster
+ newParent )
+
+
+
+
+
+
Toggle for printing debugging trace data.
+
Function to make a partial clone of this nucleus
+
Parameters
+
+ parent The cluster in which the cloned nucleus should be placed
+
+
+
+
Returns
+
+
+
+
+
◆ ProcessStimulus()
+
+
+
+
+
+
+
+
+ virtual void NanoBrain.Neuron.ProcessStimulus
+ (
+ Vector3
+ inputValue )
+
+
+
+
+
+virtual
+
+
+
+
+
Process an external stimulus.
+
Parameters
+
+ inputValue The value of the stimulus
+ thingId The id of the thing causing the stimulus
+ thingName The name of the thing causing the stimulus
+
+
+
+
+
+
+
+
◆ UpdateNuclei()
+
+
+
+
+
+
+
+
+ virtual void NanoBrain.Nucleus.UpdateNuclei
+ (
+ )
+
+
+
+
+
+virtual inherited
+
+
+
+
+
Update the state and recursively all Nuclei receiving data from this Nucleus.
+
+
Reimplemented in NanoBrain.MemoryCell .
+
+
+
+
+
+
◆ bias
+
+
+
+
+
+ Vector3 NanoBrain.Neuron.bias = Vector3.zero
+
+
+
+
+
Create a new Neuron in a Cluster Prefab.
+
Parameters
+
+ prefab The Cluster Preafb in which the new Neuron should be created
+ name The name of the new Neuron
+
+
+
+
The bias
+
The bias which a value which is always added to the combined value of the neuron It does not have a synapse and therefore no weight of source nucleus
+
+
+
+
+
◆ parent
+
+
+
+
+
+
+
+
+ Cluster NanoBrain.Nucleus.parent
+
+
+
+
+inherited
+
+
+
+
+
The cluster prefab in which the nucleus is located.
+
The cluster instance in which the nucleus is located
+
+
+
+
The documentation for this class was generated from the following file:
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs
+
+
+
+
+
+
diff --git a/Documentation/html/class_nano_brain_1_1_neuron.html.meta b/Documentation/html/class_nano_brain_1_1_neuron.html.meta
new file mode 100644
index 0000000..7b0bc5a
--- /dev/null
+++ b/Documentation/html/class_nano_brain_1_1_neuron.html.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 7871287615b5cde18932faa30404d970
+TextScriptImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Documentation/html/class_nano_brain_1_1_neuron.png b/Documentation/html/class_nano_brain_1_1_neuron.png
new file mode 100644
index 0000000..49d8eae
Binary files /dev/null and b/Documentation/html/class_nano_brain_1_1_neuron.png differ
diff --git a/Documentation/html/class_nano_brain_1_1_neuron.png.meta b/Documentation/html/class_nano_brain_1_1_neuron.png.meta
new file mode 100644
index 0000000..f98c5d4
--- /dev/null
+++ b/Documentation/html/class_nano_brain_1_1_neuron.png.meta
@@ -0,0 +1,117 @@
+fileFormatVersion: 2
+guid: b1154d0738a8e2c8db9ccdfc6cf0ea22
+TextureImporter:
+ internalIDToNameTable: []
+ externalObjects: {}
+ serializedVersion: 13
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 1
+ sRGBTexture: 1
+ linearTexture: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapsPreserveCoverage: 0
+ alphaTestReferenceValue: 0.5
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ flipGreenChannel: 0
+ isReadable: 0
+ streamingMipmaps: 0
+ streamingMipmapsPriority: 0
+ vTOnly: 0
+ ignoreMipmapLimit: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 6
+ cubemapConvolution: 0
+ seamlessCubemap: 0
+ textureFormat: 1
+ maxTextureSize: 2048
+ textureSettings:
+ serializedVersion: 2
+ filterMode: 1
+ aniso: 1
+ mipBias: 0
+ wrapU: 0
+ wrapV: 0
+ wrapW: 0
+ nPOTScale: 1
+ lightmap: 0
+ compressionQuality: 50
+ spriteMode: 0
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: 0.5, y: 0.5}
+ spritePixelsToUnits: 100
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spriteGenerateFallbackPhysicsShape: 1
+ alphaUsage: 1
+ alphaIsTransparency: 0
+ spriteTessellationDetail: -1
+ textureType: 0
+ textureShape: 1
+ singleChannelComponent: 0
+ flipbookRows: 1
+ flipbookColumns: 1
+ maxTextureSizeSet: 0
+ compressionQualitySet: 0
+ textureFormatSet: 0
+ ignorePngGamma: 0
+ applyGammaDecoding: 0
+ swizzle: 50462976
+ cookieLightType: 0
+ platformSettings:
+ - serializedVersion: 4
+ buildTarget: DefaultTexturePlatform
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: Standalone
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ spriteSheet:
+ serializedVersion: 2
+ sprites: []
+ outline: []
+ customData:
+ physicsShape: []
+ bones: []
+ spriteID:
+ internalID: 0
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ secondaryTextures: []
+ spriteCustomMetadata:
+ entries: []
+ nameFileIdTable: {}
+ mipmapLimitGroupName:
+ pSDRemoveMatte: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Documentation/html/class_nano_brain_1_1_nucleus-members.html b/Documentation/html/class_nano_brain_1_1_nucleus-members.html
new file mode 100644
index 0000000..5a6ac49
--- /dev/null
+++ b/Documentation/html/class_nano_brain_1_1_nucleus-members.html
@@ -0,0 +1,96 @@
+
+
+
+
+
+
+
+Nano Brain for Unity: Member List
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Nano Brain for Unity v0.1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+
+
+
+
+
+
+
This is the complete list of members for NanoBrain.Nucleus , including all inherited members.
+
+
+
+
+
diff --git a/Documentation/html/class_nano_brain_1_1_nucleus-members.html.meta b/Documentation/html/class_nano_brain_1_1_nucleus-members.html.meta
new file mode 100644
index 0000000..be2fda4
--- /dev/null
+++ b/Documentation/html/class_nano_brain_1_1_nucleus-members.html.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 10ed020f41822a80c9d9e1126c67c937
+TextScriptImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Documentation/html/class_nano_brain_1_1_nucleus.html b/Documentation/html/class_nano_brain_1_1_nucleus.html
new file mode 100644
index 0000000..f289aeb
--- /dev/null
+++ b/Documentation/html/class_nano_brain_1_1_nucleus.html
@@ -0,0 +1,251 @@
+
+
+
+
+
+
+
+Nano Brain for Unity: NanoBrain.Nucleus Class Reference
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Nano Brain for Unity v0.1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+
+
+
+
+
+
+
A Nucleus is a basic element in a brain cluster.
+
+
+
+
+
+
+
+
+
+
+
+
+enum Type { None
+, Neuron
+, MemoryCell
+, Cluster
+ }
+ Function to clone a nucleus to a Cluster prefab. More...
+
+
+
+Nucleus ShallowCloneTo (Cluster parent )
+ Toggle for printing debugging trace data.
+
+
+void UpdateStateIsolated ()
+ Update the state without updating other Nuclei.
+
+virtual void UpdateNuclei ()
+ Update the state and recursively all Nuclei receiving data from this Nucleus.
+
+
+
+
+string name
+ The name of the Nucleus.
+
+Cluster parent
+ The cluster prefab in which the nucleus is located.
+
+
+
+
+
◆ Type
+
+
+
+
+
Function to clone a nucleus to a Cluster prefab.
+
Parameters
+
+
+
+
Returns
+
The types of Nucleus
+
+
+
+
+
+
◆ ShallowCloneTo()
+
+
+
+
+
+
+
+
+ Nucleus NanoBrain.Nucleus.ShallowCloneTo
+ (
+ Cluster
+ parent )
+
+
+
+
+
+abstract
+
+
+
+
+
Toggle for printing debugging trace data.
+
Function to make a partial clone of this nucleus
+
Parameters
+
+ parent The cluster in which the cloned nucleus should be placed
+
+
+
+
Returns
+
+
+
+
+
◆ UpdateNuclei()
+
+
+
+
+
+
+
+
+ virtual void NanoBrain.Nucleus.UpdateNuclei
+ (
+ )
+
+
+
+
+
+virtual
+
+
+
+
+
Update the state and recursively all Nuclei receiving data from this Nucleus.
+
+
Reimplemented in NanoBrain.MemoryCell .
+
+
+
+
+
+
◆ parent
+
+
+
+
+
+ Cluster NanoBrain.Nucleus.parent
+
+
+
+
+
The cluster prefab in which the nucleus is located.
+
The cluster instance in which the nucleus is located
+
+
+
+
The documentation for this class was generated from the following file:
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Nucleus.cs
+
+
+
+
+
+
diff --git a/Documentation/html/class_nano_brain_1_1_nucleus.html.meta b/Documentation/html/class_nano_brain_1_1_nucleus.html.meta
new file mode 100644
index 0000000..27af6b5
--- /dev/null
+++ b/Documentation/html/class_nano_brain_1_1_nucleus.html.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 26e7ab58944014c90ac92694c09f8d9d
+TextScriptImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Documentation/html/class_nano_brain_1_1_nucleus.png b/Documentation/html/class_nano_brain_1_1_nucleus.png
new file mode 100644
index 0000000..1433a13
Binary files /dev/null and b/Documentation/html/class_nano_brain_1_1_nucleus.png differ
diff --git a/Documentation/html/class_nano_brain_1_1_nucleus.png.meta b/Documentation/html/class_nano_brain_1_1_nucleus.png.meta
new file mode 100644
index 0000000..e4bb6c0
--- /dev/null
+++ b/Documentation/html/class_nano_brain_1_1_nucleus.png.meta
@@ -0,0 +1,117 @@
+fileFormatVersion: 2
+guid: b35c7cf86cbf03b1c93eae644d264e85
+TextureImporter:
+ internalIDToNameTable: []
+ externalObjects: {}
+ serializedVersion: 13
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 1
+ sRGBTexture: 1
+ linearTexture: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapsPreserveCoverage: 0
+ alphaTestReferenceValue: 0.5
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ flipGreenChannel: 0
+ isReadable: 0
+ streamingMipmaps: 0
+ streamingMipmapsPriority: 0
+ vTOnly: 0
+ ignoreMipmapLimit: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 6
+ cubemapConvolution: 0
+ seamlessCubemap: 0
+ textureFormat: 1
+ maxTextureSize: 2048
+ textureSettings:
+ serializedVersion: 2
+ filterMode: 1
+ aniso: 1
+ mipBias: 0
+ wrapU: 0
+ wrapV: 0
+ wrapW: 0
+ nPOTScale: 1
+ lightmap: 0
+ compressionQuality: 50
+ spriteMode: 0
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: 0.5, y: 0.5}
+ spritePixelsToUnits: 100
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spriteGenerateFallbackPhysicsShape: 1
+ alphaUsage: 1
+ alphaIsTransparency: 0
+ spriteTessellationDetail: -1
+ textureType: 0
+ textureShape: 1
+ singleChannelComponent: 0
+ flipbookRows: 1
+ flipbookColumns: 1
+ maxTextureSizeSet: 0
+ compressionQualitySet: 0
+ textureFormatSet: 0
+ ignorePngGamma: 0
+ applyGammaDecoding: 0
+ swizzle: 50462976
+ cookieLightType: 0
+ platformSettings:
+ - serializedVersion: 4
+ buildTarget: DefaultTexturePlatform
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: Standalone
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ spriteSheet:
+ serializedVersion: 2
+ sprites: []
+ outline: []
+ customData:
+ physicsShape: []
+ bones: []
+ spriteID:
+ internalID: 0
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ secondaryTextures: []
+ spriteCustomMetadata:
+ entries: []
+ nameFileIdTable: {}
+ mipmapLimitGroupName:
+ pSDRemoveMatte: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Documentation/html/class_nano_brain_1_1_synapse-members.html b/Documentation/html/class_nano_brain_1_1_synapse-members.html
new file mode 100644
index 0000000..7e49574
--- /dev/null
+++ b/Documentation/html/class_nano_brain_1_1_synapse-members.html
@@ -0,0 +1,94 @@
+
+
+
+
+
+
+
+Nano Brain for Unity: Member List
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Nano Brain for Unity v0.1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+
+
+
+
+
+
+
This is the complete list of members for NanoBrain.Synapse , including all inherited members.
+
+
+
+
+
diff --git a/Documentation/html/class_nano_brain_1_1_synapse-members.html.meta b/Documentation/html/class_nano_brain_1_1_synapse-members.html.meta
new file mode 100644
index 0000000..4c3ebae
--- /dev/null
+++ b/Documentation/html/class_nano_brain_1_1_synapse-members.html.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 1a5ad1f0608e9cbf7a7fea9e76378a74
+TextScriptImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Documentation/html/class_nano_brain_1_1_synapse.html b/Documentation/html/class_nano_brain_1_1_synapse.html
new file mode 100644
index 0000000..c093760
--- /dev/null
+++ b/Documentation/html/class_nano_brain_1_1_synapse.html
@@ -0,0 +1,159 @@
+
+
+
+
+
+
+
+Nano Brain for Unity: NanoBrain.Synapse Class Reference
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Nano Brain for Unity v0.1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+
+
+
+
+
+
+
A Synapse connects the ouput of a Neuron to another Neuron.
+
+
+
+Neuron neuron
+ The neuron from which input is received.
+
+
+float weight
+ The weight value to apply to the Neuron input.
+
+
+
+
+bool isSleeping [get]
+
+
+
+
+
◆ Synapse()
+
+
+
+
+
+ NanoBrain.Synapse.Synapse
+ (
+ Neuron
+ nucleus ,
+
+
+
+
+ float
+ weight = 1::0f
+
+
+
+ )
+
+
+
+
+
+
Create a new Synapse.
+
Parameters
+
+ nucleus The neuron from which input is received
+ weight The weight value to apply to the Neuron input
+
+
+
+
+
+
+
The documentation for this class was generated from the following file:
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Synapse.cs
+
+
+
+
+
+
diff --git a/Documentation/html/class_nano_brain_1_1_synapse.html.meta b/Documentation/html/class_nano_brain_1_1_synapse.html.meta
new file mode 100644
index 0000000..e5a15fc
--- /dev/null
+++ b/Documentation/html/class_nano_brain_1_1_synapse.html.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: e96ea75afe3a7411fa97ecf8af019fb8
+TextScriptImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Documentation/html/classes.html b/Documentation/html/classes.html
new file mode 100644
index 0000000..7a712c5
--- /dev/null
+++ b/Documentation/html/classes.html
@@ -0,0 +1,101 @@
+
+
+
+
+
+
+
+Nano Brain for Unity: Class Index
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Nano Brain for Unity v0.1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Documentation/html/classes.html.meta b/Documentation/html/classes.html.meta
new file mode 100644
index 0000000..0f269a7
--- /dev/null
+++ b/Documentation/html/classes.html.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: d0955c9f105c1b5d999da492a82677a6
+TextScriptImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Documentation/html/closed.png b/Documentation/html/closed.png
new file mode 100644
index 0000000..7d8dac4
Binary files /dev/null and b/Documentation/html/closed.png differ
diff --git a/Documentation/html/closed.png.meta b/Documentation/html/closed.png.meta
new file mode 100644
index 0000000..af7f54c
--- /dev/null
+++ b/Documentation/html/closed.png.meta
@@ -0,0 +1,117 @@
+fileFormatVersion: 2
+guid: 8f359a9b1001b62e48b929d9ec9d02c4
+TextureImporter:
+ internalIDToNameTable: []
+ externalObjects: {}
+ serializedVersion: 13
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 1
+ sRGBTexture: 1
+ linearTexture: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapsPreserveCoverage: 0
+ alphaTestReferenceValue: 0.5
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ flipGreenChannel: 0
+ isReadable: 0
+ streamingMipmaps: 0
+ streamingMipmapsPriority: 0
+ vTOnly: 0
+ ignoreMipmapLimit: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 6
+ cubemapConvolution: 0
+ seamlessCubemap: 0
+ textureFormat: 1
+ maxTextureSize: 2048
+ textureSettings:
+ serializedVersion: 2
+ filterMode: 1
+ aniso: 1
+ mipBias: 0
+ wrapU: 0
+ wrapV: 0
+ wrapW: 0
+ nPOTScale: 1
+ lightmap: 0
+ compressionQuality: 50
+ spriteMode: 0
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: 0.5, y: 0.5}
+ spritePixelsToUnits: 100
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spriteGenerateFallbackPhysicsShape: 1
+ alphaUsage: 1
+ alphaIsTransparency: 0
+ spriteTessellationDetail: -1
+ textureType: 0
+ textureShape: 1
+ singleChannelComponent: 0
+ flipbookRows: 1
+ flipbookColumns: 1
+ maxTextureSizeSet: 0
+ compressionQualitySet: 0
+ textureFormatSet: 0
+ ignorePngGamma: 0
+ applyGammaDecoding: 0
+ swizzle: 50462976
+ cookieLightType: 0
+ platformSettings:
+ - serializedVersion: 4
+ buildTarget: DefaultTexturePlatform
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: Standalone
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ spriteSheet:
+ serializedVersion: 2
+ sprites: []
+ outline: []
+ customData:
+ physicsShape: []
+ bones: []
+ spriteID:
+ internalID: 0
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ secondaryTextures: []
+ spriteCustomMetadata:
+ entries: []
+ nameFileIdTable: {}
+ mipmapLimitGroupName:
+ pSDRemoveMatte: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Documentation/html/custom_doxygen.css b/Documentation/html/custom_doxygen.css
new file mode 100644
index 0000000..b921a4d
--- /dev/null
+++ b/Documentation/html/custom_doxygen.css
@@ -0,0 +1,12 @@
+/* Custom PasserVR CSS for DoxyGen */
+
+a {
+ color: #e77505;
+}
+.contents a:visited {
+ color: #e77505;
+}
+
+a:hover {
+ color: #10659C;
+}
\ No newline at end of file
diff --git a/Runtime/LinearAlgebra.meta b/Documentation/html/custom_doxygen.css.meta
similarity index 67%
rename from Runtime/LinearAlgebra.meta
rename to Documentation/html/custom_doxygen.css.meta
index c54c1af..5b9c005 100644
--- a/Runtime/LinearAlgebra.meta
+++ b/Documentation/html/custom_doxygen.css.meta
@@ -1,6 +1,5 @@
fileFormatVersion: 2
-guid: d98555a675e8e5e879de17db950b55fe
-folderAsset: yes
+guid: 12575efb4c194b50d8661fc04f025564
DefaultImporter:
externalObjects: {}
userData:
diff --git a/Documentation/html/dir_14eca4e58e6d71e3a9859288c1bd2735.html b/Documentation/html/dir_14eca4e58e6d71e3a9859288c1bd2735.html
new file mode 100644
index 0000000..e81d864
--- /dev/null
+++ b/Documentation/html/dir_14eca4e58e6d71e3a9859288c1bd2735.html
@@ -0,0 +1,87 @@
+
+
+
+
+
+
+
+Nano Brain for Unity: /home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Editor Directory Reference
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Nano Brain for Unity v0.1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Documentation/html/dir_14eca4e58e6d71e3a9859288c1bd2735.html.meta b/Documentation/html/dir_14eca4e58e6d71e3a9859288c1bd2735.html.meta
new file mode 100644
index 0000000..6697847
--- /dev/null
+++ b/Documentation/html/dir_14eca4e58e6d71e3a9859288c1bd2735.html.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 2691d82d648861377a94054f9d58deb1
+TextScriptImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Documentation/html/dir_4f6666a8f2ab10bc970eb7559668f031.html b/Documentation/html/dir_4f6666a8f2ab10bc970eb7559668f031.html
new file mode 100644
index 0000000..ee9e8da
--- /dev/null
+++ b/Documentation/html/dir_4f6666a8f2ab10bc970eb7559668f031.html
@@ -0,0 +1,93 @@
+
+
+
+
+
+
+
+Nano Brain for Unity: /home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime Directory Reference
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Nano Brain for Unity v0.1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Documentation/html/dir_4f6666a8f2ab10bc970eb7559668f031.html.meta b/Documentation/html/dir_4f6666a8f2ab10bc970eb7559668f031.html.meta
new file mode 100644
index 0000000..cdcc5ac
--- /dev/null
+++ b/Documentation/html/dir_4f6666a8f2ab10bc970eb7559668f031.html.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 98b39284631945f34ba2f654c3a875ce
+TextScriptImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Documentation/html/dir_961f031cbd4067daa41f3038afdffb61.html b/Documentation/html/dir_961f031cbd4067daa41f3038afdffb61.html
new file mode 100644
index 0000000..2f32784
--- /dev/null
+++ b/Documentation/html/dir_961f031cbd4067daa41f3038afdffb61.html
@@ -0,0 +1,87 @@
+
+
+
+
+
+
+
+Nano Brain for Unity: /home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/ScriptableObjects Directory Reference
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Nano Brain for Unity v0.1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Documentation/html/dir_961f031cbd4067daa41f3038afdffb61.html.meta b/Documentation/html/dir_961f031cbd4067daa41f3038afdffb61.html.meta
new file mode 100644
index 0000000..8e7a5a3
--- /dev/null
+++ b/Documentation/html/dir_961f031cbd4067daa41f3038afdffb61.html.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 2926169196b4c7646a8f05ad7b23018c
+TextScriptImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Documentation/html/dir_d52cd4d528148a4237c9bd37fdf6f7e8.html b/Documentation/html/dir_d52cd4d528148a4237c9bd37fdf6f7e8.html
new file mode 100644
index 0000000..2b53de7
--- /dev/null
+++ b/Documentation/html/dir_d52cd4d528148a4237c9bd37fdf6f7e8.html
@@ -0,0 +1,95 @@
+
+
+
+
+
+
+
+Nano Brain for Unity: /home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts Directory Reference
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Nano Brain for Unity v0.1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Documentation/html/dir_d52cd4d528148a4237c9bd37fdf6f7e8.html.meta b/Documentation/html/dir_d52cd4d528148a4237c9bd37fdf6f7e8.html.meta
new file mode 100644
index 0000000..df076b2
--- /dev/null
+++ b/Documentation/html/dir_d52cd4d528148a4237c9bd37fdf6f7e8.html.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 4063181f562fec3d785401cba8562c79
+TextScriptImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Documentation/html/dir_ff8b04b97203665bfd386b445c7d0b7c.html b/Documentation/html/dir_ff8b04b97203665bfd386b445c7d0b7c.html
new file mode 100644
index 0000000..90a09b4
--- /dev/null
+++ b/Documentation/html/dir_ff8b04b97203665bfd386b445c7d0b7c.html
@@ -0,0 +1,87 @@
+
+
+
+
+
+
+
+Nano Brain for Unity: /home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core Directory Reference
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Nano Brain for Unity v0.1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Documentation/html/dir_ff8b04b97203665bfd386b445c7d0b7c.html.meta b/Documentation/html/dir_ff8b04b97203665bfd386b445c7d0b7c.html.meta
new file mode 100644
index 0000000..3b6154a
--- /dev/null
+++ b/Documentation/html/dir_ff8b04b97203665bfd386b445c7d0b7c.html.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 5dca77ad1f394fe7181cc332b1ac0fa6
+TextScriptImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Documentation/html/doc.svg b/Documentation/html/doc.svg
new file mode 100644
index 0000000..f2b6a64
--- /dev/null
+++ b/Documentation/html/doc.svg
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Documentation/html/doc.svg.meta b/Documentation/html/doc.svg.meta
new file mode 100644
index 0000000..87da073
--- /dev/null
+++ b/Documentation/html/doc.svg.meta
@@ -0,0 +1,53 @@
+fileFormatVersion: 2
+guid: 0605b0f6e3ad2fbcab684f5fb334e917
+ScriptedImporter:
+ internalIDToNameTable: []
+ externalObjects: {}
+ serializedVersion: 2
+ userData:
+ assetBundleName:
+ assetBundleVariant:
+ script: {fileID: 12408, guid: 0000000000000000e000000000000000, type: 0}
+ svgType: 3
+ texturedSpriteMeshType: 0
+ svgPixelsPerUnit: 100
+ gradientResolution: 64
+ alignment: 0
+ customPivot: {x: 0, y: 0}
+ generatePhysicsShape: 0
+ viewportOptions: 0
+ preserveViewport: 0
+ advancedMode: 0
+ tessellationMode: 1
+ predefinedResolutionIndex: 1
+ targetResolution: 1080
+ resolutionMultiplier: 1
+ stepDistance: 10
+ samplingStepDistance: 100
+ maxCordDeviationEnabled: 0
+ maxCordDeviation: 1
+ maxTangentAngleEnabled: 0
+ maxTangentAngle: 5
+ keepTextureAspectRatio: 1
+ textureSize: 256
+ textureWidth: 256
+ textureHeight: 256
+ wrapMode: 0
+ filterMode: 1
+ sampleCount: 4
+ preserveSVGImageAspect: 0
+ useSVGPixelsPerUnit: 0
+ spriteData:
+ TessellationDetail: 0
+ SpriteName:
+ SpritePivot: {x: 0, y: 0}
+ SpriteAlignment: 0
+ SpriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ SpriteRect:
+ serializedVersion: 2
+ x: 0
+ y: 0
+ width: 0
+ height: 0
+ SpriteID:
+ PhysicsOutlines: []
diff --git a/Documentation/html/docd.svg b/Documentation/html/docd.svg
new file mode 100644
index 0000000..a467461
--- /dev/null
+++ b/Documentation/html/docd.svg
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Documentation/html/docd.svg.meta b/Documentation/html/docd.svg.meta
new file mode 100644
index 0000000..0e047fa
--- /dev/null
+++ b/Documentation/html/docd.svg.meta
@@ -0,0 +1,53 @@
+fileFormatVersion: 2
+guid: 835932448a49d591fa409c846511dcbc
+ScriptedImporter:
+ internalIDToNameTable: []
+ externalObjects: {}
+ serializedVersion: 2
+ userData:
+ assetBundleName:
+ assetBundleVariant:
+ script: {fileID: 12408, guid: 0000000000000000e000000000000000, type: 0}
+ svgType: 3
+ texturedSpriteMeshType: 0
+ svgPixelsPerUnit: 100
+ gradientResolution: 64
+ alignment: 0
+ customPivot: {x: 0, y: 0}
+ generatePhysicsShape: 0
+ viewportOptions: 0
+ preserveViewport: 0
+ advancedMode: 0
+ tessellationMode: 1
+ predefinedResolutionIndex: 1
+ targetResolution: 1080
+ resolutionMultiplier: 1
+ stepDistance: 10
+ samplingStepDistance: 100
+ maxCordDeviationEnabled: 0
+ maxCordDeviation: 1
+ maxTangentAngleEnabled: 0
+ maxTangentAngle: 5
+ keepTextureAspectRatio: 1
+ textureSize: 256
+ textureWidth: 256
+ textureHeight: 256
+ wrapMode: 0
+ filterMode: 1
+ sampleCount: 4
+ preserveSVGImageAspect: 0
+ useSVGPixelsPerUnit: 0
+ spriteData:
+ TessellationDetail: 0
+ SpriteName:
+ SpritePivot: {x: 0, y: 0}
+ SpriteAlignment: 0
+ SpriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ SpriteRect:
+ serializedVersion: 2
+ x: 0
+ y: 0
+ width: 0
+ height: 0
+ SpriteID:
+ PhysicsOutlines: []
diff --git a/Documentation/html/doxygen.css b/Documentation/html/doxygen.css
new file mode 100644
index 0000000..7964918
--- /dev/null
+++ b/Documentation/html/doxygen.css
@@ -0,0 +1,1685 @@
+/* The standard CSS for doxygen 1.9.8*/
+
+body {
+ background-color: white;
+ color: black;
+}
+
+body, table, div, p, dl {
+ font-weight: 400;
+ font-size: 14px;
+ font-family: Roboto,sans-serif;
+ line-height: 22px;
+}
+
+/* @group Heading Levels */
+
+.title {
+ font-weight: 400;
+ font-size: 14px;
+ font-family: Roboto,sans-serif;
+ line-height: 28px;
+ font-size: 150%;
+ font-weight: bold;
+ margin: 10px 2px;
+}
+
+h1.groupheader {
+ font-size: 150%;
+}
+
+h2.groupheader {
+ border-bottom: 1px solid #969696;
+ color: #414141;
+ font-size: 150%;
+ font-weight: normal;
+ margin-top: 1.75em;
+ padding-top: 8px;
+ padding-bottom: 4px;
+ width: 100%;
+}
+
+h3.groupheader {
+ font-size: 100%;
+}
+
+h1, h2, h3, h4, h5, h6 {
+ -webkit-transition: text-shadow 0.5s linear;
+ -moz-transition: text-shadow 0.5s linear;
+ -ms-transition: text-shadow 0.5s linear;
+ -o-transition: text-shadow 0.5s linear;
+ transition: text-shadow 0.5s linear;
+ margin-right: 15px;
+}
+
+h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow {
+ text-shadow: 0 0 15px cyan;
+}
+
+dt {
+ font-weight: bold;
+}
+
+p.startli, p.startdd {
+ margin-top: 2px;
+}
+
+th p.starttd, th p.intertd, th p.endtd {
+ font-size: 100%;
+ font-weight: 700;
+}
+
+p.starttd {
+ margin-top: 0px;
+}
+
+p.endli {
+ margin-bottom: 0px;
+}
+
+p.enddd {
+ margin-bottom: 4px;
+}
+
+p.endtd {
+ margin-bottom: 2px;
+}
+
+p.interli {
+}
+
+p.interdd {
+}
+
+p.intertd {
+}
+
+/* @end */
+
+caption {
+ font-weight: bold;
+}
+
+span.legend {
+ font-size: 70%;
+ text-align: center;
+}
+
+h3.version {
+ font-size: 90%;
+ text-align: center;
+}
+
+div.navtab {
+ padding-right: 15px;
+ text-align: right;
+ line-height: 110%;
+}
+
+div.navtab table {
+ border-spacing: 0;
+}
+
+td.navtab {
+ padding-right: 6px;
+ padding-left: 6px;
+}
+
+td.navtabHL {
+ background-image: url('tab_a.png');
+ background-repeat:repeat-x;
+ padding-right: 6px;
+ padding-left: 6px;
+}
+
+td.navtabHL a, td.navtabHL a:visited {
+ color: white;
+ text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0);
+}
+
+a.navtab {
+ font-weight: bold;
+}
+
+div.qindex{
+ text-align: center;
+ width: 100%;
+ line-height: 140%;
+ font-size: 130%;
+ color: #A0A0A0;
+}
+
+#main-menu a:focus {
+ outline: auto;
+ z-index: 10;
+ position: relative;
+}
+
+dt.alphachar{
+ font-size: 180%;
+ font-weight: bold;
+}
+
+.alphachar a{
+ color: black;
+}
+
+.alphachar a:hover, .alphachar a:visited{
+ text-decoration: none;
+}
+
+.classindex dl {
+ padding: 25px;
+ column-count:1
+}
+
+.classindex dd {
+ display:inline-block;
+ margin-left: 50px;
+ width: 90%;
+ line-height: 1.15em;
+}
+
+.classindex dl.even {
+ background-color: white;
+}
+
+.classindex dl.odd {
+ background-color: #F8F8F8;
+}
+
+@media(min-width: 1120px) {
+ .classindex dl {
+ column-count:2
+ }
+}
+
+@media(min-width: 1320px) {
+ .classindex dl {
+ column-count:3
+ }
+}
+
+
+/* @group Link Styling */
+
+a {
+ color: #4D4D4D;
+ font-weight: normal;
+ text-decoration: none;
+}
+
+.contents a:visited {
+ color: #5D5D5D;
+}
+
+a:hover {
+ text-decoration: underline;
+}
+
+a.el {
+ font-weight: bold;
+}
+
+a.elRef {
+}
+
+a.code, a.code:visited, a.line, a.line:visited {
+ color: #5D5D5D;
+}
+
+a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited {
+ color: #5D5D5D;
+}
+
+a.code.hl_class { /* style for links to class names in code snippets */ }
+a.code.hl_struct { /* style for links to struct names in code snippets */ }
+a.code.hl_union { /* style for links to union names in code snippets */ }
+a.code.hl_interface { /* style for links to interface names in code snippets */ }
+a.code.hl_protocol { /* style for links to protocol names in code snippets */ }
+a.code.hl_category { /* style for links to category names in code snippets */ }
+a.code.hl_exception { /* style for links to exception names in code snippets */ }
+a.code.hl_service { /* style for links to service names in code snippets */ }
+a.code.hl_singleton { /* style for links to singleton names in code snippets */ }
+a.code.hl_concept { /* style for links to concept names in code snippets */ }
+a.code.hl_namespace { /* style for links to namespace names in code snippets */ }
+a.code.hl_package { /* style for links to package names in code snippets */ }
+a.code.hl_define { /* style for links to macro names in code snippets */ }
+a.code.hl_function { /* style for links to function names in code snippets */ }
+a.code.hl_variable { /* style for links to variable names in code snippets */ }
+a.code.hl_typedef { /* style for links to typedef names in code snippets */ }
+a.code.hl_enumvalue { /* style for links to enum value names in code snippets */ }
+a.code.hl_enumeration { /* style for links to enumeration names in code snippets */ }
+a.code.hl_signal { /* style for links to Qt signal names in code snippets */ }
+a.code.hl_slot { /* style for links to Qt slot names in code snippets */ }
+a.code.hl_friend { /* style for links to friend names in code snippets */ }
+a.code.hl_dcop { /* style for links to KDE3 DCOP names in code snippets */ }
+a.code.hl_property { /* style for links to property names in code snippets */ }
+a.code.hl_event { /* style for links to event names in code snippets */ }
+a.code.hl_sequence { /* style for links to sequence names in code snippets */ }
+a.code.hl_dictionary { /* style for links to dictionary names in code snippets */ }
+
+/* @end */
+
+dl.el {
+ margin-left: -1cm;
+}
+
+ul {
+ overflow: visible;
+}
+
+ul.multicol {
+ -moz-column-gap: 1em;
+ -webkit-column-gap: 1em;
+ column-gap: 1em;
+ -moz-column-count: 3;
+ -webkit-column-count: 3;
+ column-count: 3;
+ list-style-type: none;
+}
+
+#side-nav ul {
+ overflow: visible; /* reset ul rule for scroll bar in GENERATE_TREEVIEW window */
+}
+
+#main-nav ul {
+ overflow: visible; /* reset ul rule for the navigation bar drop down lists */
+}
+
+.fragment {
+ text-align: left;
+ direction: ltr;
+ overflow-x: auto; /*Fixed: fragment lines overlap floating elements*/
+ overflow-y: hidden;
+}
+
+pre.fragment {
+ border: 1px solid #CACACA;
+ background-color: #FBFBFB;
+ color: black;
+ padding: 4px 6px;
+ margin: 4px 8px 4px 2px;
+ overflow: auto;
+ word-wrap: break-word;
+ font-size: 9pt;
+ line-height: 125%;
+ font-family: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed;
+ font-size: 105%;
+}
+
+div.fragment {
+ padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/
+ margin: 4px 8px 4px 2px;
+ color: black;
+ background-color: #FBFBFB;
+ border: 1px solid #CACACA;
+}
+
+div.line {
+ font-family: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed;
+ font-size: 13px;
+ min-height: 13px;
+ line-height: 1.2;
+ text-wrap: unrestricted;
+ white-space: -moz-pre-wrap; /* Moz */
+ white-space: -pre-wrap; /* Opera 4-6 */
+ white-space: -o-pre-wrap; /* Opera 7 */
+ white-space: pre-wrap; /* CSS3 */
+ word-wrap: break-word; /* IE 5.5+ */
+ text-indent: -53px;
+ padding-left: 53px;
+ padding-bottom: 0px;
+ margin: 0px;
+ -webkit-transition-property: background-color, box-shadow;
+ -webkit-transition-duration: 0.5s;
+ -moz-transition-property: background-color, box-shadow;
+ -moz-transition-duration: 0.5s;
+ -ms-transition-property: background-color, box-shadow;
+ -ms-transition-duration: 0.5s;
+ -o-transition-property: background-color, box-shadow;
+ -o-transition-duration: 0.5s;
+ transition-property: background-color, box-shadow;
+ transition-duration: 0.5s;
+}
+
+div.line:after {
+ content:"\000A";
+ white-space: pre;
+}
+
+div.line.glow {
+ background-color: cyan;
+ box-shadow: 0 0 10px cyan;
+}
+
+span.fold {
+ margin-left: 5px;
+ margin-right: 1px;
+ margin-top: 0px;
+ margin-bottom: 0px;
+ padding: 0px;
+ display: inline-block;
+ width: 12px;
+ height: 12px;
+ background-repeat:no-repeat;
+ background-position:center;
+}
+
+span.lineno {
+ padding-right: 4px;
+ margin-right: 9px;
+ text-align: right;
+ border-right: 2px solid #00FF00;
+ color: black;
+ background-color: #E8E8E8;
+ white-space: pre;
+}
+span.lineno a, span.lineno a:visited {
+ color: #5D5D5D;
+ background-color: #D8D8D8;
+}
+
+span.lineno a:hover {
+ color: #5D5D5D;
+ background-color: #C8C8C8;
+}
+
+.lineno {
+ -webkit-touch-callout: none;
+ -webkit-user-select: none;
+ -khtml-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+
+div.classindex ul {
+ list-style: none;
+ padding-left: 0;
+}
+
+div.classindex span.ai {
+ display: inline-block;
+}
+
+div.groupHeader {
+ margin-left: 16px;
+ margin-top: 12px;
+ font-weight: bold;
+}
+
+div.groupText {
+ margin-left: 16px;
+ font-style: italic;
+}
+
+body {
+ color: black;
+ margin: 0;
+}
+
+div.contents {
+ margin-top: 10px;
+ margin-left: 12px;
+ margin-right: 8px;
+}
+
+p.formulaDsp {
+ text-align: center;
+}
+
+img.dark-mode-visible {
+ display: none;
+}
+img.light-mode-visible {
+ display: none;
+}
+
+img.formulaDsp {
+
+}
+
+img.formulaInl, img.inline {
+ vertical-align: middle;
+}
+
+div.center {
+ text-align: center;
+ margin-top: 0px;
+ margin-bottom: 0px;
+ padding: 0px;
+}
+
+div.center img {
+ border: 0px;
+}
+
+address.footer {
+ text-align: right;
+ padding-right: 12px;
+}
+
+img.footer {
+ border: 0px;
+ vertical-align: middle;
+ width: 104px;
+}
+
+.compoundTemplParams {
+ color: #5D5D5D;
+ font-size: 80%;
+ line-height: 120%;
+}
+
+/* @group Code Colorization */
+
+span.keyword {
+ color: #008000;
+}
+
+span.keywordtype {
+ color: #604020;
+}
+
+span.keywordflow {
+ color: #E08000;
+}
+
+span.comment {
+ color: #800000;
+}
+
+span.preprocessor {
+ color: #806020;
+}
+
+span.stringliteral {
+ color: #002080;
+}
+
+span.charliteral {
+ color: #008080;
+}
+
+span.xmlcdata {
+ color: black;
+}
+
+span.vhdldigit {
+ color: #FF00FF;
+}
+
+span.vhdlchar {
+ color: #000000;
+}
+
+span.vhdlkeyword {
+ color: #700070;
+}
+
+span.vhdllogic {
+ color: #FF0000;
+}
+
+blockquote {
+ background-color: #F7F7F7;
+ border-left: 2px solid #A7A7A7;
+ margin: 0 24px 0 4px;
+ padding: 0 12px 0 16px;
+}
+
+/* @end */
+
+td.tiny {
+ font-size: 75%;
+}
+
+.dirtab {
+ padding: 4px;
+ border-collapse: collapse;
+ border: 1px solid #343434;
+}
+
+th.dirtab {
+ background-color: #444444;
+ color: #FFFFFF;
+ font-weight: bold;
+}
+
+hr {
+ height: 0px;
+ border: none;
+ border-top: 1px solid #636363;
+}
+
+hr.footer {
+ height: 1px;
+}
+
+/* @group Member Descriptions */
+
+table.memberdecls {
+ border-spacing: 0px;
+ padding: 0px;
+}
+
+.memberdecls td, .fieldtable tr {
+ -webkit-transition-property: background-color, box-shadow;
+ -webkit-transition-duration: 0.5s;
+ -moz-transition-property: background-color, box-shadow;
+ -moz-transition-duration: 0.5s;
+ -ms-transition-property: background-color, box-shadow;
+ -ms-transition-duration: 0.5s;
+ -o-transition-property: background-color, box-shadow;
+ -o-transition-duration: 0.5s;
+ transition-property: background-color, box-shadow;
+ transition-duration: 0.5s;
+}
+
+.memberdecls td.glow, .fieldtable tr.glow {
+ background-color: cyan;
+ box-shadow: 0 0 15px cyan;
+}
+
+.mdescLeft, .mdescRight,
+.memItemLeft, .memItemRight,
+.memTemplItemLeft, .memTemplItemRight, .memTemplParams {
+ background-color: #F9F9F9;
+ border: none;
+ margin: 4px;
+ padding: 1px 0 0 8px;
+}
+
+.mdescLeft, .mdescRight {
+ padding: 0px 8px 4px 8px;
+ color: #555;
+}
+
+.memSeparator {
+ border-bottom: 1px solid #E1E1E1;
+ line-height: 1px;
+ margin: 0px;
+ padding: 0px;
+}
+
+.memItemLeft, .memTemplItemLeft {
+ white-space: nowrap;
+}
+
+.memItemRight, .memTemplItemRight {
+ width: 100%;
+}
+
+.memTemplParams {
+ color: #5D5D5D;
+ white-space: nowrap;
+ font-size: 80%;
+}
+
+/* @end */
+
+/* @group Member Details */
+
+/* Styles for detailed member documentation */
+
+.memtitle {
+ padding: 8px;
+ border-top: 1px solid #B2B2B2;
+ border-left: 1px solid #B2B2B2;
+ border-right: 1px solid #B2B2B2;
+ border-top-right-radius: 4px;
+ border-top-left-radius: 4px;
+ margin-bottom: -1px;
+ background-image: url('nav_f.png');
+ background-repeat: repeat-x;
+ background-color: #E5E5E5;
+ line-height: 1.25;
+ font-weight: 300;
+ float:left;
+}
+
+.permalink
+{
+ font-size: 65%;
+ display: inline-block;
+ vertical-align: middle;
+}
+
+.memtemplate {
+ font-size: 80%;
+ color: #5D5D5D;
+ font-weight: normal;
+ margin-left: 9px;
+}
+
+.mempage {
+ width: 100%;
+}
+
+.memitem {
+ padding: 0;
+ margin-bottom: 10px;
+ margin-right: 5px;
+ -webkit-transition: box-shadow 0.5s linear;
+ -moz-transition: box-shadow 0.5s linear;
+ -ms-transition: box-shadow 0.5s linear;
+ -o-transition: box-shadow 0.5s linear;
+ transition: box-shadow 0.5s linear;
+ display: table !important;
+ width: 100%;
+}
+
+.memitem.glow {
+ box-shadow: 0 0 15px cyan;
+}
+
+.memname {
+ font-weight: 400;
+ margin-left: 6px;
+}
+
+.memname td {
+ vertical-align: bottom;
+}
+
+.memproto, dl.reflist dt {
+ border-top: 1px solid #B2B2B2;
+ border-left: 1px solid #B2B2B2;
+ border-right: 1px solid #B2B2B2;
+ padding: 6px 0px 6px 0px;
+ color: #282828;
+ font-weight: bold;
+ text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9);
+ background-color: #E2E2E2;
+ box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
+ border-top-right-radius: 4px;
+}
+
+.overload {
+ font-family: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed;
+ font-size: 65%;
+}
+
+.memdoc, dl.reflist dd {
+ border-bottom: 1px solid #B2B2B2;
+ border-left: 1px solid #B2B2B2;
+ border-right: 1px solid #B2B2B2;
+ padding: 6px 10px 2px 10px;
+ border-top-width: 0;
+ background-image:url('nav_g.png');
+ background-repeat:repeat-x;
+ background-color: white;
+ /* opera specific markup */
+ border-bottom-left-radius: 4px;
+ border-bottom-right-radius: 4px;
+ box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
+ /* firefox specific markup */
+ -moz-border-radius-bottomleft: 4px;
+ -moz-border-radius-bottomright: 4px;
+ -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px;
+ /* webkit specific markup */
+ -webkit-border-bottom-left-radius: 4px;
+ -webkit-border-bottom-right-radius: 4px;
+ -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
+}
+
+dl.reflist dt {
+ padding: 5px;
+}
+
+dl.reflist dd {
+ margin: 0px 0px 10px 0px;
+ padding: 5px;
+}
+
+.paramkey {
+ text-align: right;
+}
+
+.paramtype {
+ white-space: nowrap;
+}
+
+.paramname {
+ color: #602020;
+ white-space: nowrap;
+}
+.paramname em {
+ font-style: normal;
+}
+.paramname code {
+ line-height: 14px;
+}
+
+.params, .retval, .exception, .tparams {
+ margin-left: 0px;
+ padding-left: 0px;
+}
+
+.params .paramname, .retval .paramname, .tparams .paramname, .exception .paramname {
+ font-weight: bold;
+ vertical-align: top;
+}
+
+.params .paramtype, .tparams .paramtype {
+ font-style: italic;
+ vertical-align: top;
+}
+
+.params .paramdir, .tparams .paramdir {
+ font-family: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed;
+ vertical-align: top;
+}
+
+table.mlabels {
+ border-spacing: 0px;
+}
+
+td.mlabels-left {
+ width: 100%;
+ padding: 0px;
+}
+
+td.mlabels-right {
+ vertical-align: bottom;
+ padding: 0px;
+ white-space: nowrap;
+}
+
+span.mlabels {
+ margin-left: 8px;
+}
+
+span.mlabel {
+ background-color: #858585;
+ border-top:1px solid #6D6D6D;
+ border-left:1px solid #6D6D6D;
+ border-right:1px solid #CACACA;
+ border-bottom:1px solid #CACACA;
+ text-shadow: none;
+ color: white;
+ margin-right: 4px;
+ padding: 2px 3px;
+ border-radius: 3px;
+ font-size: 7pt;
+ white-space: nowrap;
+ vertical-align: middle;
+}
+
+
+
+/* @end */
+
+/* these are for tree view inside a (index) page */
+
+div.directory {
+ margin: 10px 0px;
+ border-top: 1px solid #A7A7A7;
+ border-bottom: 1px solid #A7A7A7;
+ width: 100%;
+}
+
+.directory table {
+ border-collapse:collapse;
+}
+
+.directory td {
+ margin: 0px;
+ padding: 0px;
+ vertical-align: top;
+}
+
+.directory td.entry {
+ white-space: nowrap;
+ padding-right: 6px;
+ padding-top: 3px;
+}
+
+.directory td.entry a {
+ outline:none;
+}
+
+.directory td.entry a img {
+ border: none;
+}
+
+.directory td.desc {
+ width: 100%;
+ padding-left: 6px;
+ padding-right: 6px;
+ padding-top: 3px;
+ border-left: 1px solid rgba(0,0,0,0.05);
+}
+
+.directory tr.odd {
+ padding-left: 6px;
+ background-color: #F8F8F8;
+}
+
+.directory tr.even {
+ padding-left: 6px;
+ background-color: white;
+}
+
+.directory img {
+ vertical-align: -30%;
+}
+
+.directory .levels {
+ white-space: nowrap;
+ width: 100%;
+ text-align: right;
+ font-size: 9pt;
+}
+
+.directory .levels span {
+ cursor: pointer;
+ padding-left: 2px;
+ padding-right: 2px;
+ color: #4D4D4D;
+}
+
+.arrow {
+ color: #A7A7A7;
+ -webkit-user-select: none;
+ -khtml-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+ cursor: pointer;
+ font-size: 80%;
+ display: inline-block;
+ width: 16px;
+ height: 22px;
+}
+
+.icon {
+ font-family: Arial,Helvetica;
+ line-height: normal;
+ font-weight: bold;
+ font-size: 12px;
+ height: 14px;
+ width: 16px;
+ display: inline-block;
+ background-color: #858585;
+ color: white;
+ text-align: center;
+ border-radius: 4px;
+ margin-left: 2px;
+ margin-right: 2px;
+}
+
+.icona {
+ width: 24px;
+ height: 22px;
+ display: inline-block;
+}
+
+.iconfopen {
+ width: 24px;
+ height: 18px;
+ margin-bottom: 4px;
+ background-image:url('folderopen.svg');
+ background-repeat: repeat-y;
+ vertical-align:top;
+ display: inline-block;
+}
+
+.iconfclosed {
+ width: 24px;
+ height: 18px;
+ margin-bottom: 4px;
+ background-image:url('folderclosed.svg');
+ background-repeat: repeat-y;
+ vertical-align:top;
+ display: inline-block;
+}
+
+.icondoc {
+ width: 24px;
+ height: 18px;
+ margin-bottom: 4px;
+ background-image:url('doc.svg');
+ background-position: 0px -4px;
+ background-repeat: repeat-y;
+ vertical-align:top;
+ display: inline-block;
+}
+
+/* @end */
+
+div.dynheader {
+ margin-top: 8px;
+ -webkit-touch-callout: none;
+ -webkit-user-select: none;
+ -khtml-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+
+address {
+ font-style: normal;
+ color: #303030;
+}
+
+table.doxtable caption {
+ caption-side: top;
+}
+
+table.doxtable {
+ border-collapse:collapse;
+ margin-top: 4px;
+ margin-bottom: 4px;
+}
+
+table.doxtable td, table.doxtable th {
+ border: 1px solid #343434;
+ padding: 3px 7px 2px;
+}
+
+table.doxtable th {
+ background-color: #444444;
+ color: #FFFFFF;
+ font-size: 110%;
+ padding-bottom: 4px;
+ padding-top: 5px;
+}
+
+table.fieldtable {
+ margin-bottom: 10px;
+ border: 1px solid #B2B2B2;
+ border-spacing: 0px;
+ border-radius: 4px;
+ box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15);
+}
+
+.fieldtable td, .fieldtable th {
+ padding: 3px 7px 2px;
+}
+
+.fieldtable td.fieldtype, .fieldtable td.fieldname {
+ white-space: nowrap;
+ border-right: 1px solid #B2B2B2;
+ border-bottom: 1px solid #B2B2B2;
+ vertical-align: top;
+}
+
+.fieldtable td.fieldname {
+ padding-top: 3px;
+}
+
+.fieldtable td.fielddoc {
+ border-bottom: 1px solid #B2B2B2;
+}
+
+.fieldtable td.fielddoc p:first-child {
+ margin-top: 0px;
+}
+
+.fieldtable td.fielddoc p:last-child {
+ margin-bottom: 2px;
+}
+
+.fieldtable tr:last-child td {
+ border-bottom: none;
+}
+
+.fieldtable th {
+ background-image: url('nav_f.png');
+ background-repeat:repeat-x;
+ background-color: #E5E5E5;
+ font-size: 90%;
+ color: #282828;
+ padding-bottom: 4px;
+ padding-top: 5px;
+ text-align:left;
+ font-weight: 400;
+ border-top-left-radius: 4px;
+ border-top-right-radius: 4px;
+ border-bottom: 1px solid #B2B2B2;
+}
+
+
+.tabsearch {
+ top: 0px;
+ left: 10px;
+ height: 36px;
+ background-image: url('tab_b.png');
+ z-index: 101;
+ overflow: hidden;
+ font-size: 13px;
+}
+
+.navpath ul
+{
+ font-size: 11px;
+ background-image: url('tab_b.png');
+ background-repeat:repeat-x;
+ background-position: 0 -5px;
+ height:30px;
+ line-height:30px;
+ color:#2D2D2D;
+ border:solid 1px #C8C8C8;
+ overflow:hidden;
+ margin:0px;
+ padding:0px;
+}
+
+.navpath li
+{
+ list-style-type:none;
+ float:left;
+ padding-left:10px;
+ padding-right:15px;
+ background-image:url('bc_s.png');
+ background-repeat:no-repeat;
+ background-position:right;
+ color: #424242;
+}
+
+.navpath li.navelem a
+{
+ height:32px;
+ display:block;
+ text-decoration: none;
+ outline: none;
+ color: #2D2D2D;
+ font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif;
+ text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9);
+ text-decoration: none;
+}
+
+.navpath li.navelem a:hover
+{
+ color: white;
+ text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0);
+}
+
+.navpath li.footer
+{
+ list-style-type:none;
+ float:right;
+ padding-left:10px;
+ padding-right:15px;
+ background-image:none;
+ background-repeat:no-repeat;
+ background-position:right;
+ color: #303030;
+ font-size: 8pt;
+}
+
+
+div.summary
+{
+ float: right;
+ font-size: 8pt;
+ padding-right: 5px;
+ width: 50%;
+ text-align: right;
+}
+
+div.summary a
+{
+ white-space: nowrap;
+}
+
+table.classindex
+{
+ margin: 10px;
+ white-space: nowrap;
+ margin-left: 3%;
+ margin-right: 3%;
+ width: 94%;
+ border: 0;
+ border-spacing: 0;
+ padding: 0;
+}
+
+div.ingroups
+{
+ font-size: 8pt;
+ width: 50%;
+ text-align: left;
+}
+
+div.ingroups a
+{
+ white-space: nowrap;
+}
+
+div.header
+{
+ background-image: url('nav_h.png');
+ background-repeat:repeat-x;
+ background-color: #F9F9F9;
+ margin: 0px;
+ border-bottom: 1px solid #CACACA;
+}
+
+div.headertitle
+{
+ padding: 5px 5px 5px 10px;
+}
+
+.PageDocRTL-title div.headertitle {
+ text-align: right;
+ direction: rtl;
+}
+
+dl {
+ padding: 0 0 0 0;
+}
+
+/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug, dl.examples */
+dl.section {
+ margin-left: 0px;
+ padding-left: 0px;
+}
+
+dl.note {
+ margin-left: -7px;
+ padding-left: 3px;
+ border-left: 4px solid;
+ border-color: #D0C000;
+}
+
+dl.warning, dl.attention {
+ margin-left: -7px;
+ padding-left: 3px;
+ border-left: 4px solid;
+ border-color: #FF0000;
+}
+
+dl.pre, dl.post, dl.invariant {
+ margin-left: -7px;
+ padding-left: 3px;
+ border-left: 4px solid;
+ border-color: #00D000;
+}
+
+dl.deprecated {
+ margin-left: -7px;
+ padding-left: 3px;
+ border-left: 4px solid;
+ border-color: #505050;
+}
+
+dl.todo {
+ margin-left: -7px;
+ padding-left: 3px;
+ border-left: 4px solid;
+ border-color: #00C0E0;
+}
+
+dl.test {
+ margin-left: -7px;
+ padding-left: 3px;
+ border-left: 4px solid;
+ border-color: #3030E0;
+}
+
+dl.bug {
+ margin-left: -7px;
+ padding-left: 3px;
+ border-left: 4px solid;
+ border-color: #C08050;
+}
+
+dl.section dd {
+ margin-bottom: 6px;
+}
+
+
+#projectrow
+{
+ height: 56px;
+}
+
+#projectlogo
+{
+ text-align: center;
+ vertical-align: bottom;
+ border-collapse: separate;
+}
+
+#projectlogo img
+{
+ border: 0px none;
+}
+
+#projectalign
+{
+ vertical-align: middle;
+ padding-left: 0.5em;
+}
+
+#projectname
+{
+ font-size: 200%;
+ font-family: Tahoma,Arial,sans-serif;
+ margin: 0px;
+ padding: 2px 0px;
+}
+
+#projectbrief
+{
+ font-size: 90%;
+ font-family: Tahoma,Arial,sans-serif;
+ margin: 0px;
+ padding: 0px;
+}
+
+#projectnumber
+{
+ font-size: 50%;
+ font-family: 50% Tahoma,Arial,sans-serif;
+ margin: 0px;
+ padding: 0px;
+}
+
+#titlearea
+{
+ padding: 0px;
+ margin: 0px;
+ width: 100%;
+ border-bottom: 1px solid #6D6D6D;
+ background-color: white;
+}
+
+.image
+{
+ text-align: center;
+}
+
+.dotgraph
+{
+ text-align: center;
+}
+
+.mscgraph
+{
+ text-align: center;
+}
+
+.plantumlgraph
+{
+ text-align: center;
+}
+
+.diagraph
+{
+ text-align: center;
+}
+
+.caption
+{
+ font-weight: bold;
+}
+
+dl.citelist {
+ margin-bottom:50px;
+}
+
+dl.citelist dt {
+ color:#3D3D3D;
+ float:left;
+ font-weight:bold;
+ margin-right:10px;
+ padding:5px;
+ text-align:right;
+ width:52px;
+}
+
+dl.citelist dd {
+ margin:2px 0 2px 72px;
+ padding:5px 0;
+}
+
+div.toc {
+ padding: 14px 25px;
+ background-color: #F5F5F5;
+ border: 1px solid #DCDCDC;
+ border-radius: 7px 7px 7px 7px;
+ float: right;
+ height: auto;
+ margin: 0 8px 10px 10px;
+ width: 200px;
+}
+
+div.toc li {
+ background: url("data:image/svg+xml;utf8,&%238595; ") no-repeat scroll 0 5px transparent;
+ font: 10px/1.2 Verdana,'DejaVu Sans',Geneva,sans-serif;
+ margin-top: 5px;
+ padding-left: 10px;
+ padding-top: 2px;
+}
+
+div.toc h3 {
+ font: bold 12px/1.2 Verdana,'DejaVu Sans',Geneva,sans-serif;
+ color: #5D5D5D;
+ border-bottom: 0 none;
+ margin: 0;
+}
+
+div.toc ul {
+ list-style: none outside none;
+ border: medium none;
+ padding: 0px;
+}
+
+div.toc li.level1 {
+ margin-left: 0px;
+}
+
+div.toc li.level2 {
+ margin-left: 15px;
+}
+
+div.toc li.level3 {
+ margin-left: 15px;
+}
+
+div.toc li.level4 {
+ margin-left: 15px;
+}
+
+span.emoji {
+ /* font family used at the site: https://unicode.org/emoji/charts/full-emoji-list.html
+ * font-family: "Noto Color Emoji", "Apple Color Emoji", "Segoe UI Emoji", Times, Symbola, Aegyptus, Code2000, Code2001, Code2002, Musica, serif, LastResort;
+ */
+}
+
+span.obfuscator {
+ display: none;
+}
+
+.inherit_header {
+ font-weight: bold;
+ color: gray;
+ cursor: pointer;
+ -webkit-touch-callout: none;
+ -webkit-user-select: none;
+ -khtml-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+
+.inherit_header td {
+ padding: 6px 0px 2px 5px;
+}
+
+.inherit {
+ display: none;
+}
+
+tr.heading h2 {
+ margin-top: 12px;
+ margin-bottom: 4px;
+}
+
+/* tooltip related style info */
+
+.ttc {
+ position: absolute;
+ display: none;
+}
+
+#powerTip {
+ cursor: default;
+ /*white-space: nowrap;*/
+ color: black;
+ background-color: white;
+ border: 1px solid gray;
+ border-radius: 4px 4px 4px 4px;
+ box-shadow: 1px 1px 7px gray;
+ display: none;
+ font-size: smaller;
+ max-width: 80%;
+ opacity: 0.9;
+ padding: 1ex 1em 1em;
+ position: absolute;
+ z-index: 2147483647;
+}
+
+#powerTip div.ttdoc {
+ color: grey;
+ font-style: italic;
+}
+
+#powerTip div.ttname a {
+ font-weight: bold;
+}
+
+#powerTip a {
+ color: #5D5D5D;
+}
+
+#powerTip div.ttname {
+ font-weight: bold;
+}
+
+#powerTip div.ttdeci {
+ color: #006318;
+}
+
+#powerTip div {
+ margin: 0px;
+ padding: 0px;
+ font-size: 12px;
+ font-family: Roboto,sans-serif;
+ line-height: 16px;
+}
+
+#powerTip:before, #powerTip:after {
+ content: "";
+ position: absolute;
+ margin: 0px;
+}
+
+#powerTip.n:after, #powerTip.n:before,
+#powerTip.s:after, #powerTip.s:before,
+#powerTip.w:after, #powerTip.w:before,
+#powerTip.e:after, #powerTip.e:before,
+#powerTip.ne:after, #powerTip.ne:before,
+#powerTip.se:after, #powerTip.se:before,
+#powerTip.nw:after, #powerTip.nw:before,
+#powerTip.sw:after, #powerTip.sw:before {
+ border: solid transparent;
+ content: " ";
+ height: 0;
+ width: 0;
+ position: absolute;
+}
+
+#powerTip.n:after, #powerTip.s:after,
+#powerTip.w:after, #powerTip.e:after,
+#powerTip.nw:after, #powerTip.ne:after,
+#powerTip.sw:after, #powerTip.se:after {
+ border-color: rgba(255, 255, 255, 0);
+}
+
+#powerTip.n:before, #powerTip.s:before,
+#powerTip.w:before, #powerTip.e:before,
+#powerTip.nw:before, #powerTip.ne:before,
+#powerTip.sw:before, #powerTip.se:before {
+ border-color: rgba(128, 128, 128, 0);
+}
+
+#powerTip.n:after, #powerTip.n:before,
+#powerTip.ne:after, #powerTip.ne:before,
+#powerTip.nw:after, #powerTip.nw:before {
+ top: 100%;
+}
+
+#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after {
+ border-top-color: white;
+ border-width: 10px;
+ margin: 0px -10px;
+}
+#powerTip.n:before, #powerTip.ne:before, #powerTip.nw:before {
+ border-top-color: gray;
+ border-width: 11px;
+ margin: 0px -11px;
+}
+#powerTip.n:after, #powerTip.n:before {
+ left: 50%;
+}
+
+#powerTip.nw:after, #powerTip.nw:before {
+ right: 14px;
+}
+
+#powerTip.ne:after, #powerTip.ne:before {
+ left: 14px;
+}
+
+#powerTip.s:after, #powerTip.s:before,
+#powerTip.se:after, #powerTip.se:before,
+#powerTip.sw:after, #powerTip.sw:before {
+ bottom: 100%;
+}
+
+#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after {
+ border-bottom-color: white;
+ border-width: 10px;
+ margin: 0px -10px;
+}
+
+#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before {
+ border-bottom-color: gray;
+ border-width: 11px;
+ margin: 0px -11px;
+}
+
+#powerTip.s:after, #powerTip.s:before {
+ left: 50%;
+}
+
+#powerTip.sw:after, #powerTip.sw:before {
+ right: 14px;
+}
+
+#powerTip.se:after, #powerTip.se:before {
+ left: 14px;
+}
+
+#powerTip.e:after, #powerTip.e:before {
+ left: 100%;
+}
+#powerTip.e:after {
+ border-left-color: gray;
+ border-width: 10px;
+ top: 50%;
+ margin-top: -10px;
+}
+#powerTip.e:before {
+ border-left-color: gray;
+ border-width: 11px;
+ top: 50%;
+ margin-top: -11px;
+}
+
+#powerTip.w:after, #powerTip.w:before {
+ right: 100%;
+}
+#powerTip.w:after {
+ border-right-color: gray;
+ border-width: 10px;
+ top: 50%;
+ margin-top: -10px;
+}
+#powerTip.w:before {
+ border-right-color: gray;
+ border-width: 11px;
+ top: 50%;
+ margin-top: -11px;
+}
+
+@media print
+{
+ #top { display: none; }
+ #side-nav { display: none; }
+ #nav-path { display: none; }
+ body { overflow:visible; }
+ h1, h2, h3, h4, h5, h6 { page-break-after: avoid; }
+ .summary { display: none; }
+ .memitem { page-break-inside: avoid; }
+ #doc-content
+ {
+ margin-left:0 !important;
+ height:auto !important;
+ width:auto !important;
+ overflow:inherit;
+ display:inline;
+ }
+}
+
+/* @group Markdown */
+
+table.markdownTable {
+ border-collapse:collapse;
+ margin-top: 4px;
+ margin-bottom: 4px;
+}
+
+table.markdownTable td, table.markdownTable th {
+ border: 1px solid #343434;
+ padding: 3px 7px 2px;
+}
+
+table.markdownTable tr {
+}
+
+th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone {
+ background-color: #444444;
+ color: #FFFFFF;
+ font-size: 110%;
+ padding-bottom: 4px;
+ padding-top: 5px;
+}
+
+th.markdownTableHeadLeft, td.markdownTableBodyLeft {
+ text-align: left
+}
+
+th.markdownTableHeadRight, td.markdownTableBodyRight {
+ text-align: right
+}
+
+th.markdownTableHeadCenter, td.markdownTableBodyCenter {
+ text-align: center
+}
+
+tt, code, kbd, samp
+{
+ display: inline-block;
+}
+/* @end */
+
+u {
+ text-decoration: underline;
+}
+
+details>summary {
+ list-style-type: none;
+}
+
+details > summary::-webkit-details-marker {
+ display: none;
+}
+
+details>summary::before {
+ content: "\25ba";
+ padding-right:4px;
+ font-size: 80%;
+}
+
+details[open]>summary::before {
+ content: "\25bc";
+ padding-right:4px;
+ font-size: 80%;
+}
+
diff --git a/Documentation/html/doxygen.css.meta b/Documentation/html/doxygen.css.meta
new file mode 100644
index 0000000..7795306
--- /dev/null
+++ b/Documentation/html/doxygen.css.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 247df139d59e2166c877cf6642d9815c
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Documentation/html/doxygen.svg b/Documentation/html/doxygen.svg
new file mode 100644
index 0000000..61d44aa
--- /dev/null
+++ b/Documentation/html/doxygen.svg
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Documentation/html/doxygen.svg.meta b/Documentation/html/doxygen.svg.meta
new file mode 100644
index 0000000..d759875
--- /dev/null
+++ b/Documentation/html/doxygen.svg.meta
@@ -0,0 +1,53 @@
+fileFormatVersion: 2
+guid: 207e0d8a44ba97950b3f8bcde74a84dd
+ScriptedImporter:
+ internalIDToNameTable: []
+ externalObjects: {}
+ serializedVersion: 2
+ userData:
+ assetBundleName:
+ assetBundleVariant:
+ script: {fileID: 12408, guid: 0000000000000000e000000000000000, type: 0}
+ svgType: 3
+ texturedSpriteMeshType: 0
+ svgPixelsPerUnit: 100
+ gradientResolution: 64
+ alignment: 0
+ customPivot: {x: 0, y: 0}
+ generatePhysicsShape: 0
+ viewportOptions: 0
+ preserveViewport: 0
+ advancedMode: 0
+ tessellationMode: 1
+ predefinedResolutionIndex: 1
+ targetResolution: 1080
+ resolutionMultiplier: 1
+ stepDistance: 10
+ samplingStepDistance: 100
+ maxCordDeviationEnabled: 0
+ maxCordDeviation: 1
+ maxTangentAngleEnabled: 0
+ maxTangentAngle: 5
+ keepTextureAspectRatio: 1
+ textureSize: 256
+ textureWidth: 256
+ textureHeight: 256
+ wrapMode: 0
+ filterMode: 1
+ sampleCount: 4
+ preserveSVGImageAspect: 0
+ useSVGPixelsPerUnit: 0
+ spriteData:
+ TessellationDetail: 0
+ SpriteName:
+ SpritePivot: {x: 0, y: 0}
+ SpriteAlignment: 0
+ SpriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ SpriteRect:
+ serializedVersion: 2
+ x: 0
+ y: 0
+ width: 0
+ height: 0
+ SpriteID:
+ PhysicsOutlines: []
diff --git a/Documentation/html/dynsections.js b/Documentation/html/dynsections.js
new file mode 100644
index 0000000..ee3f142
--- /dev/null
+++ b/Documentation/html/dynsections.js
@@ -0,0 +1,192 @@
+/*
+ @licstart The following is the entire license notice for the JavaScript code in this file.
+
+ The MIT License (MIT)
+
+ Copyright (C) 1997-2020 by Dimitri van Heesch
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+ and associated documentation files (the "Software"), to deal in the Software without restriction,
+ including without limitation the rights to use, copy, modify, merge, publish, distribute,
+ sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all copies or
+ substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+ BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+ @licend The above is the entire license notice for the JavaScript code in this file
+ */
+function toggleVisibility(linkObj)
+{
+ var base = $(linkObj).attr('id');
+ var summary = $('#'+base+'-summary');
+ var content = $('#'+base+'-content');
+ var trigger = $('#'+base+'-trigger');
+ var src=$(trigger).attr('src');
+ if (content.is(':visible')===true) {
+ content.hide();
+ summary.show();
+ $(linkObj).addClass('closed').removeClass('opened');
+ $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png');
+ } else {
+ content.show();
+ summary.hide();
+ $(linkObj).removeClass('closed').addClass('opened');
+ $(trigger).attr('src',src.substring(0,src.length-10)+'open.png');
+ }
+ return false;
+}
+
+function updateStripes()
+{
+ $('table.directory tr').
+ removeClass('even').filter(':visible:even').addClass('even');
+ $('table.directory tr').
+ removeClass('odd').filter(':visible:odd').addClass('odd');
+}
+
+function toggleLevel(level)
+{
+ $('table.directory tr').each(function() {
+ var l = this.id.split('_').length-1;
+ var i = $('#img'+this.id.substring(3));
+ var a = $('#arr'+this.id.substring(3));
+ if (l');
+ // add vertical lines to other rows
+ $('span[class=lineno]').not(':eq(0)').append(' ');
+ // add toggle controls to lines with fold divs
+ $('div[class=foldopen]').each(function() {
+ // extract specific id to use
+ var id = $(this).attr('id').replace('foldopen','');
+ // extract start and end foldable fragment attributes
+ var start = $(this).attr('data-start');
+ var end = $(this).attr('data-end');
+ // replace normal fold span with controls for the first line of a foldable fragment
+ $(this).find('span[class=fold]:first').replaceWith(' ');
+ // append div for folded (closed) representation
+ $(this).after('
');
+ // extract the first line from the "open" section to represent closed content
+ var line = $(this).children().first().clone();
+ // remove any glow that might still be active on the original line
+ $(line).removeClass('glow');
+ if (start) {
+ // if line already ends with a start marker (e.g. trailing {), remove it
+ $(line).html($(line).html().replace(new RegExp('\\s*'+start+'\\s*$','g'),''));
+ }
+ // replace minus with plus symbol
+ $(line).find('span[class=fold]').css('background-image',plusImg[relPath]);
+ // append ellipsis
+ $(line).append(' '+start+'… '+end);
+ // insert constructed line into closed div
+ $('#foldclosed'+id).html(line);
+ });
+}
+
+/* @license-end */
diff --git a/Documentation/html/dynsections.js.meta b/Documentation/html/dynsections.js.meta
new file mode 100644
index 0000000..669884d
--- /dev/null
+++ b/Documentation/html/dynsections.js.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 220af82fcb6183668ba400d72fa73f5e
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Documentation/html/folderclosed.svg b/Documentation/html/folderclosed.svg
new file mode 100644
index 0000000..f2a498c
--- /dev/null
+++ b/Documentation/html/folderclosed.svg
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/Documentation/html/folderclosed.svg.meta b/Documentation/html/folderclosed.svg.meta
new file mode 100644
index 0000000..cccef68
--- /dev/null
+++ b/Documentation/html/folderclosed.svg.meta
@@ -0,0 +1,53 @@
+fileFormatVersion: 2
+guid: ed852fa6ace29dcc3aee5f3b5c63fadc
+ScriptedImporter:
+ internalIDToNameTable: []
+ externalObjects: {}
+ serializedVersion: 2
+ userData:
+ assetBundleName:
+ assetBundleVariant:
+ script: {fileID: 12408, guid: 0000000000000000e000000000000000, type: 0}
+ svgType: 3
+ texturedSpriteMeshType: 0
+ svgPixelsPerUnit: 100
+ gradientResolution: 64
+ alignment: 0
+ customPivot: {x: 0, y: 0}
+ generatePhysicsShape: 0
+ viewportOptions: 0
+ preserveViewport: 0
+ advancedMode: 0
+ tessellationMode: 1
+ predefinedResolutionIndex: 1
+ targetResolution: 1080
+ resolutionMultiplier: 1
+ stepDistance: 10
+ samplingStepDistance: 100
+ maxCordDeviationEnabled: 0
+ maxCordDeviation: 1
+ maxTangentAngleEnabled: 0
+ maxTangentAngle: 5
+ keepTextureAspectRatio: 1
+ textureSize: 256
+ textureWidth: 256
+ textureHeight: 256
+ wrapMode: 0
+ filterMode: 1
+ sampleCount: 4
+ preserveSVGImageAspect: 0
+ useSVGPixelsPerUnit: 0
+ spriteData:
+ TessellationDetail: 0
+ SpriteName:
+ SpritePivot: {x: 0, y: 0}
+ SpriteAlignment: 0
+ SpriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ SpriteRect:
+ serializedVersion: 2
+ x: 0
+ y: 0
+ width: 0
+ height: 0
+ SpriteID:
+ PhysicsOutlines: []
diff --git a/Documentation/html/folderclosedd.svg b/Documentation/html/folderclosedd.svg
new file mode 100644
index 0000000..0bd469b
--- /dev/null
+++ b/Documentation/html/folderclosedd.svg
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/Documentation/html/folderclosedd.svg.meta b/Documentation/html/folderclosedd.svg.meta
new file mode 100644
index 0000000..223ac14
--- /dev/null
+++ b/Documentation/html/folderclosedd.svg.meta
@@ -0,0 +1,53 @@
+fileFormatVersion: 2
+guid: 603b3653e1469c03294155c230618f89
+ScriptedImporter:
+ internalIDToNameTable: []
+ externalObjects: {}
+ serializedVersion: 2
+ userData:
+ assetBundleName:
+ assetBundleVariant:
+ script: {fileID: 12408, guid: 0000000000000000e000000000000000, type: 0}
+ svgType: 3
+ texturedSpriteMeshType: 0
+ svgPixelsPerUnit: 100
+ gradientResolution: 64
+ alignment: 0
+ customPivot: {x: 0, y: 0}
+ generatePhysicsShape: 0
+ viewportOptions: 0
+ preserveViewport: 0
+ advancedMode: 0
+ tessellationMode: 1
+ predefinedResolutionIndex: 1
+ targetResolution: 1080
+ resolutionMultiplier: 1
+ stepDistance: 10
+ samplingStepDistance: 100
+ maxCordDeviationEnabled: 0
+ maxCordDeviation: 1
+ maxTangentAngleEnabled: 0
+ maxTangentAngle: 5
+ keepTextureAspectRatio: 1
+ textureSize: 256
+ textureWidth: 256
+ textureHeight: 256
+ wrapMode: 0
+ filterMode: 1
+ sampleCount: 4
+ preserveSVGImageAspect: 0
+ useSVGPixelsPerUnit: 0
+ spriteData:
+ TessellationDetail: 0
+ SpriteName:
+ SpritePivot: {x: 0, y: 0}
+ SpriteAlignment: 0
+ SpriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ SpriteRect:
+ serializedVersion: 2
+ x: 0
+ y: 0
+ width: 0
+ height: 0
+ SpriteID:
+ PhysicsOutlines: []
diff --git a/Documentation/html/folderopen.svg b/Documentation/html/folderopen.svg
new file mode 100644
index 0000000..3552d18
--- /dev/null
+++ b/Documentation/html/folderopen.svg
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/Documentation/html/folderopen.svg.meta b/Documentation/html/folderopen.svg.meta
new file mode 100644
index 0000000..70999eb
--- /dev/null
+++ b/Documentation/html/folderopen.svg.meta
@@ -0,0 +1,53 @@
+fileFormatVersion: 2
+guid: 99d7b20b61619bbc7bc7acf43433ad71
+ScriptedImporter:
+ internalIDToNameTable: []
+ externalObjects: {}
+ serializedVersion: 2
+ userData:
+ assetBundleName:
+ assetBundleVariant:
+ script: {fileID: 12408, guid: 0000000000000000e000000000000000, type: 0}
+ svgType: 3
+ texturedSpriteMeshType: 0
+ svgPixelsPerUnit: 100
+ gradientResolution: 64
+ alignment: 0
+ customPivot: {x: 0, y: 0}
+ generatePhysicsShape: 0
+ viewportOptions: 0
+ preserveViewport: 0
+ advancedMode: 0
+ tessellationMode: 1
+ predefinedResolutionIndex: 1
+ targetResolution: 1080
+ resolutionMultiplier: 1
+ stepDistance: 10
+ samplingStepDistance: 100
+ maxCordDeviationEnabled: 0
+ maxCordDeviation: 1
+ maxTangentAngleEnabled: 0
+ maxTangentAngle: 5
+ keepTextureAspectRatio: 1
+ textureSize: 256
+ textureWidth: 256
+ textureHeight: 256
+ wrapMode: 0
+ filterMode: 1
+ sampleCount: 4
+ preserveSVGImageAspect: 0
+ useSVGPixelsPerUnit: 0
+ spriteData:
+ TessellationDetail: 0
+ SpriteName:
+ SpritePivot: {x: 0, y: 0}
+ SpriteAlignment: 0
+ SpriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ SpriteRect:
+ serializedVersion: 2
+ x: 0
+ y: 0
+ width: 0
+ height: 0
+ SpriteID:
+ PhysicsOutlines: []
diff --git a/Documentation/html/folderopend.svg b/Documentation/html/folderopend.svg
new file mode 100644
index 0000000..7f59273
--- /dev/null
+++ b/Documentation/html/folderopend.svg
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Documentation/html/folderopend.svg.meta b/Documentation/html/folderopend.svg.meta
new file mode 100644
index 0000000..4519174
--- /dev/null
+++ b/Documentation/html/folderopend.svg.meta
@@ -0,0 +1,53 @@
+fileFormatVersion: 2
+guid: 49346fcfab3fcfff6b70fc3e72079452
+ScriptedImporter:
+ internalIDToNameTable: []
+ externalObjects: {}
+ serializedVersion: 2
+ userData:
+ assetBundleName:
+ assetBundleVariant:
+ script: {fileID: 12408, guid: 0000000000000000e000000000000000, type: 0}
+ svgType: 3
+ texturedSpriteMeshType: 0
+ svgPixelsPerUnit: 100
+ gradientResolution: 64
+ alignment: 0
+ customPivot: {x: 0, y: 0}
+ generatePhysicsShape: 0
+ viewportOptions: 0
+ preserveViewport: 0
+ advancedMode: 0
+ tessellationMode: 1
+ predefinedResolutionIndex: 1
+ targetResolution: 1080
+ resolutionMultiplier: 1
+ stepDistance: 10
+ samplingStepDistance: 100
+ maxCordDeviationEnabled: 0
+ maxCordDeviation: 1
+ maxTangentAngleEnabled: 0
+ maxTangentAngle: 5
+ keepTextureAspectRatio: 1
+ textureSize: 256
+ textureWidth: 256
+ textureHeight: 256
+ wrapMode: 0
+ filterMode: 1
+ sampleCount: 4
+ preserveSVGImageAspect: 0
+ useSVGPixelsPerUnit: 0
+ spriteData:
+ TessellationDetail: 0
+ SpriteName:
+ SpritePivot: {x: 0, y: 0}
+ SpriteAlignment: 0
+ SpriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ SpriteRect:
+ serializedVersion: 2
+ x: 0
+ y: 0
+ width: 0
+ height: 0
+ SpriteID:
+ PhysicsOutlines: []
diff --git a/Documentation/html/functions.html b/Documentation/html/functions.html
new file mode 100644
index 0000000..286e8fd
--- /dev/null
+++ b/Documentation/html/functions.html
@@ -0,0 +1,192 @@
+
+
+
+
+
+
+
+Nano Brain for Unity: Class Members
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Nano Brain for Unity v0.1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+
+
+
Here is a list of all documented class members with links to the class documentation for each member:
+
+
- _ -
+
+
+
- a -
+
+
+
- b -
+
+
+
- c -
+
+
+
- d -
+
+
+
- g -
+
+
+
- i -
+
+
+
- l -
+
+
+
- n -
+
+
+
- o -
+
+
+
- p -
+
+
+
- r -
+
+
+
- s -
+
+
+
- t -
+
+
+
- u -
+
+
+
- w -
+
+
+
+
+
diff --git a/Documentation/html/functions.html.meta b/Documentation/html/functions.html.meta
new file mode 100644
index 0000000..cc77049
--- /dev/null
+++ b/Documentation/html/functions.html.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 9fd7deb6d1234937ead79f8ee90ef568
+TextScriptImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Documentation/html/functions_enum.html b/Documentation/html/functions_enum.html
new file mode 100644
index 0000000..103f15e
--- /dev/null
+++ b/Documentation/html/functions_enum.html
@@ -0,0 +1,85 @@
+
+
+
+
+
+
+
+Nano Brain for Unity: Class Members - Enumerations
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Nano Brain for Unity v0.1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+
+
+
Here is a list of all documented enums with links to the class documentation for each member:
+
+
+
+
+
diff --git a/Documentation/html/functions_enum.html.meta b/Documentation/html/functions_enum.html.meta
new file mode 100644
index 0000000..087b18b
--- /dev/null
+++ b/Documentation/html/functions_enum.html.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 9174d5685198b8457a89eb77e1ddc9e0
+TextScriptImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Documentation/html/functions_func.html b/Documentation/html/functions_func.html
new file mode 100644
index 0000000..cc97471
--- /dev/null
+++ b/Documentation/html/functions_func.html
@@ -0,0 +1,145 @@
+
+
+
+
+
+
+
+Nano Brain for Unity: Class Members - Functions
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Nano Brain for Unity v0.1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+
+
+
Here is a list of all documented functions with links to the class documentation for each member:
+
+
- a -
+
+
+
- c -
+
+
+
- d -
+
+
+
- g -
+
+
+
- n -
+
+
+
- p -
+
+
+
- r -
+
+
+
- s -
+
+
+
- t -
+
+
+
- u -
+
+
+
+
+
diff --git a/Documentation/html/functions_func.html.meta b/Documentation/html/functions_func.html.meta
new file mode 100644
index 0000000..3fc61e9
--- /dev/null
+++ b/Documentation/html/functions_func.html.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: b5635926d38de5a61b800a9e6bc4c310
+TextScriptImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Documentation/html/functions_prop.html b/Documentation/html/functions_prop.html
new file mode 100644
index 0000000..6007cfa
--- /dev/null
+++ b/Documentation/html/functions_prop.html
@@ -0,0 +1,88 @@
+
+
+
+
+
+
+
+Nano Brain for Unity: Class Members - Properties
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Nano Brain for Unity v0.1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+
+
+
Here is a list of all documented properties with links to the class documentation for each member:
+
+
+
+
+
diff --git a/Documentation/html/functions_prop.html.meta b/Documentation/html/functions_prop.html.meta
new file mode 100644
index 0000000..4cfade3
--- /dev/null
+++ b/Documentation/html/functions_prop.html.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 42580dac37333d6589c5fdfb92ee56c5
+TextScriptImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Documentation/html/functions_vars.html b/Documentation/html/functions_vars.html
new file mode 100644
index 0000000..00d4803
--- /dev/null
+++ b/Documentation/html/functions_vars.html
@@ -0,0 +1,96 @@
+
+
+
+
+
+
+
+Nano Brain for Unity: Class Members - Variables
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Nano Brain for Unity v0.1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+
+
+
Here is a list of all documented variables with links to the class documentation for each member:
+
+
+
+
+
diff --git a/Documentation/html/functions_vars.html.meta b/Documentation/html/functions_vars.html.meta
new file mode 100644
index 0000000..addd230
--- /dev/null
+++ b/Documentation/html/functions_vars.html.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 429b2d216a8555dd884eb2892854c4be
+TextScriptImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Documentation/html/hierarchy.html b/Documentation/html/hierarchy.html
new file mode 100644
index 0000000..c450a54
--- /dev/null
+++ b/Documentation/html/hierarchy.html
@@ -0,0 +1,94 @@
+
+
+
+
+
+
+
+Nano Brain for Unity: Class Hierarchy
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Nano Brain for Unity v0.1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+
+
+
+
This inheritance list is sorted roughly, but not completely, alphabetically:
+
+
+
+
+
diff --git a/Documentation/html/hierarchy.html.meta b/Documentation/html/hierarchy.html.meta
new file mode 100644
index 0000000..d72a89d
--- /dev/null
+++ b/Documentation/html/hierarchy.html.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 65ad0dc620f273b18838bfcd08da2155
+TextScriptImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Documentation/html/index.html b/Documentation/html/index.html
new file mode 100644
index 0000000..36f8aae
--- /dev/null
+++ b/Documentation/html/index.html
@@ -0,0 +1,89 @@
+
+
+
+
+
+
+
+Nano Brain for Unity: Nano Brain for Unity
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Nano Brain for Unity v0.1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+
+
+
+
+
+
diff --git a/Documentation/html/index.html.meta b/Documentation/html/index.html.meta
new file mode 100644
index 0000000..1ea5663
--- /dev/null
+++ b/Documentation/html/index.html.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: e1fcaffbcd8a71d15bd82fd16ed5c4dd
+TextScriptImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Documentation/html/jquery.js b/Documentation/html/jquery.js
new file mode 100644
index 0000000..1dffb65
--- /dev/null
+++ b/Documentation/html/jquery.js
@@ -0,0 +1,34 @@
+/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */
+!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML=" ",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML=" ";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML=" ",y.option=!!ce.lastChild;var ge={thead:[1,""],col:[2,""],tr:[2,""],td:[3,""],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0",options:{classes:{},disabled:!1,create:null},_createWidget:function(t,e){e=y(e||this.defaultElement||this)[0],this.element=y(e),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=y(),this.hoverable=y(),this.focusable=y(),this.classesElementLookup={},e!==this&&(y.data(e,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===e&&this.destroy()}}),this.document=y(e.style?e.ownerDocument:e.document||e),this.window=y(this.document[0].defaultView||this.document[0].parentWindow)),this.options=y.widget.extend({},this.options,this._getCreateOptions(),t),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:y.noop,_create:y.noop,_init:y.noop,destroy:function(){var i=this;this._destroy(),y.each(this.classesElementLookup,function(t,e){i._removeClass(e,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:y.noop,widget:function(){return this.element},option:function(t,e){var i,s,n,o=t;if(0===arguments.length)return y.widget.extend({},this.options);if("string"==typeof t)if(o={},t=(i=t.split(".")).shift(),i.length){for(s=o[t]=y.widget.extend({},this.options[t]),n=0;n
"),i=e.children()[0];return y("body").append(e),t=i.offsetWidth,e.css("overflow","scroll"),t===(i=i.offsetWidth)&&(i=e[0].clientWidth),e.remove(),s=t-i},getScrollInfo:function(t){var e=t.isWindow||t.isDocument?"":t.element.css("overflow-x"),i=t.isWindow||t.isDocument?"":t.element.css("overflow-y"),e="scroll"===e||"auto"===e&&t.widthx(D(s),D(n))?o.important="horizontal":o.important="vertical",p.using.call(this,t,o)}),h.offset(y.extend(l,{using:t}))})},y.ui.position={fit:{left:function(t,e){var i=e.within,s=i.isWindow?i.scrollLeft:i.offset.left,n=i.width,o=t.left-e.collisionPosition.marginLeft,h=s-o,a=o+e.collisionWidth-n-s;e.collisionWidth>n?0n?0=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),y.ui.plugin={add:function(t,e,i){var s,n=y.ui[t].prototype;for(s in i)n.plugins[s]=n.plugins[s]||[],n.plugins[s].push([e,i[s]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;n").css({overflow:"hidden",position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,t={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(t),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(t),this._proportionallyResize()),this._setupHandles(),e.autoHide&&y(this.element).on("mouseenter",function(){e.disabled||(i._removeClass("ui-resizable-autohide"),i._handles.show())}).on("mouseleave",function(){e.disabled||i.resizing||(i._addClass("ui-resizable-autohide"),i._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy(),this._addedHandles.remove();function t(t){y(t).removeData("resizable").removeData("ui-resizable").off(".resizable")}var e;return this.elementIsWrapper&&(t(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),t(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;case"aspectRatio":this._aspectRatio=!!e}},_setupHandles:function(){var t,e,i,s,n,o=this.options,h=this;if(this.handles=o.handles||(y(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=y(),this._addedHandles=y(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),i=this.handles.split(","),this.handles={},e=0;e"),this._addClass(n,"ui-resizable-handle "+s),n.css({zIndex:o.zIndex}),this.handles[t]=".ui-resizable-"+t,this.element.children(this.handles[t]).length||(this.element.append(n),this._addedHandles=this._addedHandles.add(n));this._renderAxis=function(t){var e,i,s;for(e in t=t||this.element,this.handles)this.handles[e].constructor===String?this.handles[e]=this.element.children(this.handles[e]).first().show():(this.handles[e].jquery||this.handles[e].nodeType)&&(this.handles[e]=y(this.handles[e]),this._on(this.handles[e],{mousedown:h._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(i=y(this.handles[e],this.element),s=/sw|ne|nw|se|n|s/.test(e)?i.outerHeight():i.outerWidth(),i=["padding",/ne|nw|n/.test(e)?"Top":/se|sw|s/.test(e)?"Bottom":/^e$/.test(e)?"Right":"Left"].join(""),t.css(i,s),this._proportionallyResize()),this._handles=this._handles.add(this.handles[e])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){h.resizing||(this.className&&(n=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),h.axis=n&&n[1]?n[1]:"se")}),o.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._addedHandles.remove()},_mouseCapture:function(t){var e,i,s=!1;for(e in this.handles)(i=y(this.handles[e])[0])!==t.target&&!y.contains(i,t.target)||(s=!0);return!this.options.disabled&&s},_mouseStart:function(t){var e,i,s=this.options,n=this.element;return this.resizing=!0,this._renderProxy(),e=this._num(this.helper.css("left")),i=this._num(this.helper.css("top")),s.containment&&(e+=y(s.containment).scrollLeft()||0,i+=y(s.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:e,top:i},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:n.width(),height:n.height()},this.originalSize=this._helper?{width:n.outerWidth(),height:n.outerHeight()}:{width:n.width(),height:n.height()},this.sizeDiff={width:n.outerWidth()-n.width(),height:n.outerHeight()-n.height()},this.originalPosition={left:e,top:i},this.originalMousePosition={left:t.pageX,top:t.pageY},this.aspectRatio="number"==typeof s.aspectRatio?s.aspectRatio:this.originalSize.width/this.originalSize.height||1,s=y(".ui-resizable-"+this.axis).css("cursor"),y("body").css("cursor","auto"===s?this.axis+"-resize":s),this._addClass("ui-resizable-resizing"),this._propagate("start",t),!0},_mouseDrag:function(t){var e=this.originalMousePosition,i=this.axis,s=t.pageX-e.left||0,e=t.pageY-e.top||0,i=this._change[i];return this._updatePrevProperties(),i&&(e=i.apply(this,[t,s,e]),this._updateVirtualBoundaries(t.shiftKey),(this._aspectRatio||t.shiftKey)&&(e=this._updateRatio(e,t)),e=this._respectSize(e,t),this._updateCache(e),this._propagate("resize",t),e=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),y.isEmptyObject(e)||(this._updatePrevProperties(),this._trigger("resize",t,this.ui()),this._applyChanges())),!1},_mouseStop:function(t){this.resizing=!1;var e,i,s,n=this.options,o=this;return this._helper&&(s=(e=(i=this._proportionallyResizeElements).length&&/textarea/i.test(i[0].nodeName))&&this._hasScroll(i[0],"left")?0:o.sizeDiff.height,i=e?0:o.sizeDiff.width,e={width:o.helper.width()-i,height:o.helper.height()-s},i=parseFloat(o.element.css("left"))+(o.position.left-o.originalPosition.left)||null,s=parseFloat(o.element.css("top"))+(o.position.top-o.originalPosition.top)||null,n.animate||this.element.css(y.extend(e,{top:s,left:i})),o.helper.height(o.size.height),o.helper.width(o.size.width),this._helper&&!n.animate&&this._proportionallyResize()),y("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",t),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s=this.options,n={minWidth:this._isNumber(s.minWidth)?s.minWidth:0,maxWidth:this._isNumber(s.maxWidth)?s.maxWidth:1/0,minHeight:this._isNumber(s.minHeight)?s.minHeight:0,maxHeight:this._isNumber(s.maxHeight)?s.maxHeight:1/0};(this._aspectRatio||t)&&(e=n.minHeight*this.aspectRatio,i=n.minWidth/this.aspectRatio,s=n.maxHeight*this.aspectRatio,t=n.maxWidth/this.aspectRatio,e>n.minWidth&&(n.minWidth=e),i>n.minHeight&&(n.minHeight=i),st.width,h=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,a=this.originalPosition.left+this.originalSize.width,r=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),i=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),h&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=a-e.minWidth),s&&l&&(t.left=a-e.maxWidth),h&&i&&(t.top=r-e.minHeight),n&&i&&(t.top=r-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];e<4;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;e").css({overflow:"hidden"}),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++e.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize;return{left:this.originalPosition.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize;return{top:this.originalPosition.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},sw:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[t,e,i]))},ne:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},nw:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[t,e,i]))}},_propagate:function(t,e){y.ui.plugin.call(this,t,[e,this.ui()]),"resize"!==t&&this._trigger(t,e,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),y.ui.plugin.add("resizable","animate",{stop:function(e){var i=y(this).resizable("instance"),t=i.options,s=i._proportionallyResizeElements,n=s.length&&/textarea/i.test(s[0].nodeName),o=n&&i._hasScroll(s[0],"left")?0:i.sizeDiff.height,h=n?0:i.sizeDiff.width,n={width:i.size.width-h,height:i.size.height-o},h=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,o=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(y.extend(n,o&&h?{top:o,left:h}:{}),{duration:t.animateDuration,easing:t.animateEasing,step:function(){var t={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};s&&s.length&&y(s[0]).css({width:t.width,height:t.height}),i._updateCache(t),i._propagate("resize",e)}})}}),y.ui.plugin.add("resizable","containment",{start:function(){var i,s,n=y(this).resizable("instance"),t=n.options,e=n.element,o=t.containment,h=o instanceof y?o.get(0):/parent/.test(o)?e.parent().get(0):o;h&&(n.containerElement=y(h),/document/.test(o)||o===document?(n.containerOffset={left:0,top:0},n.containerPosition={left:0,top:0},n.parentData={element:y(document),left:0,top:0,width:y(document).width(),height:y(document).height()||document.body.parentNode.scrollHeight}):(i=y(h),s=[],y(["Top","Right","Left","Bottom"]).each(function(t,e){s[t]=n._num(i.css("padding"+e))}),n.containerOffset=i.offset(),n.containerPosition=i.position(),n.containerSize={height:i.innerHeight()-s[3],width:i.innerWidth()-s[1]},t=n.containerOffset,e=n.containerSize.height,o=n.containerSize.width,o=n._hasScroll(h,"left")?h.scrollWidth:o,e=n._hasScroll(h)?h.scrollHeight:e,n.parentData={element:h,left:t.left,top:t.top,width:o,height:e}))},resize:function(t){var e=y(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.position,o=e._aspectRatio||t.shiftKey,h={top:0,left:0},a=e.containerElement,t=!0;a[0]!==document&&/static/.test(a.css("position"))&&(h=s),n.left<(e._helper?s.left:0)&&(e.size.width=e.size.width+(e._helper?e.position.left-s.left:e.position.left-h.left),o&&(e.size.height=e.size.width/e.aspectRatio,t=!1),e.position.left=i.helper?s.left:0),n.top<(e._helper?s.top:0)&&(e.size.height=e.size.height+(e._helper?e.position.top-s.top:e.position.top),o&&(e.size.width=e.size.height*e.aspectRatio,t=!1),e.position.top=e._helper?s.top:0),i=e.containerElement.get(0)===e.element.parent().get(0),n=/relative|absolute/.test(e.containerElement.css("position")),i&&n?(e.offset.left=e.parentData.left+e.position.left,e.offset.top=e.parentData.top+e.position.top):(e.offset.left=e.element.offset().left,e.offset.top=e.element.offset().top),n=Math.abs(e.sizeDiff.width+(e._helper?e.offset.left-h.left:e.offset.left-s.left)),s=Math.abs(e.sizeDiff.height+(e._helper?e.offset.top-h.top:e.offset.top-s.top)),n+e.size.width>=e.parentData.width&&(e.size.width=e.parentData.width-n,o&&(e.size.height=e.size.width/e.aspectRatio,t=!1)),s+e.size.height>=e.parentData.height&&(e.size.height=e.parentData.height-s,o&&(e.size.width=e.size.height*e.aspectRatio,t=!1)),t||(e.position.left=e.prevPosition.left,e.position.top=e.prevPosition.top,e.size.width=e.prevSize.width,e.size.height=e.prevSize.height)},stop:function(){var t=y(this).resizable("instance"),e=t.options,i=t.containerOffset,s=t.containerPosition,n=t.containerElement,o=y(t.helper),h=o.offset(),a=o.outerWidth()-t.sizeDiff.width,o=o.outerHeight()-t.sizeDiff.height;t._helper&&!e.animate&&/relative/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o}),t._helper&&!e.animate&&/static/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o})}}),y.ui.plugin.add("resizable","alsoResize",{start:function(){var t=y(this).resizable("instance").options;y(t.alsoResize).each(function(){var t=y(this);t.data("ui-resizable-alsoresize",{width:parseFloat(t.width()),height:parseFloat(t.height()),left:parseFloat(t.css("left")),top:parseFloat(t.css("top"))})})},resize:function(t,i){var e=y(this).resizable("instance"),s=e.options,n=e.originalSize,o=e.originalPosition,h={height:e.size.height-n.height||0,width:e.size.width-n.width||0,top:e.position.top-o.top||0,left:e.position.left-o.left||0};y(s.alsoResize).each(function(){var t=y(this),s=y(this).data("ui-resizable-alsoresize"),n={},e=t.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];y.each(e,function(t,e){var i=(s[e]||0)+(h[e]||0);i&&0<=i&&(n[e]=i||null)}),t.css(n)})},stop:function(){y(this).removeData("ui-resizable-alsoresize")}}),y.ui.plugin.add("resizable","ghost",{start:function(){var t=y(this).resizable("instance"),e=t.size;t.ghost=t.originalElement.clone(),t.ghost.css({opacity:.25,display:"block",position:"relative",height:e.height,width:e.width,margin:0,left:0,top:0}),t._addClass(t.ghost,"ui-resizable-ghost"),!1!==y.uiBackCompat&&"string"==typeof t.options.ghost&&t.ghost.addClass(this.options.ghost),t.ghost.appendTo(t.helper)},resize:function(){var t=y(this).resizable("instance");t.ghost&&t.ghost.css({position:"relative",height:t.size.height,width:t.size.width})},stop:function(){var t=y(this).resizable("instance");t.ghost&&t.helper&&t.helper.get(0).removeChild(t.ghost.get(0))}}),y.ui.plugin.add("resizable","grid",{resize:function(){var t,e=y(this).resizable("instance"),i=e.options,s=e.size,n=e.originalSize,o=e.originalPosition,h=e.axis,a="number"==typeof i.grid?[i.grid,i.grid]:i.grid,r=a[0]||1,l=a[1]||1,u=Math.round((s.width-n.width)/r)*r,p=Math.round((s.height-n.height)/l)*l,d=n.width+u,c=n.height+p,f=i.maxWidth&&i.maxWidthd,s=i.minHeight&&i.minHeight>c;i.grid=a,m&&(d+=r),s&&(c+=l),f&&(d-=r),g&&(c-=l),/^(se|s|e)$/.test(h)?(e.size.width=d,e.size.height=c):/^(ne)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.top=o.top-p):/^(sw)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.left=o.left-u):((c-l<=0||d-r<=0)&&(t=e._getPaddingPlusBorderDimensions(this)),0=f[g]?0:Math.min(f[g],n));!a&&1-1){targetElements.on(evt+EVENT_NAMESPACE,function elementToggle(event){$.powerTip.toggle(this,event)})}else{targetElements.on(evt+EVENT_NAMESPACE,function elementOpen(event){$.powerTip.show(this,event)})}});$.each(options.closeEvents,function(idx,evt){if($.inArray(evt,options.openEvents)<0){targetElements.on(evt+EVENT_NAMESPACE,function elementClose(event){$.powerTip.hide(this,!isMouseEvent(event))})}});targetElements.on("keydown"+EVENT_NAMESPACE,function elementKeyDown(event){if(event.keyCode===27){$.powerTip.hide(this,true)}})}return targetElements};$.fn.powerTip.defaults={fadeInTime:200,fadeOutTime:100,followMouse:false,popupId:"powerTip",popupClass:null,intentSensitivity:7,intentPollInterval:100,closeDelay:100,placement:"n",smartPlacement:false,offset:10,mouseOnToPopup:false,manual:false,openEvents:["mouseenter","focus"],closeEvents:["mouseleave","blur"]};$.fn.powerTip.smartPlacementLists={n:["n","ne","nw","s"],e:["e","ne","se","w","nw","sw","n","s","e"],s:["s","se","sw","n"],w:["w","nw","sw","e","ne","se","n","s","w"],nw:["nw","w","sw","n","s","se","nw"],ne:["ne","e","se","n","s","sw","ne"],sw:["sw","w","nw","s","n","ne","sw"],se:["se","e","ne","s","n","nw","se"],"nw-alt":["nw-alt","n","ne-alt","sw-alt","s","se-alt","w","e"],"ne-alt":["ne-alt","n","nw-alt","se-alt","s","sw-alt","e","w"],"sw-alt":["sw-alt","s","se-alt","nw-alt","n","ne-alt","w","e"],"se-alt":["se-alt","s","sw-alt","ne-alt","n","nw-alt","e","w"]};$.powerTip={show:function apiShowTip(element,event){if(isMouseEvent(event)){trackMouse(event);session.previousX=event.pageX;session.previousY=event.pageY;$(element).data(DATA_DISPLAYCONTROLLER).show()}else{$(element).first().data(DATA_DISPLAYCONTROLLER).show(true,true)}return element},reposition:function apiResetPosition(element){$(element).first().data(DATA_DISPLAYCONTROLLER).resetPosition();return element},hide:function apiCloseTip(element,immediate){var displayController;immediate=element?immediate:true;if(element){displayController=$(element).first().data(DATA_DISPLAYCONTROLLER)}else if(session.activeHover){displayController=session.activeHover.data(DATA_DISPLAYCONTROLLER)}if(displayController){displayController.hide(immediate)}return element},toggle:function apiToggle(element,event){if(session.activeHover&&session.activeHover.is(element)){$.powerTip.hide(element,!isMouseEvent(event))}else{$.powerTip.show(element,event)}return element}};$.powerTip.showTip=$.powerTip.show;$.powerTip.closeTip=$.powerTip.hide;function CSSCoordinates(){var me=this;me.top="auto";me.left="auto";me.right="auto";me.bottom="auto";me.set=function(property,value){if($.isNumeric(value)){me[property]=Math.round(value)}}}function DisplayController(element,options,tipController){var hoverTimer=null,myCloseDelay=null;function openTooltip(immediate,forceOpen){cancelTimer();if(!element.data(DATA_HASACTIVEHOVER)){if(!immediate){session.tipOpenImminent=true;hoverTimer=setTimeout(function intentDelay(){hoverTimer=null;checkForIntent()},options.intentPollInterval)}else{if(forceOpen){element.data(DATA_FORCEDOPEN,true)}closeAnyDelayed();tipController.showTip(element)}}else{cancelClose()}}function closeTooltip(disableDelay){if(myCloseDelay){myCloseDelay=session.closeDelayTimeout=clearTimeout(myCloseDelay);session.delayInProgress=false}cancelTimer();session.tipOpenImminent=false;if(element.data(DATA_HASACTIVEHOVER)){element.data(DATA_FORCEDOPEN,false);if(!disableDelay){session.delayInProgress=true;session.closeDelayTimeout=setTimeout(function closeDelay(){session.closeDelayTimeout=null;tipController.hideTip(element);session.delayInProgress=false;myCloseDelay=null},options.closeDelay);myCloseDelay=session.closeDelayTimeout}else{tipController.hideTip(element)}}}function checkForIntent(){var xDifference=Math.abs(session.previousX-session.currentX),yDifference=Math.abs(session.previousY-session.currentY),totalDifference=xDifference+yDifference;if(totalDifference ",{id:options.popupId});if($body.length===0){$body=$("body")}$body.append(tipElement);session.tooltips=session.tooltips?session.tooltips.add(tipElement):tipElement}if(options.followMouse){if(!tipElement.data(DATA_HASMOUSEMOVE)){$document.on("mousemove"+EVENT_NAMESPACE,positionTipOnCursor);$window.on("scroll"+EVENT_NAMESPACE,positionTipOnCursor);tipElement.data(DATA_HASMOUSEMOVE,true)}}function beginShowTip(element){element.data(DATA_HASACTIVEHOVER,true);tipElement.queue(function queueTipInit(next){showTip(element);next()})}function showTip(element){var tipContent;if(!element.data(DATA_HASACTIVEHOVER)){return}if(session.isTipOpen){if(!session.isClosing){hideTip(session.activeHover)}tipElement.delay(100).queue(function queueTipAgain(next){showTip(element);next()});return}element.trigger("powerTipPreRender");tipContent=getTooltipContent(element);if(tipContent){tipElement.empty().append(tipContent)}else{return}element.trigger("powerTipRender");session.activeHover=element;session.isTipOpen=true;tipElement.data(DATA_MOUSEONTOTIP,options.mouseOnToPopup);tipElement.addClass(options.popupClass);if(!options.followMouse||element.data(DATA_FORCEDOPEN)){positionTipOnElement(element);session.isFixedTipOpen=true}else{positionTipOnCursor()}if(!element.data(DATA_FORCEDOPEN)&&!options.followMouse){$document.on("click"+EVENT_NAMESPACE,function documentClick(event){var target=event.target;if(target!==element[0]){if(options.mouseOnToPopup){if(target!==tipElement[0]&&!$.contains(tipElement[0],target)){$.powerTip.hide()}}else{$.powerTip.hide()}}})}if(options.mouseOnToPopup&&!options.manual){tipElement.on("mouseenter"+EVENT_NAMESPACE,function tipMouseEnter(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).cancel()}});tipElement.on("mouseleave"+EVENT_NAMESPACE,function tipMouseLeave(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).hide()}})}tipElement.fadeIn(options.fadeInTime,function fadeInCallback(){if(!session.desyncTimeout){session.desyncTimeout=setInterval(closeDesyncedTip,500)}element.trigger("powerTipOpen")})}function hideTip(element){session.isClosing=true;session.isTipOpen=false;session.desyncTimeout=clearInterval(session.desyncTimeout);element.data(DATA_HASACTIVEHOVER,false);element.data(DATA_FORCEDOPEN,false);$document.off("click"+EVENT_NAMESPACE);tipElement.off(EVENT_NAMESPACE);tipElement.fadeOut(options.fadeOutTime,function fadeOutCallback(){var coords=new CSSCoordinates;session.activeHover=null;session.isClosing=false;session.isFixedTipOpen=false;tipElement.removeClass();coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);tipElement.css(coords);element.trigger("powerTipClose")})}function positionTipOnCursor(){var tipWidth,tipHeight,coords,collisions,collisionCount;if(!session.isFixedTipOpen&&(session.isTipOpen||session.tipOpenImminent&&tipElement.data(DATA_HASMOUSEMOVE))){tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=new CSSCoordinates;coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);collisions=getViewportCollisions(coords,tipWidth,tipHeight);if(collisions!==Collision.none){collisionCount=countFlags(collisions);if(collisionCount===1){if(collisions===Collision.right){coords.set("left",session.scrollLeft+session.windowWidth-tipWidth)}else if(collisions===Collision.bottom){coords.set("top",session.scrollTop+session.windowHeight-tipHeight)}}else{coords.set("left",session.currentX-tipWidth-options.offset);coords.set("top",session.currentY-tipHeight-options.offset)}}tipElement.css(coords)}}function positionTipOnElement(element){var priorityList,finalPlacement;if(options.smartPlacement||options.followMouse&&element.data(DATA_FORCEDOPEN)){priorityList=$.fn.powerTip.smartPlacementLists[options.placement];$.each(priorityList,function(idx,pos){var collisions=getViewportCollisions(placeTooltip(element,pos),tipElement.outerWidth(),tipElement.outerHeight());finalPlacement=pos;return collisions!==Collision.none})}else{placeTooltip(element,options.placement);finalPlacement=options.placement}tipElement.removeClass("w nw sw e ne se n s w se-alt sw-alt ne-alt nw-alt");tipElement.addClass(finalPlacement)}function placeTooltip(element,placement){var iterationCount=0,tipWidth,tipHeight,coords=new CSSCoordinates;coords.set("top",0);coords.set("left",0);tipElement.css(coords);do{tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=placementCalculator.compute(element,placement,tipWidth,tipHeight,options.offset);tipElement.css(coords)}while(++iterationCount<=5&&(tipWidth!==tipElement.outerWidth()||tipHeight!==tipElement.outerHeight()));return coords}function closeDesyncedTip(){var isDesynced=false,hasDesyncableCloseEvent=$.grep(["mouseleave","mouseout","blur","focusout"],function(eventType){return $.inArray(eventType,options.closeEvents)!==-1}).length>0;if(session.isTipOpen&&!session.isClosing&&!session.delayInProgress&&hasDesyncableCloseEvent){if(session.activeHover.data(DATA_HASACTIVEHOVER)===false||session.activeHover.is(":disabled")){isDesynced=true}else if(!isMouseOver(session.activeHover)&&!session.activeHover.is(":focus")&&!session.activeHover.data(DATA_FORCEDOPEN)){if(tipElement.data(DATA_MOUSEONTOTIP)){if(!isMouseOver(tipElement)){isDesynced=true}}else{isDesynced=true}}if(isDesynced){hideTip(session.activeHover)}}}this.showTip=beginShowTip;this.hideTip=hideTip;this.resetPosition=positionTipOnElement}function isSvgElement(element){return Boolean(window.SVGElement&&element[0]instanceof SVGElement)}function isMouseEvent(event){return Boolean(event&&$.inArray(event.type,MOUSE_EVENTS)>-1&&typeof event.pageX==="number")}function initTracking(){if(!session.mouseTrackingActive){session.mouseTrackingActive=true;getViewportDimensions();$(getViewportDimensions);$document.on("mousemove"+EVENT_NAMESPACE,trackMouse);$window.on("resize"+EVENT_NAMESPACE,trackResize);$window.on("scroll"+EVENT_NAMESPACE,trackScroll)}}function getViewportDimensions(){session.scrollLeft=$window.scrollLeft();session.scrollTop=$window.scrollTop();session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackResize(){session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackScroll(){var x=$window.scrollLeft(),y=$window.scrollTop();if(x!==session.scrollLeft){session.currentX+=x-session.scrollLeft;session.scrollLeft=x}if(y!==session.scrollTop){session.currentY+=y-session.scrollTop;session.scrollTop=y}}function trackMouse(event){session.currentX=event.pageX;session.currentY=event.pageY}function isMouseOver(element){var elementPosition=element.offset(),elementBox=element[0].getBoundingClientRect(),elementWidth=elementBox.right-elementBox.left,elementHeight=elementBox.bottom-elementBox.top;return session.currentX>=elementPosition.left&&session.currentX<=elementPosition.left+elementWidth&&session.currentY>=elementPosition.top&&session.currentY<=elementPosition.top+elementHeight}function getTooltipContent(element){var tipText=element.data(DATA_POWERTIP),tipObject=element.data(DATA_POWERTIPJQ),tipTarget=element.data(DATA_POWERTIPTARGET),targetElement,content;if(tipText){if($.isFunction(tipText)){tipText=tipText.call(element[0])}content=tipText}else if(tipObject){if($.isFunction(tipObject)){tipObject=tipObject.call(element[0])}if(tipObject.length>0){content=tipObject.clone(true,true)}}else if(tipTarget){targetElement=$("#"+tipTarget);if(targetElement.length>0){content=targetElement.html()}}return content}function getViewportCollisions(coords,elementWidth,elementHeight){var viewportTop=session.scrollTop,viewportLeft=session.scrollLeft,viewportBottom=viewportTop+session.windowHeight,viewportRight=viewportLeft+session.windowWidth,collisions=Collision.none;if(coords.topviewportBottom||Math.abs(coords.bottom-session.windowHeight)>viewportBottom){collisions|=Collision.bottom}if(coords.leftviewportRight){collisions|=Collision.left}if(coords.left+elementWidth>viewportRight||coords.right1)){a.preventDefault();var c=a.originalEvent.changedTouches[0],d=document.createEvent("MouseEvents");d.initMouseEvent(b,!0,!0,window,1,c.screenX,c.screenY,c.clientX,c.clientY,!1,!1,!1,!1,0,null),a.target.dispatchEvent(d)}}if(a.support.touch="ontouchend"in document,a.support.touch){var e,b=a.ui.mouse.prototype,c=b._mouseInit,d=b._mouseDestroy;b._touchStart=function(a){var b=this;!e&&b._mouseCapture(a.originalEvent.changedTouches[0])&&(e=!0,b._touchMoved=!1,f(a,"mouseover"),f(a,"mousemove"),f(a,"mousedown"))},b._touchMove=function(a){e&&(this._touchMoved=!0,f(a,"mousemove"))},b._touchEnd=function(a){e&&(f(a,"mouseup"),f(a,"mouseout"),this._touchMoved||f(a,"click"),e=!1)},b._mouseInit=function(){var b=this;b.element.bind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),c.call(b)},b._mouseDestroy=function(){var b=this;b.element.unbind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),d.call(b)}}}(jQuery);/*! SmartMenus jQuery Plugin - v1.1.0 - September 17, 2017
+ * http://www.smartmenus.org/
+ * Copyright Vasil Dinkov, Vadikom Web Ltd. http://vadikom.com; Licensed MIT */(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):"object"==typeof module&&"object"==typeof module.exports?module.exports=t(require("jquery")):t(jQuery)})(function($){function initMouseDetection(t){var e=".smartmenus_mouse";if(mouseDetectionEnabled||t)mouseDetectionEnabled&&t&&($(document).off(e),mouseDetectionEnabled=!1);else{var i=!0,s=null,o={mousemove:function(t){var e={x:t.pageX,y:t.pageY,timeStamp:(new Date).getTime()};if(s){var o=Math.abs(s.x-e.x),a=Math.abs(s.y-e.y);if((o>0||a>0)&&2>=o&&2>=a&&300>=e.timeStamp-s.timeStamp&&(mouse=!0,i)){var n=$(t.target).closest("a");n.is("a")&&$.each(menuTrees,function(){return $.contains(this.$root[0],n[0])?(this.itemEnter({currentTarget:n[0]}),!1):void 0}),i=!1}}s=e}};o[touchEvents?"touchstart":"pointerover pointermove pointerout MSPointerOver MSPointerMove MSPointerOut"]=function(t){isTouchEvent(t.originalEvent)&&(mouse=!1)},$(document).on(getEventsNS(o,e)),mouseDetectionEnabled=!0}}function isTouchEvent(t){return!/^(4|mouse)$/.test(t.pointerType)}function getEventsNS(t,e){e||(e="");var i={};for(var s in t)i[s.split(" ").join(e+" ")+e]=t[s];return i}var menuTrees=[],mouse=!1,touchEvents="ontouchstart"in window,mouseDetectionEnabled=!1,requestAnimationFrame=window.requestAnimationFrame||function(t){return setTimeout(t,1e3/60)},cancelAnimationFrame=window.cancelAnimationFrame||function(t){clearTimeout(t)},canAnimate=!!$.fn.animate;return $.SmartMenus=function(t,e){this.$root=$(t),this.opts=e,this.rootId="",this.accessIdPrefix="",this.$subArrow=null,this.activatedItems=[],this.visibleSubMenus=[],this.showTimeout=0,this.hideTimeout=0,this.scrollTimeout=0,this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.idInc=0,this.$firstLink=null,this.$firstSub=null,this.disabled=!1,this.$disableOverlay=null,this.$touchScrollingSub=null,this.cssTransforms3d="perspective"in t.style||"webkitPerspective"in t.style,this.wasCollapsible=!1,this.init()},$.extend($.SmartMenus,{hideAll:function(){$.each(menuTrees,function(){this.menuHideAll()})},destroy:function(){for(;menuTrees.length;)menuTrees[0].destroy();initMouseDetection(!0)},prototype:{init:function(t){var e=this;if(!t){menuTrees.push(this),this.rootId=((new Date).getTime()+Math.random()+"").replace(/\D/g,""),this.accessIdPrefix="sm-"+this.rootId+"-",this.$root.hasClass("sm-rtl")&&(this.opts.rightToLeftSubMenus=!0);var i=".smartmenus";this.$root.data("smartmenus",this).attr("data-smartmenus-id",this.rootId).dataSM("level",1).on(getEventsNS({"mouseover focusin":$.proxy(this.rootOver,this),"mouseout focusout":$.proxy(this.rootOut,this),keydown:$.proxy(this.rootKeyDown,this)},i)).on(getEventsNS({mouseenter:$.proxy(this.itemEnter,this),mouseleave:$.proxy(this.itemLeave,this),mousedown:$.proxy(this.itemDown,this),focus:$.proxy(this.itemFocus,this),blur:$.proxy(this.itemBlur,this),click:$.proxy(this.itemClick,this)},i),"a"),i+=this.rootId,this.opts.hideOnClick&&$(document).on(getEventsNS({touchstart:$.proxy(this.docTouchStart,this),touchmove:$.proxy(this.docTouchMove,this),touchend:$.proxy(this.docTouchEnd,this),click:$.proxy(this.docClick,this)},i)),$(window).on(getEventsNS({"resize orientationchange":$.proxy(this.winResize,this)},i)),this.opts.subIndicators&&(this.$subArrow=$(" ").addClass("sub-arrow"),this.opts.subIndicatorsText&&this.$subArrow.html(this.opts.subIndicatorsText)),initMouseDetection()}if(this.$firstSub=this.$root.find("ul").each(function(){e.menuInit($(this))}).eq(0),this.$firstLink=this.$root.find("a").eq(0),this.opts.markCurrentItem){var s=/(index|default)\.[^#\?\/]*/i,o=/#.*/,a=window.location.href.replace(s,""),n=a.replace(o,"");this.$root.find("a").each(function(){var t=this.href.replace(s,""),i=$(this);(t==a||t==n)&&(i.addClass("current"),e.opts.markCurrentTree&&i.parentsUntil("[data-smartmenus-id]","ul").each(function(){$(this).dataSM("parent-a").addClass("current")}))})}this.wasCollapsible=this.isCollapsible()},destroy:function(t){if(!t){var e=".smartmenus";this.$root.removeData("smartmenus").removeAttr("data-smartmenus-id").removeDataSM("level").off(e),e+=this.rootId,$(document).off(e),$(window).off(e),this.opts.subIndicators&&(this.$subArrow=null)}this.menuHideAll();var i=this;this.$root.find("ul").each(function(){var t=$(this);t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.dataSM("shown-before")&&((i.opts.subMenusMinWidth||i.opts.subMenusMaxWidth)&&t.css({width:"",minWidth:"",maxWidth:""}).removeClass("sm-nowrap"),t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.css({zIndex:"",top:"",left:"",marginLeft:"",marginTop:"",display:""})),0==(t.attr("id")||"").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeDataSM("in-mega").removeDataSM("shown-before").removeDataSM("scroll-arrows").removeDataSM("parent-a").removeDataSM("level").removeDataSM("beforefirstshowfired").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeAttr("aria-expanded"),this.$root.find("a.has-submenu").each(function(){var t=$(this);0==t.attr("id").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeClass("has-submenu").removeDataSM("sub").removeAttr("aria-haspopup").removeAttr("aria-controls").removeAttr("aria-expanded").closest("li").removeDataSM("sub"),this.opts.subIndicators&&this.$root.find("span.sub-arrow").remove(),this.opts.markCurrentItem&&this.$root.find("a.current").removeClass("current"),t||(this.$root=null,this.$firstLink=null,this.$firstSub=null,this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),menuTrees.splice($.inArray(this,menuTrees),1))},disable:function(t){if(!this.disabled){if(this.menuHideAll(),!t&&!this.opts.isPopup&&this.$root.is(":visible")){var e=this.$root.offset();this.$disableOverlay=$('
').css({position:"absolute",top:e.top,left:e.left,width:this.$root.outerWidth(),height:this.$root.outerHeight(),zIndex:this.getStartZIndex(!0),opacity:0}).appendTo(document.body)}this.disabled=!0}},docClick:function(t){return this.$touchScrollingSub?(this.$touchScrollingSub=null,void 0):((this.visibleSubMenus.length&&!$.contains(this.$root[0],t.target)||$(t.target).closest("a").length)&&this.menuHideAll(),void 0)},docTouchEnd:function(){if(this.lastTouch){if(!(!this.visibleSubMenus.length||void 0!==this.lastTouch.x2&&this.lastTouch.x1!=this.lastTouch.x2||void 0!==this.lastTouch.y2&&this.lastTouch.y1!=this.lastTouch.y2||this.lastTouch.target&&$.contains(this.$root[0],this.lastTouch.target))){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var t=this;this.hideTimeout=setTimeout(function(){t.menuHideAll()},350)}this.lastTouch=null}},docTouchMove:function(t){if(this.lastTouch){var e=t.originalEvent.touches[0];this.lastTouch.x2=e.pageX,this.lastTouch.y2=e.pageY}},docTouchStart:function(t){var e=t.originalEvent.touches[0];this.lastTouch={x1:e.pageX,y1:e.pageY,target:e.target}},enable:function(){this.disabled&&(this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),this.disabled=!1)},getClosestMenu:function(t){for(var e=$(t).closest("ul");e.dataSM("in-mega");)e=e.parent().closest("ul");return e[0]||null},getHeight:function(t){return this.getOffset(t,!0)},getOffset:function(t,e){var i;"none"==t.css("display")&&(i={position:t[0].style.position,visibility:t[0].style.visibility},t.css({position:"absolute",visibility:"hidden"}).show());var s=t[0].getBoundingClientRect&&t[0].getBoundingClientRect(),o=s&&(e?s.height||s.bottom-s.top:s.width||s.right-s.left);return o||0===o||(o=e?t[0].offsetHeight:t[0].offsetWidth),i&&t.hide().css(i),o},getStartZIndex:function(t){var e=parseInt(this[t?"$root":"$firstSub"].css("z-index"));return!t&&isNaN(e)&&(e=parseInt(this.$root.css("z-index"))),isNaN(e)?1:e},getTouchPoint:function(t){return t.touches&&t.touches[0]||t.changedTouches&&t.changedTouches[0]||t},getViewport:function(t){var e=t?"Height":"Width",i=document.documentElement["client"+e],s=window["inner"+e];return s&&(i=Math.min(i,s)),i},getViewportHeight:function(){return this.getViewport(!0)},getViewportWidth:function(){return this.getViewport()},getWidth:function(t){return this.getOffset(t)},handleEvents:function(){return!this.disabled&&this.isCSSOn()},handleItemEvents:function(t){return this.handleEvents()&&!this.isLinkInMegaMenu(t)},isCollapsible:function(){return"static"==this.$firstSub.css("position")},isCSSOn:function(){return"inline"!=this.$firstLink.css("display")},isFixed:function(){var t="fixed"==this.$root.css("position");return t||this.$root.parentsUntil("body").each(function(){return"fixed"==$(this).css("position")?(t=!0,!1):void 0}),t},isLinkInMegaMenu:function(t){return $(this.getClosestMenu(t[0])).hasClass("mega-menu")},isTouchMode:function(){return!mouse||this.opts.noMouseOver||this.isCollapsible()},itemActivate:function(t,e){var i=t.closest("ul"),s=i.dataSM("level");if(s>1&&(!this.activatedItems[s-2]||this.activatedItems[s-2][0]!=i.dataSM("parent-a")[0])){var o=this;$(i.parentsUntil("[data-smartmenus-id]","ul").get().reverse()).add(i).each(function(){o.itemActivate($(this).dataSM("parent-a"))})}if((!this.isCollapsible()||e)&&this.menuHideSubMenus(this.activatedItems[s-1]&&this.activatedItems[s-1][0]==t[0]?s:s-1),this.activatedItems[s-1]=t,this.$root.triggerHandler("activate.smapi",t[0])!==!1){var a=t.dataSM("sub");a&&(this.isTouchMode()||!this.opts.showOnClick||this.clickActivated)&&this.menuShow(a)}},itemBlur:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&this.$root.triggerHandler("blur.smapi",e[0])},itemClick:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(this.$touchScrollingSub&&this.$touchScrollingSub[0]==e.closest("ul")[0])return this.$touchScrollingSub=null,t.stopPropagation(),!1;if(this.$root.triggerHandler("click.smapi",e[0])===!1)return!1;var i=$(t.target).is(".sub-arrow"),s=e.dataSM("sub"),o=s?2==s.dataSM("level"):!1,a=this.isCollapsible(),n=/toggle$/.test(this.opts.collapsibleBehavior),r=/link$/.test(this.opts.collapsibleBehavior),h=/^accordion/.test(this.opts.collapsibleBehavior);if(s&&!s.is(":visible")){if((!r||!a||i)&&(this.opts.showOnClick&&o&&(this.clickActivated=!0),this.itemActivate(e,h),s.is(":visible")))return this.focusActivated=!0,!1}else if(a&&(n||i))return this.itemActivate(e,h),this.menuHide(s),n&&(this.focusActivated=!1),!1;return this.opts.showOnClick&&o||e.hasClass("disabled")||this.$root.triggerHandler("select.smapi",e[0])===!1?!1:void 0}},itemDown:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&e.dataSM("mousedown",!0)},itemEnter:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(!this.isTouchMode()){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);var i=this;this.showTimeout=setTimeout(function(){i.itemActivate(e)},this.opts.showOnClick&&1==e.closest("ul").dataSM("level")?1:this.opts.showTimeout)}this.$root.triggerHandler("mouseenter.smapi",e[0])}},itemFocus:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(!this.focusActivated||this.isTouchMode()&&e.dataSM("mousedown")||this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0]==e[0]||this.itemActivate(e,!0),this.$root.triggerHandler("focus.smapi",e[0]))},itemLeave:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(this.isTouchMode()||(e[0].blur(),this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0)),e.removeDataSM("mousedown"),this.$root.triggerHandler("mouseleave.smapi",e[0]))},menuHide:function(t){if(this.$root.triggerHandler("beforehide.smapi",t[0])!==!1&&(canAnimate&&t.stop(!0,!0),"none"!=t.css("display"))){var e=function(){t.css("z-index","")};this.isCollapsible()?canAnimate&&this.opts.collapsibleHideFunction?this.opts.collapsibleHideFunction.call(this,t,e):t.hide(this.opts.collapsibleHideDuration,e):canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,t,e):t.hide(this.opts.hideDuration,e),t.dataSM("scroll")&&(this.menuScrollStop(t),t.css({"touch-action":"","-ms-touch-action":"","-webkit-transform":"",transform:""}).off(".smartmenus_scroll").removeDataSM("scroll").dataSM("scroll-arrows").hide()),t.dataSM("parent-a").removeClass("highlighted").attr("aria-expanded","false"),t.attr({"aria-expanded":"false","aria-hidden":"true"});var i=t.dataSM("level");this.activatedItems.splice(i-1,1),this.visibleSubMenus.splice($.inArray(t,this.visibleSubMenus),1),this.$root.triggerHandler("hide.smapi",t[0])}},menuHideAll:function(){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);for(var t=this.opts.isPopup?1:0,e=this.visibleSubMenus.length-1;e>=t;e--)this.menuHide(this.visibleSubMenus[e]);this.opts.isPopup&&(canAnimate&&this.$root.stop(!0,!0),this.$root.is(":visible")&&(canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,this.$root):this.$root.hide(this.opts.hideDuration))),this.activatedItems=[],this.visibleSubMenus=[],this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.$root.triggerHandler("hideAll.smapi")},menuHideSubMenus:function(t){for(var e=this.activatedItems.length-1;e>=t;e--){var i=this.activatedItems[e].dataSM("sub");i&&this.menuHide(i)}},menuInit:function(t){if(!t.dataSM("in-mega")){t.hasClass("mega-menu")&&t.find("ul").dataSM("in-mega",!0);for(var e=2,i=t[0];(i=i.parentNode.parentNode)!=this.$root[0];)e++;var s=t.prevAll("a").eq(-1);s.length||(s=t.prevAll().find("a").eq(-1)),s.addClass("has-submenu").dataSM("sub",t),t.dataSM("parent-a",s).dataSM("level",e).parent().dataSM("sub",t);var o=s.attr("id")||this.accessIdPrefix+ ++this.idInc,a=t.attr("id")||this.accessIdPrefix+ ++this.idInc;s.attr({id:o,"aria-haspopup":"true","aria-controls":a,"aria-expanded":"false"}),t.attr({id:a,role:"group","aria-hidden":"true","aria-labelledby":o,"aria-expanded":"false"}),this.opts.subIndicators&&s[this.opts.subIndicatorsPos](this.$subArrow.clone())}},menuPosition:function(t){var e,i,s=t.dataSM("parent-a"),o=s.closest("li"),a=o.parent(),n=t.dataSM("level"),r=this.getWidth(t),h=this.getHeight(t),u=s.offset(),l=u.left,c=u.top,d=this.getWidth(s),m=this.getHeight(s),p=$(window),f=p.scrollLeft(),v=p.scrollTop(),b=this.getViewportWidth(),S=this.getViewportHeight(),g=a.parent().is("[data-sm-horizontal-sub]")||2==n&&!a.hasClass("sm-vertical"),M=this.opts.rightToLeftSubMenus&&!o.is("[data-sm-reverse]")||!this.opts.rightToLeftSubMenus&&o.is("[data-sm-reverse]"),w=2==n?this.opts.mainMenuSubOffsetX:this.opts.subMenusSubOffsetX,T=2==n?this.opts.mainMenuSubOffsetY:this.opts.subMenusSubOffsetY;if(g?(e=M?d-r-w:w,i=this.opts.bottomToTopSubMenus?-h-T:m+T):(e=M?w-r:d-w,i=this.opts.bottomToTopSubMenus?m-T-h:T),this.opts.keepInViewport){var y=l+e,I=c+i;if(M&&f>y?e=g?f-y+e:d-w:!M&&y+r>f+b&&(e=g?f+b-r-y+e:w-r),g||(S>h&&I+h>v+S?i+=v+S-h-I:(h>=S||v>I)&&(i+=v-I)),g&&(I+h>v+S+.49||v>I)||!g&&h>S+.49){var x=this;t.dataSM("scroll-arrows")||t.dataSM("scroll-arrows",$([$(' ')[0],$(' ')[0]]).on({mouseenter:function(){t.dataSM("scroll").up=$(this).hasClass("scroll-up"),x.menuScroll(t)},mouseleave:function(e){x.menuScrollStop(t),x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(t){t.preventDefault()}}).insertAfter(t));var A=".smartmenus_scroll";if(t.dataSM("scroll",{y:this.cssTransforms3d?0:i-m,step:1,itemH:m,subH:h,arrowDownH:this.getHeight(t.dataSM("scroll-arrows").eq(1))}).on(getEventsNS({mouseover:function(e){x.menuScrollOver(t,e)},mouseout:function(e){x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(e){x.menuScrollMousewheel(t,e)}},A)).dataSM("scroll-arrows").css({top:"auto",left:"0",marginLeft:e+(parseInt(t.css("border-left-width"))||0),width:r-(parseInt(t.css("border-left-width"))||0)-(parseInt(t.css("border-right-width"))||0),zIndex:t.css("z-index")}).eq(g&&this.opts.bottomToTopSubMenus?0:1).show(),this.isFixed()){var C={};C[touchEvents?"touchstart touchmove touchend":"pointerdown pointermove pointerup MSPointerDown MSPointerMove MSPointerUp"]=function(e){x.menuScrollTouch(t,e)},t.css({"touch-action":"none","-ms-touch-action":"none"}).on(getEventsNS(C,A))}}}t.css({top:"auto",left:"0",marginLeft:e,marginTop:i-m})},menuScroll:function(t,e,i){var s,o=t.dataSM("scroll"),a=t.dataSM("scroll-arrows"),n=o.up?o.upEnd:o.downEnd;if(!e&&o.momentum){if(o.momentum*=.92,s=o.momentum,.5>s)return this.menuScrollStop(t),void 0}else s=i||(e||!this.opts.scrollAccelerate?this.opts.scrollStep:Math.floor(o.step));var r=t.dataSM("level");if(this.activatedItems[r-1]&&this.activatedItems[r-1].dataSM("sub")&&this.activatedItems[r-1].dataSM("sub").is(":visible")&&this.menuHideSubMenus(r-1),o.y=o.up&&o.y>=n||!o.up&&n>=o.y?o.y:Math.abs(n-o.y)>s?o.y+(o.up?s:-s):n,t.css(this.cssTransforms3d?{"-webkit-transform":"translate3d(0, "+o.y+"px, 0)",transform:"translate3d(0, "+o.y+"px, 0)"}:{marginTop:o.y}),mouse&&(o.up&&o.y>o.downEnd||!o.up&&o.y0;t.dataSM("scroll-arrows").eq(i?0:1).is(":visible")&&(t.dataSM("scroll").up=i,this.menuScroll(t,!0))}e.preventDefault()},menuScrollOut:function(t,e){mouse&&(/^scroll-(up|down)/.test((e.relatedTarget||"").className)||(t[0]==e.relatedTarget||$.contains(t[0],e.relatedTarget))&&this.getClosestMenu(e.relatedTarget)==t[0]||t.dataSM("scroll-arrows").css("visibility","hidden"))},menuScrollOver:function(t,e){if(mouse&&!/^scroll-(up|down)/.test(e.target.className)&&this.getClosestMenu(e.target)==t[0]){this.menuScrollRefreshData(t);var i=t.dataSM("scroll"),s=$(window).scrollTop()-t.dataSM("parent-a").offset().top-i.itemH;t.dataSM("scroll-arrows").eq(0).css("margin-top",s).end().eq(1).css("margin-top",s+this.getViewportHeight()-i.arrowDownH).end().css("visibility","visible")}},menuScrollRefreshData:function(t){var e=t.dataSM("scroll"),i=$(window).scrollTop()-t.dataSM("parent-a").offset().top-e.itemH;this.cssTransforms3d&&(i=-(parseFloat(t.css("margin-top"))-i)),$.extend(e,{upEnd:i,downEnd:i+this.getViewportHeight()-e.subH})},menuScrollStop:function(t){return this.scrollTimeout?(cancelAnimationFrame(this.scrollTimeout),this.scrollTimeout=0,t.dataSM("scroll").step=1,!0):void 0},menuScrollTouch:function(t,e){if(e=e.originalEvent,isTouchEvent(e)){var i=this.getTouchPoint(e);if(this.getClosestMenu(i.target)==t[0]){var s=t.dataSM("scroll");if(/(start|down)$/i.test(e.type))this.menuScrollStop(t)?(e.preventDefault(),this.$touchScrollingSub=t):this.$touchScrollingSub=null,this.menuScrollRefreshData(t),$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp});else if(/move$/i.test(e.type)){var o=void 0!==s.touchY?s.touchY:s.touchStartY;if(void 0!==o&&o!=i.pageY){this.$touchScrollingSub=t;var a=i.pageY>o;void 0!==s.up&&s.up!=a&&$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp}),$.extend(s,{up:a,touchY:i.pageY}),this.menuScroll(t,!0,Math.abs(i.pageY-o))}e.preventDefault()}else void 0!==s.touchY&&((s.momentum=15*Math.pow(Math.abs(i.pageY-s.touchStartY)/(e.timeStamp-s.touchStartTime),2))&&(this.menuScrollStop(t),this.menuScroll(t),e.preventDefault()),delete s.touchY)}}},menuShow:function(t){if((t.dataSM("beforefirstshowfired")||(t.dataSM("beforefirstshowfired",!0),this.$root.triggerHandler("beforefirstshow.smapi",t[0])!==!1))&&this.$root.triggerHandler("beforeshow.smapi",t[0])!==!1&&(t.dataSM("shown-before",!0),canAnimate&&t.stop(!0,!0),!t.is(":visible"))){var e=t.dataSM("parent-a"),i=this.isCollapsible();if((this.opts.keepHighlighted||i)&&e.addClass("highlighted"),i)t.removeClass("sm-nowrap").css({zIndex:"",width:"auto",minWidth:"",maxWidth:"",top:"",left:"",marginLeft:"",marginTop:""});else{if(t.css("z-index",this.zIndexInc=(this.zIndexInc||this.getStartZIndex())+1),(this.opts.subMenusMinWidth||this.opts.subMenusMaxWidth)&&(t.css({width:"auto",minWidth:"",maxWidth:""}).addClass("sm-nowrap"),this.opts.subMenusMinWidth&&t.css("min-width",this.opts.subMenusMinWidth),this.opts.subMenusMaxWidth)){var s=this.getWidth(t);t.css("max-width",this.opts.subMenusMaxWidth),s>this.getWidth(t)&&t.removeClass("sm-nowrap").css("width",this.opts.subMenusMaxWidth)}this.menuPosition(t)}var o=function(){t.css("overflow","")};i?canAnimate&&this.opts.collapsibleShowFunction?this.opts.collapsibleShowFunction.call(this,t,o):t.show(this.opts.collapsibleShowDuration,o):canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,t,o):t.show(this.opts.showDuration,o),e.attr("aria-expanded","true"),t.attr({"aria-expanded":"true","aria-hidden":"false"}),this.visibleSubMenus.push(t),this.$root.triggerHandler("show.smapi",t[0])}},popupHide:function(t){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},t?1:this.opts.hideTimeout)},popupShow:function(t,e){if(!this.opts.isPopup)return alert('SmartMenus jQuery Error:\n\nIf you want to show this menu via the "popupShow" method, set the isPopup:true option.'),void 0;if(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),this.$root.dataSM("shown-before",!0),canAnimate&&this.$root.stop(!0,!0),!this.$root.is(":visible")){this.$root.css({left:t,top:e});var i=this,s=function(){i.$root.css("overflow","")};canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,this.$root,s):this.$root.show(this.opts.showDuration,s),this.visibleSubMenus[0]=this.$root}},refresh:function(){this.destroy(!0),this.init(!0)},rootKeyDown:function(t){if(this.handleEvents())switch(t.keyCode){case 27:var e=this.activatedItems[0];if(e){this.menuHideAll(),e[0].focus();var i=e.dataSM("sub");i&&this.menuHide(i)}break;case 32:var s=$(t.target);if(s.is("a")&&this.handleItemEvents(s)){var i=s.dataSM("sub");i&&!i.is(":visible")&&(this.itemClick({currentTarget:t.target}),t.preventDefault())}}},rootOut:function(t){if(this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),!this.opts.showOnClick||!this.opts.hideOnClick)){var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},this.opts.hideTimeout)}},rootOver:function(t){this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0)},winResize:function(t){if(this.handleEvents()){if(!("onorientationchange"in window)||"orientationchange"==t.type){var e=this.isCollapsible();this.wasCollapsible&&e||(this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0].blur(),this.menuHideAll()),this.wasCollapsible=e}}else if(this.$disableOverlay){var i=this.$root.offset();this.$disableOverlay.css({top:i.top,left:i.left,width:this.$root.outerWidth(),height:this.$root.outerHeight()})}}}}),$.fn.dataSM=function(t,e){return e?this.data(t+"_smartmenus",e):this.data(t+"_smartmenus")},$.fn.removeDataSM=function(t){return this.removeData(t+"_smartmenus")},$.fn.smartmenus=function(options){if("string"==typeof options){var args=arguments,method=options;return Array.prototype.shift.call(args),this.each(function(){var t=$(this).data("smartmenus");t&&t[method]&&t[method].apply(t,args)})}return this.each(function(){var dataOpts=$(this).data("sm-options")||null;if(dataOpts)try{dataOpts=eval("("+dataOpts+")")}catch(e){dataOpts=null,alert('ERROR\n\nSmartMenus jQuery init:\nInvalid "data-sm-options" attribute value syntax.')}new $.SmartMenus(this,$.extend({},$.fn.smartmenus.defaults,options,dataOpts))})},$.fn.smartmenus.defaults={isPopup:!1,mainMenuSubOffsetX:0,mainMenuSubOffsetY:0,subMenusSubOffsetX:0,subMenusSubOffsetY:0,subMenusMinWidth:"10em",subMenusMaxWidth:"20em",subIndicators:!0,subIndicatorsPos:"append",subIndicatorsText:"",scrollStep:30,scrollAccelerate:!0,showTimeout:250,hideTimeout:500,showDuration:0,showFunction:null,hideDuration:0,hideFunction:function(t,e){t.fadeOut(200,e)},collapsibleShowDuration:0,collapsibleShowFunction:function(t,e){t.slideDown(200,e)},collapsibleHideDuration:0,collapsibleHideFunction:function(t,e){t.slideUp(200,e)},showOnClick:!1,hideOnClick:!0,noMouseOver:!1,keepInViewport:!0,keepHighlighted:!0,markCurrentItem:!1,markCurrentTree:!0,rightToLeftSubMenus:!1,bottomToTopSubMenus:!1,collapsibleBehavior:"default"},$});
\ No newline at end of file
diff --git a/Documentation/html/jquery.js.meta b/Documentation/html/jquery.js.meta
new file mode 100644
index 0000000..6713e5e
--- /dev/null
+++ b/Documentation/html/jquery.js.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 3cf478a6753c2c79aa8479224333fdae
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Documentation/html/md__2home_2pascal_2_development_2_projects_2_passer_2_nano_brain_2_nano_brain_2_assets_2_nano_brain-unitypackage_2_r_e_a_d_m_e.html b/Documentation/html/md__2home_2pascal_2_development_2_projects_2_passer_2_nano_brain_2_nano_brain_2_assets_2_nano_brain-unitypackage_2_r_e_a_d_m_e.html
new file mode 100644
index 0000000..ae3ab5f
--- /dev/null
+++ b/Documentation/html/md__2home_2pascal_2_development_2_projects_2_passer_2_nano_brain_2_nano_brain_2_assets_2_nano_brain-unitypackage_2_r_e_a_d_m_e.html
@@ -0,0 +1,85 @@
+
+
+
+
+
+
+
+Nano Brain for Unity: NanoBrain
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Nano Brain for Unity v0.1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Documentation/html/md__2home_2pascal_2_development_2_projects_2_passer_2_nano_brain_2_nano_brain_2_assets_2_nano_brain-unitypackage_2_r_e_a_d_m_e.html.meta b/Documentation/html/md__2home_2pascal_2_development_2_projects_2_passer_2_nano_brain_2_nano_brain_2_assets_2_nano_brain-unitypackage_2_r_e_a_d_m_e.html.meta
new file mode 100644
index 0000000..f619db0
--- /dev/null
+++ b/Documentation/html/md__2home_2pascal_2_development_2_projects_2_passer_2_nano_brain_2_nano_brain_2_assets_2_nano_brain-unitypackage_2_r_e_a_d_m_e.html.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: c4ad8bc30919b3fb1aabdf1b8cc7ccd7
+TextScriptImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Documentation/html/md__installation.html b/Documentation/html/md__installation.html
new file mode 100644
index 0000000..59fa488
--- /dev/null
+++ b/Documentation/html/md__installation.html
@@ -0,0 +1,91 @@
+
+
+
+
+
+
+
+Nano Brain for Unity: Package Installation
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Nano Brain for Unity v0.1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+
+
+
+
+
You can import the NanoBrain Ant package in Unity directly with the Package Manager git package importer.
+
See Unity: Installing from a Git URL
+
Use the link from 'Clone with HTTP' (for example: https://git.passer.life/CreatureControl/Ant.git ) In this way you can always retrieve the latest version by pressing the Update button in the Package Manager.
+
Optionally, you can use a tag to retrieve a specific version. For example: https://git.passer.life/CreatureControl/Ant.git#0.1.0 . This will give you a stable version which does not change. Updating can be done by retrieving the package with a link to a new release.
+
+Samples Installation
+
In the Unity Package manager, select the NanoBrain Ant package and look for the Samples tab in the details pane on the right. There you can import the Models.
+
+
+
+
+
+
diff --git a/Documentation/html/md__installation.html.meta b/Documentation/html/md__installation.html.meta
new file mode 100644
index 0000000..28c8bfd
--- /dev/null
+++ b/Documentation/html/md__installation.html.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 96db3f6a19212db6ab7a2028cdbba6af
+TextScriptImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Documentation/html/menu.js b/Documentation/html/menu.js
new file mode 100644
index 0000000..b0b2693
--- /dev/null
+++ b/Documentation/html/menu.js
@@ -0,0 +1,136 @@
+/*
+ @licstart The following is the entire license notice for the JavaScript code in this file.
+
+ The MIT License (MIT)
+
+ Copyright (C) 1997-2020 by Dimitri van Heesch
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+ and associated documentation files (the "Software"), to deal in the Software without restriction,
+ including without limitation the rights to use, copy, modify, merge, publish, distribute,
+ sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all copies or
+ substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+ BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+ @licend The above is the entire license notice for the JavaScript code in this file
+ */
+function initMenu(relPath,searchEnabled,serverSide,searchPage,search) {
+ function makeTree(data,relPath) {
+ var result='';
+ if ('children' in data) {
+ result+='';
+ for (var i in data.children) {
+ var url;
+ var link;
+ link = data.children[i].url;
+ if (link.substring(0,1)=='^') {
+ url = link.substring(1);
+ } else {
+ url = relPath+link;
+ }
+ result+=''+
+ data.children[i].text+' '+
+ makeTree(data.children[i],relPath)+' ';
+ }
+ result+=' ';
+ }
+ return result;
+ }
+ var searchBoxHtml;
+ if (searchEnabled) {
+ if (serverSide) {
+ searchBoxHtml=''+
+ '
'+
+ ''+
+ '
'+
+ '
'+
+ '
';
+ } else {
+ searchBoxHtml=''+
+ '
'+
+ ' '+
+ ' '+
+ ' '+
+ '
'+
+ ' '+
+ ''+
+ '
';
+ }
+ }
+
+ $('#main-nav').before(' '+
+ ''+
+ ' '+
+ 'Toggle main menu visibility '+
+ ' '+
+ '
');
+ $('#main-nav').append(makeTree(menudata,relPath));
+ $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu');
+ if (searchBoxHtml) {
+ $('#main-menu').append(' ');
+ }
+ var $mainMenuState = $('#main-menu-state');
+ var prevWidth = 0;
+ if ($mainMenuState.length) {
+ function initResizableIfExists() {
+ if (typeof initResizable==='function') initResizable();
+ }
+ // animate mobile menu
+ $mainMenuState.change(function(e) {
+ var $menu = $('#main-menu');
+ var options = { duration: 250, step: initResizableIfExists };
+ if (this.checked) {
+ options['complete'] = function() { $menu.css('display', 'block') };
+ $menu.hide().slideDown(options);
+ } else {
+ options['complete'] = function() { $menu.css('display', 'none') };
+ $menu.show().slideUp(options);
+ }
+ });
+ // set default menu visibility
+ function resetState() {
+ var $menu = $('#main-menu');
+ var $mainMenuState = $('#main-menu-state');
+ var newWidth = $(window).outerWidth();
+ if (newWidth!=prevWidth) {
+ if ($(window).outerWidth()<768) {
+ $mainMenuState.prop('checked',false); $menu.hide();
+ $('#searchBoxPos1').html(searchBoxHtml);
+ $('#searchBoxPos2').hide();
+ } else {
+ $menu.show();
+ $('#searchBoxPos1').empty();
+ $('#searchBoxPos2').html(searchBoxHtml);
+ $('#searchBoxPos2').show();
+ }
+ if (typeof searchBox!=='undefined') {
+ searchBox.CloseResultsWindow();
+ }
+ prevWidth = newWidth;
+ }
+ }
+ $(window).ready(function() { resetState(); initResizableIfExists(); });
+ $(window).resize(resetState);
+ }
+ $('#main-menu').smartmenus();
+}
+/* @license-end */
diff --git a/Documentation/html/menu.js.meta b/Documentation/html/menu.js.meta
new file mode 100644
index 0000000..1514579
--- /dev/null
+++ b/Documentation/html/menu.js.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: bf0867ab9943f2b3e8ff363a54e3630b
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Documentation/html/menudata.js b/Documentation/html/menudata.js
new file mode 100644
index 0000000..18b2c82
--- /dev/null
+++ b/Documentation/html/menudata.js
@@ -0,0 +1,63 @@
+/*
+ @licstart The following is the entire license notice for the JavaScript code in this file.
+
+ The MIT License (MIT)
+
+ Copyright (C) 1997-2020 by Dimitri van Heesch
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+ and associated documentation files (the "Software"), to deal in the Software without restriction,
+ including without limitation the rights to use, copy, modify, merge, publish, distribute,
+ sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all copies or
+ substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+ BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+ @licend The above is the entire license notice for the JavaScript code in this file
+*/
+var menudata={children:[
+{text:"Main Page",url:"index.html"},
+{text:"Related Pages",url:"pages.html"},
+{text:"Classes",url:"annotated.html",children:[
+{text:"Class List",url:"annotated.html"},
+{text:"Class Index",url:"classes.html"},
+{text:"Class Hierarchy",url:"hierarchy.html"},
+{text:"Class Members",url:"functions.html",children:[
+{text:"All",url:"functions.html",children:[
+{text:"_",url:"functions.html#index__5F"},
+{text:"a",url:"functions.html#index_a"},
+{text:"b",url:"functions.html#index_b"},
+{text:"c",url:"functions.html#index_c"},
+{text:"d",url:"functions.html#index_d"},
+{text:"g",url:"functions.html#index_g"},
+{text:"i",url:"functions.html#index_i"},
+{text:"l",url:"functions.html#index_l"},
+{text:"n",url:"functions.html#index_n"},
+{text:"o",url:"functions.html#index_o"},
+{text:"p",url:"functions.html#index_p"},
+{text:"r",url:"functions.html#index_r"},
+{text:"s",url:"functions.html#index_s"},
+{text:"t",url:"functions.html#index_t"},
+{text:"u",url:"functions.html#index_u"},
+{text:"w",url:"functions.html#index_w"}]},
+{text:"Functions",url:"functions_func.html",children:[
+{text:"a",url:"functions_func.html#index_a"},
+{text:"c",url:"functions_func.html#index_c"},
+{text:"d",url:"functions_func.html#index_d"},
+{text:"g",url:"functions_func.html#index_g"},
+{text:"n",url:"functions_func.html#index_n"},
+{text:"p",url:"functions_func.html#index_p"},
+{text:"r",url:"functions_func.html#index_r"},
+{text:"s",url:"functions_func.html#index_s"},
+{text:"t",url:"functions_func.html#index_t"},
+{text:"u",url:"functions_func.html#index_u"}]},
+{text:"Variables",url:"functions_vars.html"},
+{text:"Enumerations",url:"functions_enum.html"},
+{text:"Properties",url:"functions_prop.html"}]}]}]}
diff --git a/Documentation/html/menudata.js.meta b/Documentation/html/menudata.js.meta
new file mode 100644
index 0000000..546f19c
--- /dev/null
+++ b/Documentation/html/menudata.js.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 0e1094ebc41608cfd9e63a04a94b6614
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Documentation/html/minus.svg b/Documentation/html/minus.svg
new file mode 100644
index 0000000..f70d0c1
--- /dev/null
+++ b/Documentation/html/minus.svg
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/Documentation/html/minus.svg.meta b/Documentation/html/minus.svg.meta
new file mode 100644
index 0000000..cf6b7d8
--- /dev/null
+++ b/Documentation/html/minus.svg.meta
@@ -0,0 +1,53 @@
+fileFormatVersion: 2
+guid: 75bf6d7b0e663a84fac3d2314389b976
+ScriptedImporter:
+ internalIDToNameTable: []
+ externalObjects: {}
+ serializedVersion: 2
+ userData:
+ assetBundleName:
+ assetBundleVariant:
+ script: {fileID: 12408, guid: 0000000000000000e000000000000000, type: 0}
+ svgType: 3
+ texturedSpriteMeshType: 0
+ svgPixelsPerUnit: 100
+ gradientResolution: 64
+ alignment: 0
+ customPivot: {x: 0, y: 0}
+ generatePhysicsShape: 0
+ viewportOptions: 0
+ preserveViewport: 0
+ advancedMode: 0
+ tessellationMode: 1
+ predefinedResolutionIndex: 1
+ targetResolution: 1080
+ resolutionMultiplier: 1
+ stepDistance: 10
+ samplingStepDistance: 100
+ maxCordDeviationEnabled: 0
+ maxCordDeviation: 1
+ maxTangentAngleEnabled: 0
+ maxTangentAngle: 5
+ keepTextureAspectRatio: 1
+ textureSize: 256
+ textureWidth: 256
+ textureHeight: 256
+ wrapMode: 0
+ filterMode: 1
+ sampleCount: 4
+ preserveSVGImageAspect: 0
+ useSVGPixelsPerUnit: 0
+ spriteData:
+ TessellationDetail: 0
+ SpriteName:
+ SpritePivot: {x: 0, y: 0}
+ SpriteAlignment: 0
+ SpriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ SpriteRect:
+ serializedVersion: 2
+ x: 0
+ y: 0
+ width: 0
+ height: 0
+ SpriteID:
+ PhysicsOutlines: []
diff --git a/Documentation/html/minusd.svg b/Documentation/html/minusd.svg
new file mode 100644
index 0000000..5f8e879
--- /dev/null
+++ b/Documentation/html/minusd.svg
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/Documentation/html/minusd.svg.meta b/Documentation/html/minusd.svg.meta
new file mode 100644
index 0000000..96e3406
--- /dev/null
+++ b/Documentation/html/minusd.svg.meta
@@ -0,0 +1,53 @@
+fileFormatVersion: 2
+guid: 3dbd79767a52054368fa2ee4614c305f
+ScriptedImporter:
+ internalIDToNameTable: []
+ externalObjects: {}
+ serializedVersion: 2
+ userData:
+ assetBundleName:
+ assetBundleVariant:
+ script: {fileID: 12408, guid: 0000000000000000e000000000000000, type: 0}
+ svgType: 3
+ texturedSpriteMeshType: 0
+ svgPixelsPerUnit: 100
+ gradientResolution: 64
+ alignment: 0
+ customPivot: {x: 0, y: 0}
+ generatePhysicsShape: 0
+ viewportOptions: 0
+ preserveViewport: 0
+ advancedMode: 0
+ tessellationMode: 1
+ predefinedResolutionIndex: 1
+ targetResolution: 1080
+ resolutionMultiplier: 1
+ stepDistance: 10
+ samplingStepDistance: 100
+ maxCordDeviationEnabled: 0
+ maxCordDeviation: 1
+ maxTangentAngleEnabled: 0
+ maxTangentAngle: 5
+ keepTextureAspectRatio: 1
+ textureSize: 256
+ textureWidth: 256
+ textureHeight: 256
+ wrapMode: 0
+ filterMode: 1
+ sampleCount: 4
+ preserveSVGImageAspect: 0
+ useSVGPixelsPerUnit: 0
+ spriteData:
+ TessellationDetail: 0
+ SpriteName:
+ SpritePivot: {x: 0, y: 0}
+ SpriteAlignment: 0
+ SpriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ SpriteRect:
+ serializedVersion: 2
+ x: 0
+ y: 0
+ width: 0
+ height: 0
+ SpriteID:
+ PhysicsOutlines: []
diff --git a/Documentation/html/namespace_nano_brain.html b/Documentation/html/namespace_nano_brain.html
new file mode 100644
index 0000000..306984e
--- /dev/null
+++ b/Documentation/html/namespace_nano_brain.html
@@ -0,0 +1,115 @@
+
+
+
+
+
+
+
+Nano Brain for Unity: NanoBrain Namespace Reference
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Nano Brain for Unity v0.1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+
+
+
+
+
+
The Nanobrain namespace.
+More...
+
+
+
The Nanobrain namespace.
+
+
+
+
+
diff --git a/Documentation/html/namespace_nano_brain.html.meta b/Documentation/html/namespace_nano_brain.html.meta
new file mode 100644
index 0000000..9bad344
--- /dev/null
+++ b/Documentation/html/namespace_nano_brain.html.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: f68497d4c4a5c3b879fe70ded6330a14
+TextScriptImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Documentation/html/nav_f.png b/Documentation/html/nav_f.png
new file mode 100644
index 0000000..4154a8d
Binary files /dev/null and b/Documentation/html/nav_f.png differ
diff --git a/Documentation/html/nav_f.png.meta b/Documentation/html/nav_f.png.meta
new file mode 100644
index 0000000..3c3f483
--- /dev/null
+++ b/Documentation/html/nav_f.png.meta
@@ -0,0 +1,117 @@
+fileFormatVersion: 2
+guid: 6013d16c3bdfa9fa080c73d709fac4d3
+TextureImporter:
+ internalIDToNameTable: []
+ externalObjects: {}
+ serializedVersion: 13
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 1
+ sRGBTexture: 1
+ linearTexture: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapsPreserveCoverage: 0
+ alphaTestReferenceValue: 0.5
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ flipGreenChannel: 0
+ isReadable: 0
+ streamingMipmaps: 0
+ streamingMipmapsPriority: 0
+ vTOnly: 0
+ ignoreMipmapLimit: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 6
+ cubemapConvolution: 0
+ seamlessCubemap: 0
+ textureFormat: 1
+ maxTextureSize: 2048
+ textureSettings:
+ serializedVersion: 2
+ filterMode: 1
+ aniso: 1
+ mipBias: 0
+ wrapU: 0
+ wrapV: 0
+ wrapW: 0
+ nPOTScale: 1
+ lightmap: 0
+ compressionQuality: 50
+ spriteMode: 0
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: 0.5, y: 0.5}
+ spritePixelsToUnits: 100
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spriteGenerateFallbackPhysicsShape: 1
+ alphaUsage: 1
+ alphaIsTransparency: 0
+ spriteTessellationDetail: -1
+ textureType: 0
+ textureShape: 1
+ singleChannelComponent: 0
+ flipbookRows: 1
+ flipbookColumns: 1
+ maxTextureSizeSet: 0
+ compressionQualitySet: 0
+ textureFormatSet: 0
+ ignorePngGamma: 0
+ applyGammaDecoding: 0
+ swizzle: 50462976
+ cookieLightType: 0
+ platformSettings:
+ - serializedVersion: 4
+ buildTarget: DefaultTexturePlatform
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: Standalone
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ spriteSheet:
+ serializedVersion: 2
+ sprites: []
+ outline: []
+ customData:
+ physicsShape: []
+ bones: []
+ spriteID:
+ internalID: 0
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ secondaryTextures: []
+ spriteCustomMetadata:
+ entries: []
+ nameFileIdTable: {}
+ mipmapLimitGroupName:
+ pSDRemoveMatte: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Documentation/html/nav_fd.png b/Documentation/html/nav_fd.png
new file mode 100644
index 0000000..93a398f
Binary files /dev/null and b/Documentation/html/nav_fd.png differ
diff --git a/Documentation/html/nav_fd.png.meta b/Documentation/html/nav_fd.png.meta
new file mode 100644
index 0000000..7fa3ffa
--- /dev/null
+++ b/Documentation/html/nav_fd.png.meta
@@ -0,0 +1,117 @@
+fileFormatVersion: 2
+guid: e3c36f216bc29fa69a6dd09a7bcd561f
+TextureImporter:
+ internalIDToNameTable: []
+ externalObjects: {}
+ serializedVersion: 13
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 1
+ sRGBTexture: 1
+ linearTexture: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapsPreserveCoverage: 0
+ alphaTestReferenceValue: 0.5
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ flipGreenChannel: 0
+ isReadable: 0
+ streamingMipmaps: 0
+ streamingMipmapsPriority: 0
+ vTOnly: 0
+ ignoreMipmapLimit: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 6
+ cubemapConvolution: 0
+ seamlessCubemap: 0
+ textureFormat: 1
+ maxTextureSize: 2048
+ textureSettings:
+ serializedVersion: 2
+ filterMode: 1
+ aniso: 1
+ mipBias: 0
+ wrapU: 0
+ wrapV: 0
+ wrapW: 0
+ nPOTScale: 1
+ lightmap: 0
+ compressionQuality: 50
+ spriteMode: 0
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: 0.5, y: 0.5}
+ spritePixelsToUnits: 100
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spriteGenerateFallbackPhysicsShape: 1
+ alphaUsage: 1
+ alphaIsTransparency: 0
+ spriteTessellationDetail: -1
+ textureType: 0
+ textureShape: 1
+ singleChannelComponent: 0
+ flipbookRows: 1
+ flipbookColumns: 1
+ maxTextureSizeSet: 0
+ compressionQualitySet: 0
+ textureFormatSet: 0
+ ignorePngGamma: 0
+ applyGammaDecoding: 0
+ swizzle: 50462976
+ cookieLightType: 0
+ platformSettings:
+ - serializedVersion: 4
+ buildTarget: DefaultTexturePlatform
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: Standalone
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ spriteSheet:
+ serializedVersion: 2
+ sprites: []
+ outline: []
+ customData:
+ physicsShape: []
+ bones: []
+ spriteID:
+ internalID: 0
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ secondaryTextures: []
+ spriteCustomMetadata:
+ entries: []
+ nameFileIdTable: {}
+ mipmapLimitGroupName:
+ pSDRemoveMatte: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Documentation/html/nav_g.png b/Documentation/html/nav_g.png
new file mode 100644
index 0000000..2093a23
Binary files /dev/null and b/Documentation/html/nav_g.png differ
diff --git a/Documentation/html/nav_g.png.meta b/Documentation/html/nav_g.png.meta
new file mode 100644
index 0000000..96fa1d8
--- /dev/null
+++ b/Documentation/html/nav_g.png.meta
@@ -0,0 +1,117 @@
+fileFormatVersion: 2
+guid: 96911d259131ee1f39f2596329dcac9e
+TextureImporter:
+ internalIDToNameTable: []
+ externalObjects: {}
+ serializedVersion: 13
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 1
+ sRGBTexture: 1
+ linearTexture: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapsPreserveCoverage: 0
+ alphaTestReferenceValue: 0.5
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ flipGreenChannel: 0
+ isReadable: 0
+ streamingMipmaps: 0
+ streamingMipmapsPriority: 0
+ vTOnly: 0
+ ignoreMipmapLimit: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 6
+ cubemapConvolution: 0
+ seamlessCubemap: 0
+ textureFormat: 1
+ maxTextureSize: 2048
+ textureSettings:
+ serializedVersion: 2
+ filterMode: 1
+ aniso: 1
+ mipBias: 0
+ wrapU: 0
+ wrapV: 0
+ wrapW: 0
+ nPOTScale: 1
+ lightmap: 0
+ compressionQuality: 50
+ spriteMode: 0
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: 0.5, y: 0.5}
+ spritePixelsToUnits: 100
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spriteGenerateFallbackPhysicsShape: 1
+ alphaUsage: 1
+ alphaIsTransparency: 0
+ spriteTessellationDetail: -1
+ textureType: 0
+ textureShape: 1
+ singleChannelComponent: 0
+ flipbookRows: 1
+ flipbookColumns: 1
+ maxTextureSizeSet: 0
+ compressionQualitySet: 0
+ textureFormatSet: 0
+ ignorePngGamma: 0
+ applyGammaDecoding: 0
+ swizzle: 50462976
+ cookieLightType: 0
+ platformSettings:
+ - serializedVersion: 4
+ buildTarget: DefaultTexturePlatform
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: Standalone
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ spriteSheet:
+ serializedVersion: 2
+ sprites: []
+ outline: []
+ customData:
+ physicsShape: []
+ bones: []
+ spriteID:
+ internalID: 0
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ secondaryTextures: []
+ spriteCustomMetadata:
+ entries: []
+ nameFileIdTable: {}
+ mipmapLimitGroupName:
+ pSDRemoveMatte: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Documentation/html/nav_h.png b/Documentation/html/nav_h.png
new file mode 100644
index 0000000..f4b427f
Binary files /dev/null and b/Documentation/html/nav_h.png differ
diff --git a/Documentation/html/nav_h.png.meta b/Documentation/html/nav_h.png.meta
new file mode 100644
index 0000000..f7e08a4
--- /dev/null
+++ b/Documentation/html/nav_h.png.meta
@@ -0,0 +1,117 @@
+fileFormatVersion: 2
+guid: 39b9a0330303df2bb887b8d253682929
+TextureImporter:
+ internalIDToNameTable: []
+ externalObjects: {}
+ serializedVersion: 13
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 1
+ sRGBTexture: 1
+ linearTexture: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapsPreserveCoverage: 0
+ alphaTestReferenceValue: 0.5
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ flipGreenChannel: 0
+ isReadable: 0
+ streamingMipmaps: 0
+ streamingMipmapsPriority: 0
+ vTOnly: 0
+ ignoreMipmapLimit: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 6
+ cubemapConvolution: 0
+ seamlessCubemap: 0
+ textureFormat: 1
+ maxTextureSize: 2048
+ textureSettings:
+ serializedVersion: 2
+ filterMode: 1
+ aniso: 1
+ mipBias: 0
+ wrapU: 0
+ wrapV: 0
+ wrapW: 0
+ nPOTScale: 1
+ lightmap: 0
+ compressionQuality: 50
+ spriteMode: 0
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: 0.5, y: 0.5}
+ spritePixelsToUnits: 100
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spriteGenerateFallbackPhysicsShape: 1
+ alphaUsage: 1
+ alphaIsTransparency: 0
+ spriteTessellationDetail: -1
+ textureType: 0
+ textureShape: 1
+ singleChannelComponent: 0
+ flipbookRows: 1
+ flipbookColumns: 1
+ maxTextureSizeSet: 0
+ compressionQualitySet: 0
+ textureFormatSet: 0
+ ignorePngGamma: 0
+ applyGammaDecoding: 0
+ swizzle: 50462976
+ cookieLightType: 0
+ platformSettings:
+ - serializedVersion: 4
+ buildTarget: DefaultTexturePlatform
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: Standalone
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ spriteSheet:
+ serializedVersion: 2
+ sprites: []
+ outline: []
+ customData:
+ physicsShape: []
+ bones: []
+ spriteID:
+ internalID: 0
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ secondaryTextures: []
+ spriteCustomMetadata:
+ entries: []
+ nameFileIdTable: {}
+ mipmapLimitGroupName:
+ pSDRemoveMatte: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Documentation/html/nav_hd.png b/Documentation/html/nav_hd.png
new file mode 100644
index 0000000..946eff2
Binary files /dev/null and b/Documentation/html/nav_hd.png differ
diff --git a/Documentation/html/nav_hd.png.meta b/Documentation/html/nav_hd.png.meta
new file mode 100644
index 0000000..6dbc82c
--- /dev/null
+++ b/Documentation/html/nav_hd.png.meta
@@ -0,0 +1,117 @@
+fileFormatVersion: 2
+guid: 7f14325f3d3940ea8bfeb38d4697e9ed
+TextureImporter:
+ internalIDToNameTable: []
+ externalObjects: {}
+ serializedVersion: 13
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 1
+ sRGBTexture: 1
+ linearTexture: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapsPreserveCoverage: 0
+ alphaTestReferenceValue: 0.5
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ flipGreenChannel: 0
+ isReadable: 0
+ streamingMipmaps: 0
+ streamingMipmapsPriority: 0
+ vTOnly: 0
+ ignoreMipmapLimit: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 6
+ cubemapConvolution: 0
+ seamlessCubemap: 0
+ textureFormat: 1
+ maxTextureSize: 2048
+ textureSettings:
+ serializedVersion: 2
+ filterMode: 1
+ aniso: 1
+ mipBias: 0
+ wrapU: 0
+ wrapV: 0
+ wrapW: 0
+ nPOTScale: 1
+ lightmap: 0
+ compressionQuality: 50
+ spriteMode: 0
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: 0.5, y: 0.5}
+ spritePixelsToUnits: 100
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spriteGenerateFallbackPhysicsShape: 1
+ alphaUsage: 1
+ alphaIsTransparency: 0
+ spriteTessellationDetail: -1
+ textureType: 0
+ textureShape: 1
+ singleChannelComponent: 0
+ flipbookRows: 1
+ flipbookColumns: 1
+ maxTextureSizeSet: 0
+ compressionQualitySet: 0
+ textureFormatSet: 0
+ ignorePngGamma: 0
+ applyGammaDecoding: 0
+ swizzle: 50462976
+ cookieLightType: 0
+ platformSettings:
+ - serializedVersion: 4
+ buildTarget: DefaultTexturePlatform
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: Standalone
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ spriteSheet:
+ serializedVersion: 2
+ sprites: []
+ outline: []
+ customData:
+ physicsShape: []
+ bones: []
+ spriteID:
+ internalID: 0
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ secondaryTextures: []
+ spriteCustomMetadata:
+ entries: []
+ nameFileIdTable: {}
+ mipmapLimitGroupName:
+ pSDRemoveMatte: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Documentation/html/open.png b/Documentation/html/open.png
new file mode 100644
index 0000000..8ab49ad
Binary files /dev/null and b/Documentation/html/open.png differ
diff --git a/Documentation/html/open.png.meta b/Documentation/html/open.png.meta
new file mode 100644
index 0000000..be4a11e
--- /dev/null
+++ b/Documentation/html/open.png.meta
@@ -0,0 +1,117 @@
+fileFormatVersion: 2
+guid: 9b7bd513a402d4bb4b85a0cb8c342719
+TextureImporter:
+ internalIDToNameTable: []
+ externalObjects: {}
+ serializedVersion: 13
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 1
+ sRGBTexture: 1
+ linearTexture: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapsPreserveCoverage: 0
+ alphaTestReferenceValue: 0.5
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ flipGreenChannel: 0
+ isReadable: 0
+ streamingMipmaps: 0
+ streamingMipmapsPriority: 0
+ vTOnly: 0
+ ignoreMipmapLimit: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 6
+ cubemapConvolution: 0
+ seamlessCubemap: 0
+ textureFormat: 1
+ maxTextureSize: 2048
+ textureSettings:
+ serializedVersion: 2
+ filterMode: 1
+ aniso: 1
+ mipBias: 0
+ wrapU: 0
+ wrapV: 0
+ wrapW: 0
+ nPOTScale: 1
+ lightmap: 0
+ compressionQuality: 50
+ spriteMode: 0
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: 0.5, y: 0.5}
+ spritePixelsToUnits: 100
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spriteGenerateFallbackPhysicsShape: 1
+ alphaUsage: 1
+ alphaIsTransparency: 0
+ spriteTessellationDetail: -1
+ textureType: 0
+ textureShape: 1
+ singleChannelComponent: 0
+ flipbookRows: 1
+ flipbookColumns: 1
+ maxTextureSizeSet: 0
+ compressionQualitySet: 0
+ textureFormatSet: 0
+ ignorePngGamma: 0
+ applyGammaDecoding: 0
+ swizzle: 50462976
+ cookieLightType: 0
+ platformSettings:
+ - serializedVersion: 4
+ buildTarget: DefaultTexturePlatform
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: Standalone
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ spriteSheet:
+ serializedVersion: 2
+ sprites: []
+ outline: []
+ customData:
+ physicsShape: []
+ bones: []
+ spriteID:
+ internalID: 0
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ secondaryTextures: []
+ spriteCustomMetadata:
+ entries: []
+ nameFileIdTable: {}
+ mipmapLimitGroupName:
+ pSDRemoveMatte: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Documentation/html/pages.html b/Documentation/html/pages.html
new file mode 100644
index 0000000..affa86d
--- /dev/null
+++ b/Documentation/html/pages.html
@@ -0,0 +1,89 @@
+
+
+
+
+
+
+
+Nano Brain for Unity: Related Pages
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Nano Brain for Unity v0.1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+
+
+
+
Here is a list of all related documentation pages:
+
+
+
+
+
diff --git a/Documentation/html/pages.html.meta b/Documentation/html/pages.html.meta
new file mode 100644
index 0000000..21c9815
--- /dev/null
+++ b/Documentation/html/pages.html.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 47c19c987956ac714b828cc714830776
+TextScriptImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Documentation/html/plus.svg b/Documentation/html/plus.svg
new file mode 100644
index 0000000..0752016
--- /dev/null
+++ b/Documentation/html/plus.svg
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/Documentation/html/plus.svg.meta b/Documentation/html/plus.svg.meta
new file mode 100644
index 0000000..22ee471
--- /dev/null
+++ b/Documentation/html/plus.svg.meta
@@ -0,0 +1,53 @@
+fileFormatVersion: 2
+guid: d844f994d6b39894ba2ec7e9fa881913
+ScriptedImporter:
+ internalIDToNameTable: []
+ externalObjects: {}
+ serializedVersion: 2
+ userData:
+ assetBundleName:
+ assetBundleVariant:
+ script: {fileID: 12408, guid: 0000000000000000e000000000000000, type: 0}
+ svgType: 3
+ texturedSpriteMeshType: 0
+ svgPixelsPerUnit: 100
+ gradientResolution: 64
+ alignment: 0
+ customPivot: {x: 0, y: 0}
+ generatePhysicsShape: 0
+ viewportOptions: 0
+ preserveViewport: 0
+ advancedMode: 0
+ tessellationMode: 1
+ predefinedResolutionIndex: 1
+ targetResolution: 1080
+ resolutionMultiplier: 1
+ stepDistance: 10
+ samplingStepDistance: 100
+ maxCordDeviationEnabled: 0
+ maxCordDeviation: 1
+ maxTangentAngleEnabled: 0
+ maxTangentAngle: 5
+ keepTextureAspectRatio: 1
+ textureSize: 256
+ textureWidth: 256
+ textureHeight: 256
+ wrapMode: 0
+ filterMode: 1
+ sampleCount: 4
+ preserveSVGImageAspect: 0
+ useSVGPixelsPerUnit: 0
+ spriteData:
+ TessellationDetail: 0
+ SpriteName:
+ SpritePivot: {x: 0, y: 0}
+ SpriteAlignment: 0
+ SpriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ SpriteRect:
+ serializedVersion: 2
+ x: 0
+ y: 0
+ width: 0
+ height: 0
+ SpriteID:
+ PhysicsOutlines: []
diff --git a/Documentation/html/plusd.svg b/Documentation/html/plusd.svg
new file mode 100644
index 0000000..0c65bfe
--- /dev/null
+++ b/Documentation/html/plusd.svg
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/Documentation/html/plusd.svg.meta b/Documentation/html/plusd.svg.meta
new file mode 100644
index 0000000..2b5b68f
--- /dev/null
+++ b/Documentation/html/plusd.svg.meta
@@ -0,0 +1,53 @@
+fileFormatVersion: 2
+guid: c39199281580bc2899dcddbfdf6f4b64
+ScriptedImporter:
+ internalIDToNameTable: []
+ externalObjects: {}
+ serializedVersion: 2
+ userData:
+ assetBundleName:
+ assetBundleVariant:
+ script: {fileID: 12408, guid: 0000000000000000e000000000000000, type: 0}
+ svgType: 3
+ texturedSpriteMeshType: 0
+ svgPixelsPerUnit: 100
+ gradientResolution: 64
+ alignment: 0
+ customPivot: {x: 0, y: 0}
+ generatePhysicsShape: 0
+ viewportOptions: 0
+ preserveViewport: 0
+ advancedMode: 0
+ tessellationMode: 1
+ predefinedResolutionIndex: 1
+ targetResolution: 1080
+ resolutionMultiplier: 1
+ stepDistance: 10
+ samplingStepDistance: 100
+ maxCordDeviationEnabled: 0
+ maxCordDeviation: 1
+ maxTangentAngleEnabled: 0
+ maxTangentAngle: 5
+ keepTextureAspectRatio: 1
+ textureSize: 256
+ textureWidth: 256
+ textureHeight: 256
+ wrapMode: 0
+ filterMode: 1
+ sampleCount: 4
+ preserveSVGImageAspect: 0
+ useSVGPixelsPerUnit: 0
+ spriteData:
+ TessellationDetail: 0
+ SpriteName:
+ SpritePivot: {x: 0, y: 0}
+ SpriteAlignment: 0
+ SpriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ SpriteRect:
+ serializedVersion: 2
+ x: 0
+ y: 0
+ width: 0
+ height: 0
+ SpriteID:
+ PhysicsOutlines: []
diff --git a/LinearAlgebra/src.meta b/Documentation/html/rtf.meta
similarity index 77%
rename from LinearAlgebra/src.meta
rename to Documentation/html/rtf.meta
index 6476da7..a910639 100644
--- a/LinearAlgebra/src.meta
+++ b/Documentation/html/rtf.meta
@@ -1,5 +1,5 @@
fileFormatVersion: 2
-guid: 6a602cec2c4009925b1d19ed36a98c6a
+guid: ee75eac0aaf5df6d9a3fb53c126f9b22
folderAsset: yes
DefaultImporter:
externalObjects: {}
diff --git a/Documentation/html/rtf/PasserLifeLogoRight1_300.png b/Documentation/html/rtf/PasserLifeLogoRight1_300.png
new file mode 100644
index 0000000..7480553
Binary files /dev/null and b/Documentation/html/rtf/PasserLifeLogoRight1_300.png differ
diff --git a/Documentation/html/rtf/PasserLifeLogoRight1_300.png.meta b/Documentation/html/rtf/PasserLifeLogoRight1_300.png.meta
new file mode 100644
index 0000000..c781544
--- /dev/null
+++ b/Documentation/html/rtf/PasserLifeLogoRight1_300.png.meta
@@ -0,0 +1,117 @@
+fileFormatVersion: 2
+guid: 281d3313137887d66b781aa9219f6768
+TextureImporter:
+ internalIDToNameTable: []
+ externalObjects: {}
+ serializedVersion: 13
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 1
+ sRGBTexture: 1
+ linearTexture: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapsPreserveCoverage: 0
+ alphaTestReferenceValue: 0.5
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ flipGreenChannel: 0
+ isReadable: 0
+ streamingMipmaps: 0
+ streamingMipmapsPriority: 0
+ vTOnly: 0
+ ignoreMipmapLimit: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 6
+ cubemapConvolution: 0
+ seamlessCubemap: 0
+ textureFormat: 1
+ maxTextureSize: 2048
+ textureSettings:
+ serializedVersion: 2
+ filterMode: 1
+ aniso: 1
+ mipBias: 0
+ wrapU: 0
+ wrapV: 0
+ wrapW: 0
+ nPOTScale: 1
+ lightmap: 0
+ compressionQuality: 50
+ spriteMode: 0
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: 0.5, y: 0.5}
+ spritePixelsToUnits: 100
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spriteGenerateFallbackPhysicsShape: 1
+ alphaUsage: 1
+ alphaIsTransparency: 0
+ spriteTessellationDetail: -1
+ textureType: 0
+ textureShape: 1
+ singleChannelComponent: 0
+ flipbookRows: 1
+ flipbookColumns: 1
+ maxTextureSizeSet: 0
+ compressionQualitySet: 0
+ textureFormatSet: 0
+ ignorePngGamma: 0
+ applyGammaDecoding: 0
+ swizzle: 50462976
+ cookieLightType: 0
+ platformSettings:
+ - serializedVersion: 4
+ buildTarget: DefaultTexturePlatform
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: Standalone
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ spriteSheet:
+ serializedVersion: 2
+ sprites: []
+ outline: []
+ customData:
+ physicsShape: []
+ bones: []
+ spriteID:
+ internalID: 0
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ secondaryTextures: []
+ spriteCustomMetadata:
+ entries: []
+ nameFileIdTable: {}
+ mipmapLimitGroupName:
+ pSDRemoveMatte: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Documentation/html/rtf/class_nano_brain_1_1_cluster.png b/Documentation/html/rtf/class_nano_brain_1_1_cluster.png
new file mode 100644
index 0000000..b808c35
Binary files /dev/null and b/Documentation/html/rtf/class_nano_brain_1_1_cluster.png differ
diff --git a/Documentation/html/rtf/class_nano_brain_1_1_cluster.png.meta b/Documentation/html/rtf/class_nano_brain_1_1_cluster.png.meta
new file mode 100644
index 0000000..1f80df8
--- /dev/null
+++ b/Documentation/html/rtf/class_nano_brain_1_1_cluster.png.meta
@@ -0,0 +1,117 @@
+fileFormatVersion: 2
+guid: fb4c6dc5080cae06f81b03c76d845d19
+TextureImporter:
+ internalIDToNameTable: []
+ externalObjects: {}
+ serializedVersion: 13
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 1
+ sRGBTexture: 1
+ linearTexture: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapsPreserveCoverage: 0
+ alphaTestReferenceValue: 0.5
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ flipGreenChannel: 0
+ isReadable: 0
+ streamingMipmaps: 0
+ streamingMipmapsPriority: 0
+ vTOnly: 0
+ ignoreMipmapLimit: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 6
+ cubemapConvolution: 0
+ seamlessCubemap: 0
+ textureFormat: 1
+ maxTextureSize: 2048
+ textureSettings:
+ serializedVersion: 2
+ filterMode: 1
+ aniso: 1
+ mipBias: 0
+ wrapU: 0
+ wrapV: 0
+ wrapW: 0
+ nPOTScale: 1
+ lightmap: 0
+ compressionQuality: 50
+ spriteMode: 0
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: 0.5, y: 0.5}
+ spritePixelsToUnits: 100
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spriteGenerateFallbackPhysicsShape: 1
+ alphaUsage: 1
+ alphaIsTransparency: 0
+ spriteTessellationDetail: -1
+ textureType: 0
+ textureShape: 1
+ singleChannelComponent: 0
+ flipbookRows: 1
+ flipbookColumns: 1
+ maxTextureSizeSet: 0
+ compressionQualitySet: 0
+ textureFormatSet: 0
+ ignorePngGamma: 0
+ applyGammaDecoding: 0
+ swizzle: 50462976
+ cookieLightType: 0
+ platformSettings:
+ - serializedVersion: 4
+ buildTarget: DefaultTexturePlatform
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: Standalone
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ spriteSheet:
+ serializedVersion: 2
+ sprites: []
+ outline: []
+ customData:
+ physicsShape: []
+ bones: []
+ spriteID:
+ internalID: 0
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ secondaryTextures: []
+ spriteCustomMetadata:
+ entries: []
+ nameFileIdTable: {}
+ mipmapLimitGroupName:
+ pSDRemoveMatte: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Documentation/html/rtf/class_nano_brain_1_1_memory_cell.png b/Documentation/html/rtf/class_nano_brain_1_1_memory_cell.png
new file mode 100644
index 0000000..9fc1c66
Binary files /dev/null and b/Documentation/html/rtf/class_nano_brain_1_1_memory_cell.png differ
diff --git a/Documentation/html/rtf/class_nano_brain_1_1_memory_cell.png.meta b/Documentation/html/rtf/class_nano_brain_1_1_memory_cell.png.meta
new file mode 100644
index 0000000..3b014f4
--- /dev/null
+++ b/Documentation/html/rtf/class_nano_brain_1_1_memory_cell.png.meta
@@ -0,0 +1,117 @@
+fileFormatVersion: 2
+guid: 20ff3fd220acc95968831d2cb4e7a6d2
+TextureImporter:
+ internalIDToNameTable: []
+ externalObjects: {}
+ serializedVersion: 13
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 1
+ sRGBTexture: 1
+ linearTexture: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapsPreserveCoverage: 0
+ alphaTestReferenceValue: 0.5
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ flipGreenChannel: 0
+ isReadable: 0
+ streamingMipmaps: 0
+ streamingMipmapsPriority: 0
+ vTOnly: 0
+ ignoreMipmapLimit: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 6
+ cubemapConvolution: 0
+ seamlessCubemap: 0
+ textureFormat: 1
+ maxTextureSize: 2048
+ textureSettings:
+ serializedVersion: 2
+ filterMode: 1
+ aniso: 1
+ mipBias: 0
+ wrapU: 0
+ wrapV: 0
+ wrapW: 0
+ nPOTScale: 1
+ lightmap: 0
+ compressionQuality: 50
+ spriteMode: 0
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: 0.5, y: 0.5}
+ spritePixelsToUnits: 100
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spriteGenerateFallbackPhysicsShape: 1
+ alphaUsage: 1
+ alphaIsTransparency: 0
+ spriteTessellationDetail: -1
+ textureType: 0
+ textureShape: 1
+ singleChannelComponent: 0
+ flipbookRows: 1
+ flipbookColumns: 1
+ maxTextureSizeSet: 0
+ compressionQualitySet: 0
+ textureFormatSet: 0
+ ignorePngGamma: 0
+ applyGammaDecoding: 0
+ swizzle: 50462976
+ cookieLightType: 0
+ platformSettings:
+ - serializedVersion: 4
+ buildTarget: DefaultTexturePlatform
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: Standalone
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ spriteSheet:
+ serializedVersion: 2
+ sprites: []
+ outline: []
+ customData:
+ physicsShape: []
+ bones: []
+ spriteID:
+ internalID: 0
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ secondaryTextures: []
+ spriteCustomMetadata:
+ entries: []
+ nameFileIdTable: {}
+ mipmapLimitGroupName:
+ pSDRemoveMatte: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Documentation/html/rtf/class_nano_brain_1_1_neuron.png b/Documentation/html/rtf/class_nano_brain_1_1_neuron.png
new file mode 100644
index 0000000..49d8eae
Binary files /dev/null and b/Documentation/html/rtf/class_nano_brain_1_1_neuron.png differ
diff --git a/Documentation/html/rtf/class_nano_brain_1_1_neuron.png.meta b/Documentation/html/rtf/class_nano_brain_1_1_neuron.png.meta
new file mode 100644
index 0000000..623b8ce
--- /dev/null
+++ b/Documentation/html/rtf/class_nano_brain_1_1_neuron.png.meta
@@ -0,0 +1,117 @@
+fileFormatVersion: 2
+guid: f659ccb7654b41d42b8c154b615b9ff8
+TextureImporter:
+ internalIDToNameTable: []
+ externalObjects: {}
+ serializedVersion: 13
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 1
+ sRGBTexture: 1
+ linearTexture: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapsPreserveCoverage: 0
+ alphaTestReferenceValue: 0.5
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ flipGreenChannel: 0
+ isReadable: 0
+ streamingMipmaps: 0
+ streamingMipmapsPriority: 0
+ vTOnly: 0
+ ignoreMipmapLimit: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 6
+ cubemapConvolution: 0
+ seamlessCubemap: 0
+ textureFormat: 1
+ maxTextureSize: 2048
+ textureSettings:
+ serializedVersion: 2
+ filterMode: 1
+ aniso: 1
+ mipBias: 0
+ wrapU: 0
+ wrapV: 0
+ wrapW: 0
+ nPOTScale: 1
+ lightmap: 0
+ compressionQuality: 50
+ spriteMode: 0
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: 0.5, y: 0.5}
+ spritePixelsToUnits: 100
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spriteGenerateFallbackPhysicsShape: 1
+ alphaUsage: 1
+ alphaIsTransparency: 0
+ spriteTessellationDetail: -1
+ textureType: 0
+ textureShape: 1
+ singleChannelComponent: 0
+ flipbookRows: 1
+ flipbookColumns: 1
+ maxTextureSizeSet: 0
+ compressionQualitySet: 0
+ textureFormatSet: 0
+ ignorePngGamma: 0
+ applyGammaDecoding: 0
+ swizzle: 50462976
+ cookieLightType: 0
+ platformSettings:
+ - serializedVersion: 4
+ buildTarget: DefaultTexturePlatform
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: Standalone
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ spriteSheet:
+ serializedVersion: 2
+ sprites: []
+ outline: []
+ customData:
+ physicsShape: []
+ bones: []
+ spriteID:
+ internalID: 0
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ secondaryTextures: []
+ spriteCustomMetadata:
+ entries: []
+ nameFileIdTable: {}
+ mipmapLimitGroupName:
+ pSDRemoveMatte: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Documentation/html/rtf/class_nano_brain_1_1_nucleus.png b/Documentation/html/rtf/class_nano_brain_1_1_nucleus.png
new file mode 100644
index 0000000..1433a13
Binary files /dev/null and b/Documentation/html/rtf/class_nano_brain_1_1_nucleus.png differ
diff --git a/Documentation/html/rtf/class_nano_brain_1_1_nucleus.png.meta b/Documentation/html/rtf/class_nano_brain_1_1_nucleus.png.meta
new file mode 100644
index 0000000..49f5b96
--- /dev/null
+++ b/Documentation/html/rtf/class_nano_brain_1_1_nucleus.png.meta
@@ -0,0 +1,117 @@
+fileFormatVersion: 2
+guid: b6e2180992e8fd8789dc1f2459192e00
+TextureImporter:
+ internalIDToNameTable: []
+ externalObjects: {}
+ serializedVersion: 13
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 1
+ sRGBTexture: 1
+ linearTexture: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapsPreserveCoverage: 0
+ alphaTestReferenceValue: 0.5
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ flipGreenChannel: 0
+ isReadable: 0
+ streamingMipmaps: 0
+ streamingMipmapsPriority: 0
+ vTOnly: 0
+ ignoreMipmapLimit: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 6
+ cubemapConvolution: 0
+ seamlessCubemap: 0
+ textureFormat: 1
+ maxTextureSize: 2048
+ textureSettings:
+ serializedVersion: 2
+ filterMode: 1
+ aniso: 1
+ mipBias: 0
+ wrapU: 0
+ wrapV: 0
+ wrapW: 0
+ nPOTScale: 1
+ lightmap: 0
+ compressionQuality: 50
+ spriteMode: 0
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: 0.5, y: 0.5}
+ spritePixelsToUnits: 100
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spriteGenerateFallbackPhysicsShape: 1
+ alphaUsage: 1
+ alphaIsTransparency: 0
+ spriteTessellationDetail: -1
+ textureType: 0
+ textureShape: 1
+ singleChannelComponent: 0
+ flipbookRows: 1
+ flipbookColumns: 1
+ maxTextureSizeSet: 0
+ compressionQualitySet: 0
+ textureFormatSet: 0
+ ignorePngGamma: 0
+ applyGammaDecoding: 0
+ swizzle: 50462976
+ cookieLightType: 0
+ platformSettings:
+ - serializedVersion: 4
+ buildTarget: DefaultTexturePlatform
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: Standalone
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ spriteSheet:
+ serializedVersion: 2
+ sprites: []
+ outline: []
+ customData:
+ physicsShape: []
+ bones: []
+ spriteID:
+ internalID: 0
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ secondaryTextures: []
+ spriteCustomMetadata:
+ entries: []
+ nameFileIdTable: {}
+ mipmapLimitGroupName:
+ pSDRemoveMatte: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Documentation/html/rtf/refman.rtf b/Documentation/html/rtf/refman.rtf
new file mode 100644
index 0000000..874a030
--- /dev/null
+++ b/Documentation/html/rtf/refman.rtf
@@ -0,0 +1,3631 @@
+{\rtf1\ansi\ansicpg1252\uc1 \deff0\deflang1033\deflangfe1033
+{\fonttbl {\f0\froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}
+{\f1\fswiss\fcharset0\fprq2{\*\panose 020b0604020202020204}Arial;}
+{\f2\fmodern\fcharset0\fprq1{\*\panose 02070309020205020404}Courier New;}
+{\f3\froman\fcharset2\fprq2{\*\panose 05050102010706020507}Symbol;}
+}
+{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;\red0\green128\blue0;\red96\green64\blue32;\rede0\green128\blue0;\red128\green0\blue0;\red128\green96\blue32;\red0\green32\blue128;\red0\green128\blue128;\red255\green0\blue255;\red0\green0\blue0;\red112\green0\blue112;\red255\green0\blue0;}
+{\stylesheet
+{\widctlpar\adjustright \fs20\cgrid \snext0 Normal;}
+{\paperw11900\paperh16840\margl1800\margr1800\margt1440\margb1440\gutter0\ltrsect}
+{\s1\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs36\kerning36\cgrid \sbasedon0 \snext0 heading 1;}
+{\s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid \sbasedon0 \snext0 heading 2;}
+{\s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid \sbasedon0 \snext0 heading 3;}
+{\s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid \sbasedon0 \snext0 heading 4;}{\*\cs10 \additive Default Paragraph Font;}
+{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid \sbasedon0 \snext0 heading 5;}{\*\cs10 \additive Default Paragraph Font;}
+{\s15\qc\sb240\sa60\widctlpar\outlinelevel0\adjustright \b\f1\fs32\kerning28\cgrid \sbasedon0 \snext15 Title;}
+{\s16\qc\sa60\widctlpar\outlinelevel1\adjustright \f1\cgrid \sbasedon0 \snext16 Subtitle;}
+{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid \sbasedon0 \snext17 BodyText;}
+{\s18\widctlpar\fs22\cgrid \sbasedon0 \snext18 DenseText;}
+{\s28\widctlpar\tqc\tx4320\tqr\tx8640\adjustright \fs20\cgrid \sbasedon0 \snext28 header;}
+{\s29\widctlpar\tqc\tx4320\tqr\tx8640\qr\adjustright \fs20\cgrid \sbasedon0 \snext29 footer;}
+{\s30\li360\sa60\sb120\keepn\widctlpar\adjustright \b\f1\fs20\cgrid \sbasedon0 \snext30 GroupHeader;}
+{\s40\li0\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid \sbasedon0 \snext41 Code Example 0;}
+{\s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid \sbasedon0 \snext42 Code Example 1;}
+{\s42\li720\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid \sbasedon0 \snext43 Code Example 2;}
+{\s43\li1080\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid \sbasedon0 \snext44 Code Example 3;}
+{\s44\li1440\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid \sbasedon0 \snext45 Code Example 4;}
+{\s45\li1800\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid \sbasedon0 \snext46 Code Example 5;}
+{\s46\li2160\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid \sbasedon0 \snext47 Code Example 6;}
+{\s47\li2520\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid \sbasedon0 \snext48 Code Example 7;}
+{\s48\li2880\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid \sbasedon0 \snext49 Code Example 8;}
+{\s49\li3240\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid \sbasedon0 \snext50 Code Example 9;}
+{\s50\li3600\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid \sbasedon0 \snext51 Code Example 10;}
+{\s51\li3960\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid \sbasedon0 \snext52 Code Example 11;}
+{\s52\li4320\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid \sbasedon0 \snext53 Code Example 12;}
+{\s53\li4680\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid \sbasedon0 \snext53 Code Example 13;}
+{\s60\li0\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid \sbasedon0 \snext61 List Continue 0;}
+{\s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid \sbasedon0 \snext62 List Continue 1;}
+{\s62\li720\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid \sbasedon0 \snext63 List Continue 2;}
+{\s63\li1080\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid \sbasedon0 \snext64 List Continue 3;}
+{\s64\li1440\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid \sbasedon0 \snext65 List Continue 4;}
+{\s65\li1800\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid \sbasedon0 \snext66 List Continue 5;}
+{\s66\li2160\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid \sbasedon0 \snext67 List Continue 6;}
+{\s67\li2520\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid \sbasedon0 \snext68 List Continue 7;}
+{\s68\li2880\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid \sbasedon0 \snext69 List Continue 8;}
+{\s69\li3240\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid \sbasedon0 \snext70 List Continue 9;}
+{\s70\li3600\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid \sbasedon0 \snext71 List Continue 10;}
+{\s71\li3960\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid \sbasedon0 \snext72 List Continue 11;}
+{\s72\li4320\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid \sbasedon0 \snext73 List Continue 12;}
+{\s73\li4680\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid \sbasedon0 \snext73 List Continue 13;}
+{\s80\li0\widctlpar\ql\adjustright \fs20\cgrid \sbasedon0 \snext81 DescContinue 0;}
+{\s81\li360\widctlpar\ql\adjustright \fs20\cgrid \sbasedon0 \snext82 DescContinue 1;}
+{\s82\li720\widctlpar\ql\adjustright \fs20\cgrid \sbasedon0 \snext83 DescContinue 2;}
+{\s83\li1080\widctlpar\ql\adjustright \fs20\cgrid \sbasedon0 \snext84 DescContinue 3;}
+{\s84\li1440\widctlpar\ql\adjustright \fs20\cgrid \sbasedon0 \snext85 DescContinue 4;}
+{\s85\li1800\widctlpar\ql\adjustright \fs20\cgrid \sbasedon0 \snext86 DescContinue 5;}
+{\s86\li2160\widctlpar\ql\adjustright \fs20\cgrid \sbasedon0 \snext87 DescContinue 6;}
+{\s87\li2520\widctlpar\ql\adjustright \fs20\cgrid \sbasedon0 \snext88 DescContinue 7;}
+{\s88\li2880\widctlpar\ql\adjustright \fs20\cgrid \sbasedon0 \snext89 DescContinue 8;}
+{\s89\li3240\widctlpar\ql\adjustright \fs20\cgrid \sbasedon0 \snext90 DescContinue 9;}
+{\s90\li3600\widctlpar\ql\adjustright \fs20\cgrid \sbasedon0 \snext91 DescContinue 10;}
+{\s91\li3960\widctlpar\ql\adjustright \fs20\cgrid \sbasedon0 \snext92 DescContinue 11;}
+{\s92\li4320\widctlpar\ql\adjustright \fs20\cgrid \sbasedon0 \snext93 DescContinue 12;}
+{\s93\li4680\widctlpar\ql\adjustright \fs20\cgrid \sbasedon0 \snext93 DescContinue 13;}
+{\s100\li0\sa30\sb30\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid \sbasedon0 \snext101 LatexTOC 0;}
+{\s101\li360\sa27\sb27\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid \sbasedon0 \snext102 LatexTOC 1;}
+{\s102\li720\sa24\sb24\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid \sbasedon0 \snext103 LatexTOC 2;}
+{\s103\li1080\sa21\sb21\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid \sbasedon0 \snext104 LatexTOC 3;}
+{\s104\li1440\sa18\sb18\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid \sbasedon0 \snext105 LatexTOC 4;}
+{\s105\li1800\sa15\sb15\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid \sbasedon0 \snext106 LatexTOC 5;}
+{\s106\li2160\sa12\sb12\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid \sbasedon0 \snext107 LatexTOC 6;}
+{\s107\li2520\sa9\sb9\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid \sbasedon0 \snext108 LatexTOC 7;}
+{\s108\li2880\sa6\sb6\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid \sbasedon0 \snext109 LatexTOC 8;}
+{\s109\li3240\sa3\sb3\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid \sbasedon0 \snext110 LatexTOC 9;}
+{\s110\li3600\sa3\sb3\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid \sbasedon0 \snext111 LatexTOC 10;}
+{\s111\li3960\sa3\sb3\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid \sbasedon0 \snext112 LatexTOC 11;}
+{\s112\li4320\sa3\sb3\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid \sbasedon0 \snext113 LatexTOC 12;}
+{\s113\li4680\sa3\sb3\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid \sbasedon0 \snext113 LatexTOC 13;}
+{\s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid \sbasedon0 \snext121 \sautoupd List Bullet 0;}
+{\s121\fi-360\li720\widctlpar\jclisttab\tx720{\*\pn \pnlvlbody\ilvl0\ls2\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid \sbasedon0 \snext122 \sautoupd List Bullet 1;}
+{\s122\fi-360\li1080\widctlpar\jclisttab\tx1080{\*\pn \pnlvlbody\ilvl0\ls3\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid \sbasedon0 \snext123 \sautoupd List Bullet 2;}
+{\s123\fi-360\li1440\widctlpar\jclisttab\tx1440{\*\pn \pnlvlbody\ilvl0\ls4\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid \sbasedon0 \snext124 \sautoupd List Bullet 3;}
+{\s124\fi-360\li1800\widctlpar\jclisttab\tx1800{\*\pn \pnlvlbody\ilvl0\ls5\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid \sbasedon0 \snext125 \sautoupd List Bullet 4;}
+{\s125\fi-360\li2160\widctlpar\jclisttab\tx2160{\*\pn \pnlvlbody\ilvl0\ls6\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid \sbasedon0 \snext126 \sautoupd List Bullet 5;}
+{\s126\fi-360\li2520\widctlpar\jclisttab\tx2520{\*\pn \pnlvlbody\ilvl0\ls7\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid \sbasedon0 \snext127 \sautoupd List Bullet 6;}
+{\s127\fi-360\li2880\widctlpar\jclisttab\tx2880{\*\pn \pnlvlbody\ilvl0\ls8\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid \sbasedon0 \snext128 \sautoupd List Bullet 7;}
+{\s128\fi-360\li3240\widctlpar\jclisttab\tx3240{\*\pn \pnlvlbody\ilvl0\ls9\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid \sbasedon0 \snext129 \sautoupd List Bullet 8;}
+{\s129\fi-360\li3600\widctlpar\jclisttab\tx3600{\*\pn \pnlvlbody\ilvl0\ls10\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid \sbasedon0 \snext130 \sautoupd List Bullet 9;}
+{\s130\fi-360\li3960\widctlpar\jclisttab\tx3960{\*\pn \pnlvlbody\ilvl0\ls11\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid \sbasedon0 \snext131 \sautoupd List Bullet 10;}
+{\s131\fi-360\li4320\widctlpar\jclisttab\tx4320{\*\pn \pnlvlbody\ilvl0\ls12\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid \sbasedon0 \snext132 \sautoupd List Bullet 11;}
+{\s132\fi-360\li4680\widctlpar\jclisttab\tx4680{\*\pn \pnlvlbody\ilvl0\ls13\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid \sbasedon0 \snext133 \sautoupd List Bullet 12;}
+{\s133\fi-360\li5040\widctlpar\jclisttab\tx5040{\*\pn \pnlvlbody\ilvl0\ls14\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid \sbasedon0 \snext133 \sautoupd List Bullet 13;}
+{\s140\fi-360\li360\widctlpar\fs20\cgrid \sbasedon0 \snext141 \sautoupd List Enum 0;}
+{\s141\fi-360\li720\widctlpar\fs20\cgrid \sbasedon0 \snext142 \sautoupd List Enum 1;}
+{\s142\fi-360\li1080\widctlpar\fs20\cgrid \sbasedon0 \snext143 \sautoupd List Enum 2;}
+{\s143\fi-360\li1440\widctlpar\fs20\cgrid \sbasedon0 \snext144 \sautoupd List Enum 3;}
+{\s144\fi-360\li1800\widctlpar\fs20\cgrid \sbasedon0 \snext145 \sautoupd List Enum 4;}
+{\s145\fi-360\li2160\widctlpar\fs20\cgrid \sbasedon0 \snext146 \sautoupd List Enum 5;}
+{\s146\fi-360\li2520\widctlpar\fs20\cgrid \sbasedon0 \snext147 \sautoupd List Enum 6;}
+{\s147\fi-360\li2880\widctlpar\fs20\cgrid \sbasedon0 \snext148 \sautoupd List Enum 7;}
+{\s148\fi-360\li3240\widctlpar\fs20\cgrid \sbasedon0 \snext149 \sautoupd List Enum 8;}
+{\s149\fi-360\li3600\widctlpar\fs20\cgrid \sbasedon0 \snext150 \sautoupd List Enum 9;}
+{\s150\fi-360\li3960\widctlpar\fs20\cgrid \sbasedon0 \snext151 \sautoupd List Enum 10;}
+{\s151\fi-360\li4320\widctlpar\fs20\cgrid \sbasedon0 \snext152 \sautoupd List Enum 11;}
+{\s152\fi-360\li4680\widctlpar\fs20\cgrid \sbasedon0 \snext153 \sautoupd List Enum 12;}
+{\s153\fi-360\li5040\widctlpar\fs20\cgrid \sbasedon0 \snext153 \sautoupd List Enum 13;}
+}
+{\info
+{\title {\comment Nano Brain for Unity {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+v0.1 \par
+}}Nano Brain for Unity}
+{\comment Generated by doxygen 1.9.8.}
+}\pard\plain
+\sectd\pgnlcrm
+{\footer \s29\widctlpar\tqc\tx4320\tqr\tx8640\qr\adjustright \fs20\cgrid {\chpgn}}
+\pard\plain \s16\qc\sa60\widctlpar\outlinelevel1\adjustright \f1\cgrid
+\vertalc\qc\par\par\par\par\par\par\par
+\pard\plain \s15\qc\sb240\sa60\widctlpar\outlinelevel0\adjustright \b\f1\fs32\kerning28\cgrid
+{\field\fldedit {\*\fldinst TITLE \\*MERGEFORMAT}{\fldrslt Nano Brain for Unity}}\par
+\pard\plain \s16\qc\sa60\widctlpar\outlinelevel1\adjustright \f1\cgrid
+\par
+\par\par\par\par\par\par\par\par\par\par\par\par
+\pard\plain \s16\qc\sa60\widctlpar\outlinelevel1\adjustright \f1\cgrid
+{\field\fldedit {\*\fldinst AUTHOR \\*MERGEFORMAT}{\fldrslt AUTHOR}}\par
+Version v0.1\par\page\page\vertalt
+\pard\plain
+\s1\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs36\kerning36\cgrid Table of Contents\par
+\pard\plain \par
+{\field\fldedit {\*\fldinst TOC \\f \\*MERGEFORMAT}{\fldrslt Table of contents}}\par
+\pard\plain
+\sect \sbkpage \pgndec \pgnrestart
+\sect \sectd \sbknone
+{\footer \s29\widctlpar\tqc\tx4320\tqr\tx8640\qr\adjustright \fs20\cgrid {\chpgn}}
+
+\pard\plain \sect\sbkpage
+\s1\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs36\kerning36\cgrid
+\par \pard\plain
+\pard\plain \s1\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs36\kerning36\cgrid
+Nano Brain for Unity\par \pard\plain
+{\tc\tcl1 \v Nano Brain for Unity}
+{\xe \v Nano Brain for Unity}
+{\bkmkstart AAAAAAAAEW}
+{\bkmkend AAAAAAAAEW}
+{
+\pard\plain \s17\sa60\sb30\widctlpar\qj \fs22\cgrid {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+\par
+{\bkmkstart AAAAAAAAEX}
+{\bkmkend AAAAAAAAEX}
+{{\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid
+Table of Contents
+\par}
+{\tc\tcl3 \v Table of Contents}
+{
+\par
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+{\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAA" }{}}{\fldrslt {\cs37\ul\cf2 Installation}}} \par}
+\par
+\par}
+}}
+\par \pard\plain
+\par \pard\plain
+\pard\plain \s1\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs36\kerning36\cgrid
+Package Installation\par \pard\plain
+{\tc\tcl1 \v Package Installation}
+{\xe \v Package Installation}
+{\bkmkstart AAAAAAAAAA}
+{\bkmkend AAAAAAAAAA}
+{
+\pard\plain \s17\sa60\sb30\widctlpar\qj \fs22\cgrid {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+You can import the {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAB" }{}}{\fldrslt {\cs37\ul\cf2 NanoBrain}}} Ant package in Unity directly with the Package Manager git package importer.\par
+See Unity: {\field {\*\fldinst { HYPERLINK "https://docs.unity3d.com/Manual/upm-ui-giturl.html" }{}}{\fldrslt {\cs37\ul\cf2 Installing from a Git URL}}}\par
+Use the link from 'Clone with HTTP' (for example: {\field {\*\fldinst { HYPERLINK "https://git.passer.life/CreatureControl/Ant.git" }{}}{\fldrslt {\cs37\ul\cf2 https://git.passer.life/CreatureControl/Ant.git}}}
+) In this way you can always retrieve the latest version by pressing the Update button in the Package Manager.\par
+Optionally, you can use a tag to retrieve a specific version. For example: {\field {\*\fldinst { HYPERLINK "https://git.passer.life/CreatureControl/Ant.git#0.1.0" }{}}{\fldrslt {\cs37\ul\cf2 https://git.passer.life/CreatureControl/Ant.git#0.1.0}}}
+. This will give you a stable version which does not change. Updating can be done by retrieving the package with a link to a new release.\par
+{\bkmkstart AAAAAAAAAC}
+{\bkmkend AAAAAAAAAC}
+{{\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid
+Samples Installation
+\par}
+{\tc\tcl2 \v Samples Installation}
+In the Unity Package manager, select the {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAB" }{}}{\fldrslt {\cs37\ul\cf2 NanoBrain}}} Ant package and look for the {\f2 Samples} tab in the details pane on the right. There you can import the {\f2 Models} . \par}
+}}
+\par \pard\plain
+\pard\plain \s1\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs36\kerning36\cgrid
+NanoBrain\par \pard\plain
+{\tc\tcl1 \v %NanoBrain}
+{\xe \v %NanoBrain}
+{\bkmkstart AAAAAAAAAD}
+{\bkmkend AAAAAAAAAD}
+{
+\pard\plain \s17\sa60\sb30\widctlpar\qj \fs22\cgrid {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+{\bkmkstart AAAAAAAAAE}
+{\bkmkend AAAAAAAAAE}
+ Documentation is found in the {\field {\*\fldinst { HYPERLINK "Documentation/html/index.html" }{}}{\fldrslt {\cs37\ul\cf2 Documentation folder}}} \par
+}}
+
+\pard\plain \sect\sbkpage
+\s1\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs36\kerning36\cgrid
+Hierarchical Index\par \pard\plain
+{\tc \v Hierarchical Index}
+\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid
+Class Hierarchy\par \pard\plain
+{
+\pard\plain \s17\sa60\sb30\widctlpar\qj \fs22\cgrid This inheritance list is sorted roughly, but not completely, alphabetically:}
+{
+\par
+\pard\plain \s101\li360\sa27\sb27\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid
+NanoBrain.Brain\tab {\field\fldedit {\*\fldinst PAGEREF AAAAAAAAAF \\*MERGEFORMAT}{\fldrslt pagenum}}
+\par
+NanoBrain.ClusterPrefab\tab {\field\fldedit {\*\fldinst PAGEREF AAAAAAAAAH \\*MERGEFORMAT}{\fldrslt pagenum}}
+\par
+NanoBrain.Nucleus\tab {\field\fldedit {\*\fldinst PAGEREF AAAAAAAAAK \\*MERGEFORMAT}{\fldrslt pagenum}}
+{
+\par
+\pard\plain \s102\li720\sa24\sb24\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid
+NanoBrain.Cluster\tab {\field\fldedit {\*\fldinst PAGEREF AAAAAAAAAG \\*MERGEFORMAT}{\fldrslt pagenum}}
+\par
+NanoBrain.Neuron\tab {\field\fldedit {\*\fldinst PAGEREF AAAAAAAAAJ \\*MERGEFORMAT}{\fldrslt pagenum}}
+{
+\par
+\pard\plain \s103\li1080\sa21\sb21\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid
+NanoBrain.MemoryCell\tab {\field\fldedit {\*\fldinst PAGEREF AAAAAAAAAI \\*MERGEFORMAT}{\fldrslt pagenum}}
+\par
+}\par
+}\par
+NanoBrain.Synapse\tab {\field\fldedit {\*\fldinst PAGEREF AAAAAAAAAL \\*MERGEFORMAT}{\fldrslt pagenum}}
+\par
+}
+\pard\plain \sect\sbkpage
+\s1\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs36\kerning36\cgrid
+Class Index\par \pard\plain
+{\tc \v Class Index}
+\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid
+Class List\par \pard\plain
+{
+\pard\plain \s17\sa60\sb30\widctlpar\qj \fs22\cgrid Here are the classes, structs, unions and interfaces with brief descriptions:}
+{
+\par
+\pard\plain \s101\li360\sa27\sb27\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid
+{\b {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAF" }{}}{\fldrslt {\cs37\ul\cf2 NanoBrain.Brain}}}
+ ({\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+The {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAB" }{}}{\fldrslt {\cs37\ul\cf2 NanoBrain}}} Unity Componnent })} \tab {\field\fldedit {\*\fldinst PAGEREF AAAAAAAAAF \\*MERGEFORMAT}{\fldrslt pagenum}}
+\par
+{\b {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAG" }{}}{\fldrslt {\cs37\ul\cf2 NanoBrain.Cluster}}}
+ ({\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+A Cluster combines a collection of Nuclei to implement reusable behaviour })} \tab {\field\fldedit {\*\fldinst PAGEREF AAAAAAAAAG \\*MERGEFORMAT}{\fldrslt pagenum}}
+\par
+{\b {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAH" }{}}{\fldrslt {\cs37\ul\cf2 NanoBrain.ClusterPrefab}}}
+ ({\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+The Unity ScriptableObject to implement re-usable Cluster Prefabs })} \tab {\field\fldedit {\*\fldinst PAGEREF AAAAAAAAAH \\*MERGEFORMAT}{\fldrslt pagenum}}
+\par
+{\b {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAI" }{}}{\fldrslt {\cs37\ul\cf2 NanoBrain.MemoryCell}}}
+ ({\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+A MemoryCell stored its value for one update })} \tab {\field\fldedit {\*\fldinst PAGEREF AAAAAAAAAI \\*MERGEFORMAT}{\fldrslt pagenum}}
+\par
+{\b {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAJ" }{}}{\fldrslt {\cs37\ul\cf2 NanoBrain.Neuron}}}
+ ({\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+A neuron is a basic Nucleus })} \tab {\field\fldedit {\*\fldinst PAGEREF AAAAAAAAAJ \\*MERGEFORMAT}{\fldrslt pagenum}}
+\par
+{\b {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAK" }{}}{\fldrslt {\cs37\ul\cf2 NanoBrain.Nucleus}}}
+ ({\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+A Nucleus is a basic element in a brain cluster })} \tab {\field\fldedit {\*\fldinst PAGEREF AAAAAAAAAK \\*MERGEFORMAT}{\fldrslt pagenum}}
+\par
+{\b {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAL" }{}}{\fldrslt {\cs37\ul\cf2 NanoBrain.Synapse}}}
+ ({\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+A Synapse connects the ouput of a Neuron to another Neuron })} \tab {\field\fldedit {\*\fldinst PAGEREF AAAAAAAAAL \\*MERGEFORMAT}{\fldrslt pagenum}}
+\par
+\par}
+\pard\plain \sect\sbkpage
+\s1\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs36\kerning36\cgrid
+Namespace Documentation\par \pard\plain
+\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid
+NanoBrain Namespace Reference\par \pard\plain
+{\tc\tcl2 \v NanoBrain}
+{\xe \v NanoBrain}
+{\bkmkstart AAAAAAAAAB}
+{\bkmkend AAAAAAAAAB}
+\par
+{
+{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+The Nanobrain namespace. }}\par
+\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid
+Classes\par
+\pard\plain
+
+{
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+class {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAF" }{}}{\fldrslt {\cs37\ul\cf2 Brain}}}
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+The {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAB" }{}}{\fldrslt {\cs37\ul\cf2 NanoBrain}}} Unity Componnent. }}\par}
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+class {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAG" }{}}{\fldrslt {\cs37\ul\cf2 Cluster}}}
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+A Cluster combines a collection of Nuclei to implement reusable behaviour. }}\par}
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+class {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAH" }{}}{\fldrslt {\cs37\ul\cf2 ClusterPrefab}}}
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+The Unity ScriptableObject to implement re-usable Cluster Prefabs. }}\par}
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+class {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAI" }{}}{\fldrslt {\cs37\ul\cf2 MemoryCell}}}
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+A MemoryCell stored its value for one update. }}\par}
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+class {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAJ" }{}}{\fldrslt {\cs37\ul\cf2 Neuron}}}
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+A neuron is a basic Nucleus. }}\par}
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+class {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAK" }{}}{\fldrslt {\cs37\ul\cf2 Nucleus}}}
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+A Nucleus is a basic element in a brain cluster. }}\par}
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+class {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAL" }{}}{\fldrslt {\cs37\ul\cf2 Synapse}}}
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+A Synapse connects the ouput of a Neuron to another Neuron. }}\par}
+}
+{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par}
+\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid
+Detailed Description\par
+\pard\plain
+{
+\pard\plain \s17\sa60\sb30\widctlpar\qj \fs22\cgrid {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+The Nanobrain namespace. \par
+}}
+
+\pard\plain \sect\sbkpage
+\s1\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs36\kerning36\cgrid
+Class Documentation{\tc \v Class Documentation}
+\par \pard\plain
+\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid
+NanoBrain.Brain Class Reference\par \pard\plain
+{\tc\tcl2 \v NanoBrain.Brain}
+{\xe \v NanoBrain.Brain}
+{\bkmkstart AAAAAAAAAF}
+{\bkmkend AAAAAAAAAF}
+{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par}
+\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid
+Description\par
+\pard\plain
+{
+\pard\plain \s17\sa60\sb30\widctlpar\qj \fs22\cgrid {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+The {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAB" }{}}{\fldrslt {\cs37\ul\cf2 NanoBrain}}} Unity Componnent. \par
+}
+
+{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+This implements the top-level {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAB" }{}}{\fldrslt {\cs37\ul\cf2 NanoBrain}}} Cluster \par
+ \par
+}}
+\par
+{
+Inherits MonoBehaviour.}\par
+\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid
+Static Public Member Functions\par
+\pard\plain
+
+{
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+static void {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAM" }{}}{\fldrslt {\cs37\ul\cf2 UpdateWeight}}}
+ ({\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAG" }{}}{\fldrslt {\cs37\ul\cf2 Cluster}}}
+ {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAN" }{}}{\fldrslt {\cs37\ul\cf2 brain}}}
+, string name, float weight)\par
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+Update the weight for all Synapses coming from the Neuron with the given name. }{
+}\par
+}\par}
+}
+\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid
+Public Attributes\par
+\pard\plain
+
+{
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+{\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAH" }{}}{\fldrslt {\cs37\ul\cf2 ClusterPrefab}}}
+ {\b brainPrefab}{\bkmkstart AAAAAAAAAO}
+{\bkmkend AAAAAAAAAO}
+\par
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+The Cluster prefab from which the cluster is created. }{
+}\par
+}\par}
+}
+\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid
+Properties\par
+\pard\plain
+
+{
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+{\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAG" }{}}{\fldrslt {\cs37\ul\cf2 Cluster}}}
+ {\b brain}{\f2 [get]}{\bkmkstart AAAAAAAAAN}
+{\bkmkend AAAAAAAAAN}
+\par
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+The cluster isntance. }{
+}\par
+}\par}
+}
+{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par}
+\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid
+Member Function Documentation\par
+\pard\plain
+{\xe \v UpdateWeight\:NanoBrain.Brain}
+{\xe \v NanoBrain.Brain\:UpdateWeight}
+\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid {
+{\b
+static void NanoBrain.Brain.UpdateWeight ({\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAG" }{}}{\fldrslt {\cs37\ul\cf2 Cluster}}}
+ {\i brain}, string {\i name}, float {\i weight}){\f2 [static]}}}
+\par
+{\bkmkstart AAAAAAAAAM}
+{\bkmkend AAAAAAAAAM}
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid
+\par
+{
+{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+Update the weight for all Synapses coming from the Neuron with the given name. }}\par
+{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+{\par
+{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid
+Parameters\par}
+\pard\plain \s81\li360\widctlpar\ql\adjustright \fs20\cgrid \trowd \trgaph108\trleft426\tblind426\trbrdrt\brdrs\brdrw10\brdrcf15 \trbrdrl\brdrs\brdrw10\brdrcf15 \trbrdrb\brdrs\brdrw10\brdrcf15 \trbrdrr\brdrs\brdrw10\brdrcf15 \trbrdrh\brdrs\brdrw10\brdrcf15 \trbrdrv\brdrs\brdrw10\brdrcf15
+\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx2187
+\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx8748
+\pard \widctlpar\intbl\adjustright
+{{\i brain} \cell }{The cluster in which the synapses are updated\cell }
+{\row }
+\trowd \trgaph108\trleft426\tblind426\trbrdrt\brdrs\brdrw10\brdrcf15 \trbrdrl\brdrs\brdrw10\brdrcf15 \trbrdrb\brdrs\brdrw10\brdrcf15 \trbrdrr\brdrs\brdrw10\brdrcf15 \trbrdrh\brdrs\brdrw10\brdrcf15 \trbrdrv\brdrs\brdrw10\brdrcf15
+\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx2187
+\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx8748
+\pard \widctlpar\intbl\adjustright
+{{\i name} \cell }{The name of the Neuron for which the weights are updated\cell }
+{\row }
+\trowd \trgaph108\trleft426\tblind426\trbrdrt\brdrs\brdrw10\brdrcf15 \trbrdrl\brdrs\brdrw10\brdrcf15 \trbrdrb\brdrs\brdrw10\brdrcf15 \trbrdrr\brdrs\brdrw10\brdrcf15 \trbrdrh\brdrs\brdrw10\brdrcf15 \trbrdrv\brdrs\brdrw10\brdrcf15
+\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx2187
+\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx8748
+\pard \widctlpar\intbl\adjustright
+{{\i weight} \cell }{The new Synapse weight\cell }
+{\row }
+}
+}}
+{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par}
+The documentation for this class was generated from the following file:{\par
+\pard\plain \s121\fi-360\li720\widctlpar\jclisttab\tx720{\*\pn \pnlvlbody\ilvl0\ls2\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Brain.cs\par
+}\par \pard\plain
+
+\pard\plain \sect\sbkpage
+\s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid
+\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid
+NanoBrain.Cluster Class Reference\par \pard\plain
+{\tc\tcl2 \v NanoBrain.Cluster}
+{\xe \v NanoBrain.Cluster}
+{\bkmkstart AAAAAAAAAG}
+{\bkmkend AAAAAAAAAG}
+{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par}
+\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid
+Description\par
+\pard\plain
+{
+\pard\plain \s17\sa60\sb30\widctlpar\qj \fs22\cgrid {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+A Cluster combines a collection of Nuclei to implement reusable behaviour. \par
+}
+
+{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+A Cluster is an instantiation of a ClusterPrefab. Clusters can be nested inside other clusters. \par
+}}
+Inheritance diagram for NanoBrain.Cluster:{
+\pard\plain
+\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "class_nano_brain_1_1_cluster.png" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par
+}
+\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid
+Public Types\par
+\pard\plain
+
+{
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+enum {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAP" }{}}{\fldrslt {\cs37\ul\cf2 Type}}}
+ \{ {\b None}
+, {\b Neuron}
+, {\b MemoryCell}
+, {\b Cluster}
+ \}\par
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+Function to clone a nucleus to a Cluster prefab. }}\par}
+}
+\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid
+Public Member Functions\par
+\pard\plain
+
+{
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+{\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAQ" }{}}{\fldrslt {\cs37\ul\cf2 Cluster}}}
+ ({\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAH" }{}}{\fldrslt {\cs37\ul\cf2 ClusterPrefab}}}
+ {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAR" }{}}{\fldrslt {\cs37\ul\cf2 prefab}}}
+, {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAG" }{}}{\fldrslt {\cs37\ul\cf2 Cluster}}}
+ {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAS" }{}}{\fldrslt {\cs37\ul\cf2 parent}}}
+)\par
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+Instantiate a new copy of a ClusterPrefab in the given parent. }{
+}\par
+}\par}
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+{\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAT" }{}}{\fldrslt {\cs37\ul\cf2 Cluster}}}
+ ({\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAH" }{}}{\fldrslt {\cs37\ul\cf2 ClusterPrefab}}}
+ {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAR" }{}}{\fldrslt {\cs37\ul\cf2 prefab}}}
+, {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAH" }{}}{\fldrslt {\cs37\ul\cf2 ClusterPrefab}}}
+ {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAS" }{}}{\fldrslt {\cs37\ul\cf2 parent}}}
+=null)\par
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+Add a new cluster to a ClusterPrefab. }{
+}\par
+}\par}
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+override {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAK" }{}}{\fldrslt {\cs37\ul\cf2 Nucleus}}}
+ {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAU" }{}}{\fldrslt {\cs37\ul\cf2 ShallowCloneTo}}}
+ ({\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAG" }{}}{\fldrslt {\cs37\ul\cf2 Cluster}}}
+ {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAS" }{}}{\fldrslt {\cs37\ul\cf2 parent}}}
+)\par
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+Toggle for printing debugging trace data. }{
+}\par
+}\par}
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+void {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAV" }{}}{\fldrslt {\cs37\ul\cf2 AddInstance}}}
+ ()\par
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+Increase the number of instances in an multi-cluster. }{
+}\par
+}\par}
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+void {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAW" }{}}{\fldrslt {\cs37\ul\cf2 AddInstance}}}
+ ({\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAH" }{}}{\fldrslt {\cs37\ul\cf2 ClusterPrefab}}}
+ {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAR" }{}}{\fldrslt {\cs37\ul\cf2 prefab}}}
+)\par
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+Create an new instance in a multi-cluster. }{
+}\par
+}\par}
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+void {\b RemoveInstance} (){\bkmkstart AAAAAAAAAX}
+{\bkmkend AAAAAAAAAX}
+\par
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+Decrease the number of instance in a multi-cluster. }{
+}\par
+}\par}
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+void {\b RefreshComputeOrders} (){\bkmkstart AAAAAAAAAY}
+{\bkmkend AAAAAAAAAY}
+\par
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+Refresh the order in which neurons should be computed. }{
+}\par
+}\par}
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+void {\b RefreshOutputs} (){\bkmkstart AAAAAAAAAZ}
+{\bkmkend AAAAAAAAAZ}
+\par
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+Reset the list of outputs such that they will be re-determined. }{
+}\par
+}\par}
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+bool {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAABA" }{}}{\fldrslt {\cs37\ul\cf2 TryGetNucleus}}}
+ (string nucleusName, out {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAK" }{}}{\fldrslt {\cs37\ul\cf2 Nucleus}}}
+ foundNucleus)\par
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+Try to find a nucleus in this cluster. }{
+}\par
+}\par}
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+{\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAK" }{}}{\fldrslt {\cs37\ul\cf2 Nucleus}}}
+ {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAABB" }{}}{\fldrslt {\cs37\ul\cf2 GetNucleus}}}
+ (string nucleusName)\par
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+Get a nucleus in this cluster. }{
+}\par
+}\par}
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+{\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAJ" }{}}{\fldrslt {\cs37\ul\cf2 Neuron}}}
+ {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAABC" }{}}{\fldrslt {\cs37\ul\cf2 GetNeuron}}}
+ (string neuronName)\par
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+Get a neuron in this cluster. }{
+}\par
+}\par}
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+{\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAJ" }{}}{\fldrslt {\cs37\ul\cf2 Neuron}}}
+ {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAABD" }{}}{\fldrslt {\cs37\ul\cf2 GetNeuron}}}
+ (int thingId, string neuronName, string thingName=null)\par
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+Get a neuron in an instance of a multi-cluster. }{
+}\par
+}\par}
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+bool {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAABE" }{}}{\fldrslt {\cs37\ul\cf2 DeleteNucleus}}}
+ ({\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAK" }{}}{\fldrslt {\cs37\ul\cf2 Nucleus}}}
+ nucleus)\par
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+Delete a nucleus from this clsuter. }{
+}\par
+}\par}
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+virtual List< {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAK" }{}}{\fldrslt {\cs37\ul\cf2 Nucleus}}}
+ > {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAABF" }{}}{\fldrslt {\cs37\ul\cf2 CollectReceivers}}}
+ (bool removeDuplicates=false)\par
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+Collect all receiving nuclei of signals from this cluster. }{
+}\par
+}\par}
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+List< {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAL" }{}}{\fldrslt {\cs37\ul\cf2 Synapse}}}
+ > {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAABG" }{}}{\fldrslt {\cs37\ul\cf2 CollectSynapsesTo}}}
+ ({\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAG" }{}}{\fldrslt {\cs37\ul\cf2 Cluster}}}
+ otherCluster)\par
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+Collect all connections to receivers of signals from this cluster. }{
+}\par
+}\par}
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+void {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAABH" }{}}{\fldrslt {\cs37\ul\cf2 UpdateFromNucleus}}}
+ ({\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAK" }{}}{\fldrslt {\cs37\ul\cf2 Nucleus}}}
+ startNucleus)\par
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+Update the state of the nucleus and all nuclei receiving from it. }{
+}\par
+}\par}
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+override void {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAABI" }{}}{\fldrslt {\cs37\ul\cf2 UpdateStateIsolated}}}
+ ()\par
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+Update the state without updating other Nuclei. }{
+}\par
+}\par}
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+void {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAABJ" }{}}{\fldrslt {\cs37\ul\cf2 Refresh}}}
+ ()\par
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+Recalculate derived properties. }{
+}\par
+}\par}
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+virtual void {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAABK" }{}}{\fldrslt {\cs37\ul\cf2 UpdateNuclei}}}
+ ()\par
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+Update the state and recursively all Nuclei receiving data from this Nucleus. }{
+}\par
+}\par}
+}
+\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid
+Static Public Member Functions\par
+\pard\plain
+
+{
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+static int {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAABL" }{}}{\fldrslt {\cs37\ul\cf2 GetNucleusIndex}}}
+ (List< {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAK" }{}}{\fldrslt {\cs37\ul\cf2 Nucleus}}}
+ > {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAABM" }{}}{\fldrslt {\cs37\ul\cf2 nuclei}}}
+, {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAK" }{}}{\fldrslt {\cs37\ul\cf2 Nucleus}}}
+ nucleus)\par
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+Get the index of a nucleus in a list of nuclei. }{
+}\par
+}\par}
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+static int {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAABN" }{}}{\fldrslt {\cs37\ul\cf2 GetNucleusIndex}}}
+ (List< {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAK" }{}}{\fldrslt {\cs37\ul\cf2 Nucleus}}}
+ > {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAABM" }{}}{\fldrslt {\cs37\ul\cf2 nuclei}}}
+, string nucleusName)\par
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+Get the index of a nucleus with the given name in a list of nuclei. }{
+}\par
+}\par}
+}
+\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid
+Public Attributes\par
+\pard\plain
+
+{
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+{\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAH" }{}}{\fldrslt {\cs37\ul\cf2 ClusterPrefab}}}
+ {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAR" }{}}{\fldrslt {\cs37\ul\cf2 prefab}}}
+\par
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+The prefab used to create this cluster. }{
+}\par
+}\par}
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+{\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAG" }{}}{\fldrslt {\cs37\ul\cf2 Cluster}}}
+[] {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAABO" }{}}{\fldrslt {\cs37\ul\cf2 instances}}}
+\par
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+All cluster instance of a multi-cluster. }{
+}\par
+}\par}
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+int {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAABP" }{}}{\fldrslt {\cs37\ul\cf2 instanceCount}}}
+ = 1\par
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+The number of cluster instances in a multi-cluster. }{
+}\par
+}\par}
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+Dictionary< int, {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAG" }{}}{\fldrslt {\cs37\ul\cf2 Cluster}}}
+ > {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAABQ" }{}}{\fldrslt {\cs37\ul\cf2 thingClusters}}}
+ = new()\par
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+The mapping from things to cluster instances. }{
+}\par
+}\par}
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+List< {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAK" }{}}{\fldrslt {\cs37\ul\cf2 Nucleus}}}
+ > {\b nuclei} = new(){\bkmkstart AAAAAAAABM}
+{\bkmkend AAAAAAAABM}
+\par
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+All nuclei in this cluster. }{
+}\par
+}\par}
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+string {\b name}{\bkmkstart AAAAAAAABR}
+{\bkmkend AAAAAAAABR}
+\par
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+The name of the Nucleus. }{
+}\par
+}\par}
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+{\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAG" }{}}{\fldrslt {\cs37\ul\cf2 Cluster}}}
+ {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAS" }{}}{\fldrslt {\cs37\ul\cf2 parent}}}
+\par
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+The cluster prefab in which the nucleus is located. }{
+}\par
+}\par}
+}
+\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid
+Protected Attributes\par
+\pard\plain
+
+{
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+List< {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAJ" }{}}{\fldrslt {\cs37\ul\cf2 Neuron}}}
+ > {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAABS" }{}}{\fldrslt {\cs37\ul\cf2 _outputs}}}
+ = null\par
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+The neurons without outgoing connections. }{
+}\par
+}\par}
+}
+\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid
+Properties\par
+\pard\plain
+
+{
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+string {\b baseName}{\f2 [get]}{\bkmkstart AAAAAAAABT}
+{\bkmkend AAAAAAAABT}
+\par
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+The base name of the cluster. I don't think this is actively used at this moment. }{
+}\par
+}\par}
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+Dictionary< {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAK" }{}}{\fldrslt {\cs37\ul\cf2 Nucleus}}}
+, List< {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAK" }{}}{\fldrslt {\cs37\ul\cf2 Nucleus}}}
+ > > {\b computeOrders}{\f2 [get]}{\bkmkstart AAAAAAAABU}
+{\bkmkend AAAAAAAABU}
+\par
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+This gives the order in which nuclei should be computed when a nucleus is updated. }{
+}\par
+}\par}
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+virtual {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAJ" }{}}{\fldrslt {\cs37\ul\cf2 Neuron}}}
+ {\b defaultOutput}{\f2 [get]}{\bkmkstart AAAAAAAABV}
+{\bkmkend AAAAAAAABV}
+\par
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+The first nucleus in a cluster is the default output. }{
+}\par
+}\par}
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+List< {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAJ" }{}}{\fldrslt {\cs37\ul\cf2 Neuron}}}
+ > {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAABW" }{}}{\fldrslt {\cs37\ul\cf2 outputs}}}
+{\f2 [get]}\par
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+The neurons without outgoing connections. }{
+}\par
+}\par}
+}
+{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par}
+\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid
+Member Enumeration Documentation\par
+\pard\plain
+{\xe \v Type\:NanoBrain.Cluster}
+{\xe \v NanoBrain.Cluster\:Type}
+\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid {
+{\b
+enum {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAP" }{}}{\fldrslt {\cs37\ul\cf2 NanoBrain.Nucleus.Type}}}
+{\f2 [inherited]}}}
+\par
+{\bkmkstart AAAAAAAAAP}
+{\bkmkend AAAAAAAAAP}
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid
+\par
+{
+{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+Function to clone a nucleus to a Cluster prefab. }}\par
+{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+{\par
+{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid
+Parameters\par}
+\pard\plain \s81\li360\widctlpar\ql\adjustright \fs20\cgrid \trowd \trgaph108\trleft426\tblind426\trbrdrt\brdrs\brdrw10\brdrcf15 \trbrdrl\brdrs\brdrw10\brdrcf15 \trbrdrb\brdrs\brdrw10\brdrcf15 \trbrdrr\brdrs\brdrw10\brdrcf15 \trbrdrh\brdrs\brdrw10\brdrcf15 \trbrdrv\brdrs\brdrw10\brdrcf15
+\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx2187
+\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx8748
+\pard \widctlpar\intbl\adjustright
+{{\i prefab} \cell }{\cell }
+{\row }
+}
+{{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid
+Returns\par}\pard\plain \s82\li720\widctlpar\ql\adjustright \fs20\cgrid {\s17 \sa60 \sb30
+\par
+}}The types of Nucleus \par
+}}
+{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par}
+\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid
+Constructor & Destructor Documentation\par
+\pard\plain
+{\xe \v Cluster\:NanoBrain.Cluster}
+{\xe \v NanoBrain.Cluster\:Cluster}
+\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid {
+{\b
+NanoBrain.Cluster.Cluster ({\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAH" }{}}{\fldrslt {\cs37\ul\cf2 ClusterPrefab}}}
+ {\i prefab}, {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAG" }{}}{\fldrslt {\cs37\ul\cf2 Cluster}}}
+ {\i parent})}}
+\par
+{\bkmkstart AAAAAAAAAQ}
+{\bkmkend AAAAAAAAAQ}
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid
+\par
+{
+{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+Instantiate a new copy of a ClusterPrefab in the given parent. }}\par
+{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+{\par
+{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid
+Parameters\par}
+\pard\plain \s81\li360\widctlpar\ql\adjustright \fs20\cgrid \trowd \trgaph108\trleft426\tblind426\trbrdrt\brdrs\brdrw10\brdrcf15 \trbrdrl\brdrs\brdrw10\brdrcf15 \trbrdrb\brdrs\brdrw10\brdrcf15 \trbrdrr\brdrs\brdrw10\brdrcf15 \trbrdrh\brdrs\brdrw10\brdrcf15 \trbrdrv\brdrs\brdrw10\brdrcf15
+\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx2187
+\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx8748
+\pard \widctlpar\intbl\adjustright
+{{\i prefab} \cell }{The prefab to use\cell }
+{\row }
+\trowd \trgaph108\trleft426\tblind426\trbrdrt\brdrs\brdrw10\brdrcf15 \trbrdrl\brdrs\brdrw10\brdrcf15 \trbrdrb\brdrs\brdrw10\brdrcf15 \trbrdrr\brdrs\brdrw10\brdrcf15 \trbrdrh\brdrs\brdrw10\brdrcf15 \trbrdrv\brdrs\brdrw10\brdrcf15
+\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx2187
+\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx8748
+\pard \widctlpar\intbl\adjustright
+{{\i parent} \cell }{The cluster in which this new cluster will be placed\cell }
+{\row }
+}
+}}
+{\xe \v Cluster\:NanoBrain.Cluster}
+{\xe \v NanoBrain.Cluster\:Cluster}
+\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid {
+{\b
+NanoBrain.Cluster.Cluster ({\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAH" }{}}{\fldrslt {\cs37\ul\cf2 ClusterPrefab}}}
+ {\i prefab}, {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAH" }{}}{\fldrslt {\cs37\ul\cf2 ClusterPrefab}}}
+ {\i parent} = {\f2 null})}}
+\par
+{\bkmkstart AAAAAAAAAT}
+{\bkmkend AAAAAAAAAT}
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid
+\par
+{
+{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+Add a new cluster to a ClusterPrefab. }}\par
+{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+{\par
+{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid
+Parameters\par}
+\pard\plain \s81\li360\widctlpar\ql\adjustright \fs20\cgrid \trowd \trgaph108\trleft426\tblind426\trbrdrt\brdrs\brdrw10\brdrcf15 \trbrdrl\brdrs\brdrw10\brdrcf15 \trbrdrb\brdrs\brdrw10\brdrcf15 \trbrdrr\brdrs\brdrw10\brdrcf15 \trbrdrh\brdrs\brdrw10\brdrcf15 \trbrdrv\brdrs\brdrw10\brdrcf15
+\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx2187
+\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx8748
+\pard \widctlpar\intbl\adjustright
+{{\i prefab} \cell }{The prefab to copy\cell }
+{\row }
+\trowd \trgaph108\trleft426\tblind426\trbrdrt\brdrs\brdrw10\brdrcf15 \trbrdrl\brdrs\brdrw10\brdrcf15 \trbrdrb\brdrs\brdrw10\brdrcf15 \trbrdrr\brdrs\brdrw10\brdrcf15 \trbrdrh\brdrs\brdrw10\brdrcf15 \trbrdrv\brdrs\brdrw10\brdrcf15
+\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx2187
+\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx8748
+\pard \widctlpar\intbl\adjustright
+{{\i parent} \cell }{The prefab in which the new copy is placed\cell }
+{\row }
+}
+}}
+{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par}
+\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid
+Member Function Documentation\par
+\pard\plain
+{\xe \v ShallowCloneTo\:NanoBrain.Cluster}
+{\xe \v NanoBrain.Cluster\:ShallowCloneTo}
+\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid {
+{\b
+override {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAK" }{}}{\fldrslt {\cs37\ul\cf2 Nucleus}}}
+ NanoBrain.Cluster.ShallowCloneTo ({\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAG" }{}}{\fldrslt {\cs37\ul\cf2 Cluster}}}
+ {\i parent})}}
+\par
+{\bkmkstart AAAAAAAAAU}
+{\bkmkend AAAAAAAAAU}
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid
+\par
+{
+{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+Toggle for printing debugging trace data. }}\par
+{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+Function to make a partial clone of this nucleus\par
+{{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid
+Parameters\par}
+\pard\plain \s81\li360\widctlpar\ql\adjustright \fs20\cgrid \trowd \trgaph108\trleft426\tblind426\trbrdrt\brdrs\brdrw10\brdrcf15 \trbrdrl\brdrs\brdrw10\brdrcf15 \trbrdrb\brdrs\brdrw10\brdrcf15 \trbrdrr\brdrs\brdrw10\brdrcf15 \trbrdrh\brdrs\brdrw10\brdrcf15 \trbrdrv\brdrs\brdrw10\brdrcf15
+\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx2187
+\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx8748
+\pard \widctlpar\intbl\adjustright
+{{\i parent} \cell }{The cluster in which the cloned nucleus should be placed\cell }
+{\row }
+}
+{{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid
+Returns\par}\pard\plain \s82\li720\widctlpar\ql\adjustright \fs20\cgrid {\s17 \sa60 \sb30
+\par
+}}}}
+{\xe \v GetNucleusIndex\:NanoBrain.Cluster}
+{\xe \v NanoBrain.Cluster\:GetNucleusIndex}
+\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid {
+{\b
+static int NanoBrain.Cluster.GetNucleusIndex (List< {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAK" }{}}{\fldrslt {\cs37\ul\cf2 Nucleus}}}
+ > {\i nuclei}, {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAK" }{}}{\fldrslt {\cs37\ul\cf2 Nucleus}}}
+ {\i nucleus}){\f2 [static]}}}
+\par
+{\bkmkstart AAAAAAAABL}
+{\bkmkend AAAAAAAABL}
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid
+\par
+{
+{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+Get the index of a nucleus in a list of nuclei. }}\par
+{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+{\par
+{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid
+Parameters\par}
+\pard\plain \s81\li360\widctlpar\ql\adjustright \fs20\cgrid \trowd \trgaph108\trleft426\tblind426\trbrdrt\brdrs\brdrw10\brdrcf15 \trbrdrl\brdrs\brdrw10\brdrcf15 \trbrdrb\brdrs\brdrw10\brdrcf15 \trbrdrr\brdrs\brdrw10\brdrcf15 \trbrdrh\brdrs\brdrw10\brdrcf15 \trbrdrv\brdrs\brdrw10\brdrcf15
+\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx2187
+\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx8748
+\pard \widctlpar\intbl\adjustright
+{{\i nuclei} \cell }{The list of nuclei to search\cell }
+{\row }
+\trowd \trgaph108\trleft426\tblind426\trbrdrt\brdrs\brdrw10\brdrcf15 \trbrdrl\brdrs\brdrw10\brdrcf15 \trbrdrb\brdrs\brdrw10\brdrcf15 \trbrdrr\brdrs\brdrw10\brdrcf15 \trbrdrh\brdrs\brdrw10\brdrcf15 \trbrdrv\brdrs\brdrw10\brdrcf15
+\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx2187
+\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx8748
+\pard \widctlpar\intbl\adjustright
+{{\i nucleus} \cell }{The nucleus to find\cell }
+{\row }
+}
+{{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid
+Returns\par}\pard\plain \s82\li720\widctlpar\ql\adjustright \fs20\cgrid {\s17 \sa60 \sb30
+The index of the nucleus in the list or -1 when it has not been found\par
+}}}}
+{\xe \v GetNucleusIndex\:NanoBrain.Cluster}
+{\xe \v NanoBrain.Cluster\:GetNucleusIndex}
+\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid {
+{\b
+static int NanoBrain.Cluster.GetNucleusIndex (List< {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAK" }{}}{\fldrslt {\cs37\ul\cf2 Nucleus}}}
+ > {\i nuclei}, string {\i nucleusName}){\f2 [static]}}}
+\par
+{\bkmkstart AAAAAAAABN}
+{\bkmkend AAAAAAAABN}
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid
+\par
+{
+{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+Get the index of a nucleus with the given name in a list of nuclei. }}\par
+{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+{\par
+{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid
+Parameters\par}
+\pard\plain \s81\li360\widctlpar\ql\adjustright \fs20\cgrid \trowd \trgaph108\trleft426\tblind426\trbrdrt\brdrs\brdrw10\brdrcf15 \trbrdrl\brdrs\brdrw10\brdrcf15 \trbrdrb\brdrs\brdrw10\brdrcf15 \trbrdrr\brdrs\brdrw10\brdrcf15 \trbrdrh\brdrs\brdrw10\brdrcf15 \trbrdrv\brdrs\brdrw10\brdrcf15
+\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx2187
+\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx8748
+\pard \widctlpar\intbl\adjustright
+{{\i nuclei} \cell }{The list of nuclei to search\cell }
+{\row }
+\trowd \trgaph108\trleft426\tblind426\trbrdrt\brdrs\brdrw10\brdrcf15 \trbrdrl\brdrs\brdrw10\brdrcf15 \trbrdrb\brdrs\brdrw10\brdrcf15 \trbrdrr\brdrs\brdrw10\brdrcf15 \trbrdrh\brdrs\brdrw10\brdrcf15 \trbrdrv\brdrs\brdrw10\brdrcf15
+\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx2187
+\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx8748
+\pard \widctlpar\intbl\adjustright
+{{\i nucleusName} \cell }{The name of the nucleus to find\cell }
+{\row }
+}
+{{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid
+Returns\par}\pard\plain \s82\li720\widctlpar\ql\adjustright \fs20\cgrid {\s17 \sa60 \sb30
+The index of the nucleus in the list or -1 when it has not been found\par
+}}}}
+{\xe \v AddInstance\:NanoBrain.Cluster}
+{\xe \v NanoBrain.Cluster\:AddInstance}
+\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid {
+{\b
+void NanoBrain.Cluster.AddInstance ()}}
+\par
+{\bkmkstart AAAAAAAAAV}
+{\bkmkend AAAAAAAAAV}
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid
+\par
+{
+{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+Increase the number of instances in an multi-cluster. }}\par
+{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+/remark Note this does not create the instances. This is only intended to be used for prefabs. \par
+}}
+{\xe \v AddInstance\:NanoBrain.Cluster}
+{\xe \v NanoBrain.Cluster\:AddInstance}
+\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid {
+{\b
+void NanoBrain.Cluster.AddInstance ({\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAH" }{}}{\fldrslt {\cs37\ul\cf2 ClusterPrefab}}}
+ {\i prefab})}}
+\par
+{\bkmkstart AAAAAAAAAW}
+{\bkmkend AAAAAAAAAW}
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid
+\par
+{
+{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+Create an new instance in a multi-cluster. }}\par
+{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+{\par
+{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid
+Parameters\par}
+\pard\plain \s81\li360\widctlpar\ql\adjustright \fs20\cgrid \trowd \trgaph108\trleft426\tblind426\trbrdrt\brdrs\brdrw10\brdrcf15 \trbrdrl\brdrs\brdrw10\brdrcf15 \trbrdrb\brdrs\brdrw10\brdrcf15 \trbrdrr\brdrs\brdrw10\brdrcf15 \trbrdrh\brdrs\brdrw10\brdrcf15 \trbrdrv\brdrs\brdrw10\brdrcf15
+\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx2187
+\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx8748
+\pard \widctlpar\intbl\adjustright
+{{\i prefab} \cell }{The prefab to use to create the new instance\cell }
+{\row }
+}
+/remark This does not change the instanceCount. It should only be used at runtime. \par
+}}
+{\xe \v TryGetNucleus\:NanoBrain.Cluster}
+{\xe \v NanoBrain.Cluster\:TryGetNucleus}
+\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid {
+{\b
+bool NanoBrain.Cluster.TryGetNucleus (string {\i nucleusName}, out {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAK" }{}}{\fldrslt {\cs37\ul\cf2 Nucleus}}}
+ {\i foundNucleus})}}
+\par
+{\bkmkstart AAAAAAAABA}
+{\bkmkend AAAAAAAABA}
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid
+\par
+{
+{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+Try to find a nucleus in this cluster. }}\par
+{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+{\par
+{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid
+Parameters\par}
+\pard\plain \s81\li360\widctlpar\ql\adjustright \fs20\cgrid \trowd \trgaph108\trleft426\tblind426\trbrdrt\brdrs\brdrw10\brdrcf15 \trbrdrl\brdrs\brdrw10\brdrcf15 \trbrdrb\brdrs\brdrw10\brdrcf15 \trbrdrr\brdrs\brdrw10\brdrcf15 \trbrdrh\brdrs\brdrw10\brdrcf15 \trbrdrv\brdrs\brdrw10\brdrcf15
+\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx2187
+\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx8748
+\pard \widctlpar\intbl\adjustright
+{{\i nucleusName} \cell }{The name of the nucleus to find\cell }
+{\row }
+\trowd \trgaph108\trleft426\tblind426\trbrdrt\brdrs\brdrw10\brdrcf15 \trbrdrl\brdrs\brdrw10\brdrcf15 \trbrdrb\brdrs\brdrw10\brdrcf15 \trbrdrr\brdrs\brdrw10\brdrcf15 \trbrdrh\brdrs\brdrw10\brdrcf15 \trbrdrv\brdrs\brdrw10\brdrcf15
+\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx2187
+\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx8748
+\pard \widctlpar\intbl\adjustright
+{{\i foundNucleus} \cell }{The found nucleus or null if it is not found\cell }
+{\row }
+}
+{{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid
+Returns\par}\pard\plain \s82\li720\widctlpar\ql\adjustright \fs20\cgrid {\s17 \sa60 \sb30
+True when the nucleus is found, false otherwise\par
+}}}}
+{\xe \v GetNucleus\:NanoBrain.Cluster}
+{\xe \v NanoBrain.Cluster\:GetNucleus}
+\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid {
+{\b
+{\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAK" }{}}{\fldrslt {\cs37\ul\cf2 Nucleus}}}
+ NanoBrain.Cluster.GetNucleus (string {\i nucleusName})}}
+\par
+{\bkmkstart AAAAAAAABB}
+{\bkmkend AAAAAAAABB}
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid
+\par
+{
+{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+Get a nucleus in this cluster. }}\par
+{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+{\par
+{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid
+Parameters\par}
+\pard\plain \s81\li360\widctlpar\ql\adjustright \fs20\cgrid \trowd \trgaph108\trleft426\tblind426\trbrdrt\brdrs\brdrw10\brdrcf15 \trbrdrl\brdrs\brdrw10\brdrcf15 \trbrdrb\brdrs\brdrw10\brdrcf15 \trbrdrr\brdrs\brdrw10\brdrcf15 \trbrdrh\brdrs\brdrw10\brdrcf15 \trbrdrv\brdrs\brdrw10\brdrcf15
+\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx2187
+\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx8748
+\pard \widctlpar\intbl\adjustright
+{{\i nucleusName} \cell }{The name of the nucleus to find\cell }
+{\row }
+}
+{{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid
+Returns\par}\pard\plain \s82\li720\widctlpar\ql\adjustright \fs20\cgrid {\s17 \sa60 \sb30
+The found nucleus or null when it is not found\par
+}}}}
+{\xe \v GetNeuron\:NanoBrain.Cluster}
+{\xe \v NanoBrain.Cluster\:GetNeuron}
+\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid {
+{\b
+{\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAJ" }{}}{\fldrslt {\cs37\ul\cf2 Neuron}}}
+ NanoBrain.Cluster.GetNeuron (string {\i neuronName})}}
+\par
+{\bkmkstart AAAAAAAABC}
+{\bkmkend AAAAAAAABC}
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid
+\par
+{
+{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+Get a neuron in this cluster. }}\par
+{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+{\par
+{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid
+Parameters\par}
+\pard\plain \s81\li360\widctlpar\ql\adjustright \fs20\cgrid \trowd \trgaph108\trleft426\tblind426\trbrdrt\brdrs\brdrw10\brdrcf15 \trbrdrl\brdrs\brdrw10\brdrcf15 \trbrdrb\brdrs\brdrw10\brdrcf15 \trbrdrr\brdrs\brdrw10\brdrcf15 \trbrdrh\brdrs\brdrw10\brdrcf15 \trbrdrv\brdrs\brdrw10\brdrcf15
+\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx2187
+\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx8748
+\pard \widctlpar\intbl\adjustright
+{{\i neuronName} \cell }{The name of the neuron to find\cell }
+{\row }
+}
+{{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid
+Returns\par}\pard\plain \s82\li720\widctlpar\ql\adjustright \fs20\cgrid {\s17 \sa60 \sb30
+The found neuron or null when it is not found\par
+}}}}
+{\xe \v GetNeuron\:NanoBrain.Cluster}
+{\xe \v NanoBrain.Cluster\:GetNeuron}
+\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid {
+{\b
+{\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAJ" }{}}{\fldrslt {\cs37\ul\cf2 Neuron}}}
+ NanoBrain.Cluster.GetNeuron (int {\i thingId}, string {\i neuronName}, string {\i thingName} = {\f2 null})}}
+\par
+{\bkmkstart AAAAAAAABD}
+{\bkmkend AAAAAAAABD}
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid
+\par
+{
+{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+Get a neuron in an instance of a multi-cluster. }}\par
+{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+{\par
+{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid
+Parameters\par}
+\pard\plain \s81\li360\widctlpar\ql\adjustright \fs20\cgrid \trowd \trgaph108\trleft426\tblind426\trbrdrt\brdrs\brdrw10\brdrcf15 \trbrdrl\brdrs\brdrw10\brdrcf15 \trbrdrb\brdrs\brdrw10\brdrcf15 \trbrdrr\brdrs\brdrw10\brdrcf15 \trbrdrh\brdrs\brdrw10\brdrcf15 \trbrdrv\brdrs\brdrw10\brdrcf15
+\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx2187
+\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx8748
+\pard \widctlpar\intbl\adjustright
+{{\i thingId} \cell }{The id of the thing mapped to the cluster instance\cell }
+{\row }
+\trowd \trgaph108\trleft426\tblind426\trbrdrt\brdrs\brdrw10\brdrcf15 \trbrdrl\brdrs\brdrw10\brdrcf15 \trbrdrb\brdrs\brdrw10\brdrcf15 \trbrdrr\brdrs\brdrw10\brdrcf15 \trbrdrh\brdrs\brdrw10\brdrcf15 \trbrdrv\brdrs\brdrw10\brdrcf15
+\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx2187
+\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx8748
+\pard \widctlpar\intbl\adjustright
+{{\i neuronName} \cell }{The name of the neuron to find\cell }
+{\row }
+\trowd \trgaph108\trleft426\tblind426\trbrdrt\brdrs\brdrw10\brdrcf15 \trbrdrl\brdrs\brdrw10\brdrcf15 \trbrdrb\brdrs\brdrw10\brdrcf15 \trbrdrr\brdrs\brdrw10\brdrcf15 \trbrdrh\brdrs\brdrw10\brdrcf15 \trbrdrv\brdrs\brdrw10\brdrcf15
+\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx2187
+\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx8748
+\pard \widctlpar\intbl\adjustright
+{{\i thingName} \cell }{The name of the thing mapped to the cluster instance\cell }
+{\row }
+}
+{{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid
+Returns\par}\pard\plain \s82\li720\widctlpar\ql\adjustright \fs20\cgrid {\s17 \sa60 \sb30
+The found neuron or null when it is not found\par
+}}The cluster instance mapped to the thing will be neuron.parent if a neuron is found. \par
+}}
+{\xe \v DeleteNucleus\:NanoBrain.Cluster}
+{\xe \v NanoBrain.Cluster\:DeleteNucleus}
+\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid {
+{\b
+bool NanoBrain.Cluster.DeleteNucleus ({\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAK" }{}}{\fldrslt {\cs37\ul\cf2 Nucleus}}}
+ {\i nucleus})}}
+\par
+{\bkmkstart AAAAAAAABE}
+{\bkmkend AAAAAAAABE}
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid
+\par
+{
+{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+Delete a nucleus from this clsuter. }}\par
+{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+{\par
+{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid
+Parameters\par}
+\pard\plain \s81\li360\widctlpar\ql\adjustright \fs20\cgrid \trowd \trgaph108\trleft426\tblind426\trbrdrt\brdrs\brdrw10\brdrcf15 \trbrdrl\brdrs\brdrw10\brdrcf15 \trbrdrb\brdrs\brdrw10\brdrcf15 \trbrdrr\brdrs\brdrw10\brdrcf15 \trbrdrh\brdrs\brdrw10\brdrcf15 \trbrdrv\brdrs\brdrw10\brdrcf15
+\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx2187
+\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx8748
+\pard \widctlpar\intbl\adjustright
+{{\i nucleus} \cell }{The nucleus to delete\cell }
+{\row }
+}
+{{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid
+Returns\par}\pard\plain \s82\li720\widctlpar\ql\adjustright \fs20\cgrid {\s17 \sa60 \sb30
+True if a nucleus was deleted, false if the nucleus could not be found\par
+}}}}
+{\xe \v CollectReceivers\:NanoBrain.Cluster}
+{\xe \v NanoBrain.Cluster\:CollectReceivers}
+\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid {
+{\b
+virtual List< {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAK" }{}}{\fldrslt {\cs37\ul\cf2 Nucleus}}}
+ > NanoBrain.Cluster.CollectReceivers (bool {\i removeDuplicates} = {\f2 false}){\f2 [virtual]}}}
+\par
+{\bkmkstart AAAAAAAABF}
+{\bkmkend AAAAAAAABF}
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid
+\par
+{
+{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+Collect all receiving nuclei of signals from this cluster. }}\par
+{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+{\par
+{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid
+Parameters\par}
+\pard\plain \s81\li360\widctlpar\ql\adjustright \fs20\cgrid \trowd \trgaph108\trleft426\tblind426\trbrdrt\brdrs\brdrw10\brdrcf15 \trbrdrl\brdrs\brdrw10\brdrcf15 \trbrdrb\brdrs\brdrw10\brdrcf15 \trbrdrr\brdrs\brdrw10\brdrcf15 \trbrdrh\brdrs\brdrw10\brdrcf15 \trbrdrv\brdrs\brdrw10\brdrcf15
+\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx2187
+\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx8748
+\pard \widctlpar\intbl\adjustright
+{{\i removeDuplicates} \cell }{Ensure that a receiver is only listed once in the result\cell }
+{\row }
+}
+{{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid
+Returns\par}\pard\plain \s82\li720\widctlpar\ql\adjustright \fs20\cgrid {\s17 \sa60 \sb30
+The list of receivers\par
+}}}}
+{\xe \v CollectSynapsesTo\:NanoBrain.Cluster}
+{\xe \v NanoBrain.Cluster\:CollectSynapsesTo}
+\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid {
+{\b
+List< {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAL" }{}}{\fldrslt {\cs37\ul\cf2 Synapse}}}
+ > NanoBrain.Cluster.CollectSynapsesTo ({\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAG" }{}}{\fldrslt {\cs37\ul\cf2 Cluster}}}
+ {\i otherCluster})}}
+\par
+{\bkmkstart AAAAAAAABG}
+{\bkmkend AAAAAAAABG}
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid
+\par
+{
+{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+Collect all connections to receivers of signals from this cluster. }}\par
+{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+\par
+{{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid
+Returns\par}\pard\plain \s82\li720\widctlpar\ql\adjustright \fs20\cgrid {\s17 \sa60 \sb30
+A list of pairs of the sending neuron in this cluster and the matching receiving nucleus\par
+}}Collect all synapses of senders in another cluster of signals to this cluster\par
+{{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid
+Parameters\par}
+\pard\plain \s81\li360\widctlpar\ql\adjustright \fs20\cgrid \trowd \trgaph108\trleft426\tblind426\trbrdrt\brdrs\brdrw10\brdrcf15 \trbrdrl\brdrs\brdrw10\brdrcf15 \trbrdrb\brdrs\brdrw10\brdrcf15 \trbrdrr\brdrs\brdrw10\brdrcf15 \trbrdrh\brdrs\brdrw10\brdrcf15 \trbrdrv\brdrs\brdrw10\brdrcf15
+\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx2187
+\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx8748
+\pard \widctlpar\intbl\adjustright
+{{\i otherCluster} \cell }{The other cluster with sending neurons\cell }
+{\row }
+}
+{{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid
+Returns\par}\pard\plain \s82\li720\widctlpar\ql\adjustright \fs20\cgrid {\s17 \sa60 \sb30
+A list of synapses to the neurons in the other clusters\par
+}}}}
+{\xe \v UpdateFromNucleus\:NanoBrain.Cluster}
+{\xe \v NanoBrain.Cluster\:UpdateFromNucleus}
+\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid {
+{\b
+void NanoBrain.Cluster.UpdateFromNucleus ({\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAK" }{}}{\fldrslt {\cs37\ul\cf2 Nucleus}}}
+ {\i startNucleus})}}
+\par
+{\bkmkstart AAAAAAAABH}
+{\bkmkend AAAAAAAABH}
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid
+\par
+{
+{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+Update the state of the nucleus and all nuclei receiving from it. }}\par
+{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+{\par
+{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid
+Parameters\par}
+\pard\plain \s81\li360\widctlpar\ql\adjustright \fs20\cgrid \trowd \trgaph108\trleft426\tblind426\trbrdrt\brdrs\brdrw10\brdrcf15 \trbrdrl\brdrs\brdrw10\brdrcf15 \trbrdrb\brdrs\brdrw10\brdrcf15 \trbrdrr\brdrs\brdrw10\brdrcf15 \trbrdrh\brdrs\brdrw10\brdrcf15 \trbrdrv\brdrs\brdrw10\brdrcf15
+\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx2187
+\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx8748
+\pard \widctlpar\intbl\adjustright
+{{\i startNucleus} \cell }{The nucleus to start updating\cell }
+{\row }
+}
+}}
+{\xe \v UpdateStateIsolated\:NanoBrain.Cluster}
+{\xe \v NanoBrain.Cluster\:UpdateStateIsolated}
+\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid {
+{\b
+override void NanoBrain.Cluster.UpdateStateIsolated ()}}
+\par
+{\bkmkstart AAAAAAAABI}
+{\bkmkend AAAAAAAABI}
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid
+\par
+{
+{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+Update the state without updating other Nuclei. }}\par
+{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+\par
+}}
+{\xe \v Refresh\:NanoBrain.Cluster}
+{\xe \v NanoBrain.Cluster\:Refresh}
+\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid {
+{\b
+void NanoBrain.Cluster.Refresh ()}}
+\par
+{\bkmkstart AAAAAAAABJ}
+{\bkmkend AAAAAAAABJ}
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid
+\par
+{
+{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+Recalculate derived properties. }}\par
+{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+This can be used to recalculate derived properties after the set of nuclei has been changed \par
+}}
+{\xe \v UpdateNuclei\:NanoBrain.Cluster}
+{\xe \v NanoBrain.Cluster\:UpdateNuclei}
+\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid {
+{\b
+virtual void NanoBrain.Nucleus.UpdateNuclei (){\f2 [virtual]}, {\f2 [inherited]}}}
+\par
+{\bkmkstart AAAAAAAABK}
+{\bkmkend AAAAAAAABK}
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid
+\par
+{
+{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+Update the state and recursively all Nuclei receiving data from this Nucleus. }}\par
+{
+Reimplemented in {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAABX" }{}}{\fldrslt {\cs37\ul\cf2 NanoBrain.MemoryCell}}}
+.}\par
+}
+{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par}
+\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid
+Member Data Documentation\par
+\pard\plain
+{\xe \v prefab\:NanoBrain.Cluster}
+{\xe \v NanoBrain.Cluster\:prefab}
+\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid {
+{\b
+{\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAH" }{}}{\fldrslt {\cs37\ul\cf2 ClusterPrefab}}}
+ NanoBrain.Cluster.prefab}}
+\par
+{\bkmkstart AAAAAAAAAR}
+{\bkmkend AAAAAAAAAR}
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid
+\par
+{
+{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+The prefab used to create this cluster. }}\par
+{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+Cluster should always be created from prefabs \par
+}}
+{\xe \v instances\:NanoBrain.Cluster}
+{\xe \v NanoBrain.Cluster\:instances}
+\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid {
+{\b
+{\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAG" }{}}{\fldrslt {\cs37\ul\cf2 Cluster}}}
+ [] NanoBrain.Cluster.instances}}
+\par
+{\bkmkstart AAAAAAAABO}
+{\bkmkend AAAAAAAABO}
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid
+\par
+{
+{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+All cluster instance of a multi-cluster. }}\par
+{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+A cluster is a multi-cluster when there is more than one instance. The actual instances are only created at runtime. The value instanceCount determines how many instances will be present at runtime. \par
+}}
+{\xe \v instanceCount\:NanoBrain.Cluster}
+{\xe \v NanoBrain.Cluster\:instanceCount}
+\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid {
+{\b
+int NanoBrain.Cluster.instanceCount = 1}}
+\par
+{\bkmkstart AAAAAAAABP}
+{\bkmkend AAAAAAAABP}
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid
+\par
+{
+{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+The number of cluster instances in a multi-cluster. }}\par
+{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+A cluster is a multi-clsuter when there is more than one instance. \par
+}}
+{\xe \v thingClusters\:NanoBrain.Cluster}
+{\xe \v NanoBrain.Cluster\:thingClusters}
+\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid {
+{\b
+Dictionary NanoBrain.Cluster.thingClusters = new()}}
+\par
+{\bkmkstart AAAAAAAABQ}
+{\bkmkend AAAAAAAABQ}
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid
+\par
+{
+{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+The mapping from things to cluster instances. }}\par
+{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+In a multi-cluster each instance can be used for a thing. Cluster instance may also not (yet) be mapped to a thing. \par
+}}
+{\xe \v _outputs\:NanoBrain.Cluster}
+{\xe \v NanoBrain.Cluster\:_outputs}
+\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid {
+{\b
+List<{\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAJ" }{}}{\fldrslt {\cs37\ul\cf2 Neuron}}}
+> NanoBrain.Cluster._outputs = null{\f2 [protected]}}}
+\par
+{\bkmkstart AAAAAAAABS}
+{\bkmkend AAAAAAAABS}
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid
+\par
+{
+{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+The neurons without outgoing connections. }}\par
+{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+These neurons can potentially be connected to neurons in other clusters \par
+}}
+{\xe \v parent\:NanoBrain.Cluster}
+{\xe \v NanoBrain.Cluster\:parent}
+\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid {
+{\b
+{\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAG" }{}}{\fldrslt {\cs37\ul\cf2 Cluster}}}
+ NanoBrain.Nucleus.parent{\f2 [inherited]}}}
+\par
+{\bkmkstart AAAAAAAAAS}
+{\bkmkend AAAAAAAAAS}
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid
+\par
+{
+{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+The cluster prefab in which the nucleus is located. }}\par
+{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+The cluster instance in which the nucleus is located \par
+}}
+{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par}
+\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid
+Property Documentation\par
+\pard\plain
+{\xe \v outputs\:NanoBrain.Cluster}
+{\xe \v NanoBrain.Cluster\:outputs}
+\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid {
+{\b
+List<{\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAJ" }{}}{\fldrslt {\cs37\ul\cf2 Neuron}}}
+> NanoBrain.Cluster.outputs{\f2 [get]}}}
+\par
+{\bkmkstart AAAAAAAABW}
+{\bkmkend AAAAAAAABW}
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid
+\par
+{
+{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+The neurons without outgoing connections. }}\par
+{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+These neurons can potentially be connected to neurons in other clusters \par
+}}
+{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par}
+The documentation for this class was generated from the following file:{\par
+\pard\plain \s121\fi-360\li720\widctlpar\jclisttab\tx720{\*\pn \pnlvlbody\ilvl0\ls2\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Cluster.cs\par
+}\par \pard\plain
+
+\pard\plain \sect\sbkpage
+\s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid
+\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid
+NanoBrain.ClusterPrefab Class Reference\par \pard\plain
+{\tc\tcl2 \v NanoBrain.ClusterPrefab}
+{\xe \v NanoBrain.ClusterPrefab}
+{\bkmkstart AAAAAAAAAH}
+{\bkmkend AAAAAAAAAH}
+{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par}
+\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid
+Description\par
+\pard\plain
+{
+\pard\plain \s17\sa60\sb30\widctlpar\qj \fs22\cgrid {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+The Unity ScriptableObject to implement re-usable Cluster Prefabs. \par
+}}
+\par
+{
+Inherits ScriptableObject.}\par
+\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid
+Public Member Functions\par
+\pard\plain
+
+{
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+{\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAK" }{}}{\fldrslt {\cs37\ul\cf2 Nucleus}}}
+ {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAABY" }{}}{\fldrslt {\cs37\ul\cf2 GetNucleus}}}
+ (string nucleusName)\par
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+Retrieve a nucleus in this cluster. }{
+}\par
+}\par}
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+void {\b EnsureInitialization} (){\bkmkstart AAAAAAAABZ}
+{\bkmkend AAAAAAAABZ}
+\par
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+void {\b GarbageCollection} (){\bkmkstart AAAAAAAACA}
+{\bkmkend AAAAAAAACA}
+\par
+}
+\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid
+Public Attributes\par
+\pard\plain
+
+{
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+{\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAG" }{}}{\fldrslt {\cs37\ul\cf2 Cluster}}}
+ {\b cluster}{\bkmkstart AAAAAAAACB}
+{\bkmkend AAAAAAAACB}
+\par
+}
+{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par}
+\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid
+Member Function Documentation\par
+\pard\plain
+{\xe \v GetNucleus\:NanoBrain.ClusterPrefab}
+{\xe \v NanoBrain.ClusterPrefab\:GetNucleus}
+\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid {
+{\b
+{\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAK" }{}}{\fldrslt {\cs37\ul\cf2 Nucleus}}}
+ NanoBrain.ClusterPrefab.GetNucleus (string {\i nucleusName})}}
+\par
+{\bkmkstart AAAAAAAABY}
+{\bkmkend AAAAAAAABY}
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid
+\par
+{
+{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+Retrieve a nucleus in this cluster. }}\par
+{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+{\par
+{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid
+Parameters\par}
+\pard\plain \s81\li360\widctlpar\ql\adjustright \fs20\cgrid \trowd \trgaph108\trleft426\tblind426\trbrdrt\brdrs\brdrw10\brdrcf15 \trbrdrl\brdrs\brdrw10\brdrcf15 \trbrdrb\brdrs\brdrw10\brdrcf15 \trbrdrr\brdrs\brdrw10\brdrcf15 \trbrdrh\brdrs\brdrw10\brdrcf15 \trbrdrv\brdrs\brdrw10\brdrcf15
+\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx2187
+\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx8748
+\pard \widctlpar\intbl\adjustright
+{{\i nucleusName} \cell }{The name of the nucleus\cell }
+{\row }
+}
+{{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid
+Returns\par}\pard\plain \s82\li720\widctlpar\ql\adjustright \fs20\cgrid {\s17 \sa60 \sb30
+The Nucleus with the given name or null if no such Nucleus could be found\par
+}}}}
+{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par}
+The documentation for this class was generated from the following file:{\par
+\pard\plain \s121\fi-360\li720\widctlpar\jclisttab\tx720{\*\pn \pnlvlbody\ilvl0\ls2\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/ScriptableObjects/ClusterPrefab.cs\par
+}\par \pard\plain
+
+\pard\plain \sect\sbkpage
+\s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid
+\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid
+NanoBrain.MemoryCell Class Reference\par \pard\plain
+{\tc\tcl2 \v NanoBrain.MemoryCell}
+{\xe \v NanoBrain.MemoryCell}
+{\bkmkstart AAAAAAAAAI}
+{\bkmkend AAAAAAAAAI}
+{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par}
+\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid
+Description\par
+\pard\plain
+{
+\pard\plain \s17\sa60\sb30\widctlpar\qj \fs22\cgrid {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+A MemoryCell stored its value for one update. \par
+}
+
+{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+When the input for a Memory Cell changes, it will output the previous value \par
+ \par
+}}
+Inheritance diagram for NanoBrain.MemoryCell:{
+\pard\plain
+\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "class_nano_brain_1_1_memory_cell.png" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par
+}
+\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid
+Public Types\par
+\pard\plain
+
+{
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+enum {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAACC" }{}}{\fldrslt {\cs37\ul\cf2 CombinatorType}}}
+ \{ {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAACD" }{}}{\fldrslt {\cs37\ul\cf2 Sum}}}
+
+, {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAACE" }{}}{\fldrslt {\cs37\ul\cf2 Product}}}
+
+ \}\par
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+The type of combinators. }}\par}
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+enum {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAACF" }{}}{\fldrslt {\cs37\ul\cf2 ActivationType}}}
+ \{ {\b Linear}
+, {\b Power}
+, {\b Sqrt}
+, {\b Reciprocal}
+, {\b Tanh}
+, {\b Binary}
+, {\b Normalized}
+, {\b Custom}
+ \}{\bkmkstart AAAAAAAACF}
+{\bkmkend AAAAAAAACF}
+\par
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+The type of. }}\par}
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+enum {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAP" }{}}{\fldrslt {\cs37\ul\cf2 Type}}}
+ \{ {\b None}
+, {\b Neuron}
+, {\b MemoryCell}
+, {\b Cluster}
+ \}\par
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+Function to clone a nucleus to a Cluster prefab. }}\par}
+}
+\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid
+Public Member Functions\par
+\pard\plain
+
+{
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+{\b MemoryCell} ({\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAG" }{}}{\fldrslt {\cs37\ul\cf2 Cluster}}}
+ {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAS" }{}}{\fldrslt {\cs37\ul\cf2 parent}}}
+, string {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAABR" }{}}{\fldrslt {\cs37\ul\cf2 name}}}
+){\bkmkstart AAAAAAAACG}
+{\bkmkend AAAAAAAACG}
+\par
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+override {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAK" }{}}{\fldrslt {\cs37\ul\cf2 Nucleus}}}
+ {\b ShallowCloneTo} ({\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAG" }{}}{\fldrslt {\cs37\ul\cf2 Cluster}}}
+ newParent){\bkmkstart AAAAAAAACH}
+{\bkmkend AAAAAAAACH}
+\par
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+override void {\b UpdateStateIsolated} (){\bkmkstart AAAAAAAACI}
+{\bkmkend AAAAAAAACI}
+\par
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+override void {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAABX" }{}}{\fldrslt {\cs37\ul\cf2 UpdateNuclei}}}
+ ()\par
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+Update the state and recursively all Nuclei receiving data from this Nucleus. }{
+}\par
+}\par}
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+{\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAL" }{}}{\fldrslt {\cs37\ul\cf2 Synapse}}}
+ {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAACJ" }{}}{\fldrslt {\cs37\ul\cf2 AddSynapse}}}
+ ({\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAJ" }{}}{\fldrslt {\cs37\ul\cf2 Neuron}}}
+ sendingNucleus, float weight=1)\par
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+Add a new synapse to this nuclues. }{
+}\par
+}\par}
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+{\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAL" }{}}{\fldrslt {\cs37\ul\cf2 Synapse}}}
+ {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAACK" }{}}{\fldrslt {\cs37\ul\cf2 GetSynapse}}}
+ ({\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAK" }{}}{\fldrslt {\cs37\ul\cf2 Nucleus}}}
+ sender)\par
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+Find a synapse. }{
+}\par
+}\par}
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+void {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAACL" }{}}{\fldrslt {\cs37\ul\cf2 RemoveSynapse}}}
+ ({\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAK" }{}}{\fldrslt {\cs37\ul\cf2 Nucleus}}}
+ sendingNucleus)\par
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+Remove a synapse from a Nucleus. }{
+}\par
+}\par}
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+virtual void {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAACM" }{}}{\fldrslt {\cs37\ul\cf2 SetBias}}}
+ (Vector3 inputValue)\par
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+Set the bias, recalculate the output and update all Nuclei receiving from this Nucleus. }{
+}\par
+}\par}
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+AnimationCurve {\b GenerateCurve} (){\bkmkstart AAAAAAAACN}
+{\bkmkend AAAAAAAACN}
+\par
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+void {\b SleepCheck} (){\bkmkstart AAAAAAAACO}
+{\bkmkend AAAAAAAACO}
+\par
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+float3 {\b CombinatorSum} (){\bkmkstart AAAAAAAACP}
+{\bkmkend AAAAAAAACP}
+\par
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+Vector3 {\b CombinatorSum} (){\bkmkstart AAAAAAAACQ}
+{\bkmkend AAAAAAAACQ}
+\par
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+float3 {\b CombinatorProduct} (){\bkmkstart AAAAAAAACR}
+{\bkmkend AAAAAAAACR}
+\par
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+Vector3 {\b CombinatorProduct} (){\bkmkstart AAAAAAAACS}
+{\bkmkend AAAAAAAACS}
+\par
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+Vector3 {\b CombinatorMax} (){\bkmkstart AAAAAAAACT}
+{\bkmkend AAAAAAAACT}
+\par
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+virtual void {\b AddReceiver} ({\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAK" }{}}{\fldrslt {\cs37\ul\cf2 Nucleus}}}
+ receiverToAdd, float weight=1){\bkmkstart AAAAAAAACU}
+{\bkmkend AAAAAAAACU}
+\par
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+virtual void {\b RemoveReceiver} ({\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAK" }{}}{\fldrslt {\cs37\ul\cf2 Nucleus}}}
+ receiverToRemove){\bkmkstart AAAAAAAACV}
+{\bkmkend AAAAAAAACV}
+\par
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+virtual void {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAACW" }{}}{\fldrslt {\cs37\ul\cf2 ProcessStimulus}}}
+ (Vector3 inputValue)\par
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+Process an external stimulus. }{
+}\par
+}\par}
+}
+\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid
+Static Public Member Functions\par
+\pard\plain
+
+{
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+static void {\b Delete} ({\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAK" }{}}{\fldrslt {\cs37\ul\cf2 Nucleus}}}
+ nucleus){\bkmkstart AAAAAAAACX}
+{\bkmkend AAAAAAAACX}
+\par
+}
+\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid
+Public Attributes\par
+\pard\plain
+
+{
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+bool {\b staticMemory} = false{\bkmkstart AAAAAAAACY}
+{\bkmkend AAAAAAAACY}
+\par
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+Vector3 {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAACZ" }{}}{\fldrslt {\cs37\ul\cf2 bias}}}
+ = Vector3.zero\par
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+Create a new Neuron in a Cluster Prefab. }{
+}\par
+}\par}
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+{\field {\*\fldinst { HYPERLINK \\l "AAAAAAAACC" }{}}{\fldrslt {\cs37\ul\cf2 CombinatorType}}}
+ {\b combinator} = {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAACD" }{}}{\fldrslt {\cs37\ul\cf2 CombinatorType.Sum}}}
+{\bkmkstart AAAAAAAADA}
+{\bkmkend AAAAAAAADA}
+\par
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+The type of combinator used for this Neuron. }{
+}\par
+}\par}
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+{\field {\*\fldinst { HYPERLINK \\l "AAAAAAAACF" }{}}{\fldrslt {\cs37\ul\cf2 ActivationType}}}
+ {\b _curvePreset}{\bkmkstart AAAAAAAADB}
+{\bkmkend AAAAAAAADB}
+\par
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+AnimationCurve {\b curve}{\bkmkstart AAAAAAAADC}
+{\bkmkend AAAAAAAADC}
+\par
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+float {\b curveMax} = 1.0f{\bkmkstart AAAAAAAADD}
+{\bkmkend AAAAAAAADD}
+\par
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+Action {\b WhenFiring}{\bkmkstart AAAAAAAADE}
+{\bkmkend AAAAAAAADE}
+\par
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+bool {\b persistOutput} = false{\bkmkstart AAAAAAAADF}
+{\bkmkend AAAAAAAADF}
+\par
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+float {\b lastUpdate} = 0{\bkmkstart AAAAAAAADG}
+{\bkmkend AAAAAAAADG}
+\par
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+Toggle for printing debugging trace data. }{
+}\par
+}\par}
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+readonly float {\b timeToSleep} = 1f{\bkmkstart AAAAAAAADH}
+{\bkmkend AAAAAAAADH}
+\par
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+string {\b name}{\bkmkstart AAAAAAAABR}
+{\bkmkend AAAAAAAABR}
+\par
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+The name of the Nucleus. }{
+}\par
+}\par}
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+{\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAG" }{}}{\fldrslt {\cs37\ul\cf2 Cluster}}}
+ {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAS" }{}}{\fldrslt {\cs37\ul\cf2 parent}}}
+\par
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+The cluster prefab in which the nucleus is located. }{
+}\par
+}\par}
+}
+\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid
+Protected Member Functions\par
+\pard\plain
+
+{
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+virtual void {\b CloneFields} ({\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAJ" }{}}{\fldrslt {\cs37\ul\cf2 Neuron}}}
+ clone){\bkmkstart AAAAAAAADI}
+{\bkmkend AAAAAAAADI}
+\par
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+void {\b CheckSleepingSynapses} (){\bkmkstart AAAAAAAADJ}
+{\bkmkend AAAAAAAADJ}
+\par
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+float3 {\b ActivatorLinear} (float3 input){\bkmkstart AAAAAAAADK}
+{\bkmkend AAAAAAAADK}
+\par
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+Vector3 {\b ActivatorLinear} (Vector3 input){\bkmkstart AAAAAAAADL}
+{\bkmkend AAAAAAAADL}
+\par
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+float3 {\b ActivatorSqrt} (float3 input){\bkmkstart AAAAAAAADM}
+{\bkmkend AAAAAAAADM}
+\par
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+Vector3 {\b ActivatorSqrt} (Vector3 input){\bkmkstart AAAAAAAADN}
+{\bkmkend AAAAAAAADN}
+\par
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+float3 {\b ActivatorPower} (float3 input){\bkmkstart AAAAAAAADO}
+{\bkmkend AAAAAAAADO}
+\par
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+Vector3 {\b ActivatorPower} (Vector3 input){\bkmkstart AAAAAAAADP}
+{\bkmkend AAAAAAAADP}
+\par
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+float3 {\b ActivatorReciprocal} (float3 input){\bkmkstart AAAAAAAADQ}
+{\bkmkend AAAAAAAADQ}
+\par
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+Vector3 {\b ActivatorReciprocal} (Vector3 input){\bkmkstart AAAAAAAADR}
+{\bkmkend AAAAAAAADR}
+\par
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+float3 {\b ActivatorTanh} (float3 input){\bkmkstart AAAAAAAADS}
+{\bkmkend AAAAAAAADS}
+\par
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+float3 {\b ActivatorBinary} (float3 input){\bkmkstart AAAAAAAADT}
+{\bkmkend AAAAAAAADT}
+\par
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+float3 {\b ActivatorNormalized} (float3 input){\bkmkstart AAAAAAAADU}
+{\bkmkend AAAAAAAADU}
+\par
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+float3 {\b ActivatorCustom} (float3 input){\bkmkstart AAAAAAAADV}
+{\bkmkend AAAAAAAADV}
+\par
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+Vector3 {\b ActivatorCustom} (Vector3 input){\bkmkstart AAAAAAAADW}
+{\bkmkend AAAAAAAADW}
+\par
+}
+\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid
+Protected Attributes\par
+\pard\plain
+
+{
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+float3 {\b _outputValue}{\bkmkstart AAAAAAAADX}
+{\bkmkend AAAAAAAADX}
+\par
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+Vector3 {\b _outputValue}{\bkmkstart AAAAAAAADY}
+{\bkmkend AAAAAAAADY}
+\par
+}
+\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid
+Properties\par
+\pard\plain
+
+{
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+override bool {\b isSleeping}{\f2 [get]}{\bkmkstart AAAAAAAADZ}
+{\bkmkend AAAAAAAADZ}
+\par
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+List< {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAL" }{}}{\fldrslt {\cs37\ul\cf2 Synapse}}}
+ > {\b synapses}{\f2 [get]}{\bkmkstart AAAAAAAAEA}
+{\bkmkend AAAAAAAAEA}
+\par
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+The synapses of the nucleus. }{
+}\par
+}\par}
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+{\field {\*\fldinst { HYPERLINK \\l "AAAAAAAACF" }{}}{\fldrslt {\cs37\ul\cf2 ActivationType}}}
+ {\b curvePreset}{\f2 [get, set]}{\bkmkstart AAAAAAAAEB}
+{\bkmkend AAAAAAAAEB}
+\par
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+virtual float3 {\b outputValue}{\f2 [get, set]}{\bkmkstart AAAAAAAAEC}
+{\bkmkend AAAAAAAAEC}
+\par
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+virtual Vector3 {\b outputValue}{\f2 [get, set]}{\bkmkstart AAAAAAAAED}
+{\bkmkend AAAAAAAAED}
+\par
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+float {\b outputMagnitude}{\f2 [get]}{\bkmkstart AAAAAAAAEE}
+{\bkmkend AAAAAAAAEE}
+\par
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+float {\b outputSqrMagnitude}{\f2 [get]}{\bkmkstart AAAAAAAAEF}
+{\bkmkend AAAAAAAAEF}
+\par
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+bool {\b isFiring}{\f2 [get]}{\bkmkstart AAAAAAAAEG}
+{\bkmkend AAAAAAAAEG}
+\par
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+Func< float3 > {\b Combinator}{\f2 [get]}{\bkmkstart AAAAAAAAEH}
+{\bkmkend AAAAAAAAEH}
+\par
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+Func< Vector3 > {\b Combinator}{\f2 [get]}{\bkmkstart AAAAAAAAEI}
+{\bkmkend AAAAAAAAEI}
+\par
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+Func< float3, float3 > {\b Activator}{\f2 [get]}{\bkmkstart AAAAAAAAEJ}
+{\bkmkend AAAAAAAAEJ}
+\par
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+Func< Vector3, Vector3 > {\b Activator}{\f2 [get]}{\bkmkstart AAAAAAAAEK}
+{\bkmkend AAAAAAAAEK}
+\par
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+virtual List< {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAK" }{}}{\fldrslt {\cs37\ul\cf2 Nucleus}}}
+ > {\b receivers}{\f2 [get, set]}{\bkmkstart AAAAAAAAEL}
+{\bkmkend AAAAAAAAEL}
+\par
+}
+{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par}
+\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid
+Member Enumeration Documentation\par
+\pard\plain
+{\xe \v CombinatorType\:NanoBrain.MemoryCell}
+{\xe \v NanoBrain.MemoryCell\:CombinatorType}
+\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid {
+{\b
+enum {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAACC" }{}}{\fldrslt {\cs37\ul\cf2 NanoBrain.Neuron.CombinatorType}}}
+{\f2 [inherited]}}}
+\par
+{\bkmkstart AAAAAAAACC}
+{\bkmkend AAAAAAAACC}
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid
+\par
+{
+{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+The type of combinators. }}\par
+{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+A combinator combines the weighted values of the synapses to a single value \par
+}{\par
+{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid
+Enumerator:\par}
+\pard\plain \s81\li360\widctlpar\ql\adjustright \fs20\cgrid \trowd \trgaph108\trleft426\tblind426\trbrdrt\brdrs\brdrw10\brdrcf15 \trbrdrl\brdrs\brdrw10\brdrcf15 \trbrdrb\brdrs\brdrw10\brdrcf15 \trbrdrr\brdrs\brdrw10\brdrcf15 \trbrdrh\brdrs\brdrw10\brdrcf15 \trbrdrv\brdrs\brdrw10\brdrcf15
+\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx2187
+\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx8748
+\pard \widctlpar\intbl\adjustright
+{\xe \v Sum\:NanoBrain.MemoryCell}
+{\xe \v NanoBrain.MemoryCell\:Sum}
+{\qr Sum{\bkmkstart AAAAAAAACD}
+{\bkmkend AAAAAAAACD}
+\cell }{{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+Add the weighted values together. \par
+}\cell }{\row }
+{\xe \v Product\:NanoBrain.MemoryCell}
+{\xe \v NanoBrain.MemoryCell\:Product}
+{\qr Product{\bkmkstart AAAAAAAACE}
+{\bkmkend AAAAAAAACE}
+\cell }{{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+Multiply the weighted values. \par
+}\cell }{\row }
+}
+}
+{\xe \v Type\:NanoBrain.MemoryCell}
+{\xe \v NanoBrain.MemoryCell\:Type}
+\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid {
+{\b
+enum {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAP" }{}}{\fldrslt {\cs37\ul\cf2 NanoBrain.Nucleus.Type}}}
+{\f2 [inherited]}}}
+\par
+{\bkmkstart AAAAAAAAAP}
+{\bkmkend AAAAAAAAAP}
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid
+\par
+{
+{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+Function to clone a nucleus to a Cluster prefab. }}\par
+{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+{\par
+{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid
+Parameters\par}
+\pard\plain \s81\li360\widctlpar\ql\adjustright \fs20\cgrid \trowd \trgaph108\trleft426\tblind426\trbrdrt\brdrs\brdrw10\brdrcf15 \trbrdrl\brdrs\brdrw10\brdrcf15 \trbrdrb\brdrs\brdrw10\brdrcf15 \trbrdrr\brdrs\brdrw10\brdrcf15 \trbrdrh\brdrs\brdrw10\brdrcf15 \trbrdrv\brdrs\brdrw10\brdrcf15
+\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx2187
+\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx8748
+\pard \widctlpar\intbl\adjustright
+{{\i prefab} \cell }{\cell }
+{\row }
+}
+{{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid
+Returns\par}\pard\plain \s82\li720\widctlpar\ql\adjustright \fs20\cgrid {\s17 \sa60 \sb30
+\par
+}}The types of Nucleus \par
+}}
+{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par}
+\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid
+Member Function Documentation\par
+\pard\plain
+{\xe \v UpdateNuclei\:NanoBrain.MemoryCell}
+{\xe \v NanoBrain.MemoryCell\:UpdateNuclei}
+\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid {
+{\b
+override void NanoBrain.MemoryCell.UpdateNuclei (){\f2 [virtual]}}}
+\par
+{\bkmkstart AAAAAAAABX}
+{\bkmkend AAAAAAAABX}
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid
+\par
+{
+{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+Update the state and recursively all Nuclei receiving data from this Nucleus. }}\par
+{
+Reimplemented from {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAABK" }{}}{\fldrslt {\cs37\ul\cf2 NanoBrain.Nucleus}}}
+.}\par
+}
+{\xe \v AddSynapse\:NanoBrain.MemoryCell}
+{\xe \v NanoBrain.MemoryCell\:AddSynapse}
+\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid {
+{\b
+{\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAL" }{}}{\fldrslt {\cs37\ul\cf2 Synapse}}}
+ NanoBrain.Neuron.AddSynapse ({\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAJ" }{}}{\fldrslt {\cs37\ul\cf2 Neuron}}}
+ {\i sendingNucleus}, float {\i weight} = {\f2 1}){\f2 [inherited]}}}
+\par
+{\bkmkstart AAAAAAAACJ}
+{\bkmkend AAAAAAAACJ}
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid
+\par
+{
+{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+Add a new synapse to this nuclues. }}\par
+{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+{\par
+{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid
+Parameters\par}
+\pard\plain \s81\li360\widctlpar\ql\adjustright \fs20\cgrid \trowd \trgaph108\trleft426\tblind426\trbrdrt\brdrs\brdrw10\brdrcf15 \trbrdrl\brdrs\brdrw10\brdrcf15 \trbrdrb\brdrs\brdrw10\brdrcf15 \trbrdrr\brdrs\brdrw10\brdrcf15 \trbrdrh\brdrs\brdrw10\brdrcf15 \trbrdrv\brdrs\brdrw10\brdrcf15
+\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx2187
+\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx8748
+\pard \widctlpar\intbl\adjustright
+{{\i sendingNucleus} \cell }{The nucleus from which the signals may originate\cell }
+{\row }
+\trowd \trgaph108\trleft426\tblind426\trbrdrt\brdrs\brdrw10\brdrcf15 \trbrdrl\brdrs\brdrw10\brdrcf15 \trbrdrb\brdrs\brdrw10\brdrcf15 \trbrdrr\brdrs\brdrw10\brdrcf15 \trbrdrh\brdrs\brdrw10\brdrcf15 \trbrdrv\brdrs\brdrw10\brdrcf15
+\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx2187
+\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx8748
+\pard \widctlpar\intbl\adjustright
+{{\i weight} \cell }{The weight applied to the input. Default value = 1\cell }
+{\row }
+}
+{{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid
+Returns\par}\pard\plain \s82\li720\widctlpar\ql\adjustright \fs20\cgrid {\s17 \sa60 \sb30
+The created Synapse\par
+}}This will add a new input to this nucleus with the given weight. \par
+}}
+{\xe \v GetSynapse\:NanoBrain.MemoryCell}
+{\xe \v NanoBrain.MemoryCell\:GetSynapse}
+\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid {
+{\b
+{\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAL" }{}}{\fldrslt {\cs37\ul\cf2 Synapse}}}
+ NanoBrain.Neuron.GetSynapse ({\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAK" }{}}{\fldrslt {\cs37\ul\cf2 Nucleus}}}
+ {\i sender}){\f2 [inherited]}}}
+\par
+{\bkmkstart AAAAAAAACK}
+{\bkmkend AAAAAAAACK}
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid
+\par
+{
+{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+Find a synapse. }}\par
+{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+{\par
+{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid
+Parameters\par}
+\pard\plain \s81\li360\widctlpar\ql\adjustright \fs20\cgrid \trowd \trgaph108\trleft426\tblind426\trbrdrt\brdrs\brdrw10\brdrcf15 \trbrdrl\brdrs\brdrw10\brdrcf15 \trbrdrb\brdrs\brdrw10\brdrcf15 \trbrdrr\brdrs\brdrw10\brdrcf15 \trbrdrh\brdrs\brdrw10\brdrcf15 \trbrdrv\brdrs\brdrw10\brdrcf15
+\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx2187
+\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx8748
+\pard \widctlpar\intbl\adjustright
+{{\i sender} \cell }{The sender of the input to the Synapse\cell }
+{\row }
+}
+{{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid
+Returns\par}\pard\plain \s82\li720\widctlpar\ql\adjustright \fs20\cgrid {\s17 \sa60 \sb30
+The found Synapse or null when the sender has no synapse to this nucleus.\par
+}}}}
+{\xe \v RemoveSynapse\:NanoBrain.MemoryCell}
+{\xe \v NanoBrain.MemoryCell\:RemoveSynapse}
+\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid {
+{\b
+void NanoBrain.Neuron.RemoveSynapse ({\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAK" }{}}{\fldrslt {\cs37\ul\cf2 Nucleus}}}
+ {\i sendingNucleus}){\f2 [inherited]}}}
+\par
+{\bkmkstart AAAAAAAACL}
+{\bkmkend AAAAAAAACL}
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid
+\par
+{
+{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+Remove a synapse from a Nucleus. }}\par
+{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+{\par
+{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid
+Parameters\par}
+\pard\plain \s81\li360\widctlpar\ql\adjustright \fs20\cgrid \trowd \trgaph108\trleft426\tblind426\trbrdrt\brdrs\brdrw10\brdrcf15 \trbrdrl\brdrs\brdrw10\brdrcf15 \trbrdrb\brdrs\brdrw10\brdrcf15 \trbrdrr\brdrs\brdrw10\brdrcf15 \trbrdrh\brdrs\brdrw10\brdrcf15 \trbrdrv\brdrs\brdrw10\brdrcf15
+\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx2187
+\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx8748
+\pard \widctlpar\intbl\adjustright
+{{\i sendingNucleus} \cell }{Remote the synapse connecting to this Nucleus\cell }
+{\row }
+}
+}}
+{\xe \v SetBias\:NanoBrain.MemoryCell}
+{\xe \v NanoBrain.MemoryCell\:SetBias}
+\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid {
+{\b
+virtual void NanoBrain.Neuron.SetBias (Vector3 {\i inputValue}){\f2 [virtual]}, {\f2 [inherited]}}}
+\par
+{\bkmkstart AAAAAAAACM}
+{\bkmkend AAAAAAAACM}
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid
+\par
+{
+{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+Set the bias, recalculate the output and update all Nuclei receiving from this Nucleus. }}\par
+{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+{\par
+{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid
+Parameters\par}
+\pard\plain \s81\li360\widctlpar\ql\adjustright \fs20\cgrid \trowd \trgaph108\trleft426\tblind426\trbrdrt\brdrs\brdrw10\brdrcf15 \trbrdrl\brdrs\brdrw10\brdrcf15 \trbrdrb\brdrs\brdrw10\brdrcf15 \trbrdrr\brdrs\brdrw10\brdrcf15 \trbrdrh\brdrs\brdrw10\brdrcf15 \trbrdrv\brdrs\brdrw10\brdrcf15
+\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx2187
+\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx8748
+\pard \widctlpar\intbl\adjustright
+{{\i inputValue} \cell }{\cell }
+{\row }
+}
+}}
+{\xe \v ProcessStimulus\:NanoBrain.MemoryCell}
+{\xe \v NanoBrain.MemoryCell\:ProcessStimulus}
+\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid {
+{\b
+virtual void NanoBrain.Neuron.ProcessStimulus (Vector3 {\i inputValue}){\f2 [virtual]}, {\f2 [inherited]}}}
+\par
+{\bkmkstart AAAAAAAACW}
+{\bkmkend AAAAAAAACW}
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid
+\par
+{
+{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+Process an external stimulus. }}\par
+{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+{\par
+{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid
+Parameters\par}
+\pard\plain \s81\li360\widctlpar\ql\adjustright \fs20\cgrid \trowd \trgaph108\trleft426\tblind426\trbrdrt\brdrs\brdrw10\brdrcf15 \trbrdrl\brdrs\brdrw10\brdrcf15 \trbrdrb\brdrs\brdrw10\brdrcf15 \trbrdrr\brdrs\brdrw10\brdrcf15 \trbrdrh\brdrs\brdrw10\brdrcf15 \trbrdrv\brdrs\brdrw10\brdrcf15
+\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx2187
+\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx8748
+\pard \widctlpar\intbl\adjustright
+{{\i inputValue} \cell }{The value of the stimulus\cell }
+{\row }
+\trowd \trgaph108\trleft426\tblind426\trbrdrt\brdrs\brdrw10\brdrcf15 \trbrdrl\brdrs\brdrw10\brdrcf15 \trbrdrb\brdrs\brdrw10\brdrcf15 \trbrdrr\brdrs\brdrw10\brdrcf15 \trbrdrh\brdrs\brdrw10\brdrcf15 \trbrdrv\brdrs\brdrw10\brdrcf15
+\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx2187
+\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx8748
+\pard \widctlpar\intbl\adjustright
+{{\i thingId} \cell }{The id of the thing causing the stimulus\cell }
+{\row }
+\trowd \trgaph108\trleft426\tblind426\trbrdrt\brdrs\brdrw10\brdrcf15 \trbrdrl\brdrs\brdrw10\brdrcf15 \trbrdrb\brdrs\brdrw10\brdrcf15 \trbrdrr\brdrs\brdrw10\brdrcf15 \trbrdrh\brdrs\brdrw10\brdrcf15 \trbrdrv\brdrs\brdrw10\brdrcf15
+\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx2187
+\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx8748
+\pard \widctlpar\intbl\adjustright
+{{\i thingName} \cell }{The name of the thing causing the stimulus\cell }
+{\row }
+}
+}}
+{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par}
+\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid
+Member Data Documentation\par
+\pard\plain
+{\xe \v bias\:NanoBrain.MemoryCell}
+{\xe \v NanoBrain.MemoryCell\:bias}
+\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid {
+{\b
+Vector3 NanoBrain.Neuron.bias = Vector3.zero{\f2 [inherited]}}}
+\par
+{\bkmkstart AAAAAAAACZ}
+{\bkmkend AAAAAAAACZ}
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid
+\par
+{
+{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+Create a new Neuron in a Cluster Prefab. }}\par
+{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+{\par
+{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid
+Parameters\par}
+\pard\plain \s81\li360\widctlpar\ql\adjustright \fs20\cgrid \trowd \trgaph108\trleft426\tblind426\trbrdrt\brdrs\brdrw10\brdrcf15 \trbrdrl\brdrs\brdrw10\brdrcf15 \trbrdrb\brdrs\brdrw10\brdrcf15 \trbrdrr\brdrs\brdrw10\brdrcf15 \trbrdrh\brdrs\brdrw10\brdrcf15 \trbrdrv\brdrs\brdrw10\brdrcf15
+\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx2187
+\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx8748
+\pard \widctlpar\intbl\adjustright
+{{\i prefab} \cell }{The Cluster Preafb in which the new Neuron should be created\cell }
+{\row }
+\trowd \trgaph108\trleft426\tblind426\trbrdrt\brdrs\brdrw10\brdrcf15 \trbrdrl\brdrs\brdrw10\brdrcf15 \trbrdrb\brdrs\brdrw10\brdrcf15 \trbrdrr\brdrs\brdrw10\brdrcf15 \trbrdrh\brdrs\brdrw10\brdrcf15 \trbrdrv\brdrs\brdrw10\brdrcf15
+\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx2187
+\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx8748
+\pard \widctlpar\intbl\adjustright
+{{\i name} \cell }{The name of the new Neuron\cell }
+{\row }
+}
+The bias\par
+The bias which a value which is always added to the combined value of the neuron It does not have a synapse and therefore no weight of source nucleus \par
+}}
+{\xe \v parent\:NanoBrain.MemoryCell}
+{\xe \v NanoBrain.MemoryCell\:parent}
+\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid {
+{\b
+{\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAG" }{}}{\fldrslt {\cs37\ul\cf2 Cluster}}}
+ NanoBrain.Nucleus.parent{\f2 [inherited]}}}
+\par
+{\bkmkstart AAAAAAAAAS}
+{\bkmkend AAAAAAAAAS}
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid
+\par
+{
+{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+The cluster prefab in which the nucleus is located. }}\par
+{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+The cluster instance in which the nucleus is located \par
+}}
+{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par}
+The documentation for this class was generated from the following file:{\par
+\pard\plain \s121\fi-360\li720\widctlpar\jclisttab\tx720{\*\pn \pnlvlbody\ilvl0\ls2\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/MemoryCell.cs\par
+}\par \pard\plain
+
+\pard\plain \sect\sbkpage
+\s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid
+\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid
+NanoBrain.Neuron Class Reference\par \pard\plain
+{\tc\tcl2 \v NanoBrain.Neuron}
+{\xe \v NanoBrain.Neuron}
+{\bkmkstart AAAAAAAAAJ}
+{\bkmkend AAAAAAAAAJ}
+{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par}
+\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid
+Description\par
+\pard\plain
+{
+\pard\plain \s17\sa60\sb30\widctlpar\qj \fs22\cgrid {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+A neuron is a basic Nucleus. \par
+}}
+Inheritance diagram for NanoBrain.Neuron:{
+\pard\plain
+\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "class_nano_brain_1_1_neuron.png" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par
+}
+\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid
+Public Types\par
+\pard\plain
+
+{
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+enum {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAACC" }{}}{\fldrslt {\cs37\ul\cf2 CombinatorType}}}
+ \{ {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAACD" }{}}{\fldrslt {\cs37\ul\cf2 Sum}}}
+
+, {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAACE" }{}}{\fldrslt {\cs37\ul\cf2 Product}}}
+
+ \}\par
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+The type of combinators. }}\par}
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+enum {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAACF" }{}}{\fldrslt {\cs37\ul\cf2 ActivationType}}}
+ \{ {\b Linear}
+, {\b Power}
+, {\b Sqrt}
+, {\b Reciprocal}
+, {\b Tanh}
+, {\b Binary}
+, {\b Normalized}
+, {\b Custom}
+ \}{\bkmkstart AAAAAAAACF}
+{\bkmkend AAAAAAAACF}
+\par
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+The type of. }}\par}
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+enum {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAP" }{}}{\fldrslt {\cs37\ul\cf2 Type}}}
+ \{ {\b None}
+, {\b Neuron}
+, {\b MemoryCell}
+, {\b Cluster}
+ \}\par
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+Function to clone a nucleus to a Cluster prefab. }}\par}
+}
+\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid
+Public Member Functions\par
+\pard\plain
+
+{
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+{\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAEM" }{}}{\fldrslt {\cs37\ul\cf2 Neuron}}}
+ ({\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAG" }{}}{\fldrslt {\cs37\ul\cf2 Cluster}}}
+ {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAS" }{}}{\fldrslt {\cs37\ul\cf2 parent}}}
+, string {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAABR" }{}}{\fldrslt {\cs37\ul\cf2 name}}}
+)\par
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+Create a new Neuron in a Cluster instance. }{
+}\par
+}\par}
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+{\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAL" }{}}{\fldrslt {\cs37\ul\cf2 Synapse}}}
+ {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAACJ" }{}}{\fldrslt {\cs37\ul\cf2 AddSynapse}}}
+ ({\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAJ" }{}}{\fldrslt {\cs37\ul\cf2 Neuron}}}
+ sendingNucleus, float weight=1)\par
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+Add a new synapse to this nuclues. }{
+}\par
+}\par}
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+{\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAL" }{}}{\fldrslt {\cs37\ul\cf2 Synapse}}}
+ {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAACK" }{}}{\fldrslt {\cs37\ul\cf2 GetSynapse}}}
+ ({\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAK" }{}}{\fldrslt {\cs37\ul\cf2 Nucleus}}}
+ sender)\par
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+Find a synapse. }{
+}\par
+}\par}
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+void {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAACL" }{}}{\fldrslt {\cs37\ul\cf2 RemoveSynapse}}}
+ ({\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAK" }{}}{\fldrslt {\cs37\ul\cf2 Nucleus}}}
+ sendingNucleus)\par
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+Remove a synapse from a Nucleus. }{
+}\par
+}\par}
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+virtual void {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAACM" }{}}{\fldrslt {\cs37\ul\cf2 SetBias}}}
+ (Vector3 inputValue)\par
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+Set the bias, recalculate the output and update all Nuclei receiving from this Nucleus. }{
+}\par
+}\par}
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+AnimationCurve {\b GenerateCurve} (){\bkmkstart AAAAAAAACN}
+{\bkmkend AAAAAAAACN}
+\par
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+void {\b SleepCheck} (){\bkmkstart AAAAAAAACO}
+{\bkmkend AAAAAAAACO}
+\par
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+override {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAK" }{}}{\fldrslt {\cs37\ul\cf2 Nucleus}}}
+ {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAEN" }{}}{\fldrslt {\cs37\ul\cf2 ShallowCloneTo}}}
+ ({\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAG" }{}}{\fldrslt {\cs37\ul\cf2 Cluster}}}
+ newParent)\par
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+Toggle for printing debugging trace data. }{
+}\par
+}\par}
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+override void {\b UpdateStateIsolated} (){\bkmkstart AAAAAAAAEO}
+{\bkmkend AAAAAAAAEO}
+\par
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+float3 {\b CombinatorSum} (){\bkmkstart AAAAAAAACP}
+{\bkmkend AAAAAAAACP}
+\par
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+float3 {\b CombinatorProduct} (){\bkmkstart AAAAAAAACR}
+{\bkmkend AAAAAAAACR}
+\par
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+Vector3 {\b CombinatorSum} (){\bkmkstart AAAAAAAACQ}
+{\bkmkend AAAAAAAACQ}
+\par
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+Vector3 {\b CombinatorProduct} (){\bkmkstart AAAAAAAACS}
+{\bkmkend AAAAAAAACS}
+\par
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+Vector3 {\b CombinatorMax} (){\bkmkstart AAAAAAAACT}
+{\bkmkend AAAAAAAACT}
+\par
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+virtual void {\b AddReceiver} ({\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAK" }{}}{\fldrslt {\cs37\ul\cf2 Nucleus}}}
+ receiverToAdd, float weight=1){\bkmkstart AAAAAAAACU}
+{\bkmkend AAAAAAAACU}
+\par
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+virtual void {\b RemoveReceiver} ({\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAK" }{}}{\fldrslt {\cs37\ul\cf2 Nucleus}}}
+ receiverToRemove){\bkmkstart AAAAAAAACV}
+{\bkmkend AAAAAAAACV}
+\par
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+virtual void {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAACW" }{}}{\fldrslt {\cs37\ul\cf2 ProcessStimulus}}}
+ (Vector3 inputValue)\par
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+Process an external stimulus. }{
+}\par
+}\par}
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+virtual void {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAABK" }{}}{\fldrslt {\cs37\ul\cf2 UpdateNuclei}}}
+ ()\par
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+Update the state and recursively all Nuclei receiving data from this Nucleus. }{
+}\par
+}\par}
+}
+\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid
+Static Public Member Functions\par
+\pard\plain
+
+{
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+static void {\b Delete} ({\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAK" }{}}{\fldrslt {\cs37\ul\cf2 Nucleus}}}
+ nucleus){\bkmkstart AAAAAAAACX}
+{\bkmkend AAAAAAAACX}
+\par
+}
+\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid
+Public Attributes\par
+\pard\plain
+
+{
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+Vector3 {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAACZ" }{}}{\fldrslt {\cs37\ul\cf2 bias}}}
+ = Vector3.zero\par
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+Create a new Neuron in a Cluster Prefab. }{
+}\par
+}\par}
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+{\field {\*\fldinst { HYPERLINK \\l "AAAAAAAACC" }{}}{\fldrslt {\cs37\ul\cf2 CombinatorType}}}
+ {\b combinator} = {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAACD" }{}}{\fldrslt {\cs37\ul\cf2 CombinatorType.Sum}}}
+{\bkmkstart AAAAAAAADA}
+{\bkmkend AAAAAAAADA}
+\par
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+The type of combinator used for this Neuron. }{
+}\par
+}\par}
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+{\field {\*\fldinst { HYPERLINK \\l "AAAAAAAACF" }{}}{\fldrslt {\cs37\ul\cf2 ActivationType}}}
+ {\b _curvePreset}{\bkmkstart AAAAAAAADB}
+{\bkmkend AAAAAAAADB}
+\par
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+AnimationCurve {\b curve}{\bkmkstart AAAAAAAADC}
+{\bkmkend AAAAAAAADC}
+\par
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+float {\b curveMax} = 1.0f{\bkmkstart AAAAAAAADD}
+{\bkmkend AAAAAAAADD}
+\par
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+Action {\b WhenFiring}{\bkmkstart AAAAAAAADE}
+{\bkmkend AAAAAAAADE}
+\par
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+bool {\b persistOutput} = false{\bkmkstart AAAAAAAADF}
+{\bkmkend AAAAAAAADF}
+\par
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+float {\b lastUpdate} = 0{\bkmkstart AAAAAAAADG}
+{\bkmkend AAAAAAAADG}
+\par
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+Toggle for printing debugging trace data. }{
+}\par
+}\par}
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+readonly float {\b timeToSleep} = 1f{\bkmkstart AAAAAAAADH}
+{\bkmkend AAAAAAAADH}
+\par
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+string {\b name}{\bkmkstart AAAAAAAABR}
+{\bkmkend AAAAAAAABR}
+\par
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+The name of the Nucleus. }{
+}\par
+}\par}
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+{\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAG" }{}}{\fldrslt {\cs37\ul\cf2 Cluster}}}
+ {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAS" }{}}{\fldrslt {\cs37\ul\cf2 parent}}}
+\par
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+The cluster prefab in which the nucleus is located. }{
+}\par
+}\par}
+}
+\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid
+Protected Member Functions\par
+\pard\plain
+
+{
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+virtual void {\b CloneFields} ({\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAJ" }{}}{\fldrslt {\cs37\ul\cf2 Neuron}}}
+ clone){\bkmkstart AAAAAAAADI}
+{\bkmkend AAAAAAAADI}
+\par
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+void {\b CheckSleepingSynapses} (){\bkmkstart AAAAAAAADJ}
+{\bkmkend AAAAAAAADJ}
+\par
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+float3 {\b ActivatorLinear} (float3 input){\bkmkstart AAAAAAAADK}
+{\bkmkend AAAAAAAADK}
+\par
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+float3 {\b ActivatorSqrt} (float3 input){\bkmkstart AAAAAAAADM}
+{\bkmkend AAAAAAAADM}
+\par
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+float3 {\b ActivatorPower} (float3 input){\bkmkstart AAAAAAAADO}
+{\bkmkend AAAAAAAADO}
+\par
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+float3 {\b ActivatorReciprocal} (float3 input){\bkmkstart AAAAAAAADQ}
+{\bkmkend AAAAAAAADQ}
+\par
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+float3 {\b ActivatorTanh} (float3 input){\bkmkstart AAAAAAAADS}
+{\bkmkend AAAAAAAADS}
+\par
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+float3 {\b ActivatorBinary} (float3 input){\bkmkstart AAAAAAAADT}
+{\bkmkend AAAAAAAADT}
+\par
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+float3 {\b ActivatorNormalized} (float3 input){\bkmkstart AAAAAAAADU}
+{\bkmkend AAAAAAAADU}
+\par
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+float3 {\b ActivatorCustom} (float3 input){\bkmkstart AAAAAAAADV}
+{\bkmkend AAAAAAAADV}
+\par
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+Vector3 {\b ActivatorLinear} (Vector3 input){\bkmkstart AAAAAAAADL}
+{\bkmkend AAAAAAAADL}
+\par
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+Vector3 {\b ActivatorSqrt} (Vector3 input){\bkmkstart AAAAAAAADN}
+{\bkmkend AAAAAAAADN}
+\par
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+Vector3 {\b ActivatorPower} (Vector3 input){\bkmkstart AAAAAAAADP}
+{\bkmkend AAAAAAAADP}
+\par
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+Vector3 {\b ActivatorReciprocal} (Vector3 input){\bkmkstart AAAAAAAADR}
+{\bkmkend AAAAAAAADR}
+\par
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+Vector3 {\b ActivatorCustom} (Vector3 input){\bkmkstart AAAAAAAADW}
+{\bkmkend AAAAAAAADW}
+\par
+}
+\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid
+Protected Attributes\par
+\pard\plain
+
+{
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+float3 {\b _outputValue}{\bkmkstart AAAAAAAADX}
+{\bkmkend AAAAAAAADX}
+\par
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+Vector3 {\b _outputValue}{\bkmkstart AAAAAAAADY}
+{\bkmkend AAAAAAAADY}
+\par
+}
+\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid
+Properties\par
+\pard\plain
+
+{
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+List< {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAL" }{}}{\fldrslt {\cs37\ul\cf2 Synapse}}}
+ > {\b synapses}{\f2 [get]}{\bkmkstart AAAAAAAAEA}
+{\bkmkend AAAAAAAAEA}
+\par
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+The synapses of the nucleus. }{
+}\par
+}\par}
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+{\field {\*\fldinst { HYPERLINK \\l "AAAAAAAACF" }{}}{\fldrslt {\cs37\ul\cf2 ActivationType}}}
+ {\b curvePreset}{\f2 [get, set]}{\bkmkstart AAAAAAAAEB}
+{\bkmkend AAAAAAAAEB}
+\par
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+virtual float3 {\b outputValue}{\f2 [get, set]}{\bkmkstart AAAAAAAAEC}
+{\bkmkend AAAAAAAAEC}
+\par
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+float {\b outputMagnitude}{\f2 [get]}{\bkmkstart AAAAAAAAEE}
+{\bkmkend AAAAAAAAEE}
+\par
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+float {\b outputSqrMagnitude}{\f2 [get]}{\bkmkstart AAAAAAAAEF}
+{\bkmkend AAAAAAAAEF}
+\par
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+virtual Vector3 {\b outputValue}{\f2 [get, set]}{\bkmkstart AAAAAAAAED}
+{\bkmkend AAAAAAAAED}
+\par
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+bool {\b isFiring}{\f2 [get]}{\bkmkstart AAAAAAAAEG}
+{\bkmkend AAAAAAAAEG}
+\par
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+virtual bool {\b isSleeping}{\f2 [get]}{\bkmkstart AAAAAAAAEP}
+{\bkmkend AAAAAAAAEP}
+\par
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+Func< float3 > {\b Combinator}{\f2 [get]}{\bkmkstart AAAAAAAAEH}
+{\bkmkend AAAAAAAAEH}
+\par
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+Func< Vector3 > {\b Combinator}{\f2 [get]}{\bkmkstart AAAAAAAAEI}
+{\bkmkend AAAAAAAAEI}
+\par
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+Func< float3, float3 > {\b Activator}{\f2 [get]}{\bkmkstart AAAAAAAAEJ}
+{\bkmkend AAAAAAAAEJ}
+\par
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+Func< Vector3, Vector3 > {\b Activator}{\f2 [get]}{\bkmkstart AAAAAAAAEK}
+{\bkmkend AAAAAAAAEK}
+\par
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+virtual List< {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAK" }{}}{\fldrslt {\cs37\ul\cf2 Nucleus}}}
+ > {\b receivers}{\f2 [get, set]}{\bkmkstart AAAAAAAAEL}
+{\bkmkend AAAAAAAAEL}
+\par
+}
+{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par}
+\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid
+Member Enumeration Documentation\par
+\pard\plain
+{\xe \v CombinatorType\:NanoBrain.Neuron}
+{\xe \v NanoBrain.Neuron\:CombinatorType}
+\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid {
+{\b
+enum {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAACC" }{}}{\fldrslt {\cs37\ul\cf2 NanoBrain.Neuron.CombinatorType}}}
+}}
+\par
+{\bkmkstart AAAAAAAACC}
+{\bkmkend AAAAAAAACC}
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid
+\par
+{
+{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+The type of combinators. }}\par
+{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+A combinator combines the weighted values of the synapses to a single value \par
+}{\par
+{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid
+Enumerator:\par}
+\pard\plain \s81\li360\widctlpar\ql\adjustright \fs20\cgrid \trowd \trgaph108\trleft426\tblind426\trbrdrt\brdrs\brdrw10\brdrcf15 \trbrdrl\brdrs\brdrw10\brdrcf15 \trbrdrb\brdrs\brdrw10\brdrcf15 \trbrdrr\brdrs\brdrw10\brdrcf15 \trbrdrh\brdrs\brdrw10\brdrcf15 \trbrdrv\brdrs\brdrw10\brdrcf15
+\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx2187
+\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx8748
+\pard \widctlpar\intbl\adjustright
+{\xe \v Sum\:NanoBrain.Neuron}
+{\xe \v NanoBrain.Neuron\:Sum}
+{\qr Sum{\bkmkstart AAAAAAAACD}
+{\bkmkend AAAAAAAACD}
+\cell }{{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+Add the weighted values together. \par
+}\cell }{\row }
+{\xe \v Product\:NanoBrain.Neuron}
+{\xe \v NanoBrain.Neuron\:Product}
+{\qr Product{\bkmkstart AAAAAAAACE}
+{\bkmkend AAAAAAAACE}
+\cell }{{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+Multiply the weighted values. \par
+}\cell }{\row }
+}
+}
+{\xe \v Type\:NanoBrain.Neuron}
+{\xe \v NanoBrain.Neuron\:Type}
+\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid {
+{\b
+enum {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAP" }{}}{\fldrslt {\cs37\ul\cf2 NanoBrain.Nucleus.Type}}}
+{\f2 [inherited]}}}
+\par
+{\bkmkstart AAAAAAAAAP}
+{\bkmkend AAAAAAAAAP}
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid
+\par
+{
+{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+Function to clone a nucleus to a Cluster prefab. }}\par
+{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+{\par
+{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid
+Parameters\par}
+\pard\plain \s81\li360\widctlpar\ql\adjustright \fs20\cgrid \trowd \trgaph108\trleft426\tblind426\trbrdrt\brdrs\brdrw10\brdrcf15 \trbrdrl\brdrs\brdrw10\brdrcf15 \trbrdrb\brdrs\brdrw10\brdrcf15 \trbrdrr\brdrs\brdrw10\brdrcf15 \trbrdrh\brdrs\brdrw10\brdrcf15 \trbrdrv\brdrs\brdrw10\brdrcf15
+\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx2187
+\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx8748
+\pard \widctlpar\intbl\adjustright
+{{\i prefab} \cell }{\cell }
+{\row }
+}
+{{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid
+Returns\par}\pard\plain \s82\li720\widctlpar\ql\adjustright \fs20\cgrid {\s17 \sa60 \sb30
+\par
+}}The types of Nucleus \par
+}}
+{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par}
+\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid
+Constructor & Destructor Documentation\par
+\pard\plain
+{\xe \v Neuron\:NanoBrain.Neuron}
+{\xe \v NanoBrain.Neuron\:Neuron}
+\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid {
+{\b
+NanoBrain.Neuron.Neuron ({\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAG" }{}}{\fldrslt {\cs37\ul\cf2 Cluster}}}
+ {\i parent}, string {\i name})}}
+\par
+{\bkmkstart AAAAAAAAEM}
+{\bkmkend AAAAAAAAEM}
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid
+\par
+{
+{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+Create a new Neuron in a Cluster instance. }}\par
+{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+{\par
+{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid
+Parameters\par}
+\pard\plain \s81\li360\widctlpar\ql\adjustright \fs20\cgrid \trowd \trgaph108\trleft426\tblind426\trbrdrt\brdrs\brdrw10\brdrcf15 \trbrdrl\brdrs\brdrw10\brdrcf15 \trbrdrb\brdrs\brdrw10\brdrcf15 \trbrdrr\brdrs\brdrw10\brdrcf15 \trbrdrh\brdrs\brdrw10\brdrcf15 \trbrdrv\brdrs\brdrw10\brdrcf15
+\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx2187
+\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx8748
+\pard \widctlpar\intbl\adjustright
+{{\i parent} \cell }{The parent cluster in which the new Neuron should be created\cell }
+{\row }
+\trowd \trgaph108\trleft426\tblind426\trbrdrt\brdrs\brdrw10\brdrcf15 \trbrdrl\brdrs\brdrw10\brdrcf15 \trbrdrb\brdrs\brdrw10\brdrcf15 \trbrdrr\brdrs\brdrw10\brdrcf15 \trbrdrh\brdrs\brdrw10\brdrcf15 \trbrdrv\brdrs\brdrw10\brdrcf15
+\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx2187
+\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx8748
+\pard \widctlpar\intbl\adjustright
+{{\i name} \cell }{The name of the new Neuron\cell }
+{\row }
+}
+}}
+{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par}
+\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid
+Member Function Documentation\par
+\pard\plain
+{\xe \v AddSynapse\:NanoBrain.Neuron}
+{\xe \v NanoBrain.Neuron\:AddSynapse}
+\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid {
+{\b
+{\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAL" }{}}{\fldrslt {\cs37\ul\cf2 Synapse}}}
+ NanoBrain.Neuron.AddSynapse ({\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAJ" }{}}{\fldrslt {\cs37\ul\cf2 Neuron}}}
+ {\i sendingNucleus}, float {\i weight} = {\f2 1})}}
+\par
+{\bkmkstart AAAAAAAACJ}
+{\bkmkend AAAAAAAACJ}
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid
+\par
+{
+{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+Add a new synapse to this nuclues. }}\par
+{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+{\par
+{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid
+Parameters\par}
+\pard\plain \s81\li360\widctlpar\ql\adjustright \fs20\cgrid \trowd \trgaph108\trleft426\tblind426\trbrdrt\brdrs\brdrw10\brdrcf15 \trbrdrl\brdrs\brdrw10\brdrcf15 \trbrdrb\brdrs\brdrw10\brdrcf15 \trbrdrr\brdrs\brdrw10\brdrcf15 \trbrdrh\brdrs\brdrw10\brdrcf15 \trbrdrv\brdrs\brdrw10\brdrcf15
+\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx2187
+\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx8748
+\pard \widctlpar\intbl\adjustright
+{{\i sendingNucleus} \cell }{The nucleus from which the signals may originate\cell }
+{\row }
+\trowd \trgaph108\trleft426\tblind426\trbrdrt\brdrs\brdrw10\brdrcf15 \trbrdrl\brdrs\brdrw10\brdrcf15 \trbrdrb\brdrs\brdrw10\brdrcf15 \trbrdrr\brdrs\brdrw10\brdrcf15 \trbrdrh\brdrs\brdrw10\brdrcf15 \trbrdrv\brdrs\brdrw10\brdrcf15
+\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx2187
+\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx8748
+\pard \widctlpar\intbl\adjustright
+{{\i weight} \cell }{The weight applied to the input. Default value = 1\cell }
+{\row }
+}
+{{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid
+Returns\par}\pard\plain \s82\li720\widctlpar\ql\adjustright \fs20\cgrid {\s17 \sa60 \sb30
+The created Synapse\par
+}}This will add a new input to this nucleus with the given weight. \par
+}}
+{\xe \v GetSynapse\:NanoBrain.Neuron}
+{\xe \v NanoBrain.Neuron\:GetSynapse}
+\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid {
+{\b
+{\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAL" }{}}{\fldrslt {\cs37\ul\cf2 Synapse}}}
+ NanoBrain.Neuron.GetSynapse ({\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAK" }{}}{\fldrslt {\cs37\ul\cf2 Nucleus}}}
+ {\i sender})}}
+\par
+{\bkmkstart AAAAAAAACK}
+{\bkmkend AAAAAAAACK}
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid
+\par
+{
+{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+Find a synapse. }}\par
+{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+{\par
+{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid
+Parameters\par}
+\pard\plain \s81\li360\widctlpar\ql\adjustright \fs20\cgrid \trowd \trgaph108\trleft426\tblind426\trbrdrt\brdrs\brdrw10\brdrcf15 \trbrdrl\brdrs\brdrw10\brdrcf15 \trbrdrb\brdrs\brdrw10\brdrcf15 \trbrdrr\brdrs\brdrw10\brdrcf15 \trbrdrh\brdrs\brdrw10\brdrcf15 \trbrdrv\brdrs\brdrw10\brdrcf15
+\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx2187
+\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx8748
+\pard \widctlpar\intbl\adjustright
+{{\i sender} \cell }{The sender of the input to the Synapse\cell }
+{\row }
+}
+{{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid
+Returns\par}\pard\plain \s82\li720\widctlpar\ql\adjustright \fs20\cgrid {\s17 \sa60 \sb30
+The found Synapse or null when the sender has no synapse to this nucleus.\par
+}}}}
+{\xe \v RemoveSynapse\:NanoBrain.Neuron}
+{\xe \v NanoBrain.Neuron\:RemoveSynapse}
+\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid {
+{\b
+void NanoBrain.Neuron.RemoveSynapse ({\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAK" }{}}{\fldrslt {\cs37\ul\cf2 Nucleus}}}
+ {\i sendingNucleus})}}
+\par
+{\bkmkstart AAAAAAAACL}
+{\bkmkend AAAAAAAACL}
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid
+\par
+{
+{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+Remove a synapse from a Nucleus. }}\par
+{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+{\par
+{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid
+Parameters\par}
+\pard\plain \s81\li360\widctlpar\ql\adjustright \fs20\cgrid \trowd \trgaph108\trleft426\tblind426\trbrdrt\brdrs\brdrw10\brdrcf15 \trbrdrl\brdrs\brdrw10\brdrcf15 \trbrdrb\brdrs\brdrw10\brdrcf15 \trbrdrr\brdrs\brdrw10\brdrcf15 \trbrdrh\brdrs\brdrw10\brdrcf15 \trbrdrv\brdrs\brdrw10\brdrcf15
+\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx2187
+\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx8748
+\pard \widctlpar\intbl\adjustright
+{{\i sendingNucleus} \cell }{Remote the synapse connecting to this Nucleus\cell }
+{\row }
+}
+}}
+{\xe \v SetBias\:NanoBrain.Neuron}
+{\xe \v NanoBrain.Neuron\:SetBias}
+\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid {
+{\b
+virtual void NanoBrain.Neuron.SetBias (Vector3 {\i inputValue}){\f2 [virtual]}}}
+\par
+{\bkmkstart AAAAAAAACM}
+{\bkmkend AAAAAAAACM}
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid
+\par
+{
+{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+Set the bias, recalculate the output and update all Nuclei receiving from this Nucleus. }}\par
+{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+{\par
+{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid
+Parameters\par}
+\pard\plain \s81\li360\widctlpar\ql\adjustright \fs20\cgrid \trowd \trgaph108\trleft426\tblind426\trbrdrt\brdrs\brdrw10\brdrcf15 \trbrdrl\brdrs\brdrw10\brdrcf15 \trbrdrb\brdrs\brdrw10\brdrcf15 \trbrdrr\brdrs\brdrw10\brdrcf15 \trbrdrh\brdrs\brdrw10\brdrcf15 \trbrdrv\brdrs\brdrw10\brdrcf15
+\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx2187
+\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx8748
+\pard \widctlpar\intbl\adjustright
+{{\i inputValue} \cell }{\cell }
+{\row }
+}
+}}
+{\xe \v ShallowCloneTo\:NanoBrain.Neuron}
+{\xe \v NanoBrain.Neuron\:ShallowCloneTo}
+\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid {
+{\b
+override {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAK" }{}}{\fldrslt {\cs37\ul\cf2 Nucleus}}}
+ NanoBrain.Neuron.ShallowCloneTo ({\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAG" }{}}{\fldrslt {\cs37\ul\cf2 Cluster}}}
+ {\i newParent})}}
+\par
+{\bkmkstart AAAAAAAAEN}
+{\bkmkend AAAAAAAAEN}
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid
+\par
+{
+{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+Toggle for printing debugging trace data. }}\par
+{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+Function to make a partial clone of this nucleus\par
+{{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid
+Parameters\par}
+\pard\plain \s81\li360\widctlpar\ql\adjustright \fs20\cgrid \trowd \trgaph108\trleft426\tblind426\trbrdrt\brdrs\brdrw10\brdrcf15 \trbrdrl\brdrs\brdrw10\brdrcf15 \trbrdrb\brdrs\brdrw10\brdrcf15 \trbrdrr\brdrs\brdrw10\brdrcf15 \trbrdrh\brdrs\brdrw10\brdrcf15 \trbrdrv\brdrs\brdrw10\brdrcf15
+\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx2187
+\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx8748
+\pard \widctlpar\intbl\adjustright
+{{\i parent} \cell }{The cluster in which the cloned nucleus should be placed\cell }
+{\row }
+}
+{{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid
+Returns\par}\pard\plain \s82\li720\widctlpar\ql\adjustright \fs20\cgrid {\s17 \sa60 \sb30
+\par
+}}}}
+{\xe \v ProcessStimulus\:NanoBrain.Neuron}
+{\xe \v NanoBrain.Neuron\:ProcessStimulus}
+\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid {
+{\b
+virtual void NanoBrain.Neuron.ProcessStimulus (Vector3 {\i inputValue}){\f2 [virtual]}}}
+\par
+{\bkmkstart AAAAAAAACW}
+{\bkmkend AAAAAAAACW}
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid
+\par
+{
+{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+Process an external stimulus. }}\par
+{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+{\par
+{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid
+Parameters\par}
+\pard\plain \s81\li360\widctlpar\ql\adjustright \fs20\cgrid \trowd \trgaph108\trleft426\tblind426\trbrdrt\brdrs\brdrw10\brdrcf15 \trbrdrl\brdrs\brdrw10\brdrcf15 \trbrdrb\brdrs\brdrw10\brdrcf15 \trbrdrr\brdrs\brdrw10\brdrcf15 \trbrdrh\brdrs\brdrw10\brdrcf15 \trbrdrv\brdrs\brdrw10\brdrcf15
+\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx2187
+\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx8748
+\pard \widctlpar\intbl\adjustright
+{{\i inputValue} \cell }{The value of the stimulus\cell }
+{\row }
+\trowd \trgaph108\trleft426\tblind426\trbrdrt\brdrs\brdrw10\brdrcf15 \trbrdrl\brdrs\brdrw10\brdrcf15 \trbrdrb\brdrs\brdrw10\brdrcf15 \trbrdrr\brdrs\brdrw10\brdrcf15 \trbrdrh\brdrs\brdrw10\brdrcf15 \trbrdrv\brdrs\brdrw10\brdrcf15
+\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx2187
+\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx8748
+\pard \widctlpar\intbl\adjustright
+{{\i thingId} \cell }{The id of the thing causing the stimulus\cell }
+{\row }
+\trowd \trgaph108\trleft426\tblind426\trbrdrt\brdrs\brdrw10\brdrcf15 \trbrdrl\brdrs\brdrw10\brdrcf15 \trbrdrb\brdrs\brdrw10\brdrcf15 \trbrdrr\brdrs\brdrw10\brdrcf15 \trbrdrh\brdrs\brdrw10\brdrcf15 \trbrdrv\brdrs\brdrw10\brdrcf15
+\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx2187
+\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx8748
+\pard \widctlpar\intbl\adjustright
+{{\i thingName} \cell }{The name of the thing causing the stimulus\cell }
+{\row }
+}
+}}
+{\xe \v UpdateNuclei\:NanoBrain.Neuron}
+{\xe \v NanoBrain.Neuron\:UpdateNuclei}
+\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid {
+{\b
+virtual void NanoBrain.Nucleus.UpdateNuclei (){\f2 [virtual]}, {\f2 [inherited]}}}
+\par
+{\bkmkstart AAAAAAAABK}
+{\bkmkend AAAAAAAABK}
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid
+\par
+{
+{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+Update the state and recursively all Nuclei receiving data from this Nucleus. }}\par
+{
+Reimplemented in {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAABX" }{}}{\fldrslt {\cs37\ul\cf2 NanoBrain.MemoryCell}}}
+.}\par
+}
+{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par}
+\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid
+Member Data Documentation\par
+\pard\plain
+{\xe \v bias\:NanoBrain.Neuron}
+{\xe \v NanoBrain.Neuron\:bias}
+\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid {
+{\b
+Vector3 NanoBrain.Neuron.bias = Vector3.zero}}
+\par
+{\bkmkstart AAAAAAAACZ}
+{\bkmkend AAAAAAAACZ}
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid
+\par
+{
+{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+Create a new Neuron in a Cluster Prefab. }}\par
+{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+{\par
+{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid
+Parameters\par}
+\pard\plain \s81\li360\widctlpar\ql\adjustright \fs20\cgrid \trowd \trgaph108\trleft426\tblind426\trbrdrt\brdrs\brdrw10\brdrcf15 \trbrdrl\brdrs\brdrw10\brdrcf15 \trbrdrb\brdrs\brdrw10\brdrcf15 \trbrdrr\brdrs\brdrw10\brdrcf15 \trbrdrh\brdrs\brdrw10\brdrcf15 \trbrdrv\brdrs\brdrw10\brdrcf15
+\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx2187
+\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx8748
+\pard \widctlpar\intbl\adjustright
+{{\i prefab} \cell }{The Cluster Preafb in which the new Neuron should be created\cell }
+{\row }
+\trowd \trgaph108\trleft426\tblind426\trbrdrt\brdrs\brdrw10\brdrcf15 \trbrdrl\brdrs\brdrw10\brdrcf15 \trbrdrb\brdrs\brdrw10\brdrcf15 \trbrdrr\brdrs\brdrw10\brdrcf15 \trbrdrh\brdrs\brdrw10\brdrcf15 \trbrdrv\brdrs\brdrw10\brdrcf15
+\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx2187
+\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx8748
+\pard \widctlpar\intbl\adjustright
+{{\i name} \cell }{The name of the new Neuron\cell }
+{\row }
+}
+The bias\par
+The bias which a value which is always added to the combined value of the neuron It does not have a synapse and therefore no weight of source nucleus \par
+}}
+{\xe \v parent\:NanoBrain.Neuron}
+{\xe \v NanoBrain.Neuron\:parent}
+\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid {
+{\b
+{\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAG" }{}}{\fldrslt {\cs37\ul\cf2 Cluster}}}
+ NanoBrain.Nucleus.parent{\f2 [inherited]}}}
+\par
+{\bkmkstart AAAAAAAAAS}
+{\bkmkend AAAAAAAAAS}
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid
+\par
+{
+{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+The cluster prefab in which the nucleus is located. }}\par
+{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+The cluster instance in which the nucleus is located \par
+}}
+{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par}
+The documentation for this class was generated from the following file:{\par
+\pard\plain \s121\fi-360\li720\widctlpar\jclisttab\tx720{\*\pn \pnlvlbody\ilvl0\ls2\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Neuron.cs\par
+}\par \pard\plain
+
+\pard\plain \sect\sbkpage
+\s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid
+\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid
+NanoBrain.Nucleus Class Reference\par \pard\plain
+{\tc\tcl2 \v NanoBrain.Nucleus}
+{\xe \v NanoBrain.Nucleus}
+{\bkmkstart AAAAAAAAAK}
+{\bkmkend AAAAAAAAAK}
+{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par}
+\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid
+Description\par
+\pard\plain
+{
+\pard\plain \s17\sa60\sb30\widctlpar\qj \fs22\cgrid {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+A Nucleus is a basic element in a brain cluster. \par
+}}
+Inheritance diagram for NanoBrain.Nucleus:{
+\pard\plain
+\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "class_nano_brain_1_1_nucleus.png" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par
+}
+\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid
+Public Types\par
+\pard\plain
+
+{
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+enum {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAP" }{}}{\fldrslt {\cs37\ul\cf2 Type}}}
+ \{ {\b None}
+, {\b Neuron}
+, {\b MemoryCell}
+, {\b Cluster}
+ \}\par
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+Function to clone a nucleus to a Cluster prefab. }}\par}
+}
+\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid
+Public Member Functions\par
+\pard\plain
+
+{
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+{\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAK" }{}}{\fldrslt {\cs37\ul\cf2 Nucleus}}}
+ {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAEQ" }{}}{\fldrslt {\cs37\ul\cf2 ShallowCloneTo}}}
+ ({\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAG" }{}}{\fldrslt {\cs37\ul\cf2 Cluster}}}
+ {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAS" }{}}{\fldrslt {\cs37\ul\cf2 parent}}}
+)\par
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+Toggle for printing debugging trace data. }{
+}\par
+}\par}
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+void {\b UpdateStateIsolated} (){\bkmkstart AAAAAAAAER}
+{\bkmkend AAAAAAAAER}
+\par
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+Update the state without updating other Nuclei. }{
+}\par
+}\par}
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+virtual void {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAABK" }{}}{\fldrslt {\cs37\ul\cf2 UpdateNuclei}}}
+ ()\par
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+Update the state and recursively all Nuclei receiving data from this Nucleus. }{
+}\par
+}\par}
+}
+\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid
+Public Attributes\par
+\pard\plain
+
+{
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+string {\b name}{\bkmkstart AAAAAAAABR}
+{\bkmkend AAAAAAAABR}
+\par
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+The name of the Nucleus. }{
+}\par
+}\par}
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+{\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAG" }{}}{\fldrslt {\cs37\ul\cf2 Cluster}}}
+ {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAS" }{}}{\fldrslt {\cs37\ul\cf2 parent}}}
+\par
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+The cluster prefab in which the nucleus is located. }{
+}\par
+}\par}
+}
+{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par}
+\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid
+Member Enumeration Documentation\par
+\pard\plain
+{\xe \v Type\:NanoBrain.Nucleus}
+{\xe \v NanoBrain.Nucleus\:Type}
+\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid {
+{\b
+enum {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAP" }{}}{\fldrslt {\cs37\ul\cf2 NanoBrain.Nucleus.Type}}}
+}}
+\par
+{\bkmkstart AAAAAAAAAP}
+{\bkmkend AAAAAAAAAP}
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid
+\par
+{
+{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+Function to clone a nucleus to a Cluster prefab. }}\par
+{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+{\par
+{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid
+Parameters\par}
+\pard\plain \s81\li360\widctlpar\ql\adjustright \fs20\cgrid \trowd \trgaph108\trleft426\tblind426\trbrdrt\brdrs\brdrw10\brdrcf15 \trbrdrl\brdrs\brdrw10\brdrcf15 \trbrdrb\brdrs\brdrw10\brdrcf15 \trbrdrr\brdrs\brdrw10\brdrcf15 \trbrdrh\brdrs\brdrw10\brdrcf15 \trbrdrv\brdrs\brdrw10\brdrcf15
+\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx2187
+\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx8748
+\pard \widctlpar\intbl\adjustright
+{{\i prefab} \cell }{\cell }
+{\row }
+}
+{{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid
+Returns\par}\pard\plain \s82\li720\widctlpar\ql\adjustright \fs20\cgrid {\s17 \sa60 \sb30
+\par
+}}The types of Nucleus \par
+}}
+{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par}
+\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid
+Member Function Documentation\par
+\pard\plain
+{\xe \v ShallowCloneTo\:NanoBrain.Nucleus}
+{\xe \v NanoBrain.Nucleus\:ShallowCloneTo}
+\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid {
+{\b
+{\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAK" }{}}{\fldrslt {\cs37\ul\cf2 Nucleus}}}
+ NanoBrain.Nucleus.ShallowCloneTo ({\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAG" }{}}{\fldrslt {\cs37\ul\cf2 Cluster}}}
+ {\i parent}){\f2 [abstract]}}}
+\par
+{\bkmkstart AAAAAAAAEQ}
+{\bkmkend AAAAAAAAEQ}
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid
+\par
+{
+{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+Toggle for printing debugging trace data. }}\par
+{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+Function to make a partial clone of this nucleus\par
+{{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid
+Parameters\par}
+\pard\plain \s81\li360\widctlpar\ql\adjustright \fs20\cgrid \trowd \trgaph108\trleft426\tblind426\trbrdrt\brdrs\brdrw10\brdrcf15 \trbrdrl\brdrs\brdrw10\brdrcf15 \trbrdrb\brdrs\brdrw10\brdrcf15 \trbrdrr\brdrs\brdrw10\brdrcf15 \trbrdrh\brdrs\brdrw10\brdrcf15 \trbrdrv\brdrs\brdrw10\brdrcf15
+\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx2187
+\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx8748
+\pard \widctlpar\intbl\adjustright
+{{\i parent} \cell }{The cluster in which the cloned nucleus should be placed\cell }
+{\row }
+}
+{{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid
+Returns\par}\pard\plain \s82\li720\widctlpar\ql\adjustright \fs20\cgrid {\s17 \sa60 \sb30
+\par
+}}}}
+{\xe \v UpdateNuclei\:NanoBrain.Nucleus}
+{\xe \v NanoBrain.Nucleus\:UpdateNuclei}
+\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid {
+{\b
+virtual void NanoBrain.Nucleus.UpdateNuclei (){\f2 [virtual]}}}
+\par
+{\bkmkstart AAAAAAAABK}
+{\bkmkend AAAAAAAABK}
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid
+\par
+{
+{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+Update the state and recursively all Nuclei receiving data from this Nucleus. }}\par
+{
+Reimplemented in {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAABX" }{}}{\fldrslt {\cs37\ul\cf2 NanoBrain.MemoryCell}}}
+.}\par
+}
+{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par}
+\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid
+Member Data Documentation\par
+\pard\plain
+{\xe \v parent\:NanoBrain.Nucleus}
+{\xe \v NanoBrain.Nucleus\:parent}
+\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid {
+{\b
+{\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAG" }{}}{\fldrslt {\cs37\ul\cf2 Cluster}}}
+ NanoBrain.Nucleus.parent}}
+\par
+{\bkmkstart AAAAAAAAAS}
+{\bkmkend AAAAAAAAAS}
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid
+\par
+{
+{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+The cluster prefab in which the nucleus is located. }}\par
+{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+The cluster instance in which the nucleus is located \par
+}}
+{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par}
+The documentation for this class was generated from the following file:{\par
+\pard\plain \s121\fi-360\li720\widctlpar\jclisttab\tx720{\*\pn \pnlvlbody\ilvl0\ls2\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Nucleus.cs\par
+}\par \pard\plain
+
+\pard\plain \sect\sbkpage
+\s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid
+\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid
+NanoBrain.Synapse Class Reference\par \pard\plain
+{\tc\tcl2 \v NanoBrain.Synapse}
+{\xe \v NanoBrain.Synapse}
+{\bkmkstart AAAAAAAAAL}
+{\bkmkend AAAAAAAAAL}
+{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par}
+\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid
+Description\par
+\pard\plain
+{
+\pard\plain \s17\sa60\sb30\widctlpar\qj \fs22\cgrid {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+A Synapse connects the ouput of a Neuron to another Neuron. \par
+}}
+\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid
+Public Member Functions\par
+\pard\plain
+
+{
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+{\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAES" }{}}{\fldrslt {\cs37\ul\cf2 Synapse}}}
+ ({\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAJ" }{}}{\fldrslt {\cs37\ul\cf2 Neuron}}}
+ nucleus, float {\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAET" }{}}{\fldrslt {\cs37\ul\cf2 weight}}}
+=1.0f)\par
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+Create a new Synapse. }{
+}\par
+}\par}
+}
+\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid
+Public Attributes\par
+\pard\plain
+
+{
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+{\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAJ" }{}}{\fldrslt {\cs37\ul\cf2 Neuron}}}
+ {\b neuron}{\bkmkstart AAAAAAAAEU}
+{\bkmkend AAAAAAAAEU}
+\par
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+The neuron from which input is received. }{
+}\par
+}\par}
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+float {\b weight}{\bkmkstart AAAAAAAAET}
+{\bkmkend AAAAAAAAET}
+\par
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid {\i {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+The weight value to apply to the Neuron input. }{
+}\par
+}\par}
+}
+\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid
+Properties\par
+\pard\plain
+
+{
+\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+
+bool {\b isSleeping}{\f2 [get]}{\bkmkstart AAAAAAAAEV}
+{\bkmkend AAAAAAAAEV}
+\par
+}
+{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par}
+\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid
+Constructor & Destructor Documentation\par
+\pard\plain
+{\xe \v Synapse\:NanoBrain.Synapse}
+{\xe \v NanoBrain.Synapse\:Synapse}
+\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid {
+{\b
+NanoBrain.Synapse.Synapse ({\field {\*\fldinst { HYPERLINK \\l "AAAAAAAAAJ" }{}}{\fldrslt {\cs37\ul\cf2 Neuron}}}
+ {\i nucleus}, float {\i weight} = {\f2 1::0f})}}
+\par
+{\bkmkstart AAAAAAAAES}
+{\bkmkend AAAAAAAAES}
+{
+\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid
+\par
+{
+{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+Create a new Synapse. }}\par
+{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid
+{\par
+{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid
+Parameters\par}
+\pard\plain \s81\li360\widctlpar\ql\adjustright \fs20\cgrid \trowd \trgaph108\trleft426\tblind426\trbrdrt\brdrs\brdrw10\brdrcf15 \trbrdrl\brdrs\brdrw10\brdrcf15 \trbrdrb\brdrs\brdrw10\brdrcf15 \trbrdrr\brdrs\brdrw10\brdrcf15 \trbrdrh\brdrs\brdrw10\brdrcf15 \trbrdrv\brdrs\brdrw10\brdrcf15
+\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx2187
+\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx8748
+\pard \widctlpar\intbl\adjustright
+{{\i nucleus} \cell }{The neuron from which input is received\cell }
+{\row }
+\trowd \trgaph108\trleft426\tblind426\trbrdrt\brdrs\brdrw10\brdrcf15 \trbrdrl\brdrs\brdrw10\brdrcf15 \trbrdrb\brdrs\brdrw10\brdrcf15 \trbrdrr\brdrs\brdrw10\brdrcf15 \trbrdrh\brdrs\brdrw10\brdrcf15 \trbrdrv\brdrs\brdrw10\brdrcf15
+\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx2187
+\clvertalt\clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrl\brdrs\brdrw10\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \clbrdrr \brdrs\brdrw10\brdrcf15 \cltxlrtb \cellx8748
+\pard \widctlpar\intbl\adjustright
+{{\i weight} \cell }{The weight value to apply to the Neuron input\cell }
+{\row }
+}
+}}
+{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par}
+The documentation for this class was generated from the following file:{\par
+\pard\plain \s121\fi-360\li720\widctlpar\jclisttab\tx720{\*\pn \pnlvlbody\ilvl0\ls2\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid
+/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Core/Synapse.cs\par
+}
+\pard\plain \sect\sbkpage
+\s1\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs36\kerning36\cgrid
+\s1\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs36\kerning36\cgrid Index\par
+\pard\plain
+{\tc \v Index}
+{\field\fldedit {\*\fldinst INDEX \\c2 \\*MERGEFORMAT}{\fldrslt INDEX}}
+}
diff --git a/Documentation/html/rtf/refman.rtf.meta b/Documentation/html/rtf/refman.rtf.meta
new file mode 100644
index 0000000..0324b15
--- /dev/null
+++ b/Documentation/html/rtf/refman.rtf.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: f9796692d8cde808d97648616b2bb072
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/LinearAlgebra/test.meta b/Documentation/html/search.meta
similarity index 77%
rename from LinearAlgebra/test.meta
rename to Documentation/html/search.meta
index 7b069c9..d7cc1d3 100644
--- a/LinearAlgebra/test.meta
+++ b/Documentation/html/search.meta
@@ -1,5 +1,5 @@
fileFormatVersion: 2
-guid: 9b84f664459d02b90894e460de42c219
+guid: 7a30cca37cad05ccf90f9d9f0537d338
folderAsset: yes
DefaultImporter:
externalObjects: {}
diff --git a/Documentation/html/search/all_0.js b/Documentation/html/search/all_0.js
new file mode 100644
index 0000000..2ed4933
--- /dev/null
+++ b/Documentation/html/search/all_0.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['_5foutputs_0',['_outputs',['../class_nano_brain_1_1_cluster.html#a15c5159667fe22edfc4889a955a9d293',1,'NanoBrain::Cluster']]]
+];
diff --git a/Documentation/html/search/all_0.js.meta b/Documentation/html/search/all_0.js.meta
new file mode 100644
index 0000000..13499de
--- /dev/null
+++ b/Documentation/html/search/all_0.js.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: ba986b9d8b6fa739083b315a103fcddc
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Documentation/html/search/all_1.js b/Documentation/html/search/all_1.js
new file mode 100644
index 0000000..2ab825f
--- /dev/null
+++ b/Documentation/html/search/all_1.js
@@ -0,0 +1,6 @@
+var searchData=
+[
+ ['activationtype_0',['ActivationType',['../class_nano_brain_1_1_neuron.html#ae558c02b00c776805c7fead42cb94612',1,'NanoBrain::Neuron']]],
+ ['addinstance_1',['addinstance',['../class_nano_brain_1_1_cluster.html#a01b55195c2f5be58659d9b0a5c993a8a',1,'NanoBrain.Cluster.AddInstance()'],['../class_nano_brain_1_1_cluster.html#a1b60bd296f757257a640559b732ed241',1,'NanoBrain.Cluster.AddInstance(ClusterPrefab prefab)']]],
+ ['addsynapse_2',['AddSynapse',['../class_nano_brain_1_1_neuron.html#a524fdd9e25ebbcb5baca60a942d6eb80',1,'NanoBrain::Neuron']]]
+];
diff --git a/Documentation/html/search/all_1.js.meta b/Documentation/html/search/all_1.js.meta
new file mode 100644
index 0000000..a51b53f
--- /dev/null
+++ b/Documentation/html/search/all_1.js.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 0c0ca40a74d21c4eca9027cd81dac16f
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Documentation/html/search/all_10.js b/Documentation/html/search/all_10.js
new file mode 100644
index 0000000..ca67916
--- /dev/null
+++ b/Documentation/html/search/all_10.js
@@ -0,0 +1,8 @@
+var searchData=
+[
+ ['unity_0',['Nano Brain for Unity',['../index.html',1,'']]],
+ ['updatefromnucleus_1',['UpdateFromNucleus',['../class_nano_brain_1_1_cluster.html#ab2e33a3a6642d31b5a927c7ee2db73ab',1,'NanoBrain::Cluster']]],
+ ['updatenuclei_2',['updatenuclei',['../class_nano_brain_1_1_memory_cell.html#a780592351f670461286b8cd00ec42ebd',1,'NanoBrain.MemoryCell.UpdateNuclei()'],['../class_nano_brain_1_1_nucleus.html#a31e93d392a4a861b55f3d87f0a7d6d59',1,'NanoBrain.Nucleus.UpdateNuclei()']]],
+ ['updatestateisolated_3',['updatestateisolated',['../class_nano_brain_1_1_cluster.html#ac40b182a3c5f32ec055d7fabbeaedbf3',1,'NanoBrain.Cluster.UpdateStateIsolated()'],['../class_nano_brain_1_1_nucleus.html#aaf267af9b5ad1b5f0247f04ed2934f97',1,'NanoBrain.Nucleus.UpdateStateIsolated()']]],
+ ['updateweight_4',['UpdateWeight',['../class_nano_brain_1_1_brain.html#a552d2f938f63f3c0f1997174d9098334',1,'NanoBrain::Brain']]]
+];
diff --git a/Documentation/html/search/all_10.js.meta b/Documentation/html/search/all_10.js.meta
new file mode 100644
index 0000000..0b97ef8
--- /dev/null
+++ b/Documentation/html/search/all_10.js.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: bdf36a00d9180ede4acc591a361c2f2b
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Documentation/html/search/all_11.js b/Documentation/html/search/all_11.js
new file mode 100644
index 0000000..a7ec48d
--- /dev/null
+++ b/Documentation/html/search/all_11.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['weight_0',['weight',['../class_nano_brain_1_1_synapse.html#ada805a6cfeb40773ed963d24c7e6a496',1,'NanoBrain::Synapse']]]
+];
diff --git a/Documentation/html/search/all_11.js.meta b/Documentation/html/search/all_11.js.meta
new file mode 100644
index 0000000..559edbe
--- /dev/null
+++ b/Documentation/html/search/all_11.js.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 1086b93868dfe9a6d98e5656b04c8b14
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Documentation/html/search/all_2.js b/Documentation/html/search/all_2.js
new file mode 100644
index 0000000..8d6d131
--- /dev/null
+++ b/Documentation/html/search/all_2.js
@@ -0,0 +1,8 @@
+var searchData=
+[
+ ['basename_0',['baseName',['../class_nano_brain_1_1_cluster.html#ad81aed306939c26d22043ca3a0cd71c4',1,'NanoBrain::Cluster']]],
+ ['bias_1',['bias',['../class_nano_brain_1_1_neuron.html#a37d7161e2012e95bf5d4d620c0f5c7fa',1,'NanoBrain::Neuron']]],
+ ['brain_2',['brain',['../class_nano_brain_1_1_brain.html',1,'NanoBrain.Brain'],['../class_nano_brain_1_1_brain.html#a9c34c8cba2339f23b6406c45ab8490a8',1,'NanoBrain.Brain.brain']]],
+ ['brain_20for_20unity_3',['Nano Brain for Unity',['../index.html',1,'']]],
+ ['brainprefab_4',['brainPrefab',['../class_nano_brain_1_1_brain.html#a47162765076efc24b85d9b892e876648',1,'NanoBrain::Brain']]]
+];
diff --git a/Documentation/html/search/all_2.js.meta b/Documentation/html/search/all_2.js.meta
new file mode 100644
index 0000000..fa632c9
--- /dev/null
+++ b/Documentation/html/search/all_2.js.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: cd879de91045339aa880e4b4ccb981d8
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Documentation/html/search/all_3.js b/Documentation/html/search/all_3.js
new file mode 100644
index 0000000..671f393
--- /dev/null
+++ b/Documentation/html/search/all_3.js
@@ -0,0 +1,11 @@
+var searchData=
+[
+ ['cluster_0',['cluster',['../class_nano_brain_1_1_cluster.html',1,'NanoBrain.Cluster'],['../class_nano_brain_1_1_cluster.html#a86341cf5cc0d67a146a48e9c833df7ec',1,'NanoBrain.Cluster.Cluster(ClusterPrefab prefab, Cluster parent)'],['../class_nano_brain_1_1_cluster.html#a3a22ce2493a4d154fd971214b7c484d2',1,'NanoBrain.Cluster.Cluster(ClusterPrefab prefab, ClusterPrefab parent=null)']]],
+ ['clusterprefab_1',['ClusterPrefab',['../class_nano_brain_1_1_cluster_prefab.html',1,'NanoBrain']]],
+ ['collectreceivers_2',['CollectReceivers',['../class_nano_brain_1_1_cluster.html#ab067c159f399e69bcc9d2211bc9aa3c5',1,'NanoBrain::Cluster']]],
+ ['collectsynapsesto_3',['CollectSynapsesTo',['../class_nano_brain_1_1_cluster.html#a8736cab5b8381dc5a175fd03031d308e',1,'NanoBrain::Cluster']]],
+ ['combinator_4',['combinator',['../class_nano_brain_1_1_neuron.html#aa63477670ae3a6d667f44b500a250c86',1,'NanoBrain::Neuron']]],
+ ['combinatortype_5',['CombinatorType',['../class_nano_brain_1_1_neuron.html#ad7745cc584fbc2659d77c3202ee6adfe',1,'NanoBrain::Neuron']]],
+ ['computeorders_6',['computeOrders',['../class_nano_brain_1_1_cluster.html#af3bb2af13fc7fcb15e7610d4c81cb395',1,'NanoBrain::Cluster']]],
+ ['contents_7',['Table of Contents',['../index.html#autotoc_md1',1,'']]]
+];
diff --git a/Documentation/html/search/all_3.js.meta b/Documentation/html/search/all_3.js.meta
new file mode 100644
index 0000000..e2bc2d9
--- /dev/null
+++ b/Documentation/html/search/all_3.js.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: b2d0258dc79d2fbe09297c0df75b8499
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Documentation/html/search/all_4.js b/Documentation/html/search/all_4.js
new file mode 100644
index 0000000..44e0d45
--- /dev/null
+++ b/Documentation/html/search/all_4.js
@@ -0,0 +1,5 @@
+var searchData=
+[
+ ['defaultoutput_0',['defaultOutput',['../class_nano_brain_1_1_cluster.html#ac2d36a78d001fde5c95bc48f32e0fcc7',1,'NanoBrain::Cluster']]],
+ ['deletenucleus_1',['DeleteNucleus',['../class_nano_brain_1_1_cluster.html#a6b5855021a2733df3c25ed67e8777509',1,'NanoBrain::Cluster']]]
+];
diff --git a/Documentation/html/search/all_4.js.meta b/Documentation/html/search/all_4.js.meta
new file mode 100644
index 0000000..0b8b8f6
--- /dev/null
+++ b/Documentation/html/search/all_4.js.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 828cb31da42df7ca78086c04da629fc9
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Documentation/html/search/all_5.js b/Documentation/html/search/all_5.js
new file mode 100644
index 0000000..ca40bee
--- /dev/null
+++ b/Documentation/html/search/all_5.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['for_20unity_0',['Nano Brain for Unity',['../index.html',1,'']]]
+];
diff --git a/Documentation/html/search/all_5.js.meta b/Documentation/html/search/all_5.js.meta
new file mode 100644
index 0000000..ca9501b
--- /dev/null
+++ b/Documentation/html/search/all_5.js.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 297cc839b2ab331c2b8d585b16c4c10e
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Documentation/html/search/all_6.js b/Documentation/html/search/all_6.js
new file mode 100644
index 0000000..ed9f385
--- /dev/null
+++ b/Documentation/html/search/all_6.js
@@ -0,0 +1,7 @@
+var searchData=
+[
+ ['getneuron_0',['getneuron',['../class_nano_brain_1_1_cluster.html#a938f7cc08d8fee459e0203e3b6869e06',1,'NanoBrain.Cluster.GetNeuron(string neuronName)'],['../class_nano_brain_1_1_cluster.html#a696fcbdd1ae684a7b55963d8e673b22f',1,'NanoBrain.Cluster.GetNeuron(int thingId, string neuronName, string thingName=null)']]],
+ ['getnucleus_1',['getnucleus',['../class_nano_brain_1_1_cluster.html#a31a62471a88a8180963be74227fd68be',1,'NanoBrain.Cluster.GetNucleus()'],['../class_nano_brain_1_1_cluster_prefab.html#a49601bf5ea05b4f28974a5c0a1345286',1,'NanoBrain.ClusterPrefab.GetNucleus()']]],
+ ['getnucleusindex_2',['getnucleusindex',['../class_nano_brain_1_1_cluster.html#aec242a8433041ed22dde2375436016ce',1,'NanoBrain.Cluster.GetNucleusIndex(List< Nucleus > nuclei, Nucleus nucleus)'],['../class_nano_brain_1_1_cluster.html#ad9441d41aa6e2bfd3f9acf111dde1dd8',1,'NanoBrain.Cluster.GetNucleusIndex(List< Nucleus > nuclei, string nucleusName)']]],
+ ['getsynapse_3',['GetSynapse',['../class_nano_brain_1_1_neuron.html#a1f3c83acf569fa483101fd0ce11ec5fc',1,'NanoBrain::Neuron']]]
+];
diff --git a/Documentation/html/search/all_6.js.meta b/Documentation/html/search/all_6.js.meta
new file mode 100644
index 0000000..6284903
--- /dev/null
+++ b/Documentation/html/search/all_6.js.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 7a7b95515c5b7e94380b832d1e19540d
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Documentation/html/search/all_7.js b/Documentation/html/search/all_7.js
new file mode 100644
index 0000000..ce085f0
--- /dev/null
+++ b/Documentation/html/search/all_7.js
@@ -0,0 +1,6 @@
+var searchData=
+[
+ ['installation_0',['installation',['../md__installation.html',1,'Package Installation'],['../md__installation.html#autotoc_md0',1,'Samples Installation']]],
+ ['instancecount_1',['instanceCount',['../class_nano_brain_1_1_cluster.html#a5786c4f1f8387b7cb814ed159ddef040',1,'NanoBrain::Cluster']]],
+ ['instances_2',['instances',['../class_nano_brain_1_1_cluster.html#a9a2eb00412fb5cb200564a1261f3f313',1,'NanoBrain::Cluster']]]
+];
diff --git a/Documentation/html/search/all_7.js.meta b/Documentation/html/search/all_7.js.meta
new file mode 100644
index 0000000..8a7eb03
--- /dev/null
+++ b/Documentation/html/search/all_7.js.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 1c0e9780695344c75be2feb603079d79
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Documentation/html/search/all_8.js b/Documentation/html/search/all_8.js
new file mode 100644
index 0000000..d98bdd6
--- /dev/null
+++ b/Documentation/html/search/all_8.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['lastupdate_0',['lastUpdate',['../class_nano_brain_1_1_neuron.html#ad8697d6cbd7a2656e89a818b4cc75e97',1,'NanoBrain::Neuron']]]
+];
diff --git a/Documentation/html/search/all_8.js.meta b/Documentation/html/search/all_8.js.meta
new file mode 100644
index 0000000..2b783f9
--- /dev/null
+++ b/Documentation/html/search/all_8.js.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 2e5f1605df294dd04bb885f1fd02c534
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Documentation/html/search/all_9.js b/Documentation/html/search/all_9.js
new file mode 100644
index 0000000..e9694e2
--- /dev/null
+++ b/Documentation/html/search/all_9.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['memorycell_0',['MemoryCell',['../class_nano_brain_1_1_memory_cell.html',1,'NanoBrain']]]
+];
diff --git a/Documentation/html/search/all_9.js.meta b/Documentation/html/search/all_9.js.meta
new file mode 100644
index 0000000..a7d0362
--- /dev/null
+++ b/Documentation/html/search/all_9.js.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 3b30dcc1da93725b6930bfe6e0c830cc
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Documentation/html/search/all_a.js b/Documentation/html/search/all_a.js
new file mode 100644
index 0000000..e4e1a64
--- /dev/null
+++ b/Documentation/html/search/all_a.js
@@ -0,0 +1,9 @@
+var searchData=
+[
+ ['name_0',['name',['../class_nano_brain_1_1_nucleus.html#a35070f04a3fe08ec329b0f043bff0be2',1,'NanoBrain::Nucleus']]],
+ ['nano_20brain_20for_20unity_1',['Nano Brain for Unity',['../index.html',1,'']]],
+ ['nanobrain_2',['nanobrain',['../namespace_nano_brain.html',1,'NanoBrain'],['../md__2home_2pascal_2_development_2_projects_2_passer_2_nano_brain_2_nano_brain_2_assets_2_nano_brain-unitypackage_2_r_e_a_d_m_e.html',1,'NanoBrain']]],
+ ['neuron_3',['neuron',['../class_nano_brain_1_1_neuron.html',1,'NanoBrain.Neuron'],['../class_nano_brain_1_1_synapse.html#ac5d9cb95be7cbc11c3321a8c430e7e5f',1,'NanoBrain.Synapse.neuron'],['../class_nano_brain_1_1_neuron.html#a54a94ea928e9a54552692e7d1e84782e',1,'NanoBrain.Neuron.Neuron()']]],
+ ['nuclei_4',['nuclei',['../class_nano_brain_1_1_cluster.html#a73e3b7e7a0ae623d1ac55dd442ca9d68',1,'NanoBrain::Cluster']]],
+ ['nucleus_5',['Nucleus',['../class_nano_brain_1_1_nucleus.html',1,'NanoBrain']]]
+];
diff --git a/Documentation/html/search/all_a.js.meta b/Documentation/html/search/all_a.js.meta
new file mode 100644
index 0000000..423d056
--- /dev/null
+++ b/Documentation/html/search/all_a.js.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 6aed7a8be4271c433b22292831da1225
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Documentation/html/search/all_b.js b/Documentation/html/search/all_b.js
new file mode 100644
index 0000000..4d9240d
--- /dev/null
+++ b/Documentation/html/search/all_b.js
@@ -0,0 +1,5 @@
+var searchData=
+[
+ ['of_20contents_0',['Table of Contents',['../index.html#autotoc_md1',1,'']]],
+ ['outputs_1',['outputs',['../class_nano_brain_1_1_cluster.html#a89d8b00304b04025ae0446421363aa1f',1,'NanoBrain::Cluster']]]
+];
diff --git a/Documentation/html/search/all_b.js.meta b/Documentation/html/search/all_b.js.meta
new file mode 100644
index 0000000..49c75a5
--- /dev/null
+++ b/Documentation/html/search/all_b.js.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: f1b15f4ddc0599be7b07d08f0931b17a
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Documentation/html/search/all_c.js b/Documentation/html/search/all_c.js
new file mode 100644
index 0000000..cab5f69
--- /dev/null
+++ b/Documentation/html/search/all_c.js
@@ -0,0 +1,8 @@
+var searchData=
+[
+ ['package_20installation_0',['Package Installation',['../md__installation.html',1,'']]],
+ ['parent_1',['parent',['../class_nano_brain_1_1_nucleus.html#a0750e4d9ab80ff06bd58ffebca9d8c6d',1,'NanoBrain::Nucleus']]],
+ ['prefab_2',['prefab',['../class_nano_brain_1_1_cluster.html#a9a4c212d5247090d59489d3bb3d04c3d',1,'NanoBrain::Cluster']]],
+ ['processstimulus_3',['ProcessStimulus',['../class_nano_brain_1_1_neuron.html#a30c28f0ede8d4cba4e2937cade0e79e0',1,'NanoBrain::Neuron']]],
+ ['product_4',['Product',['../class_nano_brain_1_1_neuron.html#ad7745cc584fbc2659d77c3202ee6adfeadeb10517653c255364175796ace3553f',1,'NanoBrain::Neuron']]]
+];
diff --git a/Documentation/html/search/all_c.js.meta b/Documentation/html/search/all_c.js.meta
new file mode 100644
index 0000000..0c65a6c
--- /dev/null
+++ b/Documentation/html/search/all_c.js.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: f89ca4bd315f47af2aaaf696c03b7961
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Documentation/html/search/all_d.js b/Documentation/html/search/all_d.js
new file mode 100644
index 0000000..5b39ccf
--- /dev/null
+++ b/Documentation/html/search/all_d.js
@@ -0,0 +1,8 @@
+var searchData=
+[
+ ['refresh_0',['Refresh',['../class_nano_brain_1_1_cluster.html#a40ad7f93121a3684699c92bcb03b1c74',1,'NanoBrain::Cluster']]],
+ ['refreshcomputeorders_1',['RefreshComputeOrders',['../class_nano_brain_1_1_cluster.html#acff74557b8c50f2355898855f1ab6073',1,'NanoBrain::Cluster']]],
+ ['refreshoutputs_2',['RefreshOutputs',['../class_nano_brain_1_1_cluster.html#a209d8f083a5bd82ce764ee5ac7e9f97e',1,'NanoBrain::Cluster']]],
+ ['removeinstance_3',['RemoveInstance',['../class_nano_brain_1_1_cluster.html#a5454e0c01870e1c2df93b33f43704210',1,'NanoBrain::Cluster']]],
+ ['removesynapse_4',['RemoveSynapse',['../class_nano_brain_1_1_neuron.html#a2ae2b960608803beabade55d2c830088',1,'NanoBrain::Neuron']]]
+];
diff --git a/Documentation/html/search/all_d.js.meta b/Documentation/html/search/all_d.js.meta
new file mode 100644
index 0000000..6627451
--- /dev/null
+++ b/Documentation/html/search/all_d.js.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 0e60c1b9df4ad96c6b837b2df3ef3197
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Documentation/html/search/all_e.js b/Documentation/html/search/all_e.js
new file mode 100644
index 0000000..0e99acb
--- /dev/null
+++ b/Documentation/html/search/all_e.js
@@ -0,0 +1,9 @@
+var searchData=
+[
+ ['samples_20installation_0',['Samples Installation',['../md__installation.html#autotoc_md0',1,'']]],
+ ['setbias_1',['SetBias',['../class_nano_brain_1_1_neuron.html#a407e9fca0108715d6031ea4f2ae1005d',1,'NanoBrain::Neuron']]],
+ ['shallowcloneto_2',['shallowcloneto',['../class_nano_brain_1_1_cluster.html#a7ecc2afa858940901336663b435f8fb2',1,'NanoBrain.Cluster.ShallowCloneTo()'],['../class_nano_brain_1_1_neuron.html#afe95b6470ef7689253514229d02fe2b9',1,'NanoBrain.Neuron.ShallowCloneTo()'],['../class_nano_brain_1_1_nucleus.html#a4bb93cd4cd07072f35eae3a98ba5dde8',1,'NanoBrain.Nucleus.ShallowCloneTo()']]],
+ ['sum_3',['Sum',['../class_nano_brain_1_1_neuron.html#ad7745cc584fbc2659d77c3202ee6adfeaa0ec87054b5e5b7847d0d8780a01a3d5',1,'NanoBrain::Neuron']]],
+ ['synapse_4',['synapse',['../class_nano_brain_1_1_synapse.html',1,'NanoBrain.Synapse'],['../class_nano_brain_1_1_synapse.html#a63a57254f76939b6a7bbbeb630f839d2',1,'NanoBrain.Synapse.Synapse()']]],
+ ['synapses_5',['synapses',['../class_nano_brain_1_1_neuron.html#a96a7f4b8480a8fa9fce1d698a41e4dc7',1,'NanoBrain::Neuron']]]
+];
diff --git a/Documentation/html/search/all_e.js.meta b/Documentation/html/search/all_e.js.meta
new file mode 100644
index 0000000..4635491
--- /dev/null
+++ b/Documentation/html/search/all_e.js.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: bfcd342020a22d92685dbc246693fc4a
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Documentation/html/search/all_f.js b/Documentation/html/search/all_f.js
new file mode 100644
index 0000000..1765882
--- /dev/null
+++ b/Documentation/html/search/all_f.js
@@ -0,0 +1,7 @@
+var searchData=
+[
+ ['table_20of_20contents_0',['Table of Contents',['../index.html#autotoc_md1',1,'']]],
+ ['thingclusters_1',['thingClusters',['../class_nano_brain_1_1_cluster.html#a1ea21dfdb1cf3e0e032d44e41308ab04',1,'NanoBrain::Cluster']]],
+ ['trygetnucleus_2',['TryGetNucleus',['../class_nano_brain_1_1_cluster.html#a40543b820890917a47186b04f0d44478',1,'NanoBrain::Cluster']]],
+ ['type_3',['Type',['../class_nano_brain_1_1_nucleus.html#a16cdfb57663e2f1c4629c4291b889e89',1,'NanoBrain::Nucleus']]]
+];
diff --git a/Documentation/html/search/all_f.js.meta b/Documentation/html/search/all_f.js.meta
new file mode 100644
index 0000000..8721055
--- /dev/null
+++ b/Documentation/html/search/all_f.js.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 00d8778b6322d400c94a23c153aabe1c
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Documentation/html/search/classes_0.js b/Documentation/html/search/classes_0.js
new file mode 100644
index 0000000..611f125
--- /dev/null
+++ b/Documentation/html/search/classes_0.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['brain_0',['Brain',['../class_nano_brain_1_1_brain.html',1,'NanoBrain']]]
+];
diff --git a/Documentation/html/search/classes_0.js.meta b/Documentation/html/search/classes_0.js.meta
new file mode 100644
index 0000000..58bd709
--- /dev/null
+++ b/Documentation/html/search/classes_0.js.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 58020f5cf96f5ccaf93b855230f0e79b
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Documentation/html/search/classes_1.js b/Documentation/html/search/classes_1.js
new file mode 100644
index 0000000..4d550bb
--- /dev/null
+++ b/Documentation/html/search/classes_1.js
@@ -0,0 +1,5 @@
+var searchData=
+[
+ ['cluster_0',['Cluster',['../class_nano_brain_1_1_cluster.html',1,'NanoBrain']]],
+ ['clusterprefab_1',['ClusterPrefab',['../class_nano_brain_1_1_cluster_prefab.html',1,'NanoBrain']]]
+];
diff --git a/Documentation/html/search/classes_1.js.meta b/Documentation/html/search/classes_1.js.meta
new file mode 100644
index 0000000..d493c99
--- /dev/null
+++ b/Documentation/html/search/classes_1.js.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 1a4eecdf9848c3e7a94081e9d460757d
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Documentation/html/search/classes_2.js b/Documentation/html/search/classes_2.js
new file mode 100644
index 0000000..e9694e2
--- /dev/null
+++ b/Documentation/html/search/classes_2.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['memorycell_0',['MemoryCell',['../class_nano_brain_1_1_memory_cell.html',1,'NanoBrain']]]
+];
diff --git a/Documentation/html/search/classes_2.js.meta b/Documentation/html/search/classes_2.js.meta
new file mode 100644
index 0000000..f488b9d
--- /dev/null
+++ b/Documentation/html/search/classes_2.js.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: aeb163d5904c4b7c1b436d998ac2cd6f
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Documentation/html/search/classes_3.js b/Documentation/html/search/classes_3.js
new file mode 100644
index 0000000..fc3f027
--- /dev/null
+++ b/Documentation/html/search/classes_3.js
@@ -0,0 +1,5 @@
+var searchData=
+[
+ ['neuron_0',['Neuron',['../class_nano_brain_1_1_neuron.html',1,'NanoBrain']]],
+ ['nucleus_1',['Nucleus',['../class_nano_brain_1_1_nucleus.html',1,'NanoBrain']]]
+];
diff --git a/Documentation/html/search/classes_3.js.meta b/Documentation/html/search/classes_3.js.meta
new file mode 100644
index 0000000..0e3a822
--- /dev/null
+++ b/Documentation/html/search/classes_3.js.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 2d098db1c2b8d2a74ab46725ee498d54
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Documentation/html/search/classes_4.js b/Documentation/html/search/classes_4.js
new file mode 100644
index 0000000..c82e719
--- /dev/null
+++ b/Documentation/html/search/classes_4.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['synapse_0',['Synapse',['../class_nano_brain_1_1_synapse.html',1,'NanoBrain']]]
+];
diff --git a/Documentation/html/search/classes_4.js.meta b/Documentation/html/search/classes_4.js.meta
new file mode 100644
index 0000000..1fcab88
--- /dev/null
+++ b/Documentation/html/search/classes_4.js.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 782c95a9b0e4b3c838916fc671f880de
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Documentation/html/search/close.svg b/Documentation/html/search/close.svg
new file mode 100644
index 0000000..337d6cc
--- /dev/null
+++ b/Documentation/html/search/close.svg
@@ -0,0 +1,18 @@
+
+
+
+
+
+
diff --git a/Documentation/html/search/close.svg.meta b/Documentation/html/search/close.svg.meta
new file mode 100644
index 0000000..12e214a
--- /dev/null
+++ b/Documentation/html/search/close.svg.meta
@@ -0,0 +1,53 @@
+fileFormatVersion: 2
+guid: b098206296010c8f0984a8c214cd2d0a
+ScriptedImporter:
+ internalIDToNameTable: []
+ externalObjects: {}
+ serializedVersion: 2
+ userData:
+ assetBundleName:
+ assetBundleVariant:
+ script: {fileID: 12408, guid: 0000000000000000e000000000000000, type: 0}
+ svgType: 3
+ texturedSpriteMeshType: 0
+ svgPixelsPerUnit: 100
+ gradientResolution: 64
+ alignment: 0
+ customPivot: {x: 0, y: 0}
+ generatePhysicsShape: 0
+ viewportOptions: 0
+ preserveViewport: 0
+ advancedMode: 0
+ tessellationMode: 1
+ predefinedResolutionIndex: 1
+ targetResolution: 1080
+ resolutionMultiplier: 1
+ stepDistance: 10
+ samplingStepDistance: 100
+ maxCordDeviationEnabled: 0
+ maxCordDeviation: 1
+ maxTangentAngleEnabled: 0
+ maxTangentAngle: 5
+ keepTextureAspectRatio: 1
+ textureSize: 256
+ textureWidth: 256
+ textureHeight: 256
+ wrapMode: 0
+ filterMode: 1
+ sampleCount: 4
+ preserveSVGImageAspect: 0
+ useSVGPixelsPerUnit: 0
+ spriteData:
+ TessellationDetail: 0
+ SpriteName:
+ SpritePivot: {x: 0, y: 0}
+ SpriteAlignment: 0
+ SpriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ SpriteRect:
+ serializedVersion: 2
+ x: 0
+ y: 0
+ width: 0
+ height: 0
+ SpriteID:
+ PhysicsOutlines: []
diff --git a/Documentation/html/search/enums_0.js b/Documentation/html/search/enums_0.js
new file mode 100644
index 0000000..b0f050d
--- /dev/null
+++ b/Documentation/html/search/enums_0.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['activationtype_0',['ActivationType',['../class_nano_brain_1_1_neuron.html#ae558c02b00c776805c7fead42cb94612',1,'NanoBrain::Neuron']]]
+];
diff --git a/Documentation/html/search/enums_0.js.meta b/Documentation/html/search/enums_0.js.meta
new file mode 100644
index 0000000..86c309e
--- /dev/null
+++ b/Documentation/html/search/enums_0.js.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 1835aa295ea511a6fb757a41e31b1a22
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Documentation/html/search/enums_1.js b/Documentation/html/search/enums_1.js
new file mode 100644
index 0000000..a1effce
--- /dev/null
+++ b/Documentation/html/search/enums_1.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['combinatortype_0',['CombinatorType',['../class_nano_brain_1_1_neuron.html#ad7745cc584fbc2659d77c3202ee6adfe',1,'NanoBrain::Neuron']]]
+];
diff --git a/Documentation/html/search/enums_1.js.meta b/Documentation/html/search/enums_1.js.meta
new file mode 100644
index 0000000..8244f8e
--- /dev/null
+++ b/Documentation/html/search/enums_1.js.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 0b8d752ed60717203b1c14c244da6430
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Documentation/html/search/enums_2.js b/Documentation/html/search/enums_2.js
new file mode 100644
index 0000000..32db838
--- /dev/null
+++ b/Documentation/html/search/enums_2.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['type_0',['Type',['../class_nano_brain_1_1_nucleus.html#a16cdfb57663e2f1c4629c4291b889e89',1,'NanoBrain::Nucleus']]]
+];
diff --git a/Documentation/html/search/enums_2.js.meta b/Documentation/html/search/enums_2.js.meta
new file mode 100644
index 0000000..3f7d252
--- /dev/null
+++ b/Documentation/html/search/enums_2.js.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 492d68d0ec3a737d0a644c211f6f88ef
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Documentation/html/search/enumvalues_0.js b/Documentation/html/search/enumvalues_0.js
new file mode 100644
index 0000000..4e67e01
--- /dev/null
+++ b/Documentation/html/search/enumvalues_0.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['product_0',['Product',['../class_nano_brain_1_1_neuron.html#ad7745cc584fbc2659d77c3202ee6adfeadeb10517653c255364175796ace3553f',1,'NanoBrain::Neuron']]]
+];
diff --git a/Documentation/html/search/enumvalues_0.js.meta b/Documentation/html/search/enumvalues_0.js.meta
new file mode 100644
index 0000000..03b5941
--- /dev/null
+++ b/Documentation/html/search/enumvalues_0.js.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 4c7688f504683f6d4b98d94fe263782c
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Documentation/html/search/enumvalues_1.js b/Documentation/html/search/enumvalues_1.js
new file mode 100644
index 0000000..643f53e
--- /dev/null
+++ b/Documentation/html/search/enumvalues_1.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['sum_0',['Sum',['../class_nano_brain_1_1_neuron.html#ad7745cc584fbc2659d77c3202ee6adfeaa0ec87054b5e5b7847d0d8780a01a3d5',1,'NanoBrain::Neuron']]]
+];
diff --git a/Documentation/html/search/enumvalues_1.js.meta b/Documentation/html/search/enumvalues_1.js.meta
new file mode 100644
index 0000000..4b07e5e
--- /dev/null
+++ b/Documentation/html/search/enumvalues_1.js.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: dffdd2edef386a497be686c82df05a77
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Documentation/html/search/functions_0.js b/Documentation/html/search/functions_0.js
new file mode 100644
index 0000000..d6b6327
--- /dev/null
+++ b/Documentation/html/search/functions_0.js
@@ -0,0 +1,5 @@
+var searchData=
+[
+ ['addinstance_0',['addinstance',['../class_nano_brain_1_1_cluster.html#a01b55195c2f5be58659d9b0a5c993a8a',1,'NanoBrain.Cluster.AddInstance()'],['../class_nano_brain_1_1_cluster.html#a1b60bd296f757257a640559b732ed241',1,'NanoBrain.Cluster.AddInstance(ClusterPrefab prefab)']]],
+ ['addsynapse_1',['AddSynapse',['../class_nano_brain_1_1_neuron.html#a524fdd9e25ebbcb5baca60a942d6eb80',1,'NanoBrain::Neuron']]]
+];
diff --git a/Documentation/html/search/functions_0.js.meta b/Documentation/html/search/functions_0.js.meta
new file mode 100644
index 0000000..ce4e822
--- /dev/null
+++ b/Documentation/html/search/functions_0.js.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 65ed49f03cb48699081132677596b14e
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Documentation/html/search/functions_1.js b/Documentation/html/search/functions_1.js
new file mode 100644
index 0000000..d1b25bf
--- /dev/null
+++ b/Documentation/html/search/functions_1.js
@@ -0,0 +1,6 @@
+var searchData=
+[
+ ['cluster_0',['cluster',['../class_nano_brain_1_1_cluster.html#a86341cf5cc0d67a146a48e9c833df7ec',1,'NanoBrain.Cluster.Cluster(ClusterPrefab prefab, Cluster parent)'],['../class_nano_brain_1_1_cluster.html#a3a22ce2493a4d154fd971214b7c484d2',1,'NanoBrain.Cluster.Cluster(ClusterPrefab prefab, ClusterPrefab parent=null)']]],
+ ['collectreceivers_1',['CollectReceivers',['../class_nano_brain_1_1_cluster.html#ab067c159f399e69bcc9d2211bc9aa3c5',1,'NanoBrain::Cluster']]],
+ ['collectsynapsesto_2',['CollectSynapsesTo',['../class_nano_brain_1_1_cluster.html#a8736cab5b8381dc5a175fd03031d308e',1,'NanoBrain::Cluster']]]
+];
diff --git a/Documentation/html/search/functions_1.js.meta b/Documentation/html/search/functions_1.js.meta
new file mode 100644
index 0000000..94e0419
--- /dev/null
+++ b/Documentation/html/search/functions_1.js.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: ced74dd46c11936909db8f8f9022697c
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Documentation/html/search/functions_2.js b/Documentation/html/search/functions_2.js
new file mode 100644
index 0000000..1b5fcc2
--- /dev/null
+++ b/Documentation/html/search/functions_2.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['deletenucleus_0',['DeleteNucleus',['../class_nano_brain_1_1_cluster.html#a6b5855021a2733df3c25ed67e8777509',1,'NanoBrain::Cluster']]]
+];
diff --git a/Documentation/html/search/functions_2.js.meta b/Documentation/html/search/functions_2.js.meta
new file mode 100644
index 0000000..a64f5e4
--- /dev/null
+++ b/Documentation/html/search/functions_2.js.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: a0c134925cf8aa77d98a38a4ead437c3
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Documentation/html/search/functions_3.js b/Documentation/html/search/functions_3.js
new file mode 100644
index 0000000..ed9f385
--- /dev/null
+++ b/Documentation/html/search/functions_3.js
@@ -0,0 +1,7 @@
+var searchData=
+[
+ ['getneuron_0',['getneuron',['../class_nano_brain_1_1_cluster.html#a938f7cc08d8fee459e0203e3b6869e06',1,'NanoBrain.Cluster.GetNeuron(string neuronName)'],['../class_nano_brain_1_1_cluster.html#a696fcbdd1ae684a7b55963d8e673b22f',1,'NanoBrain.Cluster.GetNeuron(int thingId, string neuronName, string thingName=null)']]],
+ ['getnucleus_1',['getnucleus',['../class_nano_brain_1_1_cluster.html#a31a62471a88a8180963be74227fd68be',1,'NanoBrain.Cluster.GetNucleus()'],['../class_nano_brain_1_1_cluster_prefab.html#a49601bf5ea05b4f28974a5c0a1345286',1,'NanoBrain.ClusterPrefab.GetNucleus()']]],
+ ['getnucleusindex_2',['getnucleusindex',['../class_nano_brain_1_1_cluster.html#aec242a8433041ed22dde2375436016ce',1,'NanoBrain.Cluster.GetNucleusIndex(List< Nucleus > nuclei, Nucleus nucleus)'],['../class_nano_brain_1_1_cluster.html#ad9441d41aa6e2bfd3f9acf111dde1dd8',1,'NanoBrain.Cluster.GetNucleusIndex(List< Nucleus > nuclei, string nucleusName)']]],
+ ['getsynapse_3',['GetSynapse',['../class_nano_brain_1_1_neuron.html#a1f3c83acf569fa483101fd0ce11ec5fc',1,'NanoBrain::Neuron']]]
+];
diff --git a/Documentation/html/search/functions_3.js.meta b/Documentation/html/search/functions_3.js.meta
new file mode 100644
index 0000000..1e19153
--- /dev/null
+++ b/Documentation/html/search/functions_3.js.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 665a1ed08b7d61e27a5568974097e3fd
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Documentation/html/search/functions_4.js b/Documentation/html/search/functions_4.js
new file mode 100644
index 0000000..c855a1d
--- /dev/null
+++ b/Documentation/html/search/functions_4.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['neuron_0',['Neuron',['../class_nano_brain_1_1_neuron.html#a54a94ea928e9a54552692e7d1e84782e',1,'NanoBrain::Neuron']]]
+];
diff --git a/Documentation/html/search/functions_4.js.meta b/Documentation/html/search/functions_4.js.meta
new file mode 100644
index 0000000..568b3b2
--- /dev/null
+++ b/Documentation/html/search/functions_4.js.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 01d34ffd14a97c743b4d7ac0aba7d702
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Documentation/html/search/functions_5.js b/Documentation/html/search/functions_5.js
new file mode 100644
index 0000000..649d473
--- /dev/null
+++ b/Documentation/html/search/functions_5.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['processstimulus_0',['ProcessStimulus',['../class_nano_brain_1_1_neuron.html#a30c28f0ede8d4cba4e2937cade0e79e0',1,'NanoBrain::Neuron']]]
+];
diff --git a/Documentation/html/search/functions_5.js.meta b/Documentation/html/search/functions_5.js.meta
new file mode 100644
index 0000000..40ae364
--- /dev/null
+++ b/Documentation/html/search/functions_5.js.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 81fdf1e58035175299f1747116f142cd
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Documentation/html/search/functions_6.js b/Documentation/html/search/functions_6.js
new file mode 100644
index 0000000..5b39ccf
--- /dev/null
+++ b/Documentation/html/search/functions_6.js
@@ -0,0 +1,8 @@
+var searchData=
+[
+ ['refresh_0',['Refresh',['../class_nano_brain_1_1_cluster.html#a40ad7f93121a3684699c92bcb03b1c74',1,'NanoBrain::Cluster']]],
+ ['refreshcomputeorders_1',['RefreshComputeOrders',['../class_nano_brain_1_1_cluster.html#acff74557b8c50f2355898855f1ab6073',1,'NanoBrain::Cluster']]],
+ ['refreshoutputs_2',['RefreshOutputs',['../class_nano_brain_1_1_cluster.html#a209d8f083a5bd82ce764ee5ac7e9f97e',1,'NanoBrain::Cluster']]],
+ ['removeinstance_3',['RemoveInstance',['../class_nano_brain_1_1_cluster.html#a5454e0c01870e1c2df93b33f43704210',1,'NanoBrain::Cluster']]],
+ ['removesynapse_4',['RemoveSynapse',['../class_nano_brain_1_1_neuron.html#a2ae2b960608803beabade55d2c830088',1,'NanoBrain::Neuron']]]
+];
diff --git a/Documentation/html/search/functions_6.js.meta b/Documentation/html/search/functions_6.js.meta
new file mode 100644
index 0000000..9c78ac7
--- /dev/null
+++ b/Documentation/html/search/functions_6.js.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 2ecf36c75790523df9f71bcffb8a2900
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Documentation/html/search/functions_7.js b/Documentation/html/search/functions_7.js
new file mode 100644
index 0000000..09608d8
--- /dev/null
+++ b/Documentation/html/search/functions_7.js
@@ -0,0 +1,6 @@
+var searchData=
+[
+ ['setbias_0',['SetBias',['../class_nano_brain_1_1_neuron.html#a407e9fca0108715d6031ea4f2ae1005d',1,'NanoBrain::Neuron']]],
+ ['shallowcloneto_1',['shallowcloneto',['../class_nano_brain_1_1_cluster.html#a7ecc2afa858940901336663b435f8fb2',1,'NanoBrain.Cluster.ShallowCloneTo()'],['../class_nano_brain_1_1_neuron.html#afe95b6470ef7689253514229d02fe2b9',1,'NanoBrain.Neuron.ShallowCloneTo()'],['../class_nano_brain_1_1_nucleus.html#a4bb93cd4cd07072f35eae3a98ba5dde8',1,'NanoBrain.Nucleus.ShallowCloneTo()']]],
+ ['synapse_2',['Synapse',['../class_nano_brain_1_1_synapse.html#a63a57254f76939b6a7bbbeb630f839d2',1,'NanoBrain::Synapse']]]
+];
diff --git a/Documentation/html/search/functions_7.js.meta b/Documentation/html/search/functions_7.js.meta
new file mode 100644
index 0000000..846555a
--- /dev/null
+++ b/Documentation/html/search/functions_7.js.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 3a0c573691300e89d9cdcdfe9c64e9a7
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Documentation/html/search/functions_8.js b/Documentation/html/search/functions_8.js
new file mode 100644
index 0000000..eb4e316
--- /dev/null
+++ b/Documentation/html/search/functions_8.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['trygetnucleus_0',['TryGetNucleus',['../class_nano_brain_1_1_cluster.html#a40543b820890917a47186b04f0d44478',1,'NanoBrain::Cluster']]]
+];
diff --git a/Documentation/html/search/functions_8.js.meta b/Documentation/html/search/functions_8.js.meta
new file mode 100644
index 0000000..cc8d6e3
--- /dev/null
+++ b/Documentation/html/search/functions_8.js.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 1e1e327b7d4c34f269fc0762fdd605ea
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Documentation/html/search/functions_9.js b/Documentation/html/search/functions_9.js
new file mode 100644
index 0000000..45f6fe1
--- /dev/null
+++ b/Documentation/html/search/functions_9.js
@@ -0,0 +1,7 @@
+var searchData=
+[
+ ['updatefromnucleus_0',['UpdateFromNucleus',['../class_nano_brain_1_1_cluster.html#ab2e33a3a6642d31b5a927c7ee2db73ab',1,'NanoBrain::Cluster']]],
+ ['updatenuclei_1',['updatenuclei',['../class_nano_brain_1_1_memory_cell.html#a780592351f670461286b8cd00ec42ebd',1,'NanoBrain.MemoryCell.UpdateNuclei()'],['../class_nano_brain_1_1_nucleus.html#a31e93d392a4a861b55f3d87f0a7d6d59',1,'NanoBrain.Nucleus.UpdateNuclei()']]],
+ ['updatestateisolated_2',['updatestateisolated',['../class_nano_brain_1_1_cluster.html#ac40b182a3c5f32ec055d7fabbeaedbf3',1,'NanoBrain.Cluster.UpdateStateIsolated()'],['../class_nano_brain_1_1_nucleus.html#aaf267af9b5ad1b5f0247f04ed2934f97',1,'NanoBrain.Nucleus.UpdateStateIsolated()']]],
+ ['updateweight_3',['UpdateWeight',['../class_nano_brain_1_1_brain.html#a552d2f938f63f3c0f1997174d9098334',1,'NanoBrain::Brain']]]
+];
diff --git a/Documentation/html/search/functions_9.js.meta b/Documentation/html/search/functions_9.js.meta
new file mode 100644
index 0000000..3dd70af
--- /dev/null
+++ b/Documentation/html/search/functions_9.js.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: d1db4d60c64a08735b3de279a9a6d3ab
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Documentation/html/search/mag.svg b/Documentation/html/search/mag.svg
new file mode 100644
index 0000000..ffb6cf0
--- /dev/null
+++ b/Documentation/html/search/mag.svg
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
diff --git a/Documentation/html/search/mag.svg.meta b/Documentation/html/search/mag.svg.meta
new file mode 100644
index 0000000..d321622
--- /dev/null
+++ b/Documentation/html/search/mag.svg.meta
@@ -0,0 +1,53 @@
+fileFormatVersion: 2
+guid: 670ba244be3f5de23866683631f24f68
+ScriptedImporter:
+ internalIDToNameTable: []
+ externalObjects: {}
+ serializedVersion: 2
+ userData:
+ assetBundleName:
+ assetBundleVariant:
+ script: {fileID: 12408, guid: 0000000000000000e000000000000000, type: 0}
+ svgType: 3
+ texturedSpriteMeshType: 0
+ svgPixelsPerUnit: 100
+ gradientResolution: 64
+ alignment: 0
+ customPivot: {x: 0, y: 0}
+ generatePhysicsShape: 0
+ viewportOptions: 0
+ preserveViewport: 0
+ advancedMode: 0
+ tessellationMode: 1
+ predefinedResolutionIndex: 1
+ targetResolution: 1080
+ resolutionMultiplier: 1
+ stepDistance: 10
+ samplingStepDistance: 100
+ maxCordDeviationEnabled: 0
+ maxCordDeviation: 1
+ maxTangentAngleEnabled: 0
+ maxTangentAngle: 5
+ keepTextureAspectRatio: 1
+ textureSize: 256
+ textureWidth: 256
+ textureHeight: 256
+ wrapMode: 0
+ filterMode: 1
+ sampleCount: 4
+ preserveSVGImageAspect: 0
+ useSVGPixelsPerUnit: 0
+ spriteData:
+ TessellationDetail: 0
+ SpriteName:
+ SpritePivot: {x: 0, y: 0}
+ SpriteAlignment: 0
+ SpriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ SpriteRect:
+ serializedVersion: 2
+ x: 0
+ y: 0
+ width: 0
+ height: 0
+ SpriteID:
+ PhysicsOutlines: []
diff --git a/Documentation/html/search/mag_d.svg b/Documentation/html/search/mag_d.svg
new file mode 100644
index 0000000..4122773
--- /dev/null
+++ b/Documentation/html/search/mag_d.svg
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
diff --git a/Documentation/html/search/mag_d.svg.meta b/Documentation/html/search/mag_d.svg.meta
new file mode 100644
index 0000000..31d72f6
--- /dev/null
+++ b/Documentation/html/search/mag_d.svg.meta
@@ -0,0 +1,53 @@
+fileFormatVersion: 2
+guid: bb69c47921567861fbba56647589ec16
+ScriptedImporter:
+ internalIDToNameTable: []
+ externalObjects: {}
+ serializedVersion: 2
+ userData:
+ assetBundleName:
+ assetBundleVariant:
+ script: {fileID: 12408, guid: 0000000000000000e000000000000000, type: 0}
+ svgType: 3
+ texturedSpriteMeshType: 0
+ svgPixelsPerUnit: 100
+ gradientResolution: 64
+ alignment: 0
+ customPivot: {x: 0, y: 0}
+ generatePhysicsShape: 0
+ viewportOptions: 0
+ preserveViewport: 0
+ advancedMode: 0
+ tessellationMode: 1
+ predefinedResolutionIndex: 1
+ targetResolution: 1080
+ resolutionMultiplier: 1
+ stepDistance: 10
+ samplingStepDistance: 100
+ maxCordDeviationEnabled: 0
+ maxCordDeviation: 1
+ maxTangentAngleEnabled: 0
+ maxTangentAngle: 5
+ keepTextureAspectRatio: 1
+ textureSize: 256
+ textureWidth: 256
+ textureHeight: 256
+ wrapMode: 0
+ filterMode: 1
+ sampleCount: 4
+ preserveSVGImageAspect: 0
+ useSVGPixelsPerUnit: 0
+ spriteData:
+ TessellationDetail: 0
+ SpriteName:
+ SpritePivot: {x: 0, y: 0}
+ SpriteAlignment: 0
+ SpriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ SpriteRect:
+ serializedVersion: 2
+ x: 0
+ y: 0
+ width: 0
+ height: 0
+ SpriteID:
+ PhysicsOutlines: []
diff --git a/Documentation/html/search/mag_sel.svg b/Documentation/html/search/mag_sel.svg
new file mode 100644
index 0000000..553dba8
--- /dev/null
+++ b/Documentation/html/search/mag_sel.svg
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
+
diff --git a/Documentation/html/search/mag_sel.svg.meta b/Documentation/html/search/mag_sel.svg.meta
new file mode 100644
index 0000000..399b5e1
--- /dev/null
+++ b/Documentation/html/search/mag_sel.svg.meta
@@ -0,0 +1,53 @@
+fileFormatVersion: 2
+guid: b9324c2942b664fb0a31114d5552801c
+ScriptedImporter:
+ internalIDToNameTable: []
+ externalObjects: {}
+ serializedVersion: 2
+ userData:
+ assetBundleName:
+ assetBundleVariant:
+ script: {fileID: 12408, guid: 0000000000000000e000000000000000, type: 0}
+ svgType: 3
+ texturedSpriteMeshType: 0
+ svgPixelsPerUnit: 100
+ gradientResolution: 64
+ alignment: 0
+ customPivot: {x: 0, y: 0}
+ generatePhysicsShape: 0
+ viewportOptions: 0
+ preserveViewport: 0
+ advancedMode: 0
+ tessellationMode: 1
+ predefinedResolutionIndex: 1
+ targetResolution: 1080
+ resolutionMultiplier: 1
+ stepDistance: 10
+ samplingStepDistance: 100
+ maxCordDeviationEnabled: 0
+ maxCordDeviation: 1
+ maxTangentAngleEnabled: 0
+ maxTangentAngle: 5
+ keepTextureAspectRatio: 1
+ textureSize: 256
+ textureWidth: 256
+ textureHeight: 256
+ wrapMode: 0
+ filterMode: 1
+ sampleCount: 4
+ preserveSVGImageAspect: 0
+ useSVGPixelsPerUnit: 0
+ spriteData:
+ TessellationDetail: 0
+ SpriteName:
+ SpritePivot: {x: 0, y: 0}
+ SpriteAlignment: 0
+ SpriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ SpriteRect:
+ serializedVersion: 2
+ x: 0
+ y: 0
+ width: 0
+ height: 0
+ SpriteID:
+ PhysicsOutlines: []
diff --git a/Documentation/html/search/mag_seld.svg b/Documentation/html/search/mag_seld.svg
new file mode 100644
index 0000000..c906f84
--- /dev/null
+++ b/Documentation/html/search/mag_seld.svg
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
+
diff --git a/Documentation/html/search/mag_seld.svg.meta b/Documentation/html/search/mag_seld.svg.meta
new file mode 100644
index 0000000..fd12b38
--- /dev/null
+++ b/Documentation/html/search/mag_seld.svg.meta
@@ -0,0 +1,53 @@
+fileFormatVersion: 2
+guid: 41e1362773440fefa94c022a6cf72822
+ScriptedImporter:
+ internalIDToNameTable: []
+ externalObjects: {}
+ serializedVersion: 2
+ userData:
+ assetBundleName:
+ assetBundleVariant:
+ script: {fileID: 12408, guid: 0000000000000000e000000000000000, type: 0}
+ svgType: 3
+ texturedSpriteMeshType: 0
+ svgPixelsPerUnit: 100
+ gradientResolution: 64
+ alignment: 0
+ customPivot: {x: 0, y: 0}
+ generatePhysicsShape: 0
+ viewportOptions: 0
+ preserveViewport: 0
+ advancedMode: 0
+ tessellationMode: 1
+ predefinedResolutionIndex: 1
+ targetResolution: 1080
+ resolutionMultiplier: 1
+ stepDistance: 10
+ samplingStepDistance: 100
+ maxCordDeviationEnabled: 0
+ maxCordDeviation: 1
+ maxTangentAngleEnabled: 0
+ maxTangentAngle: 5
+ keepTextureAspectRatio: 1
+ textureSize: 256
+ textureWidth: 256
+ textureHeight: 256
+ wrapMode: 0
+ filterMode: 1
+ sampleCount: 4
+ preserveSVGImageAspect: 0
+ useSVGPixelsPerUnit: 0
+ spriteData:
+ TessellationDetail: 0
+ SpriteName:
+ SpritePivot: {x: 0, y: 0}
+ SpriteAlignment: 0
+ SpriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ SpriteRect:
+ serializedVersion: 2
+ x: 0
+ y: 0
+ width: 0
+ height: 0
+ SpriteID:
+ PhysicsOutlines: []
diff --git a/Documentation/html/search/namespaces_0.js b/Documentation/html/search/namespaces_0.js
new file mode 100644
index 0000000..f525ebd
--- /dev/null
+++ b/Documentation/html/search/namespaces_0.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['nanobrain_0',['NanoBrain',['../namespace_nano_brain.html',1,'']]]
+];
diff --git a/Documentation/html/search/namespaces_0.js.meta b/Documentation/html/search/namespaces_0.js.meta
new file mode 100644
index 0000000..99c7f56
--- /dev/null
+++ b/Documentation/html/search/namespaces_0.js.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: c365b7848f276d43ca260709ba34d31a
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Documentation/html/search/pages_0.js b/Documentation/html/search/pages_0.js
new file mode 100644
index 0000000..bde3ebd
--- /dev/null
+++ b/Documentation/html/search/pages_0.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['brain_20for_20unity_0',['Nano Brain for Unity',['../index.html',1,'']]]
+];
diff --git a/Documentation/html/search/pages_0.js.meta b/Documentation/html/search/pages_0.js.meta
new file mode 100644
index 0000000..c27e077
--- /dev/null
+++ b/Documentation/html/search/pages_0.js.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 6c981a5cf6b62efa5b9c32f9e1b95a62
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Documentation/html/search/pages_1.js b/Documentation/html/search/pages_1.js
new file mode 100644
index 0000000..ca40bee
--- /dev/null
+++ b/Documentation/html/search/pages_1.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['for_20unity_0',['Nano Brain for Unity',['../index.html',1,'']]]
+];
diff --git a/Documentation/html/search/pages_1.js.meta b/Documentation/html/search/pages_1.js.meta
new file mode 100644
index 0000000..227b374
--- /dev/null
+++ b/Documentation/html/search/pages_1.js.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 5b9c38fe93e76835d9d7f62d5617818d
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Documentation/html/search/pages_2.js b/Documentation/html/search/pages_2.js
new file mode 100644
index 0000000..dc6d821
--- /dev/null
+++ b/Documentation/html/search/pages_2.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['installation_0',['Package Installation',['../md__installation.html',1,'']]]
+];
diff --git a/Documentation/html/search/pages_2.js.meta b/Documentation/html/search/pages_2.js.meta
new file mode 100644
index 0000000..2e9236e
--- /dev/null
+++ b/Documentation/html/search/pages_2.js.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 2b5c7292911003947b81c10e8cec49bf
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Documentation/html/search/pages_3.js b/Documentation/html/search/pages_3.js
new file mode 100644
index 0000000..11dd9d9
--- /dev/null
+++ b/Documentation/html/search/pages_3.js
@@ -0,0 +1,5 @@
+var searchData=
+[
+ ['nano_20brain_20for_20unity_0',['Nano Brain for Unity',['../index.html',1,'']]],
+ ['nanobrain_1',['NanoBrain',['../md__2home_2pascal_2_development_2_projects_2_passer_2_nano_brain_2_nano_brain_2_assets_2_nano_brain-unitypackage_2_r_e_a_d_m_e.html',1,'']]]
+];
diff --git a/Documentation/html/search/pages_3.js.meta b/Documentation/html/search/pages_3.js.meta
new file mode 100644
index 0000000..44a34fb
--- /dev/null
+++ b/Documentation/html/search/pages_3.js.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: d5e898cec12687524ad13a526157c187
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Documentation/html/search/pages_4.js b/Documentation/html/search/pages_4.js
new file mode 100644
index 0000000..05d1d2d
--- /dev/null
+++ b/Documentation/html/search/pages_4.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['package_20installation_0',['Package Installation',['../md__installation.html',1,'']]]
+];
diff --git a/Documentation/html/search/pages_4.js.meta b/Documentation/html/search/pages_4.js.meta
new file mode 100644
index 0000000..2730d6b
--- /dev/null
+++ b/Documentation/html/search/pages_4.js.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 762ab96aefd8932e5829f8fd5cb0bd93
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Documentation/html/search/pages_5.js b/Documentation/html/search/pages_5.js
new file mode 100644
index 0000000..6508dbb
--- /dev/null
+++ b/Documentation/html/search/pages_5.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['unity_0',['Nano Brain for Unity',['../index.html',1,'']]]
+];
diff --git a/Documentation/html/search/pages_5.js.meta b/Documentation/html/search/pages_5.js.meta
new file mode 100644
index 0000000..9869dd9
--- /dev/null
+++ b/Documentation/html/search/pages_5.js.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 30e182245cd305c60b79eefcba82a8e2
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Documentation/html/search/properties_0.js b/Documentation/html/search/properties_0.js
new file mode 100644
index 0000000..b0f4491
--- /dev/null
+++ b/Documentation/html/search/properties_0.js
@@ -0,0 +1,5 @@
+var searchData=
+[
+ ['basename_0',['baseName',['../class_nano_brain_1_1_cluster.html#ad81aed306939c26d22043ca3a0cd71c4',1,'NanoBrain::Cluster']]],
+ ['brain_1',['brain',['../class_nano_brain_1_1_brain.html#a9c34c8cba2339f23b6406c45ab8490a8',1,'NanoBrain::Brain']]]
+];
diff --git a/Documentation/html/search/properties_0.js.meta b/Documentation/html/search/properties_0.js.meta
new file mode 100644
index 0000000..3067454
--- /dev/null
+++ b/Documentation/html/search/properties_0.js.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: a5fbd96f77d256c5a90d2c67616466e4
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Documentation/html/search/properties_1.js b/Documentation/html/search/properties_1.js
new file mode 100644
index 0000000..1600c64
--- /dev/null
+++ b/Documentation/html/search/properties_1.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['computeorders_0',['computeOrders',['../class_nano_brain_1_1_cluster.html#af3bb2af13fc7fcb15e7610d4c81cb395',1,'NanoBrain::Cluster']]]
+];
diff --git a/Documentation/html/search/properties_1.js.meta b/Documentation/html/search/properties_1.js.meta
new file mode 100644
index 0000000..e12ccc6
--- /dev/null
+++ b/Documentation/html/search/properties_1.js.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: fe74a155ea6d16028b093404058396c3
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Documentation/html/search/properties_2.js b/Documentation/html/search/properties_2.js
new file mode 100644
index 0000000..1e01f0d
--- /dev/null
+++ b/Documentation/html/search/properties_2.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['defaultoutput_0',['defaultOutput',['../class_nano_brain_1_1_cluster.html#ac2d36a78d001fde5c95bc48f32e0fcc7',1,'NanoBrain::Cluster']]]
+];
diff --git a/Documentation/html/search/properties_2.js.meta b/Documentation/html/search/properties_2.js.meta
new file mode 100644
index 0000000..0ae2ed6
--- /dev/null
+++ b/Documentation/html/search/properties_2.js.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: d052bcbbc70413592b4cba9cfeec57cb
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Documentation/html/search/properties_3.js b/Documentation/html/search/properties_3.js
new file mode 100644
index 0000000..4ee7c8c
--- /dev/null
+++ b/Documentation/html/search/properties_3.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['outputs_0',['outputs',['../class_nano_brain_1_1_cluster.html#a89d8b00304b04025ae0446421363aa1f',1,'NanoBrain::Cluster']]]
+];
diff --git a/Documentation/html/search/properties_3.js.meta b/Documentation/html/search/properties_3.js.meta
new file mode 100644
index 0000000..69c3144
--- /dev/null
+++ b/Documentation/html/search/properties_3.js.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 127747e533ee9514eb83446dfe69454c
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Documentation/html/search/properties_4.js b/Documentation/html/search/properties_4.js
new file mode 100644
index 0000000..8e2934b
--- /dev/null
+++ b/Documentation/html/search/properties_4.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['synapses_0',['synapses',['../class_nano_brain_1_1_neuron.html#a96a7f4b8480a8fa9fce1d698a41e4dc7',1,'NanoBrain::Neuron']]]
+];
diff --git a/Documentation/html/search/properties_4.js.meta b/Documentation/html/search/properties_4.js.meta
new file mode 100644
index 0000000..641633c
--- /dev/null
+++ b/Documentation/html/search/properties_4.js.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: b3c3469325562c7bc9c32b04b0931302
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Documentation/html/search/search.css b/Documentation/html/search/search.css
new file mode 100644
index 0000000..feb41e1
--- /dev/null
+++ b/Documentation/html/search/search.css
@@ -0,0 +1,291 @@
+/*---------------- Search Box positioning */
+
+#main-menu > li:last-child {
+ /* This object is the parent of the search bar */
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ height: 36px;
+ margin-right: 1em;
+}
+
+/*---------------- Search box styling */
+
+.SRPage * {
+ font-weight: normal;
+ line-height: normal;
+}
+
+dark-mode-toggle {
+ margin-left: 5px;
+ display: flex;
+ float: right;
+}
+
+#MSearchBox {
+ display: inline-block;
+ white-space : nowrap;
+ background: white;
+ border-radius: 0.65em;
+ box-shadow: inset 0.5px 0.5px 3px 0px #555;
+ z-index: 102;
+}
+
+#MSearchBox .left {
+ display: inline-block;
+ vertical-align: middle;
+ height: 1.4em;
+}
+
+#MSearchSelect {
+ display: inline-block;
+ vertical-align: middle;
+ width: 20px;
+ height: 19px;
+ background-image: url('mag_sel.svg');
+ margin: 0 0 0 0.3em;
+ padding: 0;
+}
+
+#MSearchSelectExt {
+ display: inline-block;
+ vertical-align: middle;
+ width: 10px;
+ height: 19px;
+ background-image: url('mag.svg');
+ margin: 0 0 0 0.5em;
+ padding: 0;
+}
+
+
+#MSearchField {
+ display: inline-block;
+ vertical-align: middle;
+ width: 7.5em;
+ height: 19px;
+ margin: 0 0.15em;
+ padding: 0;
+ line-height: 1em;
+ border:none;
+ color: #909090;
+ outline: none;
+ font-family: Arial,Verdana,sans-serif;
+ -webkit-border-radius: 0px;
+ border-radius: 0px;
+ background: none;
+}
+
+@media(hover: none) {
+ /* to avoid zooming on iOS */
+ #MSearchField {
+ font-size: 16px;
+ }
+}
+
+#MSearchBox .right {
+ display: inline-block;
+ vertical-align: middle;
+ width: 1.4em;
+ height: 1.4em;
+}
+
+#MSearchClose {
+ display: none;
+ font-size: inherit;
+ background : none;
+ border: none;
+ margin: 0;
+ padding: 0;
+ outline: none;
+
+}
+
+#MSearchCloseImg {
+ padding: 0.3em;
+ margin: 0;
+}
+
+.MSearchBoxActive #MSearchField {
+ color: black;
+}
+
+
+
+/*---------------- Search filter selection */
+
+#MSearchSelectWindow {
+ display: none;
+ position: absolute;
+ left: 0; top: 0;
+ border: 1px solid #9D9D9D;
+ background-color: #F9F9F9;
+ z-index: 10001;
+ padding-top: 4px;
+ padding-bottom: 4px;
+ -moz-border-radius: 4px;
+ -webkit-border-top-left-radius: 4px;
+ -webkit-border-top-right-radius: 4px;
+ -webkit-border-bottom-left-radius: 4px;
+ -webkit-border-bottom-right-radius: 4px;
+ -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
+}
+
+.SelectItem {
+ font: 8pt Arial,Verdana,sans-serif;
+ padding-left: 2px;
+ padding-right: 12px;
+ border: 0px;
+}
+
+span.SelectionMark {
+ margin-right: 4px;
+ font-family: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed;
+ outline-style: none;
+ text-decoration: none;
+}
+
+a.SelectItem {
+ display: block;
+ outline-style: none;
+ color: black;
+ text-decoration: none;
+ padding-left: 6px;
+ padding-right: 12px;
+}
+
+a.SelectItem:focus,
+a.SelectItem:active {
+ color: black;
+ outline-style: none;
+ text-decoration: none;
+}
+
+a.SelectItem:hover {
+ color: white;
+ background-color: #4D4D4D;
+ outline-style: none;
+ text-decoration: none;
+ cursor: pointer;
+ display: block;
+}
+
+/*---------------- Search results window */
+
+iframe#MSearchResults {
+ /*width: 60ex;*/
+ height: 15em;
+}
+
+#MSearchResultsWindow {
+ display: none;
+ position: absolute;
+ left: 0; top: 0;
+ border: 1px solid black;
+ background-color: #EFEFEF;
+ z-index:10000;
+ width: 300px;
+ height: 400px;
+ overflow: auto;
+}
+
+/* ----------------------------------- */
+
+
+#SRIndex {
+ clear:both;
+}
+
+.SREntry {
+ font-size: 10pt;
+ padding-left: 1ex;
+}
+
+.SRPage .SREntry {
+ font-size: 8pt;
+ padding: 1px 5px;
+}
+
+div.SRPage {
+ margin: 5px 2px;
+ background-color: #EFEFEF;
+}
+
+.SRChildren {
+ padding-left: 3ex; padding-bottom: .5em
+}
+
+.SRPage .SRChildren {
+ display: none;
+}
+
+.SRSymbol {
+ font-weight: bold;
+ color: #555555;
+ font-family: Arial,Verdana,sans-serif;
+ text-decoration: none;
+ outline: none;
+}
+
+a.SRScope {
+ display: block;
+ color: #555555;
+ font-family: Arial,Verdana,sans-serif;
+ font-size: 8pt;
+ text-decoration: none;
+ outline: none;
+}
+
+a.SRSymbol:focus, a.SRSymbol:active,
+a.SRScope:focus, a.SRScope:active {
+ text-decoration: underline;
+}
+
+span.SRScope {
+ padding-left: 4px;
+ font-family: Arial,Verdana,sans-serif;
+}
+
+.SRPage .SRStatus {
+ padding: 2px 5px;
+ font-size: 8pt;
+ font-style: italic;
+ font-family: Arial,Verdana,sans-serif;
+}
+
+.SRResult {
+ display: none;
+}
+
+div.searchresults {
+ margin-left: 10px;
+ margin-right: 10px;
+}
+
+/*---------------- External search page results */
+
+.pages b {
+ color: white;
+ padding: 5px 5px 3px 5px;
+ background-image: url("../tab_a.png");
+ background-repeat: repeat-x;
+ text-shadow: 0 1px 1px #000000;
+}
+
+.pages {
+ line-height: 17px;
+ margin-left: 4px;
+ text-decoration: none;
+}
+
+.hl {
+ font-weight: bold;
+}
+
+#searchresults {
+ margin-bottom: 20px;
+}
+
+.searchpages {
+ margin-top: 10px;
+}
+
diff --git a/Documentation/html/search/search.css.meta b/Documentation/html/search/search.css.meta
new file mode 100644
index 0000000..65f4249
--- /dev/null
+++ b/Documentation/html/search/search.css.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 2dc5ca8306640ec9cbbd36d4afa4334e
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Documentation/html/search/search.js b/Documentation/html/search/search.js
new file mode 100644
index 0000000..6fd40c6
--- /dev/null
+++ b/Documentation/html/search/search.js
@@ -0,0 +1,840 @@
+/*
+ @licstart The following is the entire license notice for the JavaScript code in this file.
+
+ The MIT License (MIT)
+
+ Copyright (C) 1997-2020 by Dimitri van Heesch
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+ and associated documentation files (the "Software"), to deal in the Software without restriction,
+ including without limitation the rights to use, copy, modify, merge, publish, distribute,
+ sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all copies or
+ substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+ BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+ @licend The above is the entire license notice for the JavaScript code in this file
+ */
+function convertToId(search)
+{
+ var result = '';
+ for (i=0;i do a search
+ {
+ this.Search();
+ }
+ }
+
+ this.OnSearchSelectKey = function(evt)
+ {
+ var e = (evt) ? evt : window.event; // for IE
+ if (e.keyCode==40 && this.searchIndex0) // Up
+ {
+ this.searchIndex--;
+ this.OnSelectItem(this.searchIndex);
+ }
+ else if (e.keyCode==13 || e.keyCode==27)
+ {
+ e.stopPropagation();
+ this.OnSelectItem(this.searchIndex);
+ this.CloseSelectionWindow();
+ this.DOMSearchField().focus();
+ }
+ return false;
+ }
+
+ // --------- Actions
+
+ // Closes the results window.
+ this.CloseResultsWindow = function()
+ {
+ this.DOMPopupSearchResultsWindow().style.display = 'none';
+ this.DOMSearchClose().style.display = 'none';
+ this.Activate(false);
+ }
+
+ this.CloseSelectionWindow = function()
+ {
+ this.DOMSearchSelectWindow().style.display = 'none';
+ }
+
+ // Performs a search.
+ this.Search = function()
+ {
+ this.keyTimeout = 0;
+
+ // strip leading whitespace
+ var searchValue = this.DOMSearchField().value.replace(/^ +/, "");
+
+ var code = searchValue.toLowerCase().charCodeAt(0);
+ var idxChar = searchValue.substr(0, 1).toLowerCase();
+ if ( 0xD800 <= code && code <= 0xDBFF && searchValue > 1) // surrogate pair
+ {
+ idxChar = searchValue.substr(0, 2);
+ }
+
+ var jsFile;
+
+ var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar);
+ if (idx!=-1)
+ {
+ var hexCode=idx.toString(16);
+ jsFile = this.resultsPath + indexSectionNames[this.searchIndex] + '_' + hexCode + '.js';
+ }
+
+ var loadJS = function(url, impl, loc){
+ var scriptTag = document.createElement('script');
+ scriptTag.src = url;
+ scriptTag.onload = impl;
+ scriptTag.onreadystatechange = impl;
+ loc.appendChild(scriptTag);
+ }
+
+ var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow();
+ var domSearchBox = this.DOMSearchBox();
+ var domPopupSearchResults = this.DOMPopupSearchResults();
+ var domSearchClose = this.DOMSearchClose();
+ var resultsPath = this.resultsPath;
+
+ var handleResults = function() {
+ document.getElementById("Loading").style.display="none";
+ if (typeof searchData !== 'undefined') {
+ createResults(resultsPath);
+ document.getElementById("NoMatches").style.display="none";
+ }
+
+ if (idx!=-1) {
+ searchResults.Search(searchValue);
+ } else { // no file with search results => force empty search results
+ searchResults.Search('====');
+ }
+
+ if (domPopupSearchResultsWindow.style.display!='block')
+ {
+ domSearchClose.style.display = 'inline-block';
+ var left = getXPos(domSearchBox) + 150;
+ var top = getYPos(domSearchBox) + 20;
+ domPopupSearchResultsWindow.style.display = 'block';
+ left -= domPopupSearchResults.offsetWidth;
+ var maxWidth = document.body.clientWidth;
+ var maxHeight = document.body.clientHeight;
+ var width = 300;
+ if (left<10) left=10;
+ if (width+left+8>maxWidth) width=maxWidth-left-8;
+ var height = 400;
+ if (height+top+8>maxHeight) height=maxHeight-top-8;
+ domPopupSearchResultsWindow.style.top = top + 'px';
+ domPopupSearchResultsWindow.style.left = left + 'px';
+ domPopupSearchResultsWindow.style.width = width + 'px';
+ domPopupSearchResultsWindow.style.height = height + 'px';
+ }
+ }
+
+ if (jsFile) {
+ loadJS(jsFile, handleResults, this.DOMPopupSearchResultsWindow());
+ } else {
+ handleResults();
+ }
+
+ this.lastSearchValue = searchValue;
+ }
+
+ // -------- Activation Functions
+
+ // Activates or deactivates the search panel, resetting things to
+ // their default values if necessary.
+ this.Activate = function(isActive)
+ {
+ if (isActive || // open it
+ this.DOMPopupSearchResultsWindow().style.display == 'block'
+ )
+ {
+ this.DOMSearchBox().className = 'MSearchBoxActive';
+ this.searchActive = true;
+ }
+ else if (!isActive) // directly remove the panel
+ {
+ this.DOMSearchBox().className = 'MSearchBoxInactive';
+ this.searchActive = false;
+ this.lastSearchValue = ''
+ this.lastResultsPage = '';
+ this.DOMSearchField().value = '';
+ }
+ }
+}
+
+// -----------------------------------------------------------------------
+
+// The class that handles everything on the search results page.
+function SearchResults(name)
+{
+ // The number of matches from the last run of .
+ this.lastMatchCount = 0;
+ this.lastKey = 0;
+ this.repeatOn = false;
+
+ // Toggles the visibility of the passed element ID.
+ this.FindChildElement = function(id)
+ {
+ var parentElement = document.getElementById(id);
+ var element = parentElement.firstChild;
+
+ while (element && element!=parentElement)
+ {
+ if (element.nodeName.toLowerCase() == 'div' && element.className == 'SRChildren')
+ {
+ return element;
+ }
+
+ if (element.nodeName.toLowerCase() == 'div' && element.hasChildNodes())
+ {
+ element = element.firstChild;
+ }
+ else if (element.nextSibling)
+ {
+ element = element.nextSibling;
+ }
+ else
+ {
+ do
+ {
+ element = element.parentNode;
+ }
+ while (element && element!=parentElement && !element.nextSibling);
+
+ if (element && element!=parentElement)
+ {
+ element = element.nextSibling;
+ }
+ }
+ }
+ }
+
+ this.Toggle = function(id)
+ {
+ var element = this.FindChildElement(id);
+ if (element)
+ {
+ if (element.style.display == 'block')
+ {
+ element.style.display = 'none';
+ }
+ else
+ {
+ element.style.display = 'block';
+ }
+ }
+ }
+
+ // Searches for the passed string. If there is no parameter,
+ // it takes it from the URL query.
+ //
+ // Always returns true, since other documents may try to call it
+ // and that may or may not be possible.
+ this.Search = function(search)
+ {
+ if (!search) // get search word from URL
+ {
+ search = window.location.search;
+ search = search.substring(1); // Remove the leading '?'
+ search = unescape(search);
+ }
+
+ search = search.replace(/^ +/, ""); // strip leading spaces
+ search = search.replace(/ +$/, ""); // strip trailing spaces
+ search = search.toLowerCase();
+ search = convertToId(search);
+
+ var resultRows = document.getElementsByTagName("div");
+ var matches = 0;
+
+ var i = 0;
+ while (i < resultRows.length)
+ {
+ var row = resultRows.item(i);
+ if (row.className == "SRResult")
+ {
+ var rowMatchName = row.id.toLowerCase();
+ rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_'
+
+ if (search.length<=rowMatchName.length &&
+ rowMatchName.substr(0, search.length)==search)
+ {
+ row.style.display = 'block';
+ matches++;
+ }
+ else
+ {
+ row.style.display = 'none';
+ }
+ }
+ i++;
+ }
+ document.getElementById("Searching").style.display='none';
+ if (matches == 0) // no results
+ {
+ document.getElementById("NoMatches").style.display='block';
+ }
+ else // at least one result
+ {
+ document.getElementById("NoMatches").style.display='none';
+ }
+ this.lastMatchCount = matches;
+ return true;
+ }
+
+ // return the first item with index index or higher that is visible
+ this.NavNext = function(index)
+ {
+ var focusItem;
+ while (1)
+ {
+ var focusName = 'Item'+index;
+ focusItem = document.getElementById(focusName);
+ if (focusItem && focusItem.parentNode.parentNode.style.display=='block')
+ {
+ break;
+ }
+ else if (!focusItem) // last element
+ {
+ break;
+ }
+ focusItem=null;
+ index++;
+ }
+ return focusItem;
+ }
+
+ this.NavPrev = function(index)
+ {
+ var focusItem;
+ while (1)
+ {
+ var focusName = 'Item'+index;
+ focusItem = document.getElementById(focusName);
+ if (focusItem && focusItem.parentNode.parentNode.style.display=='block')
+ {
+ break;
+ }
+ else if (!focusItem) // last element
+ {
+ break;
+ }
+ focusItem=null;
+ index--;
+ }
+ return focusItem;
+ }
+
+ this.ProcessKeys = function(e)
+ {
+ if (e.type == "keydown")
+ {
+ this.repeatOn = false;
+ this.lastKey = e.keyCode;
+ }
+ else if (e.type == "keypress")
+ {
+ if (!this.repeatOn)
+ {
+ if (this.lastKey) this.repeatOn = true;
+ return false; // ignore first keypress after keydown
+ }
+ }
+ else if (e.type == "keyup")
+ {
+ this.lastKey = 0;
+ this.repeatOn = false;
+ }
+ return this.lastKey!=0;
+ }
+
+ this.Nav = function(evt,itemIndex)
+ {
+ var e = (evt) ? evt : window.event; // for IE
+ if (e.keyCode==13) return true;
+ if (!this.ProcessKeys(e)) return false;
+
+ if (this.lastKey==38) // Up
+ {
+ var newIndex = itemIndex-1;
+ var focusItem = this.NavPrev(newIndex);
+ if (focusItem)
+ {
+ var child = this.FindChildElement(focusItem.parentNode.parentNode.id);
+ if (child && child.style.display == 'block') // children visible
+ {
+ var n=0;
+ var tmpElem;
+ while (1) // search for last child
+ {
+ tmpElem = document.getElementById('Item'+newIndex+'_c'+n);
+ if (tmpElem)
+ {
+ focusItem = tmpElem;
+ }
+ else // found it!
+ {
+ break;
+ }
+ n++;
+ }
+ }
+ }
+ if (focusItem)
+ {
+ focusItem.focus();
+ }
+ else // return focus to search field
+ {
+ document.getElementById("MSearchField").focus();
+ }
+ }
+ else if (this.lastKey==40) // Down
+ {
+ var newIndex = itemIndex+1;
+ var focusItem;
+ var item = document.getElementById('Item'+itemIndex);
+ var elem = this.FindChildElement(item.parentNode.parentNode.id);
+ if (elem && elem.style.display == 'block') // children visible
+ {
+ focusItem = document.getElementById('Item'+itemIndex+'_c0');
+ }
+ if (!focusItem) focusItem = this.NavNext(newIndex);
+ if (focusItem) focusItem.focus();
+ }
+ else if (this.lastKey==39) // Right
+ {
+ var item = document.getElementById('Item'+itemIndex);
+ var elem = this.FindChildElement(item.parentNode.parentNode.id);
+ if (elem) elem.style.display = 'block';
+ }
+ else if (this.lastKey==37) // Left
+ {
+ var item = document.getElementById('Item'+itemIndex);
+ var elem = this.FindChildElement(item.parentNode.parentNode.id);
+ if (elem) elem.style.display = 'none';
+ }
+ else if (this.lastKey==27) // Escape
+ {
+ e.stopPropagation();
+ searchBox.CloseResultsWindow();
+ document.getElementById("MSearchField").focus();
+ }
+ else if (this.lastKey==13) // Enter
+ {
+ return true;
+ }
+ return false;
+ }
+
+ this.NavChild = function(evt,itemIndex,childIndex)
+ {
+ var e = (evt) ? evt : window.event; // for IE
+ if (e.keyCode==13) return true;
+ if (!this.ProcessKeys(e)) return false;
+
+ if (this.lastKey==38) // Up
+ {
+ if (childIndex>0)
+ {
+ var newIndex = childIndex-1;
+ document.getElementById('Item'+itemIndex+'_c'+newIndex).focus();
+ }
+ else // already at first child, jump to parent
+ {
+ document.getElementById('Item'+itemIndex).focus();
+ }
+ }
+ else if (this.lastKey==40) // Down
+ {
+ var newIndex = childIndex+1;
+ var elem = document.getElementById('Item'+itemIndex+'_c'+newIndex);
+ if (!elem) // last child, jump to parent next parent
+ {
+ elem = this.NavNext(itemIndex+1);
+ }
+ if (elem)
+ {
+ elem.focus();
+ }
+ }
+ else if (this.lastKey==27) // Escape
+ {
+ e.stopPropagation();
+ searchBox.CloseResultsWindow();
+ document.getElementById("MSearchField").focus();
+ }
+ else if (this.lastKey==13) // Enter
+ {
+ return true;
+ }
+ return false;
+ }
+}
+
+function setKeyActions(elem,action)
+{
+ elem.setAttribute('onkeydown',action);
+ elem.setAttribute('onkeypress',action);
+ elem.setAttribute('onkeyup',action);
+}
+
+function setClassAttr(elem,attr)
+{
+ elem.setAttribute('class',attr);
+ elem.setAttribute('className',attr);
+}
+
+function createResults(resultsPath)
+{
+ var results = document.getElementById("SRResults");
+ results.innerHTML = '';
+ for (var e=0; eli>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0px/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.main-menu-btn{position:relative;display:inline-block;width:36px;height:36px;text-indent:36px;margin-left:8px;white-space:nowrap;overflow:hidden;cursor:pointer;-webkit-tap-highlight-color:rgba(0,0,0,0)}.main-menu-btn-icon,.main-menu-btn-icon:before,.main-menu-btn-icon:after{position:absolute;top:50%;left:2px;height:2px;width:24px;background:#424242;-webkit-transition:all 0.25s;transition:all 0.25s}.main-menu-btn-icon:before{content:'';top:-7px;left:0}.main-menu-btn-icon:after{content:'';top:7px;left:0}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon{height:0}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon:before{top:0;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon:after{top:0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}#main-menu-state{position:absolute;width:1px;height:1px;margin:-1px;border:0;padding:0;overflow:hidden;clip:rect(1px, 1px, 1px, 1px)}#main-menu-state:not(:checked)~#main-menu{display:none}#main-menu-state:checked~#main-menu{display:block}@media (min-width: 768px){.main-menu-btn{position:absolute;top:-99999px}#main-menu-state:not(:checked)~#main-menu{display:block}}.sm-dox{background-image:url('tab_b.png')}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0px 12px;padding-right:43px;font-family:'Lucida Grande',Geneva,Helvetica,Arial,sans-serif;font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:0px 1px 1px rgba(255, 255, 255, 0.9);color:#2D2D2D;outline:none}.sm-dox a:hover{background-image:url('tab_a.png');background-repeat:repeat-x;color:white;text-shadow:0px 1px 1px rgba(0, 0, 0, 1.0)}.sm-dox a.current{color:#D23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace !important;text-align:center;text-shadow:none;background:rgba(255, 255, 255, 0.5);border-radius:5px}.sm-dox a span.sub-arrow:before{display:block;content:'+'}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{border-radius:0}.sm-dox ul{background:white}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:white;background-image:none}.sm-dox ul a:hover{background-image:url('tab_a.png');background-repeat:repeat-x;color:white;text-shadow:0px 1px 1px #000}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media (min-width: 768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-image:url('tab_b.png');line-height:36px}.sm-dox a span.sub-arrow{top:50%;margin-top:-2px;right:12px;width:0;height:0;border-width:4px;border-style:solid dashed dashed dashed;border-color:#2D2D2D transparent transparent transparent;background:transparent;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0px 12px;background-image:url('tab_s.png');background-repeat:no-repeat;background-position:right;border-radius:0 !important}.sm-dox a:hover{background-image:url('tab_a.png');background-repeat:repeat-x;color:white;text-shadow:0px 1px 1px rgba(0, 0, 0, 1.0)}.sm-dox a:hover span.sub-arrow{border-color:white transparent transparent transparent}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent white transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:white;border-radius:5px !important;box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-color:transparent transparent transparent #555555;border-style:dashed dashed dashed solid}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:#555555;background-image:none;border:0 !important;color:#555555;background-image:none}.sm-dox ul a:hover{background-image:url('tab_a.png');background-repeat:repeat-x;color:white;text-shadow:0px 1px 1px rgba(0, 0, 0, 1.0)}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent white}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:white;height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #D23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#D23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent #555555 transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:#555555 transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:12px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:12px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px !important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a.disabled{background-image:url('tab_b.png')}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:white}}
diff --git a/Documentation/html/tabs.css.meta b/Documentation/html/tabs.css.meta
new file mode 100644
index 0000000..b799213
--- /dev/null
+++ b/Documentation/html/tabs.css.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 3ef3bd37f39242281ab6d268249c63f8
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/doxygen/images.meta b/Documentation/images.meta
similarity index 100%
rename from doxygen/images.meta
rename to Documentation/images.meta
diff --git a/Documentation/images/PasserLifeLogoRight1_300.png b/Documentation/images/PasserLifeLogoRight1_300.png
new file mode 100644
index 0000000..7480553
Binary files /dev/null and b/Documentation/images/PasserLifeLogoRight1_300.png differ
diff --git a/doxygen/images/PasserLifeLogoRight1_300.png.meta b/Documentation/images/PasserLifeLogoRight1_300.png.meta
similarity index 100%
rename from doxygen/images/PasserLifeLogoRight1_300.png.meta
rename to Documentation/images/PasserLifeLogoRight1_300.png.meta
diff --git a/Editor/BrainPickerWindow.cs.meta b/Editor/BrainPickerWindow.cs.meta
index b2de114..1468869 100644
--- a/Editor/BrainPickerWindow.cs.meta
+++ b/Editor/BrainPickerWindow.cs.meta
@@ -1,2 +1,11 @@
fileFormatVersion: 2
-guid: 9197e2d322d23b5798ab4aef729815b0
\ No newline at end of file
+guid: 9197e2d322d23b5798ab4aef729815b0
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Editor/Brain_Editor.cs.meta b/Editor/Brain_Editor.cs.meta
index eaf830b..c91bea9 100644
--- a/Editor/Brain_Editor.cs.meta
+++ b/Editor/Brain_Editor.cs.meta
@@ -1,2 +1,11 @@
fileFormatVersion: 2
-guid: f05072314d39990639a2dbf99f322664
\ No newline at end of file
+guid: f05072314d39990639a2dbf99f322664
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Editor/ClusterEditor.cs b/Editor/ClusterEditor.cs
index 725b27d..0c4b623 100644
--- a/Editor/ClusterEditor.cs
+++ b/Editor/ClusterEditor.cs
@@ -64,22 +64,24 @@ namespace NanoBrain {
public class GraphEditor : GraphView {
protected ClusterPrefab prefab;
- protected Nucleus currentPrefabNucleus;
+ //protected Nucleus currentPrefabNucleus;
protected override Nucleus currentNucleus {
get => base.currentNucleus;
set {
base.currentNucleus = value;
- this.currentPrefabNucleus = value != null ? this.prefab.GetNucleus(value.name) : null;
+ // this.currentPrefabNucleus = value != null ? this.prefab.GetNucleus(value.name) : null;
}
}
- public GraphEditor(ClusterPrefab prefab) : base(prefab.output.parent) {
+ public GraphEditor(ClusterPrefab prefab) : base(prefab.cluster.defaultOutput.parent) {
this.prefab = prefab;
// In a Prefab editor, no instance exists but we need it for the ClusterViewer.
// So we create a temporary instance
- this.currentCluster = new(prefab);
+ //this.currentCluster = new(prefab);
+ this.currentCluster = prefab.cluster;
+ this.currentCluster.Refresh();
}
public void SetGraph(GameObject gameObject, VisualElement inspectorContainer) {
@@ -87,7 +89,7 @@ namespace NanoBrain {
if (Application.isPlaying == false)
this.serializedBrain = new SerializedObject(this.prefab);
- this.selectedOutput = this.currentCluster.outputs[0];
+ this.selectedOutput = this.currentCluster.defaultOutput;
this.currentNucleus = this.selectedOutput;
//this.currentCluster = this.currentNucleus.parent;
Rebuild(inspectorContainer);
@@ -120,9 +122,9 @@ namespace NanoBrain {
// create a SerializedObject wrapper so Unity inspector controls work (and Undo)
SerializedObject so = new(prefabAsset);
- foreach (Nucleus nucleus in this.prefab.nuclei) {
- nucleus.Initialize();
- }
+ // foreach (Nucleus nucleus in this.prefab.cluster.nuclei) {
+ // nucleus.Initialize();
+ // }
this.inspectorIMGUIContainer = new IMGUIContainer(() => InspectorHandler(so));
@@ -163,29 +165,10 @@ namespace NanoBrain {
GUILayout.Label(nucleusType, headerStyle);
// Nucleus name
- Cluster cluster = this.currentPrefabNucleus as Cluster;
- if (cluster != null) {
- EditorGUILayout.BeginHorizontal();
- if (GUILayout.Button(this.currentNucleus.parent.name))
- OnClusterClick(cluster);
- EditorGUI.BeginDisabledGroup(true);
- EditorGUILayout.TextField(this.currentNucleus.name, boldTextFieldStyle);
- EditorGUI.EndDisabledGroup();
- if (GUILayout.Button("Reimport"))
- ReimportCluster(cluster);
- EditorGUILayout.EndHorizontal();
- }
- else {
- string newName = EditorGUILayout.TextField(this.currentNucleus.name, boldTextFieldStyle);
- if (newName != this.currentNucleus.name) {
- Nucleus prefabNucleus = this.prefab.GetNucleus(this.currentNucleus.name);
- prefabNucleus.name = newName;
- // This changes it in the temporary cluster instance
- this.currentNucleus.name = newName;
- this.prefab.RefreshOutputs();
- // outputsPopup.choices = this.prefab.outputs.Select(output => output.name).ToList();
- anythingChanged = true;
- }
+ string newName = EditorGUILayout.TextField(this.currentNucleus.name, boldTextFieldStyle);
+ if (newName != this.currentNucleus.name) {
+ this.currentNucleus.name = newName;
+ anythingChanged = true;
}
// Current output value
@@ -204,7 +187,7 @@ namespace NanoBrain {
if (this.currentNucleus is MemoryCell memory)
MemoryCellInspector(memory, ref anythingChanged);
// Cluster
- else if (cluster != null)
+ else if (this.currentNucleus is Cluster cluster)
ClusterInspector(cluster, ref anythingChanged);
// Other
else
@@ -230,10 +213,8 @@ namespace NanoBrain {
bool connecting = GUILayout.Button("Add Output Neuron");
if (connecting) {
- Nucleus newOutput = new Neuron(this.prefab, "New Output");
- // Regenerate the temporary clsuter instance
- // See also the constructor
- this.currentCluster = new(this.prefab);
+ Nucleus newOutput = new Neuron(this.currentCluster, "New Output");
+ this.currentCluster.Refresh();
this.currentNucleus = newOutput;
this.selectedOutput = this.currentNucleus;
}
@@ -249,8 +230,8 @@ namespace NanoBrain {
int instanceCount = cluster.instanceCount;
if (instanceCount <= 1) {
- if (cluster.siblingClusters != null && cluster.siblingClusters.Length > 1)
- instanceCount = cluster.siblingClusters.Count();
+ if (cluster.instances != null && cluster.instances.Length > 1)
+ instanceCount = cluster.instances.Count();
else
instanceCount = 1;
}
@@ -268,8 +249,8 @@ namespace NanoBrain {
}
EditorGUILayout.EndHorizontal();
- if (GUILayout.Button("Reimport Cluster"))
- ReimportCluster(cluster);
+ // if (GUILayout.Button("Reimport Cluster"))
+ // ReimportCluster(cluster);
}
protected void NucleusInspector(Nucleus nucleus, ref bool anythingChanged) {
@@ -281,9 +262,9 @@ namespace NanoBrain {
if (breakOnWake && this.currentNucleus is Neuron currentNeuron) {
if (currentNeuron.isSleeping == false)
Debug.Break();
+ // trace = EditorGUILayout.Toggle("Trace", trace);
+ // currentNeuron.trace = trace;
}
- trace = EditorGUILayout.Toggle("Trace", trace);
- this.currentNucleus.trace = trace;
}
protected void SynapsesInspector(ref bool anythingChanged) {
@@ -293,31 +274,30 @@ namespace NanoBrain {
Neuron.CombinatorType newCombinator = (Neuron.CombinatorType)EditorGUILayout.EnumPopup("Combinator", neuron2.combinator);
anythingChanged |= newCombinator != neuron2.combinator;
neuron2.combinator = newCombinator;
- }
- EditorGUIUtility.wideMode = true;
- float previousLabelWidth = EditorGUIUtility.labelWidth;
- EditorGUIUtility.labelWidth = 100;
+ EditorGUIUtility.wideMode = true;
+ float previousLabelWidth = EditorGUIUtility.labelWidth;
+ EditorGUIUtility.labelWidth = 100;
- Vector3 newBias = EditorGUILayout.Vector3Field("Bias", this.currentNucleus.bias);
- if (newBias != this.currentPrefabNucleus.bias) {
- anythingChanged |= newBias != this.currentNucleus.bias;
- this.currentPrefabNucleus.bias = newBias;
- this.currentNucleus.bias = newBias;
+ Vector3 newBias = EditorGUILayout.Vector3Field("Bias", neuron2.bias);
+ if (newBias != neuron2.bias) {
+ anythingChanged |= newBias != neuron2.bias;
+ neuron2.bias = newBias;
+ }
+ EditorGUIUtility.labelWidth = previousLabelWidth;
}
- EditorGUIUtility.labelWidth = previousLabelWidth;
Nucleus[] array = null;
int elementIx = -1;
- if (this.currentPrefabNucleus.synapses.Count > 0) {
- Synapse[] synapses = this.currentPrefabNucleus.synapses.ToArray();
+ if (this.currentNucleus is Neuron currentNeuron && currentNeuron.synapses.Count > 0) {
+ Synapse[] synapses = currentNeuron.synapses.ToArray();
foreach (Synapse synapse in synapses) {
if (synapse.neuron == null)
continue;
if (array != null) {
if (synapse.neuron.parent is Cluster iCluster && elementIx > 0) {
- int thisElementIx = Cluster.GetNucleusIndex(iCluster.clusterNuclei, synapse.neuron);
+ int thisElementIx = Cluster.GetNucleusIndex(iCluster.nuclei, synapse.neuron);
if (thisElementIx == elementIx)
continue;
else
@@ -330,9 +310,9 @@ namespace NanoBrain {
}
else {
if (synapse.neuron.parent is Cluster iReceptor) {
- array = iReceptor.siblingClusters;
+ array = iReceptor.instances;
if (iReceptor is Cluster iCluster)
- elementIx = Cluster.GetNucleusIndex(iCluster.clusterNuclei, synapse.neuron);
+ elementIx = Cluster.GetNucleusIndex(iCluster.nuclei, synapse.neuron);
}
}
@@ -348,21 +328,19 @@ namespace NanoBrain {
else {
EditorGUILayout.BeginHorizontal();
- if (synapse.neuron.clusterPrefab != this.currentNucleus.clusterPrefab) {
+ if (synapse.neuron.parent != this.currentNucleus.parent) {
// If it is a different cluster
GUIStyle labelStyle = new(GUI.skin.label);
float labelWidth = 200;
- if (synapse.neuron.clusterPrefab != null) {
- labelWidth = labelStyle.CalcSize(new GUIContent($"{synapse.neuron.clusterPrefab.name}.")).x;
- GUILayout.Label($"{synapse.neuron.clusterPrefab.name}", GUILayout.Width(labelWidth));
+ if (synapse.neuron.parent != null) {
+ labelWidth = labelStyle.CalcSize(new GUIContent($"{synapse.neuron.parent.name}.")).x;
+ GUILayout.Label($"{synapse.neuron.parent.name}", GUILayout.Width(labelWidth));
}
- string[] options = synapse.neuron.clusterPrefab.nuclei.Select(n => n.name).ToArray();
+ string[] options = synapse.neuron.parent.nuclei.Select(n => n.name).ToArray();
int selectedIndex = System.Array.IndexOf(options, synapse.neuron.name);
int newIndex = EditorGUILayout.Popup(selectedIndex, options);
if (newIndex != selectedIndex) {
- // Nucleus selectedNucleus = synapse.neuron.parent.clusterNuclei[newIndex];
- // Neuron newNeuron = selectedNucleus as Neuron;
- Neuron newNeuron = synapse.neuron.clusterPrefab.nuclei[newIndex] as Neuron;
+ Neuron newNeuron = synapse.neuron.parent.nuclei[newIndex] as Neuron;
ChangeSynapse(synapse, newNeuron);
}
}
@@ -370,13 +348,12 @@ namespace NanoBrain {
GUILayout.Label(synapse.neuron.name);
bool disconnecting = GUILayout.Button("Disconnect", GUILayout.Width(80));
- if (disconnecting && synapse.neuron is Neuron synapseNeuron) {
- synapseNeuron.RemoveReceiver(this.currentNucleus);
- this.prefab.GarbageCollection();
+ if (disconnecting) {
+ synapse.neuron.RemoveReceiver(this.currentNucleus);
+ this.currentCluster.Refresh();
anythingChanged = true;
}
EditorGUILayout.EndHorizontal();
-
}
EditorGUI.indentLevel++;
@@ -443,13 +420,14 @@ namespace NanoBrain {
}
protected virtual void AddNeuronInput(Nucleus nucleus) {
- Neuron newNeuroid = new(this.prefab, "New neuron");
- newNeuroid.AddReceiver(nucleus);
- this.currentNucleus = newNeuroid;
+ Neuron newNeuron = new(this.currentCluster, "New Neuron");
+ //Neuron newNeuroid = new(this.prefab.cluster, "New neuron");
+ newNeuron.AddReceiver(nucleus);
+ this.currentNucleus = newNeuron;
}
protected virtual void AddMemoryCellInput(Nucleus nucleus) {
- MemoryCell newMemory = new(this.prefab, "New memory cell");
+ MemoryCell newMemory = new(this.prefab.cluster, "New memory cell");
newMemory.AddReceiver(nucleus);
this.currentNucleus = newMemory;
}
@@ -458,34 +436,34 @@ namespace NanoBrain {
ClusterPickerWindow.ShowPicker(brain => OnClusterPicked(nucleus, brain), "Select Cluster");
}
private void OnClusterPicked(Nucleus nucleus, ClusterPrefab selectedPrefab) {
- Cluster subclusterInstance = new(selectedPrefab, this.prefab);
+ Cluster subclusterInstance = new(selectedPrefab, this.currentCluster);
subclusterInstance.defaultOutput.AddReceiver(nucleus);
}
- private void ReimportCluster(Cluster subCluster) {
- if (subCluster.siblingClusters == null || subCluster.siblingClusters.Length <= 0) {
- Cluster reimportedCluster = new(subCluster.prefab, this.prefab);
- subCluster.MoveReceivers(reimportedCluster);
- // subcluster should be garbage now...
- this.currentNucleus = reimportedCluster;
- }
- else {
- this.currentNucleus = null;
- List newSiblingsList = new();
- foreach (Cluster sibling in subCluster.siblingClusters) {
- Cluster reimportedCluster = new(sibling.prefab, this.prefab) {
- name = sibling.name
- };
- sibling.MoveReceivers(reimportedCluster);
- newSiblingsList.Add(reimportedCluster);
- // make the first reimportedCluster the new current nucleus
- this.currentNucleus ??= reimportedCluster;
- }
- Cluster[] newSiblings = newSiblingsList.ToArray();
- foreach (Cluster sibling in newSiblings)
- sibling.siblingClusters = newSiblings;
- }
- }
+ // private void ReimportCluster(Cluster subCluster) {
+ // if (subCluster.siblingClusters == null || subCluster.siblingClusters.Length <= 0) {
+ // Cluster reimportedCluster = new(subCluster.prefab, this.prefab);
+ // subCluster.MoveReceivers(reimportedCluster);
+ // // subcluster should be garbage now...
+ // this.currentNucleus = reimportedCluster;
+ // }
+ // else {
+ // this.currentNucleus = null;
+ // List newSiblingsList = new();
+ // foreach (Cluster sibling in subCluster.siblingClusters) {
+ // Cluster reimportedCluster = new(sibling.prefab, this.prefab) {
+ // name = sibling.name
+ // };
+ // sibling.MoveReceivers(reimportedCluster);
+ // newSiblingsList.Add(reimportedCluster);
+ // // make the first reimportedCluster the new current nucleus
+ // this.currentNucleus ??= reimportedCluster;
+ // }
+ // Cluster[] newSiblings = newSiblingsList.ToArray();
+ // foreach (Cluster sibling in newSiblings)
+ // sibling.siblingClusters = newSiblings;
+ // }
+ // }
int selectedConnectNucleus = -1;
// Connect to another nucleus
@@ -493,11 +471,12 @@ namespace NanoBrain {
if (cluster == null)
return false;
- IEnumerable synapseNuclei = this.currentNucleus.synapses
+ Neuron currentNeuron = this.currentNucleus as Neuron;
+ IEnumerable synapseNuclei = currentNeuron.synapses
.Where(synapse => synapse.neuron != null)
.Select(synapse => synapse.neuron);
- IEnumerable nuclei = cluster.nuclei
+ IEnumerable nuclei = cluster.cluster.nuclei
.Except(synapseNuclei);
IEnumerable nucleiNames = nuclei
.Select(n => {
@@ -513,10 +492,13 @@ namespace NanoBrain {
EditorGUILayout.EndHorizontal();
if (connecting) {
Nucleus nucleus = nuclei.ElementAt(selectedConnectNucleus);
- if (nucleus is Cluster subCluster)
- subCluster.AddArrayReceiver(this.currentNucleus);
- else if (nucleus is Neuron neuron)
- neuron.AddReceiver(this.currentNucleus);
+ // if (nucleus is Cluster subCluster) {
+ // subCluster.AddArrayReceiver(this.currentNucleus);
+ // }
+ // else
+ if (nucleus is Neuron neuron)
+ neuron.AddReceiver(this.currentNucleus);
+ this.currentCluster.Refresh();
}
return connecting;
}
@@ -537,10 +519,10 @@ namespace NanoBrain {
// this.prefab.nuclei.Remove(nucleus);
// Neuron.Delete(nucleus);
- this.prefab.RefreshOutputs();
+ this.prefab.cluster.RefreshOutputs();
- this.currentNucleus = this.prefab.output;
+ this.currentNucleus = this.prefab.cluster.defaultOutput;
this.selectedOutput = this.currentNucleus;
}
@@ -558,11 +540,6 @@ namespace NanoBrain {
AddInput(selectedType, this.currentNucleus);
}
return connecting;
- // if (selectedType == Nucleus.Type.None)
- // return false;
-
- // AddInput(selectedType, this.currentNucleus);
- // return true;
}
protected virtual void ChangeSynapse(Synapse synapse, Neuron newNucleus) {
@@ -596,8 +573,8 @@ namespace NanoBrain {
// }
// else {
// it is a neuron in a subcluster
- synapseNeuron.RemoveReceiver(this.currentPrefabNucleus);
- newNucleus.AddReceiver(this.currentPrefabNucleus);
+ synapseNeuron.RemoveReceiver(this.currentNucleus);
+ newNucleus.AddReceiver(this.currentNucleus);
// }
}
else {
@@ -606,19 +583,6 @@ namespace NanoBrain {
}
}
- protected virtual void DisconnectNucleus(Neuron nucleus) {
- if (this.currentNucleus.clusterPrefab == null)
- return;
- string[] names = this.currentNucleus.synapses.Select(synapse => synapse.neuron.name).ToArray();
- int selectedIndex = -1;
- selectedIndex = EditorGUILayout.Popup("Disconnect from", selectedIndex, names);
- if (selectedIndex >= 0 && selectedIndex < this.currentNucleus.clusterPrefab.nuclei.Count) {
- Synapse synapse = this.currentNucleus.synapses[selectedIndex];
- Neuron synapseNeuron = synapse.neuron as Neuron;
- synapseNeuron.RemoveReceiver(this.currentNucleus);
- }
- }
-
#endregion Synapses
#endregion Inspector
diff --git a/Editor/ClusterEditor.cs.meta b/Editor/ClusterEditor.cs.meta
index a1a18f5..a933254 100644
--- a/Editor/ClusterEditor.cs.meta
+++ b/Editor/ClusterEditor.cs.meta
@@ -1,2 +1,11 @@
fileFormatVersion: 2
-guid: 1fc1fb7db9f7ad54a87d31313e7f457d
\ No newline at end of file
+guid: 1fc1fb7db9f7ad54a87d31313e7f457d
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Editor/ClusterViewer.cs b/Editor/ClusterViewer.cs
index 5f11269..b6e006a 100644
--- a/Editor/ClusterViewer.cs
+++ b/Editor/ClusterViewer.cs
@@ -106,10 +106,12 @@ namespace NanoBrain {
public void SetGraph(GameObject gameObject) {
this.gameObject = gameObject;
+ if (this.currentCluster == null)
+ return;
if (Application.isPlaying == false)
this.serializedBrain = new SerializedObject(this.currentCluster.prefab);
- this.selectedOutput = this.currentCluster.outputs[0];
+ this.selectedOutput = this.currentCluster.defaultOutput;
this.currentNucleus = this.selectedOutput;
Rebuild();
}
@@ -128,7 +130,7 @@ namespace NanoBrain {
}
public void OnIMGUI() {
- if (Application.isPlaying == false)
+ if (Application.isPlaying == false && serializedBrain != null)
serializedBrain.Update();
Handles.BeginGUI();
@@ -211,7 +213,8 @@ namespace NanoBrain {
}
private void DescendGraph(Dag.Node receiver, ref int ix, Dag dag) {
- foreach (Synapse synapse in receiver.nucleus.synapses) {
+ Neuron receiverNeuron = receiver.nucleus as Neuron;
+ foreach (Synapse synapse in receiverNeuron.synapses) {
Nucleus nucleus = synapse.neuron;
if (nucleus.parent != null && nucleus.parent != currentNucleus.parent) {
nucleus = nucleus.parent;
@@ -267,7 +270,7 @@ namespace NanoBrain {
Handles.color = Color.black;
Handles.DrawAAConvexPolygon(verts);
int row = 0;
- if (cluster.siblingClusters == null) {
+ if (cluster.instances == null) {
Vector3 pos = new(150, margin + row * spacing, 0.0f);
Handles.color = Color.white;
// The selected sibling highlight ring
@@ -276,7 +279,7 @@ namespace NanoBrain {
row++;
}
else {
- foreach (Cluster sibling in cluster.siblingClusters) {
+ foreach (Cluster sibling in cluster.instances) {
Vector3 pos = new(150, margin + row * spacing, 0.0f);
Handles.color = Color.white;
// The selected sibling highlight ring
@@ -384,6 +387,9 @@ namespace NanoBrain {
}
protected void DrawSynapses(Nucleus nucleus, Vector3 parentPos, float size) {
+ if (nucleus is not Neuron neuron)
+ return;
+
if (this.selectedSynapseNeuron != null) {
DrawClusterSynapses(this.selectedSynapseNeuron, parentPos, size);
return;
@@ -396,7 +402,7 @@ namespace NanoBrain {
float maxValue = 0;
int neuronCount = 0;
List drawnNeuronNames = new();
- foreach (Synapse synapse in nucleus.synapses) {
+ foreach (Synapse synapse in neuron.synapses) {
if (synapse.neuron == null)
continue;
@@ -423,7 +429,7 @@ namespace NanoBrain {
int row = 0;
//List drawnNeurons = new();
drawnNeuronNames = new();
- foreach (Synapse synapse in nucleus.synapses) {
+ foreach (Synapse synapse in neuron.synapses) {
if (synapse.neuron is null)
continue;
@@ -453,14 +459,14 @@ namespace NanoBrain {
}
protected void DrawClusterSynapses(Nucleus nucleus, Vector3 parentPos, float size) {
- if (nucleus == null || nucleus.parent == null || nucleus.parent.siblingClusters == null)
+ if (nucleus == null || nucleus.parent == null || nucleus.parent.instances == null)
return;
// Hack to disable showing labels
expandArray = true;
float maxValue = 0;
- foreach (Cluster sibling in nucleus.parent.siblingClusters) {
+ foreach (Cluster sibling in nucleus.parent.instances) {
Neuron siblingNeuron = sibling.GetNucleus(nucleus.name) as Neuron;
float value = siblingNeuron.outputMagnitude; // no need to add weight as they are all the same
if (value > maxValue)
@@ -472,7 +478,7 @@ namespace NanoBrain {
float margin = 10 + spacing / 2;
int row = 0;
- foreach (Cluster sibling in nucleus.parent.siblingClusters) {
+ foreach (Cluster sibling in nucleus.parent.instances) {
Neuron siblingNeuron = sibling.GetNucleus(nucleus.name) as Neuron;
Vector3 position = new(250, margin + row * spacing, 0.0f);
DrawEdge(parentPos, position);
@@ -482,14 +488,15 @@ namespace NanoBrain {
maxValue = 1;
float brightness = siblingNeuron.outputMagnitude / maxValue;
color = new Color(brightness, brightness, brightness, 1f);
- } DrawNucleus(siblingNeuron, position, size, color);
+ }
+ DrawNucleus(siblingNeuron, position, size, color);
GUIStyle style = new(EditorStyles.label) {
alignment = TextAnchor.UpperCenter,
normal = { textColor = Color.white },
fontStyle = FontStyle.Bold,
};
Vector3 labelPos = position - Vector3.down * (size + 5); // below neuron
- string name = $"{sibling.baseName}.{nucleus.name}";
+ string name = $"{sibling.baseName}\n{nucleus.name}";
Handles.Label(labelPos, name, style);
row++;
}
@@ -497,6 +504,9 @@ namespace NanoBrain {
}
protected void DrawOutputs(Vector2 parentPos, float size) {
+ if (this.currentCluster == null)
+ return;
+
// Determine the maximum value in this layer
// This is used to 'scale' the output value colors of the nuclei
float maxValue = 0;
@@ -603,18 +613,12 @@ namespace NanoBrain {
if (nucleus.parent != null && currentNucleus != null && nucleus.parent != currentNucleus.parent && nucleus.parent is Cluster parentCluster1) {
// This neuron is part of another cluster
parentCluster1.name ??= "";
- string baseName = "";
int colonPos = parentCluster1.name.IndexOf(":");
+ string baseName;
if (colonPos > 0 && colonPos < parentCluster1.name.Length - 2)
- baseName = parentCluster1.name[..colonPos] + ".";
+ baseName = parentCluster1.name[..colonPos] + "\n";
else
- baseName = parentCluster1.name + ".";
- // if (colonPos > 0 && colonPos < parentCluster1.name.Length - 2) {
- // // if it is an array, we should not show the :0 of the first element
- // //baseName = baseName[..colonPos];
- // Handles.Label(labelPos, baseName + nucleus.name, style);
- // }
- // else
+ baseName = parentCluster1.name + "\n";
Handles.Label(labelPos, baseName + nucleus.name, style);
}
else {
@@ -686,8 +690,8 @@ namespace NanoBrain {
Handles.Label(labelPosition, cluster.instanceCount.ToString(), labelTextStyle);
labelTextStyle.normal.textColor = Color.white;
}
- else if (cluster.siblingClusters != null && cluster.siblingClusters.Length > 1) {
- Handles.Label(labelPosition, cluster.siblingClusters.Length.ToString(), labelTextStyle);
+ else if (cluster.instances != null && cluster.instances.Length > 1) {
+ Handles.Label(labelPosition, cluster.instances.Length.ToString(), labelTextStyle);
labelTextStyle.normal.textColor = Color.white;
}
}
@@ -849,22 +853,34 @@ namespace NanoBrain {
void OnSceneGUI(SceneView sceneView) {
if (this.gameObject != null) {
- // if (this.currentNucleus is IReceptor receptor) {
- // foreach (Nucleus nucleus in receptor.nucleiArray) {
- // if (nucleus is Neuron neuron) {
- // Vector3 worldVector = this.gameObject.transform.TransformVector(neuron.outputValue);
- // Handles.color = Color.yellow;
- // Handles.DrawLine(this.gameObject.transform.position, this.gameObject.transform.position + worldVector);
- // }
- // }
- // }
- // else {
- if (this.currentNucleus is Neuron currentNeuron) {
- Vector3 worldVector = this.gameObject.transform.TransformVector(currentNeuron.outputValue);
- Handles.color = Color.yellow;
- Handles.DrawLine(this.gameObject.transform.position, this.gameObject.transform.position + worldVector);
+
+ Handles.color = Color.yellow;
+ if (this.selectedSynapseNeuron != null) {
+ foreach (Cluster sibling in this.selectedSynapseNeuron.parent.instances) {
+ Neuron siblingNeuron = sibling.GetNucleus(this.selectedSynapseNeuron.name) as Neuron;
+ Vector3 worldVector = this.gameObject.transform.TransformVector(siblingNeuron.outputValue);
+ Handles.DrawLine(this.gameObject.transform.position, this.gameObject.transform.position + worldVector);
+ }
+ // if (this.currentNucleus is Cluster cluster) {
+ // foreach (Cluster sibling in cluster.siblingClusters) {
+
+ // }
+ // }
+ // // if (this.currentNucleus is IReceptor receptor) {
+ // // foreach (Nucleus nucleus in receptor.nucleiArray) {
+ // // if (nucleus is Neuron neuron) {
+ // // Vector3 worldVector = this.gameObject.transform.TransformVector(neuron.outputValue);
+ // // Handles.color = Color.yellow;
+ // // Handles.DrawLine(this.gameObject.transform.position, this.gameObject.transform.position + worldVector);
+ // // }
+ // // }
+ }
+ else {
+ if (this.currentNucleus is Neuron currentNeuron) {
+ Vector3 worldVector = this.gameObject.transform.TransformVector(currentNeuron.outputValue);
+ Handles.DrawLine(this.gameObject.transform.position, this.gameObject.transform.position + worldVector);
+ }
}
- // }
}
}
diff --git a/Editor/ClusterViewer.cs.meta b/Editor/ClusterViewer.cs.meta
index ac68b91..7859dec 100644
--- a/Editor/ClusterViewer.cs.meta
+++ b/Editor/ClusterViewer.cs.meta
@@ -1,2 +1,11 @@
fileFormatVersion: 2
-guid: 4fe58945c76d153edacc220597474ad2
\ No newline at end of file
+guid: 4fe58945c76d153edacc220597474ad2
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Editor/ConfigurationChecker.cs.meta b/Editor/ConfigurationChecker.cs.meta
index b8bea95..68e2048 100644
--- a/Editor/ConfigurationChecker.cs.meta
+++ b/Editor/ConfigurationChecker.cs.meta
@@ -1,2 +1,11 @@
fileFormatVersion: 2
-guid: c7539a20f7894542ca347730cd8417b1
\ No newline at end of file
+guid: c7539a20f7894542ca347730cd8417b1
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Editor/Neuron_Drawer.cs b/Editor/Neuron_Drawer.cs
new file mode 100644
index 0000000..6cb226c
--- /dev/null
+++ b/Editor/Neuron_Drawer.cs
@@ -0,0 +1,83 @@
+using UnityEngine;
+using UnityEditor;
+using Unity.Mathematics;
+using System;
+using System.Reflection;
+using System.Collections;
+
+namespace NanoBrain {
+ [CustomPropertyDrawer(typeof(Neuron))]
+ class Neuron_Drawer : PropertyDrawer {
+ public static void Insepctor(SerializedObject serializedObject, string propertyName ) {
+ EditorGUILayout.PropertyField(serializedObject.FindProperty(propertyName));
+ }
+
+ public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) {
+ // Draw foldout + properties
+ label = EditorGUI.BeginProperty(position, label, property);
+
+ // Begin indent block
+ int indent = EditorGUI.indentLevel;
+ EditorGUI.indentLevel = 0;
+
+ object instance = GetTargetObjectOfProperty(property);
+
+ float lineHeight = EditorGUIUtility.singleLineHeight;
+ Rect r = new(position.x, position.y, position.width, lineHeight);
+ if (instance != null) {
+ FieldInfo field = typeof(Neuron).GetField("_outputValue", BindingFlags.NonPublic | BindingFlags.Instance);
+ if (field != null) {
+ float3 val = (float3)field.GetValue(instance);
+ EditorGUI.Vector3Field(r, $"Neuron: {label}", val);
+ }
+ }
+
+ EditorGUI.indentLevel = indent;
+ EditorGUI.EndProperty();
+ }
+
+ public override float GetPropertyHeight(SerializedProperty property, GUIContent label) {
+ // height for 1 line
+ return (EditorGUIUtility.singleLineHeight * 1) + (EditorGUIUtility.standardVerticalSpacing * 0);
+ }
+
+ public static object GetTargetObjectOfProperty(SerializedProperty prop) {
+ var path = prop.propertyPath.Replace(".Array.data[", "[");
+ object obj = prop.serializedObject.targetObject;
+ var elements = path.Split('.');
+ foreach (var element in elements) {
+ if (element.Contains("[")) {
+ var elementName = element.Substring(0, element.IndexOf("["));
+ var index = Convert.ToInt32(element.Substring(element.IndexOf("[")).Replace("[", "").Replace("]", ""));
+ obj = GetValue_Imp(obj, elementName, index);
+ }
+ else {
+ obj = GetValue_Imp(obj, element);
+ }
+ }
+ return obj;
+ }
+
+ static object GetValue_Imp(object source, string name) {
+ if (source == null)
+ return null;
+
+ Type t = source.GetType();
+ FieldInfo f = t.GetField(name, BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance);
+ if (f != null)
+ return f.GetValue(source);
+ PropertyInfo p = t.GetProperty(name, BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance);
+ return p?.GetValue(source, null);
+ }
+ static object GetValue_Imp(object source, string name, int index) {
+ if (GetValue_Imp(source, name) is not IEnumerable enumerable)
+ return null;
+ IEnumerator en = enumerable.GetEnumerator();
+ for (int i = 0; i <= index; i++) {
+ if (!en.MoveNext())
+ return null;
+ }
+ return en.Current;
+ }
+ }
+}
\ No newline at end of file
diff --git a/Editor/Neuron_Drawer.cs.meta b/Editor/Neuron_Drawer.cs.meta
new file mode 100644
index 0000000..b3a4b00
--- /dev/null
+++ b/Editor/Neuron_Drawer.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: aa0e340763ca6299e93d514b271ae38d
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..017fe3f
--- /dev/null
+++ b/README.md
@@ -0,0 +1,3 @@
+# %NanoBrain
+
+Documentation is found in the [Documentation folder](Documentation/html/index.html)
diff --git a/README.md.meta b/README.md.meta
new file mode 100644
index 0000000..65c5817
--- /dev/null
+++ b/README.md.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 4235740baccf09756af4db8495cd8f87
+TextScriptImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Runtime/LinearAlgebra/.editorconfig b/Runtime/LinearAlgebra/.editorconfig
deleted file mode 100644
index 1ec7f97..0000000
--- a/Runtime/LinearAlgebra/.editorconfig
+++ /dev/null
@@ -1,19 +0,0 @@
-# EditorConfig is awesome: https://EditorConfig.org
-
-# top-most EditorConfig file
-root = true
-
-[*]
-indent_style = space
-indent_size = 4
-end_of_line = crlf
-charset = utf-8
-trim_trailing_whitespace = false
-insert_final_newline = false
-max_line_length = 80
-
-[*.cs]
-csharp_new_line_before_open_brace = none
-# Suppress warnings everywhere
-dotnet_diagnostic.IDE1006.severity = none
-dotnet_diagnostic.IDE0130.severity = none
\ No newline at end of file
diff --git a/Runtime/LinearAlgebra/.gitea/workflows/unit_tests.yaml b/Runtime/LinearAlgebra/.gitea/workflows/unit_tests.yaml
deleted file mode 100644
index e98b26e..0000000
--- a/Runtime/LinearAlgebra/.gitea/workflows/unit_tests.yaml
+++ /dev/null
@@ -1,37 +0,0 @@
-name: Build and Run C# Unit Tests
-
-on:
- push:
- branches:
- - '**'
- pull_request:
- branches:
- - '**'
-
-jobs:
- build-and-test:
- runs-on: ubuntu-latest
-
- steps:
- - name: Checkout code
- uses: actions/checkout@v2
-
- - name: Setup .NET
- uses: actions/setup-dotnet@v1
- with:
- dotnet-version: '8.0.x' # Specify the .NET SDK version
-
- - name: Check Current Directory
- run: pwd # Logs the current working directory
-
- - name: List Files
- run: ls -la # Lists all files in the current directory
-
- - name: Restore Dependencies
- run: dotnet restore ./LinearAlgebra-csharp.sln # Restore NuGet packages
-
- - name: Build the Project
- run: dotnet build ./LinearAlgebra-csharp.sln --configuration Release # Build the C# project
-
- - name: Run Unit Tests
- run: dotnet test ./test/LinearAlgebra_Test.csproj --configuration Release # Execute unit tests
diff --git a/Runtime/LinearAlgebra/.gitignore b/Runtime/LinearAlgebra/.gitignore
deleted file mode 100644
index b32a30c..0000000
--- a/Runtime/LinearAlgebra/.gitignore
+++ /dev/null
@@ -1,5 +0,0 @@
-DoxyGen/DoxyWarnLogfile.txt
-.vscode/settings.json
-**bin
-**obj
-**.meta
diff --git a/Runtime/LinearAlgebra/LinearAlgebra-csharp.sln b/Runtime/LinearAlgebra/LinearAlgebra-csharp.sln
deleted file mode 100644
index 4b13b2b..0000000
--- a/Runtime/LinearAlgebra/LinearAlgebra-csharp.sln
+++ /dev/null
@@ -1,30 +0,0 @@
-Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio Version 17
-VisualStudioVersion = 17.5.2.0
-MinimumVisualStudioVersion = 10.0.40219.1
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LinearAlgebra", "src\LinearAlgebra.csproj", "{ECB58727-0354-924D-AE7B-22F6B21097EB}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LinearAlgebra_Test", "test\LinearAlgebra_Test.csproj", "{715BB399-5FC4-2AC9-3757-177CA0C80774}"
-EndProject
-Global
- GlobalSection(SolutionConfigurationPlatforms) = preSolution
- Debug|Any CPU = Debug|Any CPU
- Release|Any CPU = Release|Any CPU
- EndGlobalSection
- GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {ECB58727-0354-924D-AE7B-22F6B21097EB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {ECB58727-0354-924D-AE7B-22F6B21097EB}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {ECB58727-0354-924D-AE7B-22F6B21097EB}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {ECB58727-0354-924D-AE7B-22F6B21097EB}.Release|Any CPU.Build.0 = Release|Any CPU
- {715BB399-5FC4-2AC9-3757-177CA0C80774}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {715BB399-5FC4-2AC9-3757-177CA0C80774}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {715BB399-5FC4-2AC9-3757-177CA0C80774}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {715BB399-5FC4-2AC9-3757-177CA0C80774}.Release|Any CPU.Build.0 = Release|Any CPU
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
- GlobalSection(ExtensibilityGlobals) = postSolution
- SolutionGuid = {E93B8294-87D4-4887-83B7-182A623D5833}
- EndGlobalSection
-EndGlobal
diff --git a/Runtime/LinearAlgebra/src/Angle.cs b/Runtime/LinearAlgebra/src/Angle.cs
deleted file mode 100644
index 7d2fd6b..0000000
--- a/Runtime/LinearAlgebra/src/Angle.cs
+++ /dev/null
@@ -1,341 +0,0 @@
-using System;
-
-namespace LinearAlgebra {
-
- public struct AngleFloat {
- public const float Rad2Deg = 360.0f / ((float)Math.PI * 2); //0.0174532924F;
- public const float Deg2Rad = (float)Math.PI * 2 / 360.0f; //57.29578F;
-
- private AngleFloat(float degrees) {
- this.value = degrees;
- }
- private readonly float value;
-
- public static AngleFloat Degrees(float degrees) {
- // Reduce it to (-180..180]
- if (float.IsFinite(degrees)) {
- while (degrees < -180)
- degrees += 360;
- while (degrees >= 180)
- degrees -= 360;
- }
- return new AngleFloat(degrees);
- }
-
- public static AngleFloat Radians(float radians) {
- // Reduce it to (-pi..pi]
- if (float.IsFinite(radians)) {
- while (radians <= -Math.PI)
- radians += 2 * (float)Math.PI;
- while (radians > Math.PI)
- radians -= 2 * (float)Math.PI;
- }
-
- return new AngleFloat(radians * Rad2Deg);
- }
-
- public static AngleFloat Revolutions(float revolutions) {
- // reduce it to (-0.5 .. 0.5]
- if (float.IsFinite(revolutions)) {
- // Get the integer part
- int integerPart = (int)revolutions;
-
- // Get the decimal part
- revolutions -= integerPart;
- if (revolutions < -0.5)
- revolutions += 1;
- if (revolutions >= 0.5)
- revolutions -= 1;
- }
- return new AngleFloat(revolutions * 360);
- }
-
- public readonly float inDegrees => this.value;
-
- public readonly float inRadians => this.value * Deg2Rad;
-
- public readonly float inRevolutions => this.value / 360.0f;
-
- public override string ToString() {
- return $"{this.inDegrees}\u00B0";
- }
-
- public static readonly AngleFloat zero = Degrees(0);
- public static readonly AngleFloat deg90 = Degrees(90);
- public static readonly AngleFloat deg180 = Degrees(180);
-
- ///
- /// Get the sign of the angle
- ///
- /// The angle
- /// -1 when the angle is negative, 1 when it is positive and 0 in all other cases
- public static int Sign(AngleFloat a) {
- if (a.value < 0)
- return -1;
- if (a.value > 0)
- return 1;
- return 0;
- }
-
- ///
- /// Returns the magnitude of the angle
- ///
- /// The angle
- /// The positive magnitude of the angle
- /// Negative values are negated to get a positive result
- public static AngleFloat Abs(AngleFloat a) {
- if (Sign(a) < 0)
- return -a;
- else
- return a;
- }
-
- ///
- /// Tests the equality of two angles
- ///
- ///
- ///
- /// True when the angles are equal, false otherwise
- /// The equality is determine within the limits of precision of a float
- public static bool operator ==(AngleFloat a1, AngleFloat a2) {
- return a1.value == a2.value;
- }
-
- ///
- /// Tests the inequality of two angles
- ///
- ///
- ///
- /// True when the angles are not equal, false otherwise
- /// The equality is determine within the limits of precision of a float
- public static bool operator !=(AngleFloat a1, AngleFloat a2) {
- return a1.value != a2.value;
- }
-
- public override readonly bool Equals(object obj) {
- if (obj is AngleFloat other) {
- return this == other;
- }
- return false;
- }
-
- public override readonly int GetHashCode() {
- return this.value.GetHashCode();
- }
-
-
- ///
- /// Tests if the first angle is greater than the second
- ///
- ///
- ///
- /// True when a1 is greater than a2, False otherwise
- public static bool operator >(AngleFloat a1, AngleFloat a2) {
- return a1.value > a2.value;
- }
-
- ///
- /// Tests if the first angle is greater than or equal to the second
- ///
- ///
- ///
- /// True when a1 is greater than or equal to a2, False otherwise
- public static bool operator >=(AngleFloat a1, AngleFloat a2) {
- return a1.value >= a2.value;
- }
-
- ///
- /// Tests if the first angle is less than the second
- ///
- ///
- ///
- /// True when a1 is less than a2, False otherwise
- public static bool operator <(AngleFloat a1, AngleFloat a2) {
- return a1.value < a2.value;
- }
-
- ///
- /// Tests if the first angle is less than or equal to the second
- ///
- ///
- ///
- /// True when a1 is less than or equal to a2, False otherwise
- public static bool operator <=(AngleFloat a1, AngleFloat a2) {
- return a1.value <= a2.value;
- }
-
- ///
- /// Negate the angle
- ///
- /// The angle
- /// The negated angle
- /// The negation of -180 is still -180 because the range is (-180..180]
- public static AngleFloat operator -(AngleFloat a) {
- AngleFloat r = new(-a.value);
- return r;
- }
-
- ///
- /// Subtract two angles
- ///
- /// Angle 1
- /// Angle 2
- /// The result of the subtraction
- public static AngleFloat operator -(AngleFloat a1, AngleFloat a2) {
- AngleFloat r = new(a1.value - a2.value);
- return r;
- }
- ///
- /// Add two angles
- ///
- /// Angle 1
- /// Angle 2
- /// The result of the addition
- public static AngleFloat operator +(AngleFloat a1, AngleFloat a2) {
- AngleFloat r = new(a1.value + a2.value);
- return r;
- }
-
- ///
- /// Multiplies the angle
- ///
- /// The angle to multiply
- /// The factor by which the angle is multiplied
- /// The multiplied angle
- public static AngleFloat operator *(AngleFloat a, float factor) {
- return Degrees(a.inDegrees * factor);
- }
- public static AngleFloat operator *(float factor, AngleFloat a) {
- return Degrees(factor * a.inDegrees);
- }
-
- ///
- /// Clamp the angle between the given min and max values
- ///
- /// The angle to clamp
- /// The minimum angle
- /// The maximum angle
- /// The clamped angle
- /// Angles are normalized
- public static float Clamp(AngleFloat angle, AngleFloat min, AngleFloat max) {
- return Float.Clamp(angle.inDegrees, min.inDegrees, max.inDegrees);
- }
-
- /// @brief Calculates the cosine of an angle
- /// @param angle The given angle
- /// @return The cosine of the angle
- public static float Cos(AngleFloat angle) {
- return MathF.Cos(angle.inRadians);
- }
- /// @brief Calculates the sine of an angle
- /// @param angle The given angle
- /// @return The sine of the angle
- public static float Sin(AngleFloat angle) {
- return MathF.Sin(angle.inRadians);
- }
- /// @brief Calculates the tangent of an angle
- /// @param angle The given angle
- /// @return The tangent of the angle
- public static float Tan(AngleFloat angle) {
- return MathF.Tan(angle.inRadians);
- }
-
- /// @brief Calculates the arc cosine angle
- /// @param f The value
- /// @return The arc cosine for the given value
- public static AngleFloat Acos(float f) {
- return Radians(MathF.Acos(f));
- }
- /// @brief Calculates the arc sine angle
- /// @param f The value
- /// @return The arc sine for the given value
- public static AngleFloat Asin(float f) {
- return Radians(MathF.Asin(f));
- }
- /// @brief Calculates the arc tangent angle
- /// @param f The value
- /// @return The arc tangent for the given value
- public static AngleFloat Atan(float f) {
- return Radians(MathF.Atan(f));
- }
- /// @brief Calculates the tangent for the given values
- /// @param y The vertical value
- /// @param x The horizontal value
- /// @return The tanget for the given values
- /// Uses the y and x signs to compute the quadrant
- public static AngleFloat Atan2(float y, float x) {
- return Radians(MathF.Atan2(y, x));
- }
-
- ///
- /// Rotate from one angle to the other with a maximum degrees
- ///
- /// Starting angle
- /// Target angle
- /// Maximum angle to rotate
- /// The resulting angle
- /// This function is compatible with radian and degrees angles
- public static AngleFloat MoveTowards(AngleFloat fromAngle, AngleFloat toAngle, float maxDegrees) {
- maxDegrees = Math.Max(0, maxDegrees); // filter out negative distances
- AngleFloat d = toAngle - fromAngle;
- float dDegrees = Abs(d).inDegrees;
- d = Degrees(Float.Clamp(dDegrees, 0, maxDegrees));
- if (Sign(d) < 0)
- d = -d;
- return fromAngle + d;
- }
- }
-
-
- ///
- /// %Angle utilities
- ///
- public static class Angles {
- public const float pi = 3.1415927410125732421875F;
- // public static float Rad2Deg = 360.0f / ((float)Math.PI * 2);
- // public static float Deg2Rad = ((float)Math.PI * 2) / 360.0f;
-
-
- ///
- /// Determine the angle difference, result is a normalized angle
- ///
- /// First first angle
- /// The second angle
- /// the angle between the two angles
- /// Angle values should be degrees
- public static float Difference(float a, float b) {
- float r = Normalize(b - a);
- return r;
- }
-
- ///
- /// Normalize an angle to the range -180 < angle <= 180
- ///
- /// The angle to normalize
- /// The normalized angle in interval (-180..180]
- /// Angle values should be in degrees
- public static float Normalize(float angle) {
- if (float.IsInfinity(angle))
- return angle;
-
- while (angle <= -180) angle += 360;
- while (angle > 180) angle -= 360;
- return angle;
- }
-
- ///
- /// Map interval of angles between vectors [0..Pi] to interval [0..1]
- ///
- /// The first vector
- /// The second vector
- /// The resulting factor in interval [0..1]
- /// Vectors a and b must be normalized
- /// \deprecated Please use Vector2.ToFactor instead.
- // [Obsolete("Please use Vector2.ToFactor instead.")]
- // public static float ToFactor(Vector2Float v1, Vector2Float v2) {
- // return (1 - Vector2Float.Dot(v1, v2)) / 2;
- // }
-
- }
-
-}
\ No newline at end of file
diff --git a/Runtime/LinearAlgebra/src/Decomposition.cs b/Runtime/LinearAlgebra/src/Decomposition.cs
deleted file mode 100644
index ddaf434..0000000
--- a/Runtime/LinearAlgebra/src/Decomposition.cs
+++ /dev/null
@@ -1,287 +0,0 @@
-using System;
-namespace LinearAlgebra {
- class QR {
- // QR Decomposition of a matrix A
- public static (Matrix2 Q, Matrix2 R) Decomposition(Matrix2 A) {
- int nRows = A.nRows;
- int nCols = A.nCols;
-
- float[,] Q = new float[nRows, nCols];
- float[,] R = new float[nCols, nCols];
-
- // Perform Gram-Schmidt orthogonalization
- for (uint colIx = 0; colIx < nCols; colIx++) {
-
- // Step 1: v = column(ix) of A
- float[] v = new float[nRows];
- for (int rowIx = 0; rowIx < nRows; rowIx++)
- v[rowIx] = A.data[rowIx, colIx];
-
- // Step 2: Subtract projections of v onto previous q's (orthogonalize)
- for (uint colIx2 = 0; colIx2 < colIx; colIx2++) {
- float dotProd = 0;
- for (int i = 0; i < nRows; i++)
- dotProd += Q[i, colIx2] * v[i];
- for (int i = 0; i < nRows; i++)
- v[i] -= dotProd * Q[i, colIx2];
- }
-
- // Step 3: Normalize v to get column(ix) of Q
- float norm = 0;
- for (int rowIx = 0; rowIx < nRows; rowIx++)
- norm += v[rowIx] * v[rowIx];
- norm = (float)Math.Sqrt(norm);
-
- for (int rowIx = 0; rowIx < nRows; rowIx++)
- Q[rowIx, colIx] = v[rowIx] / norm;
-
- // Store the coefficients of R
- for (int colIx2 = 0; colIx2 <= colIx; colIx2++) {
- R[colIx2, colIx] = 0;
- for (int k = 0; k < nRows; k++)
- R[colIx2, colIx] += Q[k, colIx2] * A.data[k, colIx];
- }
- }
- return (new Matrix2(Q), new Matrix2(R));
- }
-
- // Reduced QR Decomposition of a matrix A
- public static (Matrix2 Q, Matrix2 R) ReducedDecomposition(Matrix2 A) {
- int nRows = A.nRows;
- int nCols = A.nCols;
-
- float[,] Q = new float[nRows, nCols];
- float[,] R = new float[nCols, nCols];
-
- // Perform Gram-Schmidt orthogonalization
- for (int colIx = 0; colIx < nCols; colIx++) {
-
- // Step 1: v = column(colIx) of A
- float[] columnIx = new float[nRows];
- bool isZeroColumn = true;
- for (int rowIx = 0; rowIx < nRows; rowIx++) {
- columnIx[rowIx] = A.data[rowIx, colIx];
- if (columnIx[rowIx] != 0)
- isZeroColumn = false;
- }
- if (isZeroColumn) {
- for (int rowIx = 0; rowIx < nRows; rowIx++)
- Q[rowIx, colIx] = 0;
- // Set corresponding R element to 0
- R[colIx, colIx] = 0;
-
- Console.WriteLine($"zero column {colIx}");
-
- continue;
- }
-
- // Step 2: Subtract projections of v onto previous q's (orthogonalize)
- for (int colIx2 = 0; colIx2 < colIx; colIx2++) {
- // Compute the dot product of v and column(colIx2) of Q
- float dotProduct = 0;
- for (int rowIx2 = 0; rowIx2 < nRows; rowIx2++)
- dotProduct += columnIx[rowIx2] * Q[rowIx2, colIx2];
- // Subtract the projection from v
- for (int rowIx2 = 0; rowIx2 < nRows; rowIx2++)
- columnIx[rowIx2] -= dotProduct * Q[rowIx2, colIx2];
- }
-
- // Step 3: Normalize v to get column(colIx) of Q
- float norm = 0;
- for (int rowIx = 0; rowIx < nRows; rowIx++)
- norm += columnIx[rowIx] * columnIx[rowIx];
- if (norm == 0)
- throw new Exception("invalid value");
-
- norm = (float)Math.Sqrt(norm);
-
- for (int rowIx = 0; rowIx < nRows; rowIx++)
- Q[rowIx, colIx] = columnIx[rowIx] / norm;
-
- // Here is where it deviates from the Full QR Decomposition !
-
- // Step 4: Compute the row(colIx) of R
- for (int colIx2 = colIx; colIx2 < nCols; colIx2++) {
- float dotProduct = 0;
- for (int rowIx2 = 0; rowIx2 < nRows; rowIx2++)
- dotProduct += Q[rowIx2, colIx] * A.data[rowIx2, colIx2];
- R[colIx, colIx2] = dotProduct;
- }
- }
- if (!float.IsFinite(R[0, 0]))
- throw new Exception("invalid value");
-
- return (new Matrix2(Q), new Matrix2(R));
- }
- }
-
- class SVD {
- // According to ChatGPT, Mathnet uses Golub-Reinsch SVD algorithm
- // 1. Bidiagonalization: The input matrix AA is reduced to a bidiagonal form using Golub-Kahan bidiagonalization.
- // This process involves applying a sequence of Householder reflections to AA to create a bidiagonal matrix.
- // This step reduces the complexity by making the matrix simpler while retaining the essential structure needed for SVD.
- //
- // 2. Diagonalization: Once the matrix is in bidiagonal form,
- // the singular values are computed using an iterative process
- // (typically involving QR factorization or Jacobi rotations) until convergence.
- // This process diagonalizes the bidiagonal matrix and allows extraction of the singular values.
- //
- // 3. Computing UU and VTVT: After obtaining the singular values,
- // the left singular vectors UU and right singular vectors VTVT are computed
- // using the accumulated transformations (such as Householder reflections) from the bidiagonalization step.
-
- // Bidiagnolizations through Householder transformations
- public static (Matrix2 U1, Matrix2 B, Matrix2 V1) Bidiagonalization(Matrix2 A) {
- int m = A.nRows; // Rows of A
- int n = A.nCols; // Columns of A
- float[,] U1 = new float[m, m]; // Left orthogonal matrix
- float[,] V1 = new float[n, n]; // Right orthogonal matrix
- float[,] B = A.Clone().data; // Copy A to B for transformation
-
- // Initialize U1 and V1 as identity matrices
- for (int i = 0; i < m; i++)
- U1[i, i] = 1;
- for (int i = 0; i < n; i++)
- V1[i, i] = 1;
-
- // Perform Householder reflections to create a bidiagonal matrix B
- for (int j = 0; j < n; j++) {
- // Step 1: Construct the Householder vector y
- float[] y = new float[m - j];
- for (int i = j; i < m; i++)
- y[i - j] = B[i, j];
-
- // Step 2: Compute the norm and scalar alpha
- float norm = 0;
- for (int i = 0; i < y.Length; i++)
- norm += y[i] * y[i];
- norm = (float)Math.Sqrt(norm);
-
- if (B[j, j] > 0)
- norm = -norm;
-
- float alpha = (float)Math.Sqrt(0.5 * (norm * (norm - B[j, j])));
- float r = (float)Math.Sqrt(0.5 * (norm * (norm + B[j, j])));
-
- // Step 3: Apply the reflection to zero out below diagonal
- for (int k = j; k < n; k++) {
- float dot = 0;
- for (int i = j; i < m; i++)
- dot += y[i - j] * B[i, k];
- dot /= r;
-
- for (int i = j; i < m; i++)
- B[i, k] -= 2 * dot * y[i - j];
- }
-
- // Step 4: Update U1 with the Householder reflection (U1 * Householder)
- for (int i = j; i < m; i++)
- U1[i, j] = y[i - j] / alpha;
-
- // Step 5: Update V1 (storing the Householder vector y)
- // Correct indexing: we only need to store part of y in V1 from index j to n
- for (int i = j; i < n; i++)
- V1[j, i] = B[j, i];
-
- // Repeat steps for further columns if necessary
- }
- return (new Matrix2(U1), new Matrix2(B), new Matrix2(V1));
- }
-
- public static Matrix2 Bidiagonalize(Matrix2 A) {
- int m = A.nRows; // Rows of A
- int n = A.nCols; // Columns of A
- float[,] B = A.Clone().data; // Copy A to B for transformation
-
- // Perform Householder reflections to create a bidiagonal matrix B
- for (int j = 0; j < n; j++) {
- // Step 1: Construct the Householder vector y
- float[] y = new float[m - j];
- for (int i = j; i < m; i++)
- y[i - j] = B[i, j];
-
- // Step 2: Compute the norm and scalar alpha
- float norm = 0;
- for (int i = 0; i < y.Length; i++)
- norm += y[i] * y[i];
- norm = (float)Math.Sqrt(norm);
-
- if (B[j, j] > 0)
- norm = -norm;
-
- float r = (float)Math.Sqrt(0.5 * (norm * (norm + B[j, j])));
-
- // Step 3: Apply the reflection to zero out below diagonal
- for (int k = j; k < n; k++) {
- float dot = 0;
- for (int i = j; i < m; i++)
- dot += y[i - j] * B[i, k];
- dot /= r;
-
- for (int i = j; i < m; i++)
- B[i, k] -= 2 * dot * y[i - j];
- }
-
- // Repeat steps for further columns if necessary
- }
- return new Matrix2(B);
- }
-
- // QR Iteration for diagonalization of a bidiagonal matrix B
- public static (Matrix1 singularValues, Matrix2 U, Matrix2 Vt) QRIteration(Matrix2 B) {
- int m = B.nRows;
- int n = B.nCols;
-
- Matrix2 U = new(m, m); // Left singular vectors (U)
- Matrix2 Vt = new(n, n); // Right singular vectors (V^T)
- float[] singularValues = new float[Math.Min(m, n)]; // Singular values
-
- // Initialize U and Vt as identity matrices
- for (int i = 0; i < m; i++)
- U.data[i, i] = 1;
- for (int i = 0; i < n; i++)
- Vt.data[i, i] = 1;
-
- // Perform QR iterations
- float tolerance = 1e-7f; //1e-12f; for double
- bool converged = false;
- while (!converged) {
- // Perform QR decomposition on the matrix B
- (Matrix2 Q, Matrix2 R) = QR.Decomposition(B);
-
- // Update B to be the product Q * R //R * Q
- B = R * Q;
-
- // Accumulate the transformations in U and Vt
- U *= Q;
- Vt *= R;
-
- // Check convergence by looking at the off-diagonal elements of B
- converged = true;
- for (int i = 0; i < m - 1; i++) {
- for (int j = i + 1; j < n; j++) {
- if (Math.Abs(B.data[i, j]) > tolerance) {
- converged = false;
- break;
- }
- }
- }
- }
-
- // Extract singular values (diagonal elements of B)
- for (int i = 0; i < Math.Min(m, n); i++)
- singularValues[i] = B.data[i, i];
-
- return (new Matrix1(singularValues), U, Vt);
- }
-
- public static (Matrix2 U, Matrix1 S, Matrix2 Vt) Decomposition(Matrix2 A) {
- if (A.nRows != A.nCols)
- throw new ArgumentException("SVD: matrix A has to be square.");
-
- Matrix2 B = Bidiagonalize(A);
- (Matrix1 S, Matrix2 U, Matrix2 Vt) = QRIteration(B);
- return (U, S, Vt);
- }
- }
-}
\ No newline at end of file
diff --git a/Runtime/LinearAlgebra/src/Direction.cs b/Runtime/LinearAlgebra/src/Direction.cs
deleted file mode 100644
index fd25b98..0000000
--- a/Runtime/LinearAlgebra/src/Direction.cs
+++ /dev/null
@@ -1,261 +0,0 @@
-using System;
-#if UNITY_5_3_OR_NEWER
-using Vector3Float = UnityEngine.Vector3;
-#endif
-
-namespace LinearAlgebra
-{
-
- ///
- /// A direction in 3D space
- ///
- /// A direction is represented using two angles:
- /// * The horizontal angle ranging from -180 (inclusive) to 180 (exclusive)
- /// degrees which is a rotation in the horizontal plane
- /// * A vertical angle ranging from -90 (inclusive) to 90 (exclusive) degrees
- /// which is the rotation in the up/down direction applied after the horizontal
- /// rotation has been applied.
- /// The angles are automatically normalized to stay within the abovenmentioned
- /// ranges.
- public struct Direction
- {
- /// @brief horizontal angle, range = (-180..180] degrees
- public AngleFloat horizontal;
- /// @brief vertical angle, range in degrees = (-90..90] degrees
- public AngleFloat vertical;
-
- ///
- /// Create a new direction
- ///
- /// The horizontal angle
- /// The vertical angle
- /// The direction will be normalized automatically
- /// to ensure the angles are within the allowed ranges
- public Direction(AngleFloat horizontal, AngleFloat vertical)
- {
- this.horizontal = horizontal;
- this.vertical = vertical;
- this.Normalize();
- }
-
- ///
- /// Create a direction using angle values in degrees
- ///
- /// The horizontal angle in degrees
- /// The vertical angle in degrees
- /// The direction
- /// The direction will be normalized automatically
- /// to ensure the angles are within the allowed ranges
- public static Direction Degrees(float horizontal, float vertical)
- {
- Direction d = new()
- {
- horizontal = AngleFloat.Degrees(horizontal),
- vertical = AngleFloat.Degrees(vertical)
- };
- d.Normalize();
- return d;
- }
- ///
- /// Create a direction using angle values in radians
- ///
- /// The horizontal angle in radians
- /// The vertical angle in radians
- /// The direction
- public static Direction Radians(float horizontal, float vertical)
- {
- Direction d = new()
- {
- horizontal = AngleFloat.Radians(horizontal),
- vertical = AngleFloat.Radians(vertical)
- };
- d.Normalize();
- return d;
- }
-
- public override readonly string ToString() {
- return $"Direction(h: {this.horizontal}, v: {this.vertical})";
- }
-
- ///
- /// A forward direction with zero for both angles
- ///
- public readonly static Direction forward = Degrees(0, 0);
- ///
- /// A backward direction with horizontal angle -180 and zero vertical
- /// angle
- ///
- public readonly static Direction backward = Degrees(-180, 0);
- ///
- /// A upward direction with zero horizontal angle and vertical angle 90
- ///
- public readonly static Direction up = Degrees(0, 90);
- ///
- /// A downward direction with zero horizontal angle and vertical angle
- /// -90
- ///
- public readonly static Direction down = Degrees(0, -90);
- ///
- /// A left-pointing direction with horizontal angle -90 and zero
- /// vertical angle
- ///
- public readonly static Direction left = Degrees(-90, 0);
- ///
- /// A right-pointing direction with horizontal angle 90 and zero
- /// vertical angle
- ///
- public readonly static Direction right = Degrees(90, 0);
-
- private void Normalize()
- {
- if (this.vertical > AngleFloat.deg90 || this.vertical < -AngleFloat.deg90)
- {
- this.horizontal += AngleFloat.deg180;
- this.vertical = AngleFloat.Degrees(180 - this.vertical.inDegrees);
- }
- }
-
-#if UNITY_5_3_OR_NEWER
- ///
- /// Convert the direction into a carthesian vector
- ///
- /// The carthesian vector corresponding to this direction.
- public readonly UnityEngine.Vector3 ToVector3() {
- // Convert degrees to radians
- float radH = this.horizontal.inRadians;
- float radV = this.vertical.inRadians;
-
- // Calculate Vector
- float cosV = MathF.Cos(radV);
- float sinV = MathF.Sin(radV);
-
- float x = cosV * MathF.Sin(radH);
- float y = sinV;
- float z = cosV * MathF.Cos(radH);
-
- return new UnityEngine.Vector3(x, y, z);
- }
-
- ///
- /// Convert a carthesian vector into a direction
- ///
- /// The carthesian vector
- /// The direction
- /// Information about the length of the carthesian vector is not
- /// included in this transformation
- public static Direction FromVector3(UnityEngine.Vector3 v) {
- AngleFloat horizontal = AngleFloat.Atan2(v.x, v.z);
- AngleFloat vertical = AngleFloat.deg90 - AngleFloat.Acos(v.y);
- Direction d = new(horizontal, vertical);
- return d;
- }
-#else
- ///
- /// Convert the direction into a carthesian vector
- ///
- /// The carthesian vector corresponding to this direction.
- public readonly Vector3Float ToVector3() {
- // Quaternion q = Quaternion.Euler(90 - this.vertical.inDegrees, this.horizontal.inDegrees, 0);
- // Vector3Float v = q * Vector3Float.forward;
- // return v;
-
- float radH = this.horizontal.inRadians;
- float radV = this.vertical.inRadians;
-
- float cosV = MathF.Cos(radV);
- float sinV = MathF.Sin(radV);
-
- float horizontal = cosV * MathF.Sin(radH);
- float vertical = sinV;
- float depth = cosV * MathF.Cos(radH);
-
- return new Vector3Float(horizontal, vertical, depth);
- }
-
- ///
- /// Convert a carthesian vector into a direction
- ///
- /// The carthesian vector
- /// The direction
- /// Information about the length of the carthesian vector is not
- /// included in this transformation
- public static Direction FromVector3(Vector3Float v)
- {
- AngleFloat horizontal = AngleFloat.Atan2(v.horizontal, v.depth);
- AngleFloat vertical = AngleFloat.deg90 - AngleFloat.Acos(v.vertical);
- Direction d = new(horizontal, vertical);
- return d;
- }
-#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
- ///
- ///
- ///
- /// True when the direction angles are equal, false otherwise.
- public static bool operator ==(Direction d1, Direction d2)
- {
- bool horizontalEq = d1.horizontal == d2.horizontal;
- bool verticalEq = d1.vertical == d2.vertical;
- return horizontalEq && verticalEq;
- }
-
- ///
- /// Tests the inequality of two directions
- ///
- ///
- ///
- /// True when the direction angles are not equal, false otherwise.
- public static bool operator !=(Direction d1, Direction d2)
- {
- bool horizontalNEq = d1.horizontal != d2.horizontal;
- bool verticalNEq = d1.vertical != d2.vertical;
- return horizontalNEq || verticalNEq;
- }
-
- public override readonly bool Equals(object obj)
- {
- if (obj is not Direction d)
- return false;
-
- bool horizontalEq = this.horizontal == d.horizontal;
- bool verticalEq = this.vertical == d.vertical;
- return horizontalEq && verticalEq;
- }
-
-
- public override readonly int GetHashCode()
- {
- return HashCode.Combine(horizontal, vertical);
- }
-
- public static AngleFloat UnsignedAngle(Direction d1, Direction d2) {
- // Convert angles from degrees to radians
- float horizontal1Rad = d1.horizontal.inRadians;
- float vertical1Rad = d1.vertical.inRadians;
-
- float horizontal2Rad = d2.horizontal.inRadians;
- float vertical2Rad = d2.vertical.inRadians;
-
- // Calculate the cosine of the angle using the spherical law of cosines
- float cosTheta = MathF.Sin(vertical1Rad) * MathF.Sin(vertical2Rad) +
- MathF.Cos(vertical1Rad) * MathF.Cos(vertical2Rad) *
- MathF.Cos(horizontal1Rad - horizontal2Rad);
-
- // Clip cosTheta to the valid range for acos
- cosTheta = Float.Clamp(cosTheta, -1.0f, 1.0f);
-
- // Calculate the angle
- AngleFloat angle = AngleFloat.Acos(cosTheta);
- return angle;
- }
- }
-
-}
\ No newline at end of file
diff --git a/Runtime/LinearAlgebra/src/Float.cs b/Runtime/LinearAlgebra/src/Float.cs
deleted file mode 100644
index 2217b84..0000000
--- a/Runtime/LinearAlgebra/src/Float.cs
+++ /dev/null
@@ -1,41 +0,0 @@
-namespace LinearAlgebra {
-
- ///
- /// Float number utilities
- ///
- public class Float {
- ///
- /// The precision of float numbers
- ///
- public const float epsilon = 1E-05f;
- ///
- /// The square of the float number precision
- ///
- public const float sqrEpsilon = 1e-10f;
-
- ///
- /// Clamp the value between the given minimum and maximum values
- ///
- /// The value to clamp
- /// The minimum value
- /// The maximum value
- /// The clamped value
- public static float Clamp(float f, float min, float max) {
- if (f < min)
- return min;
- if (f > max)
- return max;
- return f;
- }
-
- ///
- /// Clamp the value between to the interval [0..1]
- ///
- /// The value to clamp
- /// The clamped value
- public static float Clamp01(float f) {
- return Clamp(f, 0, 1);
- }
- }
-
-}
\ No newline at end of file
diff --git a/Runtime/LinearAlgebra/src/LinearAlgebra.csproj b/Runtime/LinearAlgebra/src/LinearAlgebra.csproj
deleted file mode 100644
index d2d5a85..0000000
--- a/Runtime/LinearAlgebra/src/LinearAlgebra.csproj
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
-
- false
- false
- net8.0
-
-
-
-
-
-
-
-
diff --git a/Runtime/LinearAlgebra/src/Matrix.cs b/Runtime/LinearAlgebra/src/Matrix.cs
deleted file mode 100644
index 37c6c24..0000000
--- a/Runtime/LinearAlgebra/src/Matrix.cs
+++ /dev/null
@@ -1,689 +0,0 @@
-using System;
-#if UNITY_5_3_OR_NEWER
-using Vector3Float = UnityEngine.Vector3;
-using Vector2Float = UnityEngine.Vector2;
-using Quaternion = UnityEngine.Quaternion;
-#endif
-
-namespace LinearAlgebra {
-
- public readonly struct Slice
- {
- public int start { get; }
- public int stop { get; }
- public Slice(int start, int stop)
- {
- this.start = start;
- this.stop = stop;
- }
- }
-
- public class Matrix2 {
- public float[,] data { get; }
-
- public int nRows => data.GetLength(0);
- public int nCols => data.GetLength(1);
-
- public Matrix2(int nRows, int nCols)
- {
- this.data = new float[nRows, nCols];
- }
- public Matrix2(float[,] data) {
- this.data = data;
- }
-
- public Matrix2 Clone() {
- float[,] data = new float[this.nRows, nCols];
- for (int rowIx = 0; rowIx < this.nRows; rowIx++) {
- for (int colIx = 0; colIx < this.nCols; colIx++)
- data[rowIx, colIx] = this.data[rowIx, colIx];
- }
- return new Matrix2(data);
- }
-
- public static Matrix2 Zero(int nRows, int nCols)
- {
- return new Matrix2(nRows, nCols);
- }
-
- public static Matrix2 FromVector3(Vector3Float v) {
- float[,] result = new float[3, 1];
- result[0, 0] = v.horizontal;
- result[1, 0] = v.vertical;
- result[2, 0] = v.depth;
- return new Matrix2(result);
- }
-
- public static Matrix2 Identity(int size)
- {
- return Diagonal(1, size);
- }
- public static Matrix2 Identity(int nRows, int nCols)
- {
- Matrix2 m = Zero(nRows, nCols);
- m.FillDiagonal(1);
- return m;
- }
-
- public static Matrix2 Diagonal(Matrix1 v) {
- float[,] resultData = new float[v.size, v.size];
- for (int ix = 0; ix < v.size; ix++)
- resultData[ix, ix] = v.data[ix];
- return new Matrix2(resultData);
- }
- public static Matrix2 Diagonal(float f, int size)
- {
- float[,] resultData = new float[size, size];
- for (int ix = 0; ix < size; ix++)
- resultData[ix, ix] = f;
- return new Matrix2(resultData);
- }
- public void FillDiagonal(Matrix1 v)
- {
- int n = (int)Math.Min(Math.Min(this.nRows, this.nCols), v.size);
- for (int ix = 0; ix < n; ix++)
- this.data[ix, ix] = v.data[ix];
- }
- public void FillDiagonal(float f)
- {
- int n = Math.Min(this.nRows, this.nCols);
- for (int ix = 0; ix < n; ix++)
- this.data[ix, ix] = f;
- }
-
- public static Matrix2 SkewMatrix(Vector3Float v) {
- float[,] result = new float[3, 3] {
- {0, -v.depth, v.vertical},
- {v.depth, 0, -v.horizontal},
- {-v.vertical, v.horizontal, 0}
- };
- return new Matrix2(result);
- }
-
- public Matrix1 GetRow(int rowIx) {
- float[] row = new float[this.nCols];
- for (int colIx = 0; colIx < this.nCols; colIx++) {
- row[colIx] = this.data[rowIx, colIx];
- }
- return new Matrix1(row);
- }
-
-#if UNITY_5_3_OR_NEWER
- public UnityEngine.Vector3 GetRow3(int rowIx) {
- int cols = this.nCols;
- UnityEngine.Vector3 row = new() {
- x = this.data[rowIx, 0],
- y = this.data[rowIx, 1],
- z = this.data[rowIx, 2]
- };
- return row;
- }
-#endif
- public void SetRow(int rowIx, Matrix1 v) {
- for (uint ix = 0; ix < v.size; ix++)
- this.data[rowIx, ix] = v.data[ix];
- }
- public void SetRow3(int rowIx, Vector3Float v) {
- this.data[rowIx, 0] = v.horizontal;
- this.data[rowIx, 1] = v.vertical;
- this.data[rowIx, 2] = v.depth;
- }
-
- public void SwapRows(int row1, int row2) {
- for (uint ix = 0; ix < this.nCols; ix++) {
- float temp = this.data[row1, ix];
- this.data[row1, ix] = this.data[row2, ix];
- this.data[row2, ix] = temp;
- }
- }
-
- public Matrix1 GetColumn(int colIx)
- {
- float[] column = new float[this.nRows];
- for (int i = 0; i < this.nRows; i++) {
- column[i] = this.data[i, colIx];
- }
- return new Matrix1(column);
- }
- public void SetColumn(int colIx, Matrix1 v) {
- for (uint ix = 0; ix < v.size; ix++)
- this.data[ix, colIx] = v.data[ix];
- }
- public void SetColumn(int colIx, Vector3Float v) {
- this.data[0, colIx] = v.horizontal;
- this.data[1, colIx] = v.vertical;
- this.data[2, colIx] = v.depth;
- }
-
- public static bool AllClose(Matrix2 A, Matrix2 B, float atol = 1e-08f) {
- for (int i = 0; i < A.nRows; i++) {
- for (int j = 0; j < A.nCols; j++) {
- float d = MathF.Abs(A.data[i, j] - B.data[i, j]);
- if (d > atol)
- return false;
- }
- }
- return true;
- }
-
- public Matrix2 Transpose() {
- float[,] resultData = new float[this.nCols, this.nRows];
- for (uint rowIx = 0; rowIx < this.nRows; rowIx++) {
- for (uint colIx = 0; colIx < this.nCols; colIx++)
- resultData[colIx, rowIx] = this.data[rowIx, colIx];
- }
- return new Matrix2(resultData);
- // double checked code
- }
- public Matrix2 transposed {
- get => Transpose();
- }
-
- public static Matrix2 operator -(Matrix2 m) {
- float[,] result = new float[m.nRows, m.nCols];
-
- for (int i = 0; i < m.nRows; i++) {
- for (int j = 0; j < m.nCols; j++)
- result[i, j] = -m.data[i, j];
- }
- return new Matrix2(result);
- }
-
- public static Matrix2 operator -(Matrix2 A, Matrix2 B) {
- if (A.nRows != B.nRows || A.nCols != B.nCols)
- throw new System.ArgumentException("Size of A must match size of B.");
-
- float[,] result = new float[A.nRows, B.nCols];
-
- for (int i = 0; i < A.nRows; i++) {
- for (int j = 0; j < A.nCols; j++)
- result[i, j] = A.data[i, j] - B.data[i, j];
- }
- return new Matrix2(result);
- }
-
- public static Matrix2 operator +(Matrix2 A, Matrix2 B) {
- if (A.nRows != B.nRows || A.nCols != B.nCols)
- throw new System.ArgumentException("Size of A must match size of B.");
-
- float[,] result = new float[A.nRows, B.nCols];
-
- for (int i = 0; i < A.nRows; i++) {
- for (int j = 0; j < A.nCols; j++)
- result[i, j] = A.data[i, j] + B.data[i, j];
- }
- return new Matrix2(result);
- }
-
- public static Matrix2 operator *(Matrix2 A, Matrix2 B) {
- if (A.nCols != B.nRows)
- throw new System.ArgumentException("Number of columns in A must match number of rows in B.");
-
- float[,] result = new float[A.nRows, B.nCols];
-
- for (int i = 0; i < A.nRows; i++) {
- for (int j = 0; j < B.nCols; j++) {
- float sum = 0.0f;
- for (int k = 0; k < A.nCols; k++)
- sum += A.data[i, k] * B.data[k, j];
-
- result[i, j] = sum;
- }
- }
-
- return new Matrix2(result);
- // double checked code
- }
-
- public static Matrix1 operator *(Matrix2 A, Matrix1 v) {
- float[] result = new float[A.nRows];
-
- for (int i = 0; i < A.nRows; i++) {
- for (int j = 0; j < A.nCols; j++) {
- result[i] += A.data[i, j] * v.data[j];
- }
- }
-
- return new Matrix1(result);
- }
-
- public static Vector3Float operator *(Matrix2 A, Vector3Float v) {
- return new Vector3Float(
- A.data[0, 0] * v.horizontal + A.data[0, 1] * v.vertical + A.data[0, 2] * v.depth,
- A.data[1, 0] * v.horizontal + A.data[1, 1] * v.vertical + A.data[1, 2] * v.depth,
- A.data[2, 0] * v.horizontal + A.data[2, 1] * v.vertical + A.data[2, 2] * v.depth
- );
- }
-
- public static Matrix2 operator *(Matrix2 A, float s) {
- float[,] result = new float[A.nRows, A.nCols];
-
- for (int i = 0; i < A.nRows; i++) {
- for (int j = 0; j < A.nCols; j++)
- result[i, j] = A.data[i, j] * s;
- }
-
- return new Matrix2(result);
- }
- public static Matrix2 operator *(float s, Matrix2 A) {
- return A * s;
- }
-
- public static Matrix2 operator /(Matrix2 A, float s) {
- float[,] result = new float[A.nRows, A.nCols];
-
- for (int i = 0; i < A.nRows; i++) {
- for (int j = 0; j < A.nCols; j++)
- result[i, j] = A.data[i, j] / s;
- }
-
- return new Matrix2(result);
- }
- public static Matrix2 operator /(float s, Matrix2 A) {
- float[,] result = new float[A.nRows, A.nCols];
-
- for (int i = 0; i < A.nRows; i++) {
- for (int j = 0; j < A.nCols; j++)
- result[i, j] = s / A.data[i, j];
- }
-
- return new Matrix2(result);
- }
-
- public Matrix2 GetRows(Slice slice) {
- return GetRows(slice.start, slice.stop);
- }
- public Matrix2 GetRows(int from, int to) {
- if (from < 0 || to >= this.nRows)
- throw new System.ArgumentException("Slice index out of range.");
-
- float[,] result = new float[to - from, this.nCols];
- int resultRowIx = 0;
- for (int rowIx = from; rowIx < to; rowIx++) {
- for (int colIx = 0; colIx < this.nCols; colIx++)
- result[resultRowIx, colIx] = this.data[rowIx, colIx];
-
- resultRowIx++;
- }
-
- return new Matrix2(result);
- }
-
- public Matrix2 Slice(Slice slice)
- {
- return Slice(slice.start, slice.stop);
- }
- public Matrix2 Slice(int from, int to)
- {
- if (from < 0 || to >= this.nRows)
- throw new System.ArgumentException("Slice index out of range.");
-
- float[,] result = new float[to - from, this.nCols];
- int resultRowIx = 0;
- for (int rowIx = from; rowIx < to; rowIx++)
- {
- for (int colIx = 0; colIx < this.nCols; colIx++)
- {
- result[resultRowIx, colIx] = this.data[rowIx, colIx];
- }
- resultRowIx++;
- }
-
- return new Matrix2(result);
- }
- public Matrix2 Slice(Slice rowRange, Slice colRange) {
- return Slice((rowRange.start, rowRange.stop), (colRange.start, colRange.stop));
- }
- public Matrix2 Slice((int start, int stop) rowRange, (int start, int stop) colRange)
- {
- float[,] result = new float[rowRange.stop - rowRange.start, colRange.stop - colRange.start];
-
- int resultRowIx = 0;
- int resultColIx = 0;
- for (int i = rowRange.start; i < rowRange.stop; i++)
- {
- for (int j = colRange.start; j < colRange.stop; j++)
- result[resultRowIx, resultColIx] = this.data[i, j];
- }
- return new Matrix2(result);
- }
-
- public void UpdateSlice(Slice slice, Matrix2 m) {
- UpdateSlice((slice.start, slice.stop), m);
- }
- public void UpdateSlice((int start, int stop) slice, Matrix2 m) {
- // if (slice.start == slice.stop)
- // Console.WriteLine("WARNING: no data is updates when start equals stop in a slice!");
- int mRowIx = 0;
- for (int rowIx = slice.start; rowIx < slice.stop; rowIx++, mRowIx++) {
- for (int colIx = 0; colIx < this.nCols; colIx++)
- this.data[rowIx, colIx] = m.data[mRowIx, colIx];
- }
- }
-
- public void UpdateSlice(Slice rowRange, Slice colRange, Matrix2 m)
- {
- UpdateSlice((rowRange.start, rowRange.stop), (colRange.start, colRange.stop), m);
- }
- public void UpdateSlice((int start, int stop) rowRange, (int start, int stop) colRange, Matrix2 m)
- {
- for (int i = rowRange.start; i < rowRange.stop; i++)
- {
- for (int j = colRange.start; j < colRange.stop; j++)
- this.data[i, j] = m.data[i - rowRange.start, j - colRange.start];
- }
- }
-
- public Matrix2 Inverse() {
- Matrix2 A = this;
- // unchecked
- int n = A.nRows;
-
- // Create an identity matrix of the same size as the original matrix
- float[,] augmentedMatrix = new float[n, 2 * n];
- for (int i = 0; i < n; i++) {
- for (int j = 0; j < n; j++) {
- augmentedMatrix[i, j] = A.data[i, j];
- augmentedMatrix[i, j + n] = (i == j) ? 1 : 0; // Identity matrix
- }
- }
-
- // Perform Gaussian elimination
- for (int i = 0; i < n; i++) {
- // Find the pivot row
- float pivot = augmentedMatrix[i, i];
- if (Math.Abs(pivot) < 1e-10) // Check for singular matrix
- throw new InvalidOperationException("Matrix is singular and cannot be inverted.");
-
- // Normalize the pivot row
- for (int j = 0; j < 2 * n; j++)
- augmentedMatrix[i, j] /= pivot;
-
- // Eliminate the column below the pivot
- for (int j = i + 1; j < n; j++) {
- float factor = augmentedMatrix[j, i];
- for (int k = 0; k < 2 * n; k++)
- augmentedMatrix[j, k] -= factor * augmentedMatrix[i, k];
- }
- }
-
- // Back substitution
- for (int i = n - 1; i >= 0; i--)
- {
- // Eliminate the column above the pivot
- for (int j = i - 1; j >= 0; j--)
- {
- float factor = augmentedMatrix[j, i];
- for (int k = 0; k < 2 * n; k++)
- augmentedMatrix[j, k] -= factor * augmentedMatrix[i, k];
- }
- }
-
- // Extract the inverse matrix from the augmented matrix
- float[,] inverse = new float[n, n];
- for (int i = 0; i < n; i++) {
- for (int j = 0; j < n; j++)
- inverse[i, j] = augmentedMatrix[i, j + n];
- }
-
- return new Matrix2(inverse);
- }
-
- public float Determinant()
- {
- int n = this.nRows;
- if (n != this.nCols)
- throw new System.ArgumentException("Matrix must be square.");
-
- if (n == 1)
- return this.data[0, 0]; // Base case for 1x1 matrix
-
- if (n == 2) // Base case for 2x2 matrix
- return this.data[0, 0] * this.data[1, 1] - this.data[0, 1] * this.data[1, 0];
-
- float det = 0;
- for (int col = 0; col < n; col++)
- det += (col % 2 == 0 ? 1 : -1) * this.data[0, col] * this.Minor(0, col).Determinant();
-
- return det;
- }
-
- // Helper function to compute the minor of a matrix
- private Matrix2 Minor(int rowToRemove, int colToRemove)
- {
- int n = this.nRows;
- float[,] minor = new float[n - 1, n - 1];
-
- int r = 0, c = 0;
- for (int i = 0; i < n; i++) {
- if (i == rowToRemove) continue;
-
- c = 0;
- for (int j = 0; j < n; j++) {
- if (j == colToRemove) continue;
-
- minor[r, c] = this.data[i, j];
- c++;
- }
- r++;
- }
-
- return new Matrix2(minor);
- }
-
- public static Matrix2 DeleteRows(Matrix2 A, Slice rowRange) {
- float[,] result = new float[A.nRows - (rowRange.stop - rowRange.start), A.nCols];
-
- int resultRowIx = 0;
- for (int i = 0; i < A.nRows; i++) {
- if (i >= rowRange.start && i < rowRange.stop)
- continue;
-
- for (int j = 0; j < A.nCols; j++)
- result[resultRowIx, j] = A.data[i, j];
-
- resultRowIx++;
- }
- return new Matrix2(result);
- }
-
- internal static Matrix2 DeleteColumns(Matrix2 A, Slice colRange) {
- float[,] result = new float[A.nRows, A.nCols - (colRange.stop - colRange.start)];
-
- for (int i = 0; i < A.nRows; i++) {
- int resultColIx = 0;
- for (int j = 0; j < A.nCols; j++) {
- if (j >= colRange.start && j < colRange.stop)
- continue;
-
- result[i, resultColIx++] = A.data[i, j];
- }
- }
- return new Matrix2(result);
- }
- }
-
- public class Matrix1
- {
- public float[] data { get; }
-
- public int size => data.GetLength(0);
-
- public Matrix1(int size)
- {
- this.data = new float[size];
- }
-
- public Matrix1(float[] data) {
- this.data = data;
- }
-
- public static Matrix1 Zero(int size)
- {
- return new Matrix1(size);
- }
-
- public static Matrix1 FromVector2(Vector2Float v) {
- float[] result = new float[2];
- result[0] = v.horizontal;
- result[1] = v.vertical;
- return new Matrix1(result);
- }
-
- public static Matrix1 FromVector3(Vector3Float v) {
- float[] result = new float[3];
- result[0] = v.horizontal;
- result[1] = v.vertical;
- result[2] = v.depth;
- return new Matrix1(result);
- }
-
-#if UNITY_5_3_OR_NEWER
- public static Matrix1 FromQuaternion(Quaternion q) {
- float[] result = new float[4];
- result[0] = q.x;
- result[1] = q.y;
- result[2] = q.z;
- result[3] = q.w;
- return new Matrix1(result);
- }
-#endif
-
- public Vector2Float vector2 {
- get {
- if (this.size != 2)
- throw new System.ArgumentException("Matrix1 must be of size 2");
- return new Vector2Float(this.data[0], this.data[1]);
- }
- }
- public Vector3Float vector3 {
- get {
- if (this.size != 3)
- throw new System.ArgumentException("Matrix1 must be of size 3");
- return new Vector3Float(this.data[0], this.data[1], this.data[2]);
- }
- }
-
-#if UNITY_5_3_OR_NEWER
- public Quaternion quaternion {
- get {
- if (this.size != 4)
- throw new System.ArgumentException("Matrix1 must be of size 4");
- return new Quaternion(this.data[0], this.data[1], this.data[2], this.data[3]);
- }
- }
-#endif
-
- public Matrix1 Clone() {
- float[] data = new float[this.size];
- for (int rowIx = 0; rowIx < this.size; rowIx++)
- data[rowIx] = this.data[rowIx];
- return new Matrix1(data);
- }
-
-
- public float magnitude {
- get {
- float sum = 0;
- foreach (var elm in data)
- sum += elm;
- return sum / data.Length;
- }
- }
- public static Matrix1 operator +(Matrix1 A, Matrix1 B) {
- if (A.size != B.size)
- throw new System.ArgumentException("Size of A must match size of B.");
-
- float[] result = new float[A.size];
-
- for (int i = 0; i < A.size; i++) {
- result[i] = A.data[i] + B.data[i];
- }
- return new Matrix1(result);
- }
-
- public Matrix2 Transpose() {
- float[,] r = new float[1, this.size];
- for (uint colIx = 0; colIx < this.size; colIx++)
- r[1, colIx] = this.data[colIx];
-
- return new Matrix2(r);
- }
-
- public static float Dot(Matrix1 a, Matrix1 b) {
- if (a.size != b.size)
- throw new System.ArgumentException("Vectors must be of the same length.");
-
- float result = 0.0f;
- for (int i = 0; i < a.size; i++) {
- result += a.data[i] * b.data[i];
- }
- return result;
- }
-
- public static Matrix1 operator -(Matrix1 A, Matrix1 B) {
- if (A.size != B.size)
- throw new System.ArgumentException("Size of A must match size of B.");
-
- float[] result = new float[A.size];
-
- for (int i = 0; i < A.size; i++) {
- result[i] = A.data[i] - B.data[i];
- }
- return new Matrix1(result);
- }
-
- public static Matrix1 operator *(Matrix1 A, float f)
- {
- float[] result = new float[A.size];
-
- for (int i = 0; i < A.size; i++)
- result[i] += A.data[i] * f;
-
- return new Matrix1(result);
- }
- public static Matrix1 operator *(float f, Matrix1 A) {
- return A * f;
- }
-
- public static Matrix1 operator /(Matrix1 A, float f) {
- float[] result = new float[A.size];
-
- for (int i = 0; i < A.size; i++)
- result[i] = A.data[i] / f;
-
- return new Matrix1(result);
- }
- public static Matrix1 operator /(float f, Matrix1 A) {
- float[] result = new float[A.size];
-
- for (int i = 0; i < A.size; i++)
- result[i] = f / A.data[i];
-
- return new Matrix1(result);
- }
-
- public Matrix1 Slice(Slice range)
- {
- return Slice(range.start, range.stop);
- }
- public Matrix1 Slice(int from, int to)
- {
- if (from < 0 || to >= this.size)
- throw new System.ArgumentException("Slice index out of range.");
-
- float[] result = new float[to - from];
- int resultIx = 0;
- for (int ix = from; ix < to; ix++)
- result[resultIx++] = this.data[ix];
-
- return new Matrix1(result);
- }
- public void UpdateSlice(Slice slice, Matrix1 v) {
- int vIx = 0;
- for (int ix = slice.start; ix < slice.stop; ix++, vIx++)
- this.data[ix] = v.data[vIx];
- }
- }
-
-}
\ No newline at end of file
diff --git a/Runtime/LinearAlgebra/src/Quat32.cs b/Runtime/LinearAlgebra/src/Quat32.cs
deleted file mode 100644
index 19ee9bc..0000000
--- a/Runtime/LinearAlgebra/src/Quat32.cs
+++ /dev/null
@@ -1,87 +0,0 @@
-using System;
-
-namespace LinearAlgebra {
- public class Quat32 {
- public float x;
- public float y;
- public float z;
- public float w;
-
- public Quat32() {
- this.x = 0;
- this.y = 0;
- this.z = 0;
- this.w = 1;
- }
-
- public Quat32(float x, float y, float z, float w) {
- this.x = x;
- this.y = y;
- this.z = z;
- this.w = w;
- }
-
- public static Quat32 FromSwingTwist(SwingTwist s) {
- Quat32 q32 = Quat32.Euler(-s.swing.vertical.inDegrees, s.swing.horizontal.inDegrees, s.twist.inDegrees);
- return q32;
- }
-
- public static Quat32 Euler(float yaw, float pitch, float roll) {
- float rollOver2 = roll * AngleFloat.Deg2Rad * 0.5f;
- float sinRollOver2 = (float)Math.Sin((float)rollOver2);
- float cosRollOver2 = (float)Math.Cos((float)rollOver2);
- float pitchOver2 = pitch * 0.5f;
- float sinPitchOver2 = (float)Math.Sin((float)pitchOver2);
- float cosPitchOver2 = (float)Math.Cos((float)pitchOver2);
- float yawOver2 = yaw * 0.5f;
- float sinYawOver2 = (float)Math.Sin((float)yawOver2);
- float cosYawOver2 = (float)Math.Cos((float)yawOver2);
- Quat32 result = new Quat32() {
- w = cosYawOver2 * cosPitchOver2 * cosRollOver2 +
- sinYawOver2 * sinPitchOver2 * sinRollOver2,
- x = sinYawOver2 * cosPitchOver2 * cosRollOver2 +
- cosYawOver2 * sinPitchOver2 * sinRollOver2,
- y = cosYawOver2 * sinPitchOver2 * cosRollOver2 -
- sinYawOver2 * cosPitchOver2 * sinRollOver2,
- z = cosYawOver2 * cosPitchOver2 * sinRollOver2 -
- sinYawOver2 * sinPitchOver2 * cosRollOver2
- };
- return result;
- }
-
- public void ToAngles(out float right, out float up, out float forward) {
- float test = this.x * this.y + this.z * this.w;
- if (test > 0.499f) { // singularity at north pole
- right = 0;
- up = 2 * (float)Math.Atan2(this.x, this.w) * AngleFloat.Rad2Deg;
- forward = 90;
- return;
- //return Vector3(0, 2 * (float)atan2(this.x, this.w) * Angle.Rad2Deg, 90);
- }
- else if (test < -0.499f) { // singularity at south pole
- right = 0;
- up = -2 * (float)Math.Atan2(this.x, this.w) * AngleFloat.Rad2Deg;
- forward = -90;
- return;
- //return Vector3(0, -2 * (float)atan2(this.x, this.w) * Angle.Rad2Deg, -90);
- }
- else {
- float sqx = this.x * this.x;
- float sqy = this.y * this.y;
- float sqz = this.z * this.z;
-
- right = (float)Math.Atan2(2 * this.x * this.w - 2 * this.y * this.z, 1 - 2 * sqx - 2 * sqz) * AngleFloat.Rad2Deg;
- up = (float)Math.Atan2(2 * this.y * this.w - 2 * this.x * this.z, 1 - 2 * sqy - 2 * sqz) * AngleFloat.Rad2Deg;
- forward = (float)Math.Asin(2 * test) * AngleFloat.Rad2Deg;
- return;
- // return Vector3(
- // atan2f(2 * this.x * this.w - 2 * this.y * this.z, 1 - 2 * sqx - 2 * sqz) *
- // Rad2Deg,
- // atan2f(2 * this.y * this.w - 2 * this.x * this.z, 1 - 2 * sqy - 2 * sqz) *
- // Rad2Deg,
- // asinf(2 * test) * Angle.Rad2Deg);
- }
- }
-
- }
-}
\ No newline at end of file
diff --git a/Runtime/LinearAlgebra/src/Quaternion.cs b/Runtime/LinearAlgebra/src/Quaternion.cs
deleted file mode 100644
index 7936843..0000000
--- a/Runtime/LinearAlgebra/src/Quaternion.cs
+++ /dev/null
@@ -1,582 +0,0 @@
-using System;
-#if UNITY_5_3_OR_NEWER
-using Quaternion = UnityEngine.Quaternion;
-#endif
-
-namespace LinearAlgebra {
-
-#if UNITY_5_3_OR_NEWER
- public class QuaternionExtensions {
- public static Quaternion Reflect(Quaternion q) {
- return new(-q.x, -q.y, -q.z, q.w);
- }
-
- public static Matrix2 ToRotationMatrix(Quaternion q) {
- float w = q.x, x = q.y, y = q.z, z = q.w;
-
- float[,] result = new float[,]
- {
- { 1 - 2 * (y * y + z * z), 2 * (x * y - w * z), 2 * (x * z + w * y) },
- { 2 * (x * y + w * z), 1 - 2 * (x * x + z * z), 2 * (y * z - w * x) },
- { 2 * (x * z - w * y), 2 * (y * z + w * x), 1 - 2 * (x * x + y * y) }
- };
- return new Matrix2(result);
- }
-
- public static Quaternion FromRotationMatrix(Matrix2 m) {
- float trace = m.data[0, 0] + m.data[1, 1] + m.data[2, 2];
- float w, x, y, z;
-
- if (trace > 0) {
- float s = 0.5f / (float)Math.Sqrt(trace + 1.0f);
- w = 0.25f / s;
- x = (m.data[2, 1] - m.data[1, 2]) * s;
- y = (m.data[0, 2] - m.data[2, 0]) * s;
- z = (m.data[1, 0] - m.data[0, 1]) * s;
- }
- else {
- if (m.data[0, 0] > m.data[1, 1] && m.data[0, 0] > m.data[2, 2]) {
- float s = 2.0f * (float)Math.Sqrt(1.0f + m.data[0, 0] - m.data[1, 1] - m.data[2, 2]);
- w = (m.data[2, 1] - m.data[1, 2]) / s;
- x = 0.25f * s;
- y = (m.data[0, 1] + m.data[1, 0]) / s;
- z = (m.data[0, 2] + m.data[2, 0]) / s;
- }
- else if (m.data[1, 1] > m.data[2, 2]) {
- float s = 2.0f * (float)Math.Sqrt(1.0f + m.data[1, 1] - m.data[0, 0] - m.data[2, 2]);
- w = (m.data[0, 2] - m.data[2, 0]) / s;
- x = (m.data[0, 1] + m.data[1, 0]) / s;
- y = 0.25f * s;
- z = (m.data[1, 2] + m.data[2, 1]) / s;
- }
- else {
- float s = 2.0f * (float)Math.Sqrt(1.0f + m.data[2, 2] - m.data[0, 0] - m.data[1, 1]);
- w = (m.data[1, 0] - m.data[0, 1]) / s;
- x = (m.data[0, 2] + m.data[2, 0]) / s;
- y = (m.data[1, 2] + m.data[2, 1]) / s;
- z = 0.25f * s;
- }
- }
-
- return new Quaternion(x, y, z, w);
- }
- }
-#else
- public struct Quaternion {
- public float x;
- public float y;
- public float z;
- public float w;
-
- ///
- /// create a new quaternion with the given values
- ///
- /// x component
- /// y component
- /// z component
- /// w component
- public Quaternion(float x, float y, float z, float w) {
- this.x = x;
- this.y = y;
- this.z = z;
- this.w = w;
- }
-
- ///
- /// An identity quaternion
- ///
- public static readonly Quaternion identity = new(0, 0, 0, 1);
-
- private readonly Vector3Float xyz => new(x, y, z);
-
- private readonly float magnitude => MathF.Sqrt(this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w);
-
- private readonly float sqrMagnitude => x * x + y * y + z * z + w * w;
-
- ///
- /// Convert to unit quaternion
- ///
- /// This will preserve the orientation,
- /// but ensures that it is a unit quaternion.
- public readonly Quaternion normalized {
- get {
- float length = this.magnitude;
- Quaternion q = new(this.x / length, this.y / length, this.z / length, this.w / length);
- return q;
- }
- }
-
- ///
- /// Convert to unity quaternion
- ///
- /// The quaternion to convert
- /// A unit quaternion
- /// This will preserve the orientation,
- /// but ensures that it is a unit quaternion.
- public static Quaternion Normalize(Quaternion q) {
- return q.normalized;
- }
-
- ///
- /// Convert to euler angles
- ///
- /// The quaternion to convert
- /// A vector containing euler angles
- /// The euler angles performed in the order: Z, X, Y
- public static Vector3Float ToAngles(Quaternion q) {
- // Extract Euler angles in Unity order (X = pitch, Y = yaw, Z = roll), returned in degrees as (x,pitch),(y,yaw),(z,roll)
- // Handle singularities/gimbal lock
- float test = 2f * (q.w * q.x - q.y * q.z);
- // clamp
- if (test >= 1f) test = 1f;
- if (test <= -1f) test = -1f;
-
- float pitch = MathF.Asin(test); // X
-
- float roll = MathF.Atan2(2f * (q.w * q.z + q.x * q.y),
- 1f - 2f * (q.x * q.x + q.z * q.z)); // Z
-
- float yaw = MathF.Atan2(2f * (q.w * q.y + q.x * q.z),
- 1f - 2f * (q.y * q.y + q.x * q.x)); // Y
-
- const float rad2deg = 180f / MathF.PI;
- return new Vector3Float(pitch * rad2deg, yaw * rad2deg, roll * rad2deg);
- // float test = q.x * q.y + q.z * q.w;
- // if (test > 0.499f) // singularity at north pole
- // return new Vector3Float(0, 2 * MathF.Atan2(q.x, q.w) * AngleFloat.Rad2Deg, 90);
-
- // else if (test < -0.499f) // singularity at south pole
- // return new Vector3Float(0, -2 * MathF.Atan2(q.x, q.w) * AngleFloat.Rad2Deg, -90);
-
- // else {
- // float sqx = q.x * q.x;
- // float sqy = q.y * q.y;
- // float sqz = q.z * q.z;
-
- // return new Vector3Float(
- // MathF.Atan2(2 * q.x * q.w - 2 * q.y * q.z, 1 - 2 * sqx - 2 * sqz) *
- // AngleFloat.Rad2Deg,
- // MathF.Atan2(2 * q.y * q.w - 2 * q.x * q.z, 1 - 2 * sqy - 2 * sqz) *
- // AngleFloat.Rad2Deg,
- // MathF.Asin(2 * test) * AngleFloat.Rad2Deg);
- // }
- }
-
- ///
- /// Create a rotation from euler angles
- ///
- /// The angle around the right axis
- /// The angle around the upward axis
- /// The angle around the forward axis
- /// The resulting quaternion
- /// Rotation are appied in the order Z, X, Y.
- public static Quaternion Euler(float x, float y, float z) {
- return Quaternion.Euler(new Vector3Float(x, y, z));
- }
- ///
- /// Create a rotation from a vector containing euler angles
- ///
- /// Vector with the euler angles
- /// The resulting quaternion
- /// Rotation are appied in the order Z, X, Y.
- public static Quaternion Euler(Vector3Float angles) {
- Vector3Float euler = angles * AngleFloat.Deg2Rad;
- float cx = MathF.Cos(euler.horizontal * 0.5f);
- float sx = MathF.Sin(euler.horizontal * 0.5f);
- float cy = MathF.Cos(euler.vertical * 0.5f);
- float sy = MathF.Sin(euler.vertical * 0.5f);
- float cz = MathF.Cos(euler.depth * 0.5f);
- float sz = MathF.Sin(euler.depth * 0.5f);
-
- // Unity uses intrinsic Z, then X, then Y -> q = Qy * Qx * Qz
- Quaternion q;
- q.w = cy * cx * cz + sy * sx * sz;
- q.x = cy * sx * cz + sy * cx * sz;
- q.y = sy * cx * cz - cy * sx * sz;
- q.z = cy * cx * sz - sy * sx * cz;
- return q;
- }
-
- ///
- /// Multiply two quaternions
- ///
- ///
- ///
- /// The resulting rotation
- public static Quaternion operator *(Quaternion q1, Quaternion q2) {
- return new Quaternion(
- q1.x * q2.w + q1.y * q2.z - q1.z * q2.y + q1.w * q2.x,
- -q1.x * q2.z + q1.y * q2.w + q1.z * q2.x + q1.w * q2.y,
- q1.x * q2.y - q1.y * q2.x + q1.z * q2.w + q1.w * q2.z,
- -q1.x * q2.x - q1.y * q2.y - q1.z * q2.z + q1.w * q2.w);
- }
-
- ///
- /// Rotate a vector using this quaterion
- ///
- /// The rotation
- /// The vector to rotate
- /// The rotated vector
- public static Vector3Float operator *(Quaternion q, Vector3Float v) {
- float num = q.x * 2;
- float num2 = q.y * 2;
- float num3 = q.z * 2;
- float num4 = q.x * num;
- float num5 = q.y * num2;
- float num6 = q.z * num3;
- float num7 = q.x * num2;
- float num8 = q.x * num3;
- float num9 = q.y * num3;
- float num10 = q.w * num;
- float num11 = q.w * num2;
- float num12 = q.w * num3;
-
- float px = v.horizontal;
- float py = v.vertical;
- float pz = v.depth;
- float rx =
- (1 - (num5 + num6)) * px + (num7 - num12) * py + (num8 + num11) * pz;
- float ry =
- (num7 + num12) * px + (1 - (num4 + num6)) * py + (num9 - num10) * pz;
- float rz =
- (num8 - num11) * px + (num9 + num10) * py + (1 - (num4 + num5)) * pz;
- Vector3Float result = new(rx, ry, rz);
- return result;
- }
-
- ///
- /// The inverse of quaterion
- ///
- /// The quaternion for which the inverse is
- /// needed The inverted quaternion
- public static Quaternion Inverse(Quaternion q) {
- float n = MathF.Sqrt(q.x * q.x + q.y * q.y + q.z * q.z + q.w * q.w);
- return new Quaternion(-q.x / n, -q.y / n, -q.z / n, q.w / n);
- }
-
- ///
- /// A rotation which looks in the given direction
- ///
- /// The look direction
- /// The up direction
- /// The look rotation
- public static Quaternion LookRotation(Vector3Float forward, Vector3Float up) {
- Vector3Float nForward = forward.normalized;
- Vector3Float nRight = Vector3Float.Normalize(Vector3Float.Cross(up, nForward));
- Vector3Float nUp = Vector3Float.Cross(nForward, nRight);
- float m00 = nRight.horizontal; // x;
- float m01 = nRight.vertical; // y;
- float m02 = nRight.depth; // z;
- float m10 = nUp.horizontal; // x;
- float m11 = nUp.vertical; // y;
- float m12 = nUp.depth; // z;
- float m20 = nForward.horizontal; // x;
- float m21 = nForward.vertical; // y;
- float m22 = nForward.depth; // z;
-
- float num8 = (m00 + m11) + m22;
- float x, y, z, w;
- if (num8 > 0) {
- float num = MathF.Sqrt(num8 + 1);
- w = num * 0.5f;
- num = 0.5f / num;
- x = (m12 - m21) * num;
- y = (m20 - m02) * num;
- z = (m01 - m10) * num;
- return new Quaternion(x, y, z, w);
- }
- if ((m00 >= m11) && (m00 >= m22)) {
- float num7 = MathF.Sqrt(((1 + m00) - m11) - m22);
- float num4 = 0.5F / num7;
- x = 0.5f * num7;
- y = (m01 + m10) * num4;
- z = (m02 + m20) * num4;
- w = (m12 - m21) * num4;
- return new Quaternion(x, y, z, w);
- }
- if (m11 > m22) {
- float num6 = MathF.Sqrt(((1 + m11) - m00) - m22);
- float num3 = 0.5F / num6;
- x = (m10 + m01) * num3;
- y = 0.5F * num6;
- z = (m21 + m12) * num3;
- w = (m20 - m02) * num3;
- return new Quaternion(x, y, z, w);
- }
- float num5 = MathF.Sqrt(((1 + m22) - m00) - m11);
- float num2 = 0.5F / num5;
- x = (m20 + m02) * num2;
- y = (m21 + m12) * num2;
- z = 0.5F * num5;
- w = (m01 - m10) * num2;
- return new Quaternion(x, y, z, w);
- }
-
- ///
- /// Creates a quaternion with the given forward direction with up =
- /// Vector3::up
- ///
- /// The look direction
- /// The rotation for this direction
- /// For the rotation, Vector::up is used for the up direction.
- /// Note: if the forward direction == Vector3::up, the result is
- /// Quaternion::identity
- public static Quaternion LookRotation(Vector3Float forward) {
- Vector3Float up = new(0, 1, 0);
- return LookRotation(forward, up);
- }
-
- ///
- /// Calculat the rotation from on vector to another
- ///
- /// The from direction
- /// The to direction
- /// The rotation from the first to the second vector
- public static Quaternion FromToRotation(Vector3Float fromDirection, Vector3Float toDirection) {
- Vector3Float axis = Vector3Float.Cross(fromDirection, toDirection);
- axis = axis.normalized;
- AngleFloat angle = Vector3Float.SignedAngle(fromDirection, toDirection, axis);
- Quaternion rotation = AngleAxis(angle, axis);
- return rotation;
-
- }
-
- ///
- /// Rotate form one orientation to anther with a maximum amount of degrees
- ///
- /// The from rotation
- /// The destination rotation
- /// The maximum amount of degrees to
- /// rotate The possibly limited rotation
- public static Quaternion RotateTowards(Quaternion from, Quaternion to,
- float maxDegreesDelta) {
- float num = Quaternion.UnsignedAngle(from, to);
- if (num == 0) {
- return to;
- }
- float t = MathF.Min(1, maxDegreesDelta / num);
- return SlerpUnclamped(from, to, t);
-
- }
-
- ///
- /// Convert an angle/axis representation to a quaternion
- ///
- /// The angle
- /// The axis
- /// The resulting quaternion
- public static Quaternion AngleAxis(AngleFloat angle, Vector3Float axis) {
- if (axis.sqrMagnitude == 0.0f)
- return Quaternion.identity;
-
- float radians = angle.inRadians;
- radians *= 0.5f;
-
- Vector3Float axis2 = axis * MathF.Sin(radians);
- float x = axis2.horizontal; // x;
- float y = axis2.vertical; // y;
- float z = axis2.depth; // z;
- float w = MathF.Cos(radians);
-
- return new Quaternion(x, y, z, w).normalized;
- }
- ///
- /// Convert this quaternion to angle/axis representation
- ///
- /// A pointer to the angle for the result
- /// A pointer to the axis for the result
- public readonly void ToAngleAxis(out AngleFloat angle, out Vector3Float axis) {
- Quaternion q1 = (MathF.Abs(this.w) > 1.0f) ? this.normalized : this;
- angle = AngleFloat.Radians(2.0f * MathF.Acos(q1.w)); // angle
- float den = MathF.Sqrt(1.0F - q1.w * q1.w);
- if (den > 0.0001f) {
- axis = Vector3Float.Normalize(q1.xyz / den);
- }
- else {
- // This occurs when the angle is zero.
- // Not a problem: just set an arbitrary normalized axis.
- axis = Vector3Float.right;
- }
- }
-
- ///
- /// Get the angle between two orientations
- ///
- /// The first orientation
- /// The second orientation
- /// The smallest angle in degrees between the two
- /// orientations
- public static float UnsignedAngle(Quaternion q1, Quaternion q2) {
- // float f = Dot(q1, q2);
- // return MathF.Acos(MathF.Min(MathF.Abs(f), 1)) * 2 * AngleFloat.Rad2Deg;
-
- float dot = q1.x * q2.x + q1.y * q2.y + q1.z * q2.z + q1.w * q2.w;
- dot = MathF.Min(MathF.Max(dot, -1f), 1f);
- return 2f * MathF.Acos(MathF.Abs(dot)) * (180f / MathF.PI);
- }
-
- ///
- /// Sherical lerp between two rotations
- ///
- /// The first rotation
- /// The second rotation
- /// The factor between 0 and 1.
- /// The resulting rotation
- /// A factor 0 returns rotation1, factor1 returns rotation2.
- public static Quaternion Slerp(Quaternion a,
- Quaternion b, float t) {
- if (t > 1)
- t = 1;
- if (t < 0)
- t = 0;
- return SlerpUnclamped(a, b, t);
- }
-
- ///
- /// Unclamped sherical lerp between two rotations
- ///
- /// The first rotation
- /// The second rotation
- /// The factor
- /// The resulting rotation
- /// A factor 0 returns rotation1, factor1 returns rotation2.
- /// Values outside the 0..1 range will result in extrapolated rotations
- public static Quaternion SlerpUnclamped(Quaternion a,
- Quaternion b, float t) {
- // if either input is zero, return the other.
- if (a.sqrMagnitude == 0.0f) {
- if (b.sqrMagnitude == 0.0f) {
- return identity;
- }
- return b;
- }
- else if (b.sqrMagnitude == 0.0f) {
- return a;
- }
-
- Vector3Float axyz = a.xyz;
- Vector3Float bxyz = b.xyz;
- float cosHalfAngle = a.w * b.w + Vector3Float.Dot(axyz, bxyz);
-
- Quaternion b2 = b;
- if (cosHalfAngle >= 1.0f || cosHalfAngle <= -1.0f) {
- // angle = 0.0f, so just return one input.
- return a;
- }
- else if (cosHalfAngle < 0.0f) {
- b2.x = -b.x;
- b2.y = -b.y;
- b2.z = -b.z;
- b2.w = -b.w;
- cosHalfAngle = -cosHalfAngle;
- }
-
- float blendA;
- float blendB;
- if (cosHalfAngle < 0.99f) {
- // do proper slerp for big angles
- float halfAngle = MathF.Acos(cosHalfAngle);
- float sinHalfAngle = MathF.Sin(halfAngle);
- float oneOverSinHalfAngle = 1.0F / sinHalfAngle;
- blendA = MathF.Sin(halfAngle * (1.0F - t)) * oneOverSinHalfAngle;
- blendB = MathF.Sin(halfAngle * t) * oneOverSinHalfAngle;
- }
- else {
- // do lerp if angle is really small.
- blendA = 1.0f - t;
- blendB = t;
- }
- Vector3Float v = axyz * blendA + b2.xyz * blendB;
- Quaternion result =
- new(v.horizontal, v.vertical, v.depth, blendA * a.w + blendB * b2.w);
- if (result.sqrMagnitude > 0.0f)
- return result.normalized;
- else
- return Quaternion.identity;
- }
-
- ///
- /// Convert this quaternion to angle/axis representation
- ///
- /// A pointer to the angle for the result
- /// A pointer to the axis for the result
- public readonly void ToAngleAxis(out float angle, out Vector3Float axis) {
- ToAxisAngleRad(this, out axis, out angle);
- angle *= AngleFloat.Rad2Deg;
- }
- private static void ToAxisAngleRad(Quaternion q,
- out Vector3Float axis,
- out float angle) {
- Quaternion q1 = (MathF.Abs(q.w) > 1.0f) ? Quaternion.Normalize(q) : q;
- angle = 2.0f * MathF.Acos(q1.w); // angle
- float den = MathF.Sqrt(1.0F - q1.w * q1.w);
- if (den > 0.0001f) {
- axis = (q1.xyz / den).normalized;
- }
- else {
- // This occurs when the angle is zero.
- // Not a problem: just set an arbitrary normalized axis.
- axis = new Vector3Float(1, 0, 0);
- }
- }
-
- ///
- /// Returns the angle of around the give axis for a rotation
- ///
- /// The axis around which the angle should be
- /// computed The source rotation
- /// The signed angle around the axis
- public static float GetAngleAround(Vector3Float axis, Quaternion rotation) {
- Quaternion secondaryRotation = GetRotationAround(axis, rotation);
- secondaryRotation.ToAngleAxis(out float rotationAngle, out Vector3Float rotationAxis);
-
- // Do the axis point in opposite directions?
- if (Vector3Float.Dot(axis, rotationAxis) < 0)
- rotationAngle = -rotationAngle;
-
- return rotationAngle;
- }
-
- ///
- /// Returns the rotation limited around the given axis
- ///
- /// The axis which which the rotation should be
- /// limited The source rotation
- /// The rotation around the given axis
- public static Quaternion GetRotationAround(Vector3Float axis, Quaternion rotation) {
- Vector3Float ra = new(rotation.x, rotation.y, rotation.z); // rotation axis
- Vector3Float p = Vector3Float.Project(
- ra, axis); // return projection ra on to axis (parallel component)
- Quaternion twist = new(p.horizontal, p.vertical, p.depth, rotation.w);
- twist = Normalize(twist);
- return twist;
-
- }
-
- ///
- /// Swing-twist decomposition of a rotation
- ///
- /// The base direction for the decomposition
- /// The source rotation
- /// A pointer to the quaternion for the swing
- /// result A pointer to the quaternion for the
- /// twist result
- static void GetSwingTwist(Vector3Float axis, Quaternion q,
- out Quaternion swing, out Quaternion twist) {
- twist = GetRotationAround(axis, q);
- swing = q * Inverse(twist);
- }
-
- ///
- /// Calculate the dot product of two quaternions
- ///
- /// The first rotation
- /// The second rotation
- ///
- public static float Dot(Quaternion q1, Quaternion q2) {
- return q1.x * q2.x + q1.y * q2.y + q1.z * q2.z + q1.w * q2.w;
- }
- }
-#endif
-
-}
\ No newline at end of file
diff --git a/Runtime/LinearAlgebra/src/Spherical.cs b/Runtime/LinearAlgebra/src/Spherical.cs
deleted file mode 100644
index 318839d..0000000
--- a/Runtime/LinearAlgebra/src/Spherical.cs
+++ /dev/null
@@ -1,279 +0,0 @@
-using System;
-using System.Collections.Generic;
-
-#if UNITY_5_3_OR_NEWER
-using Vector3 = UnityEngine.Vector3;
-#endif
-
-namespace LinearAlgebra {
- ///
- /// A spherical vector
- ///
- /// This is a struct such that it is a value type and cannot be null
- public struct Spherical {
- ///
- /// Create a spherical vector
- ///
- /// The distance in meters
- /// The direction of the vector
- public Spherical(float distance, Direction direction) {
- if (distance > 0) {
- this.distance = distance;
- this.direction = direction;
- }
- else {
- this.distance = -distance;
- this.direction = -direction;
- }
- }
-
- ///
- /// Create spherical vector. All given angles are in degrees
- ///
- /// The distance in meters
- /// The horizontal angle in degrees
- /// The vertical angle in degrees
- ///
- public static Spherical Degrees(float distance, float horizontal, float vertical) {
- Direction direction = Direction.Degrees(horizontal, vertical);
- Spherical s = new(distance, direction);
- return s;
- }
-
- public static Spherical Radians(float distance, float horizontal, float vertical) {
- Direction direction = Direction.Radians(horizontal, vertical);
- Spherical s = new(distance, direction);
- return s;
- }
-
- ///
- /// The distance in meters
- ///
- /// @remark The distance should never be negative
- public float distance;
- ///
- /// The direction of the vector
- ///
- public Direction direction;
-
- ///
- /// A spherical vector with zero degree angles and distance
- ///
- public readonly static Spherical zero = new(0, Direction.forward);
- ///
- /// A normalized forward-oriented vector
- ///
- public readonly static Spherical forward = new(1, Direction.forward);
-
-#if UNITY_5_3_OR_NEWER
- public static Spherical FromVector3(Vector3 v) {
- float distance = v.magnitude;
- Direction direction = Direction.FromVector3(v / distance);
- return new Spherical(distance, direction);
- }
-
- public readonly Vector3 ToVector3() {
- Vector3 v = this.direction.ToVector3();
- v *= this.distance;
- return v;
- }
-#else
- public static Spherical FromVector3(Vector3Float v) {
- float distance = v.magnitude;
- if (distance == 0.0f)
- return Spherical.zero;
- else {
- float verticalAngle = (float)(Math.PI / 2 - Math.Acos(v.vertical / distance)) * AngleFloat.Rad2Deg;
- float horizontalAngle = (float)Math.Atan2(v.horizontal, v.depth) * AngleFloat.Rad2Deg;
- return Degrees(distance, horizontalAngle, verticalAngle);
- }
- }
-
- public readonly Vector3Float ToVector3() {
- // float verticalRad = (AngleFloat.deg90 - this.direction.vertical).inRadians;
- // float horizontalRad = this.direction.horizontal.inRadians;
- // float cosVertical = (float)Math.Cos(verticalRad);
- // float sinVertical = (float)Math.Sin(verticalRad);
- // float cosHorizontal = (float)Math.Cos(horizontalRad);
- // float sinHorizontal = (float)Math.Sin(horizontalRad);
-
- // float x = this.distance * sinVertical * sinHorizontal;
- // float y = this.distance * cosVertical;
- // float z = this.distance * sinVertical * cosHorizontal;
-
- // Vector3Float v = new(x, y, z);
- Vector3Float v = this.direction.ToVector3();
- v *= this.distance;
- return v;
- }
-#endif
-
- public override readonly string ToString() {
- return $"Spherical({this.distance}, h: {this.direction.horizontal}, v: {this.direction.vertical})";
- }
-
-
- public readonly float magnitude => this.distance;
-
- public Spherical normalized {
- get {
- Spherical r = new() {
- distance = 1,
- direction = this.direction
- };
- return r;
- }
- }
-
- public static Spherical operator +(Spherical s1, Spherical s2) {
- // let's do it the easy way...
- // using vars to be compatible with both unity (Vector3) and native (Vector3Float)
- var v1 = s1.ToVector3();
- var v2 = s2.ToVector3();
- var v = v1 + v2;
- Spherical r = FromVector3(v);
- return r;
- }
-
- public static Spherical operator *(Spherical v, float d) {
- Spherical r = new(v.distance * d, v.direction);
- return r;
- }
-
- public static bool operator ==(Spherical v1, Spherical v2) {
- return (v1.distance == v2.distance && v1.direction == v2.direction);
- }
-
- public static bool operator !=(Spherical v1, Spherical v2) {
- return (v1.distance != v2.distance || v1.direction != v2.direction);
- }
-
- public override readonly bool Equals(object o) {
- if (o is Spherical s)
- return this == s;
- return false;
- }
-
- public override readonly int GetHashCode() {
- return HashCode.Combine(this.distance, this.direction);
- }
-
- public static float Distance(Spherical v1, Spherical v2) {
- // Convert degrees to radians
- float thetaARadians = v1.direction.horizontal.inRadians;
- float phiARadians = v1.direction.vertical.inRadians;// DegreesToRadians(phiA);
- float thetaBRadians = v2.direction.horizontal.inRadians; // DegreesToRadians(thetaB);
- float phiBRadians = v2.direction.vertical.inRadians; // DegreesToRadians(phiB);
-
- // Calculate sine and cosine values
- float sinPhiA = MathF.Sin(phiARadians);
- float cosPhiA = MathF.Cos(phiARadians);
- float sinPhiB = MathF.Sin(phiBRadians);
- float cosPhiB = MathF.Cos(phiBRadians);
-
- // Calculate the cosine of the difference in azimuthal angles
- float cosThetaDifference = MathF.Cos(thetaARadians - thetaBRadians);
-
- // Apply the spherical law of cosines
- float distance = MathF.Sqrt(
- v1.distance * v1.distance +
- v2.distance * v2.distance -
- 2 * v1.distance * v2.distance * (sinPhiA * sinPhiB * cosThetaDifference + cosPhiA * cosPhiB)
- );
-
- return distance;
- }
-
- public static Spherical Average(Spherical v1, Spherical v2) {
- const float EPS = 1e-6f;
-
- // Angles in radians
- float a1 = v1.direction.horizontal.inRadians;
- float a2 = v2.direction.horizontal.inRadians;
- float e1 = v1.direction.vertical.inRadians;
- float e2 = v2.direction.vertical.inRadians;
-
- // Fast path: exactly same direction (allowing wrap for azimuth) -> preserve exact angles
- bool sameAz = MathF.Abs(MathF.IEEERemainder(a1 - a2, MathF.PI * 2f)) < EPS;
- bool sameEl = MathF.Abs(e1 - e2) < EPS;
- if (sameAz && sameEl) {
- // Distances may differ; average distance but keep exact angles from v1
- float rAvgExact = 0.5f * (v1.distance + v2.distance);
- return new Spherical(rAvgExact, v1.direction);
- }
-
- // Horizontal unit-circle sum
- float cx = MathF.Cos(a1) + MathF.Cos(a2);
- float cy = MathF.Sin(a1) + MathF.Sin(a2);
-
- // Vertical as z = sin(el)
- float z1 = MathF.Sin(e1);
- float z2 = MathF.Sin(e2);
- float cz = z1 + z2;
-
- // Magnitude of summed unit-direction vectors
- float sumX = cx;
- float sumY = cy;
- float sumZ = cz;
- float magSum = MathF.Sqrt(sumX * sumX + sumY * sumY + sumZ * sumZ);
-
- // If the two direction unit-vectors cancel (or nearly), return zero distance.
- if (magSum < EPS) {
- return Spherical.Radians(0f, 0f, 0f);
- }
-
- // Normalized averaged direction components
- float ux = sumX / magSum;
- float uy = sumY / magSum;
- float uz = sumZ / magSum;
-
- // Compute averaged angles from normalized vector
- float azAvgRad = MathF.Atan2(uy, ux);
- float elAvgRad = MathF.Asin(Float.Clamp(uz, -1f, 1f));
-
- // Average distance (arithmetic mean)
- float rAvg = 0.5f * (v1.distance + v2.distance);
-
- return Spherical.Radians(rAvg, azAvgRad, elAvgRad);
- }
-
- public static Spherical Sum(List vectors) {
- if (vectors == null || vectors.Count == 0)
- throw new ArgumentException("vectors must contain at least one element", nameof(vectors));
-
-#if UNITY_5_3_OR_NEWER
- Vector3 sum = Vector3.zero;
-#else
- Vector3Float sum = Vector3Float.zero;
-#endif
- foreach (Spherical v in vectors)
- sum += v.ToVector3();
-
- return FromVector3(sum);
- }
-
-
- public static Spherical Average(List vectors) {
- if (vectors == null || vectors.Count == 0)
- throw new ArgumentException("vectors must contain at least one element", nameof(vectors));
-
-#if UNITY_5_3_OR_NEWER
- Vector3 sum = Vector3.zero;
-#else
- Vector3Float sum = Vector3Float.zero;
-#endif
- int n = 0;
- foreach (Spherical v in vectors) {
- sum += v.ToVector3();
- n++;
- }
- var avg = sum / n;
-
- // if (avg.sqrMagnitude == 0f)
- // return new Spherical(0f, new Direction(AngleFloat.Radians(0f), AngleFloat.Radians(0f)));
- // else
- return FromVector3(avg);
- }
-
- }
-}
\ No newline at end of file
diff --git a/Runtime/LinearAlgebra/src/SwingTwist.cs b/Runtime/LinearAlgebra/src/SwingTwist.cs
deleted file mode 100644
index df6e048..0000000
--- a/Runtime/LinearAlgebra/src/SwingTwist.cs
+++ /dev/null
@@ -1,136 +0,0 @@
-// #if !UNITY_5_3_OR_NEWER
-// using UnityEngine;
-// #endif
-
-namespace LinearAlgebra {
-
- ///
- /// An orientation using swing and twist angles
- ///
- /// The swing rotation
- /// The twist rotation
- public struct SwingTwist {
- public Direction swing;
- public AngleFloat twist;
-
- public SwingTwist(Direction swing, AngleFloat twist) {
- this.swing = swing;
- this.twist = twist;
- }
-
- ///
- /// Create a swing/twist rotation using angles in degrees
- ///
- /// The swing angle in the horizontal plane in degrees
- /// The swing angle in the vertical plan in degrees
- /// The twist angle in degrees
- /// The swing/twist rotation
- public static SwingTwist Degrees(float horizontalSwing, float verticalSwing, float twist) {
- Direction swing = Direction.Degrees(horizontalSwing, verticalSwing);
- AngleFloat twistAngle = AngleFloat.Degrees(twist);
- SwingTwist s = new(swing, twistAngle);
- return s;
- }
-
- ///
- /// Create a swing/twist rotation using angles in degrees
- ///
- /// The swing angle in the horizontal plane in degrees
- /// The swing angle in the vertical plan in degrees
- /// The twist angle in degrees
- /// The swing/twist rotation
- public static SwingTwist Radians(float horizontalSwing, float verticalSwing, float twist) {
- Direction swing = Direction.Radians(horizontalSwing, verticalSwing);
- AngleFloat twistAngle = AngleFloat.Radians(twist);
- SwingTwist s = new(swing, twistAngle);
- return s;
- }
-
-#if UNITY_5_3_OR_NEWER
- ///
- /// A zero angle rotation
- ///
- public static readonly SwingTwist zero = Degrees(0, 0, 0);
-
- public Spherical ToAngleAxis() {
- UnityEngine.Quaternion q = this.ToQuaternion();
- q.ToAngleAxis(out float angle, out UnityEngine.Vector3 axis);
- Direction direction = Direction.FromVector3(axis);
-
- Spherical r = new(angle, direction);
- return r;
- }
-
- public static SwingTwist FromAngleAxis(Spherical r) {
- UnityEngine.Vector3 vectorAxis = r.direction.ToVector3();
- UnityEngine.Quaternion q = UnityEngine.Quaternion.AngleAxis(r.distance, vectorAxis);
- return FromQuaternion(q);
- }
-
- ///
- /// Convert a quaternion in a swing/twist rotation
- ///
- /// The quaternion to convert
- /// The swing/twist rotation
- public static SwingTwist FromQuaternion(UnityEngine.Quaternion q) {
- UnityEngine.Vector3 angles = q.eulerAngles;
- SwingTwist r = Degrees(angles.y, -angles.x, -angles.z);
- return r;
- }
-
- public UnityEngine.Quaternion ToQuaternion() {
- UnityEngine.Quaternion q = UnityEngine.Quaternion.Euler(this.swing.vertical.inDegrees,
- this.swing.horizontal.inDegrees,
- this.twist.inDegrees);
- return q;
- }
-#else
- ///
- /// A zero angle rotation
- ///
- public static readonly SwingTwist zero = Degrees(0, 0, 0);
-
- public Spherical ToAngleAxis() {
- LinearAlgebra.Quaternion q = this.ToQuaternion();
- q.ToAngleAxis(out float angle, out Vector3Float axis);
- Direction direction = Direction.FromVector3(axis);
-
- Spherical r = new(angle, direction);
- return r;
- }
-
- public static SwingTwist FromAngleAxis(Spherical r) {
- Vector3Float vectorAxis = r.direction.ToVector3();
- LinearAlgebra.Quaternion q = LinearAlgebra.Quaternion.AngleAxis(AngleFloat.Degrees(r.distance), vectorAxis);
- return FromQuaternion(q);
- }
-
- ///
- /// Convert a quaternion in a swing/twist rotation
- ///
- /// The quaternion to convert
- /// The swing/twist rotation
- public static SwingTwist FromQuaternion(LinearAlgebra.Quaternion q) {
- Vector3Float v = LinearAlgebra.Quaternion.ToAngles(q);
- SwingTwist r = Degrees(v.vertical, v.horizontal, v.depth);
- return r;
- }
-
- public LinearAlgebra.Quaternion ToQuaternion() {
- LinearAlgebra.Quaternion q = LinearAlgebra.Quaternion.Euler(this.swing.vertical.inDegrees,
- this.swing.horizontal.inDegrees,
- this.twist.inDegrees);
- return q;
-
- }
-
- public static SwingTwist FromQuat32(Quat32 q32) {
- q32.ToAngles(out float right, out float up, out float forward);
- SwingTwist r = Degrees(up, right, forward);
- return r;
- }
-#endif
-
- }
-
-}
\ No newline at end of file
diff --git a/Runtime/LinearAlgebra/src/Vector2Float.cs b/Runtime/LinearAlgebra/src/Vector2Float.cs
deleted file mode 100644
index ac1867c..0000000
--- a/Runtime/LinearAlgebra/src/Vector2Float.cs
+++ /dev/null
@@ -1,479 +0,0 @@
-using System;
-using System.Numerics;
-
-namespace LinearAlgebra {
-
- /*
- public struct Vector2Int {
- public int horizontal;
- public int vertical;
-
- public Vector2Int(int horizontal, int vertical) {
- this.horizontal = horizontal;
- this.vertical = vertical;
- }
-
- ///
- /// A vector with zero for all axis
- ///
- public static readonly Vector2Int zero = new(0, 0);
- ///
- /// A vector with values (1, 1)
- ///
- public static readonly Vector2Int one = new(1, 1);
- ///
- /// A vector with values (0, 1)
- ///
- public static readonly Vector2Int up = new(0, 1);
- ///
- /// A vector with values (0, -1)
- ///
- public static readonly Vector2Int down = new(0, -1);
- ///
- /// A vector with values (0, 1)
- ///
- public static readonly Vector2Int forward = new(0, 1);
- ///
- /// A vector with values (0, -1)
- ///
- public static readonly Vector2Int back = new(0, -1);
- ///
- /// A vector3 with values (-1, 0)
- ///
- public static readonly Vector2Int left = new(-1, 0);
- ///
- /// A vector with values (1, 0)
- ///
- public static readonly Vector2Int right = new(1, 0);
-
- ///
- /// Tests if the vector has equal values as the given vector
- ///
- /// The vector to compare to
- /// true if the vector values are equal
- public readonly bool Equals(Vector2Int v) => this.horizontal == v.horizontal && vertical == v.vertical;
-
- ///
- /// Tests if the vector is equal to the given object
- ///
- /// The object to compare to
- /// false when the object is not a Vector2 or does not have equal values
- public override readonly bool Equals(object obj) {
- if (obj is not Vector2Int v)
- return false;
-
- return (this.horizontal == v.horizontal && this.vertical == v.vertical);
- }
-
- ///
- /// Tests if the two vectors have equal values
- ///
- /// The first vector
- /// The second vector
- /// true when the vectors have equal values
- /// Note that this uses a Float equality check which cannot be not exact in all cases.
- /// In most cases it is better to check if the Vector2.Distance between the vectors is smaller than Float.epsilon
- /// Or more efficient: (v1 - v2).sqrMagnitude < Float.sqrEpsilon
- public static bool operator ==(Vector2Int v1, Vector2Int v2) {
- return (v1.horizontal == v2.horizontal && v1.vertical == v2.vertical);
- }
- ///
- /// Tests if two vectors have different values
- ///
- /// The first vector
- /// The second vector
- /// true when the vectors have different values
- /// Note that this uses a Float equality check which cannot be not exact in all case.
- /// In most cases it is better to check if the Vector2.Distance between the vectors is smaller than Float.epsilon.
- /// Or more efficient: (v1 - v2).sqrMagnitude < Float.sqrEpsilon
- public static bool operator !=(Vector2Int v1, Vector2Int v2) {
- return (v1.horizontal != v2.horizontal || v1.vertical != v2.vertical);
- }
- public readonly float magnitude {
- get {
- int h = this.horizontal;
- int v = this.vertical;
- return MathF.Sqrt(h * h + v * v);
- }
- }
-
- public static float MagnitudeOf(Vector2Int v) {
- return v.magnitude;
- }
-
- public static Vector2Int operator -(Vector2Int v1, Vector2Int v2) {
- return new Vector2Int(v1.horizontal - v2.horizontal, v1.vertical - v2.vertical);
- }
- public static Vector2Int operator +(Vector2Int v1, Vector2Int v2) {
- return new Vector2Int(v1.horizontal + v2.horizontal, v1.vertical + v2.vertical);
- }
-
- public static float Distance(Vector2Int v1, Vector2Int v2) {
- return (v1 - v2).magnitude;
- }
- }
-
- public struct Vector2Float {
- public float horizontal;
- public float vertical;
-
- public Vector2Float(float horizontal, float vertical) {
- this.horizontal = horizontal;
- this.vertical = vertical;
- }
-
- public readonly float magnitude {
- get {
- float h = this.horizontal;
- float v = this.vertical;
- return MathF.Sqrt(h * h + v * v);
- }
- }
-
- public static Vector2Float operator -(Vector2Float v1, Vector2Float v2) {
- return new Vector2Float(v1.horizontal - v2.horizontal, v1.vertical - v2.vertical);
- }
-
- public static float Distance(Vector2Float v1, Vector2Float v2) {
- return (v1 - v2).magnitude;
- }
- }
- */
-
- ///
- /// 2-dimensional vectors
- ///
- public struct Vector2Float {
-
- ///
- /// The right axis of the vector
- ///
- public float horizontal; // left/right
- ///
- /// The upward/forward axis of the vector
- ///
- public float vertical; // forward/backward
- // directions are to be inline with Vector3 as much as possible...
-
- ///
- /// Create a new 2-dimensional vector
- ///
- /// x axis value
- /// y axis value
- public Vector2Float(float x, float y) {
- this.horizontal = x;
- this.vertical = y;
- }
-
- ///
- /// Convert a Vector2Int into a Vector2Float
- ///
- /// The Vector2Int
- public Vector2Float(Vector2Int v) {
- this.horizontal = v.horizontal;
- this.vertical = v.vertical;
- }
-
- ///
- /// A vector with zero for all axis
- ///
- public static readonly Vector2Float zero = new Vector2Float(0, 0);
- ///
- /// A vector with values (1, 1)
- ///
- public static readonly Vector2Float one = new Vector2Float(1, 1);
- ///
- /// A vector with values (0, 1)
- ///
- public static readonly Vector2Float up = new Vector2Float(0, 1);
- ///
- /// A vector with values (0, -1)
- ///
- public static readonly Vector2Float down = new Vector2Float(0, -1);
- ///
- /// A vector with values (0, 1)
- ///
- public static readonly Vector2Float forward = new Vector2Float(0, 1);
- ///
- /// A vector with values (0, -1)
- ///
- public static readonly Vector2Float back = new Vector2Float(0, -1);
- ///
- /// A vector3 with values (-1, 0)
- ///
- public static readonly Vector2Float left = new Vector2Float(-1, 0);
- ///
- /// A vector with values (1, 0)
- ///
- public static readonly Vector2Float right = new Vector2Float(1, 0);
-
- ///
- /// The squared length of this vector
- ///
- /// The squared length
- /// The squared length is computationally simpler than the real length.
- /// Think of Pythagoras A^2 + B^2 = C^2.
- /// This leaves out the calculation of the squared root of C.
- public readonly float sqrMagnitude => horizontal * horizontal + vertical * vertical;
- public static float SqrMagnitudeOf(Vector2Float v) {
- return v.sqrMagnitude;
- }
-
- ///
- /// The length of this vector
- ///
- /// The length of this vector
- public readonly float magnitude => MathF.Sqrt(horizontal * horizontal + vertical * vertical);
- public static float MagnitudeOf(Vector2Float v) {
- return v.magnitude;
- }
-
- ///
- /// Convert the vector to a length of a 1
- ///
- /// The vector with length 1
- public Vector2Float normalized {
- get {
- float l = magnitude;
- Vector2Float v = zero;
- if (l > Float.epsilon)
- v = this / l;
- return v;
- }
- }
- public static Vector2Float Normalize(Vector2Float v) {
- return v.normalized;
- }
-
- ///
- /// Add two vectors
- ///
- /// The first vector
- /// The second vector
- /// The result of adding the two vectors
- public static Vector2Float operator +(Vector2Float v1, Vector2Float v2) {
- Vector2Float v = new Vector2Float(v1.horizontal + v2.horizontal, v1.vertical + v2.vertical);
- return v;
- }
-
- ///
- /// Subtract two vectors
- ///
- /// The first vector
- /// The second vector
- /// The result of adding the two vectors
- public static Vector2Float operator -(Vector2Float v1, Vector2Float v2) {
- Vector2Float v = new Vector2Float(v1.horizontal - v2.horizontal, v1.vertical - v2.vertical);
- return v;
- }
-
- ///
- /// Negate the vector
- ///
- /// The vector to negate
- /// The negated vector
- /// This will result in a vector pointing in the opposite direction
- public static Vector2Float operator -(Vector2Float v1) {
- Vector2Float v = new Vector2Float(-v1.horizontal, -v1.vertical);
- return v;
- }
-
- ///
- /// Scale a vector uniformly down
- ///
- /// The vector to scale
- /// The scaling factor
- /// The scaled vector
- /// Each component of the vector will be devided by the same factor.
- public static Vector2Float operator /(Vector2Float v, float f) {
- Vector2Float r = new(v.horizontal / f, v.vertical / f);
- return r;
- }
-
-
- ///
- /// Scale a vector uniformly up
- ///
- /// The vector to scale
- /// The scaling factor
- /// The scaled vector
- /// Each component of the vector will be multipled with the same factor.
- public static Vector2Float operator *(Vector2Float v1, float f) {
- Vector2Float v = new Vector2Float(v1.horizontal * f, v1.vertical * f);
- return v;
- }
-
- ///
- /// Scale a vector uniformly up
- ///
- /// The scaling factor
- /// The vector to scale
- /// The scaled vector
- /// Each component of the vector will be multipled with the same factor.
- public static Vector2Float operator *(float f, Vector2Float v1) {
- Vector2Float v = new Vector2Float(f * v1.horizontal, f * v1.vertical);
- return v;
- }
-
- /// @brief Scale the vector using another vector
- /// @param v1 The vector to scale
- /// @param v2 A vector with the scaling factors
- /// @return The scaled vector
- /// @remark Each component of the vector v1 will be multiplied with the
- /// matching component from the scaling vector v2.
- public static Vector2Float Scale(Vector2Float v1, Vector2Float v2) {
- return new Vector2Float(v1.horizontal * v2.horizontal, v1.vertical * v2.vertical);
- }
-
- ///
- /// Tests if the vector has equal values as the given vector
- ///
- /// The vector to compare to
- /// true if the vector values are equal
- //public readonly bool Equals(Vector2Float v1) => horizontal == v1.horizontal && vertical == v1.vertical;
-
- ///
- /// Tests if the two vectors have equal values
- ///
- /// The first vector
- /// The second vector
- /// true when the vectors have equal values
- /// Note that this uses a Float equality check which cannot be not exact in all cases.
- /// In most cases it is better to check if the Vector2.Distance between the vectors is smaller than Float.epsilon
- /// Or more efficient: (v1 - v2).sqrMagnitude < Float.sqrEpsilon
- public static bool operator ==(Vector2Float v1, Vector2Float v2) {
- return (v1.horizontal == v2.horizontal && v1.vertical == v2.vertical);
- }
-
- ///
- /// Tests if two vectors have different values
- ///
- /// The first vector
- /// The second vector
- /// true when the vectors have different values
- /// Note that this uses a Float equality check which cannot be not exact in all case.
- /// In most cases it is better to check if the Vector2.Distance between the vectors is smaller than Float.epsilon.
- /// Or more efficient: (v1 - v2).sqrMagnitude < Float.sqrEpsilon
- public static bool operator !=(Vector2Float v1, Vector2Float v2) {
- return (v1.horizontal != v2.horizontal || v1.vertical != v2.vertical);
- }
-
- ///
- /// Tests if the vector is equal to the given object
- ///
- /// The object to compare to
- /// false when the object is not a Vector2 or does not have equal values
- public override readonly bool Equals(object obj) {
- if (obj is not Vector2Float v)
- return false;
-
- return (horizontal == v.horizontal && vertical == v.vertical);
- }
-
- ///
- /// Get an hash code for the vector
- ///
- /// The hash code
- public override readonly int GetHashCode() {
- return HashCode.Combine(horizontal, vertical);
- }
-
- ///
- /// Get the distance between two vectors
- ///
- /// The first vector
- /// The second vector
- /// The distance between the two vectors
- public static float Distance(Vector2Float v1, Vector2Float v2) {
- float x = v1.horizontal - v2.horizontal;
- float y = v1.vertical - v2.vertical;
- float d = (float)Math.Sqrt(x * x + y * y);
- return d;
- }
-
- ///
- /// The dot product of two vectors
- ///
- /// The first vector
- /// The second vector
- /// The dot product of the two vectors
- public static float Dot(Vector2Float v1, Vector2Float v2) {
- return v1.horizontal * v2.horizontal + v1.vertical * v2.vertical;
- }
-
- ///
- /// Calculate the signed angle between two vectors.
- ///
- /// The starting vector
- /// The ending vector
- /// The axis to rotate around
- /// The signed angle in degrees
- public static float SignedAngle(Vector2Float from, Vector2Float to) {
- //float sign = Math.Sign(v1.y * v2.x - v1.x * v2.y);
- //return Vector2.Angle(v1, v2) * sign;
-
- float sqrMagFrom = from.sqrMagnitude;
- float sqrMagTo = to.sqrMagnitude;
-
- if (sqrMagFrom == 0 || sqrMagTo == 0)
- return 0;
- //if (!isfinite(sqrMagFrom) || !isfinite(sqrMagTo))
- // return nanf("");
-
- float angleFrom = (float)Math.Atan2(from.vertical, from.horizontal);
- float angleTo = (float)Math.Atan2(to.vertical, to.horizontal);
- return -(angleTo - angleFrom) * AngleFloat.Rad2Deg;
- }
-
- public static float UnsignedAngle(Vector2Float from, Vector2Float to) {
- return MathF.Abs(SignedAngle(from, to));
- }
-
- ///
- /// Rotates the vector with the given angle
- ///
- /// The vector to rotate
- /// The angle in degrees
- ///
- public static Vector2Float Rotate(Vector2Float v1, AngleFloat angle) {
- float sin = (float)Math.Sin(angle.inRadians);
- float cos = (float)Math.Cos(angle.inRadians);
- // float sin = AngleFloat.Sin(angle);
- // float cos = AngleFloat.Cos(angle);
-
- float tx = v1.horizontal;
- float ty = v1.vertical;
- Vector2Float v = new Vector2Float() {
- horizontal = (cos * tx) - (sin * ty),
- vertical = (sin * tx) + (cos * ty)
- };
- return v;
- }
-
- ///
- /// Lerp between two vectors
- ///
- /// The from vector
- /// The to vector
- /// The interpolation distance [0..1]
- /// The lerped vector
- /// The factor f is unclamped. Value 0 matches the *v1* vector, Value 1
- /// matches the *v2* vector Value -1 is *v1* vector minus the difference
- /// between *v1* and *v2* etc.
- public static Vector2Float Lerp(Vector2Float v1, Vector2Float v2, float f) {
- Vector2Float v = v1 + (v2 - v1) * f;
- return v;
- }
-
- ///
- /// Map interval of angles between vectors [0..Pi] to interval [0..1]
- ///
- /// The first vector
- /// The second vector
- /// The resulting factor in interval [0..1]
- /// Vectors a and b must be normalized
- public static float ToFactor(Vector2Float v1, Vector2Float v2) {
- return (1 - Vector2Float.Dot(v1, v2)) / 2;
- }
- }
-}
\ No newline at end of file
diff --git a/Runtime/LinearAlgebra/src/Vector2Int.cs b/Runtime/LinearAlgebra/src/Vector2Int.cs
deleted file mode 100644
index ed68e8b..0000000
--- a/Runtime/LinearAlgebra/src/Vector2Int.cs
+++ /dev/null
@@ -1,185 +0,0 @@
-using System;
-
-namespace LinearAlgebra {
-
- public struct Vector2Int {
- public int horizontal;
- public int vertical;
-
- public Vector2Int(int horizontal, int vertical) {
- this.horizontal = horizontal;
- this.vertical = vertical;
- }
-
- ///
- /// A vector with zero for all axis
- ///
- public static readonly Vector2Int zero = new(0, 0);
- ///
- /// A vector with values (1, 1)
- ///
- public static readonly Vector2Int one = new(1, 1);
- ///
- /// A vector with values (0, 1)
- ///
- public static readonly Vector2Int up = new(0, 1);
- ///
- /// A vector with values (0, -1)
- ///
- public static readonly Vector2Int down = new(0, -1);
- ///
- /// A vector with values (0, 1)
- ///
- public static readonly Vector2Int forward = new(0, 1);
- ///
- /// A vector with values (0, -1)
- ///
- public static readonly Vector2Int back = new(0, -1);
- ///
- /// A vector3 with values (-1, 0)
- ///
- public static readonly Vector2Int left = new(-1, 0);
- ///
- /// A vector with values (1, 0)
- ///
- public static readonly Vector2Int right = new(1, 0);
-
- /*
- ///
- /// Get an hash code for the vector
- ///
- /// The hash code
- public override int GetHashCode() {
- return (this.horizontal, this.vertical).GetHashCode();
- }
-
- ///
- /// Tests if the vector has equal values as the given vector
- ///
- /// The vector to compare to
- /// true if the vector values are equal
- public readonly bool Equals(Vector2Int v) => this.horizontal == v.horizontal && vertical == v.vertical;
-
- */
-
- ///
- /// Tests if the two vectors have equal values
- ///
- /// The first vector
- /// The second vector
- /// true when the vectors have equal values
- /// Note that this uses a Float equality check which cannot be not exact in all cases.
- /// In most cases it is better to check if the Vector2.Distance between the vectors is smaller than Float.epsilon
- /// Or more efficient: (v1 - v2).sqrMagnitude < Float.sqrEpsilon
- public static bool operator ==(Vector2Int v1, Vector2Int v2) {
- return (v1.horizontal == v2.horizontal && v1.vertical == v2.vertical);
- }
- ///
- /// Tests if two vectors have different values
- ///
- /// The first vector
- /// The second vector
- /// true when the vectors have different values
- /// Note that this uses a Float equality check which cannot be not exact in all case.
- /// In most cases it is better to check if the Vector2.Distance between the vectors is smaller than Float.epsilon.
- /// Or more efficient: (v1 - v2).sqrMagnitude < Float.sqrEpsilon
- public static bool operator !=(Vector2Int v1, Vector2Int v2) {
- return (v1.horizontal != v2.horizontal || v1.vertical != v2.vertical);
- }
-
- ///
- /// Tests if the vector is equal to the given object
- ///
- /// The object to compare to
- /// false when the object is not a Vector2 or does not have equal values
- public override readonly bool Equals(object obj) {
- if (obj is not Vector2Int v)
- return false;
-
- return (this.horizontal == v.horizontal && this.vertical == v.vertical);
- }
-
- ///
- /// Get an hash code for the vector
- ///
- /// The hash code
- public override readonly int GetHashCode() {
- return HashCode.Combine(horizontal, vertical);
- }
-
- public readonly float sqrMagnitude => this.horizontal * this.horizontal + this.vertical * this.vertical;
-
- public static float SqrMagnitudeOf(Vector2Int v) {
- return v.sqrMagnitude;
- }
-
- public readonly float magnitude =>
- MathF.Sqrt(this.horizontal * this.horizontal + this.vertical * this.vertical);
-
- public static float MagnitudeOf(Vector2Int v) {
- return v.magnitude;
- }
-
- /// @brief Convert the vector to a length of 1
- /// @return The vector normalized to a length of 1
- public readonly Vector2Float normalized {
- get {
- float l = magnitude;
- Vector2Float v = Vector2Float.zero;
- if (l > Float.epsilon)
- v = new Vector2Float(this) / l;
- return v;
- }
- }
- /// @brief Convert the vector to a length of 1
- /// @param v The vector to convert
- /// @return The vector normalized to a length of 1
- public static Vector2Float Normalize(Vector2Int v) {
- float num = v.magnitude;
- Vector2Float result = Vector2Float.zero;
- if (num > Float.epsilon)
- result = new Vector2Float(v) / num;
-
- return result;
- }
-
- public static Vector2Int operator -(Vector2Int v) {
- return new Vector2Int(-v.horizontal, -v.vertical);
- }
-
- public static Vector2Int operator -(Vector2Int v1, Vector2Int v2) {
- return new Vector2Int(v1.horizontal - v2.horizontal, v1.vertical - v2.vertical);
- }
- public static Vector2Int operator +(Vector2Int v1, Vector2Int v2) {
- return new Vector2Int(v1.horizontal + v2.horizontal, v1.vertical + v2.vertical);
- }
-
- public static Vector2Int operator /(Vector2Int v, int f) {
- return new Vector2Int(v.horizontal / f, v.vertical / f);
- }
-
- public static Vector2Int operator *(Vector2Int v1, int d) {
- return new Vector2Int(v1.horizontal * d, v1.vertical * d);
- }
-
- public static Vector2Int operator *(int d, Vector2Int v1) {
- return new Vector2Int(d * v1.horizontal, d * v1.vertical);
- }
-
- public static Vector2Int Scale(Vector2Int v1, Vector2Int v2) {
- return new Vector2Int(v1.horizontal * v2.horizontal, v1.vertical * v2.vertical);
- }
-
- /// @brief The dot product of two vectors
- /// @param v1 The first vector
- /// @param v2 The second vector
- /// @return The dot product of the two vectors
- public static int Dot(Vector2Int v1, Vector2Int v2) {
- return v1.horizontal * v2.horizontal + v1.vertical * v2.vertical;
- }
-
- public static float Distance(Vector2Int v1, Vector2Int v2) {
- return (v1 - v2).magnitude;
- }
- }
-}
\ No newline at end of file
diff --git a/Runtime/LinearAlgebra/src/Vector3Float.cs b/Runtime/LinearAlgebra/src/Vector3Float.cs
deleted file mode 100644
index bcf8626..0000000
--- a/Runtime/LinearAlgebra/src/Vector3Float.cs
+++ /dev/null
@@ -1,402 +0,0 @@
-//#if !UNITY_5_3_OR_NEWER
-using System;
-
-namespace LinearAlgebra {
- /*
- public struct Vector3Float {
- public float horizontal;
- public float vertical;
- public float depth;
-
- public Vector3Float(float horizontal, float vertical, float depth) {
- this.horizontal = horizontal;
- this.vertical = vertical;
- this.depth = depth;
- }
-
- ///
- /// A vector with zero for all axis
- ///
- public static readonly Vector3Float zero = new(0, 0, 0);
-
- public readonly float magnitude {
- get => (float)Math.Sqrt(this.horizontal * this.horizontal + this.vertical * this.vertical + this.depth * this.depth);
- }
-
- ///
- /// Convert the vector to a length of a 1
- ///
- /// The vector with length 1
- public readonly Vector3Float normalized {
- get {
- float l = magnitude;
- Vector3Float v = zero;
- if (l > Float.epsilon)
- v = this / l;
- return v;
- }
- }
-
-
- public static Vector3Float operator *(Vector3Float v, float f) {
- Vector3Float r = new(v.horizontal * f, v.vertical * f, v.depth * f);
- return r;
- }
- public static Vector3Float operator /(Vector3Float v, float f) {
- Vector3Float r = new(v.horizontal / f, v.vertical / f, v.depth / f);
- return r;
- }
-
- public static float Dot(Vector3Float v1, Vector3Float v2) {
- return v1.horizontal * v2.horizontal + v1.vertical * v2.vertical +
- v1.depth * v2.depth;
- }
-
- const float epsilon = 1E-05f;
- public static Vector3Float Project(Vector3Float v, Vector3Float n) {
- float sqrMagnitude = Dot(n, n);
- if (sqrMagnitude < epsilon)
- return zero;
- else {
- float dot = Dot(v, n);
- Vector3Float r = n * dot;
- r /= sqrMagnitude;
- return r;
- }
-
- }
- }
- */
-
- ///
- /// 3-dimensional vectors
- ///
- /// This uses the right-handed coordinate system.
- public struct Vector3Float {
-
- ///
- /// The right axis of the vector
- ///
- public float horizontal; //> left/right
- ///
- /// The upward axis of the vector
- ///
- public float vertical; //> up/down
- ///
- /// The forward axis of the vector
- ///
- public float depth; //> forward/backward
-
- ///
- /// Create a new 3-dimensional vector
- ///
- /// x axis value
- /// y axis value
- /// z axis value
- public Vector3Float(float horizontal, float vertical, float depth) {
- this.horizontal = horizontal;
- this.vertical = vertical;
- this.depth = depth;
- }
-
- public Vector3Float(Vector3Int v) {
- this.horizontal = v.horizontal;
- this.vertical = v.vertical;
- this.depth = v.depth;
- }
-
- public static Vector3Float FromSpherical(Spherical s) {
- float verticalRad = (AngleFloat.deg90 - s.direction.vertical).inRadians;
- float horizontalRad = s.direction.horizontal.inRadians;
- float cosVertical = MathF.Cos(verticalRad);
- float sinVertical = MathF.Sin(verticalRad);
- float cosHorizontal = MathF.Cos(horizontalRad);
- float sinHorizontal = MathF.Sin(horizontalRad);
-
- float horizontal = s.distance * sinVertical * sinHorizontal;
- float vertical = s.distance * cosVertical;
- float depth = s.distance * sinVertical * cosHorizontal;
- return new Vector3Float(horizontal, vertical, depth);
- }
-
- public override string ToString() {
- return $"({this.horizontal}, {this.vertical}, {this.depth})";
- }
-
- ///
- /// A vector with zero for all axis
- ///
- public static readonly Vector3Float zero = new Vector3Float(0, 0, 0);
- ///
- /// A vector with one for all axis
- ///
- public static readonly Vector3Float one = new Vector3Float(1, 1, 1);
- ///
- /// A Vector3Float with values (-1, 0, 0)
- ///
- public static readonly Vector3Float left = new Vector3Float(-1, 0, 0);
- ///
- /// A vector with values (1, 0, 0)
- ///
- public static readonly Vector3Float right = new Vector3Float(1, 0, 0);
- ///
- /// A vector with values (0, -1, 0)
- ///
- public static readonly Vector3Float down = new Vector3Float(0, -1, 0);
- ///
- /// A vector with values (0, 1, 0)
- ///
- public static readonly Vector3Float up = new Vector3Float(0, 1, 0);
- ///
- /// A vector with values (0, 0, -1)
- ///
- public static readonly Vector3Float back = new Vector3Float(0, -1, 0);
- ///
- /// A vector with values (0, 0, 1)
- ///
- public static readonly Vector3Float forward = new Vector3Float(0, 1, 0);
-
- /// @brief The vector length
- /// @return The vector length
- public readonly float magnitude => MathF.Sqrt(horizontal * horizontal + vertical * vertical + depth * depth);
- ///
- /// The vector length
- ///
- /// The vector for which you need the length
- /// The vector length
- public static float MagnitudeOf(Vector3Float v) {
- return v.magnitude;
- }
-
- /// @brief The squared vector length
- /// @return The squared vector length
- /// @remark The squared length is computationally simpler than the real
- /// length. Think of Pythagoras A^2 + B^2 = C^2. This leaves out the
- /// calculation of the squared root of C.
- public readonly float sqrMagnitude => (horizontal * horizontal + vertical * vertical + depth * depth);
-
- ///
- /// The squared vector length
- ///
- /// The vector for which you need the squared length
- /// The squared vector length
- /// The squared length is computationally simpler than the real
- /// length. Think of Pythagoras A^2 + B^2 = C^2. This leaves out the
- /// calculation of the squared root of C.
- public static float SqrMagnitudeOf(Vector3Float v) {
- return v.sqrMagnitude;
- }
-
- /// @brief Convert the vector to a length of 1
- /// @return The vector normalized to a length of 1
- public readonly Vector3Float normalized {
- get {
- float l = magnitude;
- Vector3Float v = zero;
- if (l > Float.epsilon)
- v = this / l;
- return v;
- }
- }
- /// @brief Convert the vector to a length of 1
- /// @param v The vector to convert
- /// @return The vector normalized to a length of 1
- public static Vector3Float Normalize(Vector3Float v) {
- float num = v.magnitude;
- Vector3Float result = zero;
- if (num > Float.epsilon)
- result = v / num;
-
- return result;
- }
-
- ///
- /// Negate te vector such that it points in the opposite direction
- ///
- ///
- /// The negated vector
- public static Vector3Float operator -(Vector3Float v1) {
- Vector3Float v = new(-v1.horizontal, -v1.vertical, -v1.depth);
- return v;
- }
-
- ///
- /// Subtract two vectors
- ///
- ///
- ///
- /// The result of the subtraction
- public static Vector3Float operator -(Vector3Float v1, Vector3Float v2) {
- Vector3Float v = new(v1.horizontal - v2.horizontal, v1.vertical - v2.vertical, v1.depth - v2.depth);
- return v;
- }
-
- ///
- /// Add two vectors
- ///
- ///
- ///
- /// The result of the addition
- public static Vector3Float operator +(Vector3Float v1, Vector3Float v2) {
- Vector3Float v = new(v1.horizontal + v2.horizontal, v1.vertical + v2.vertical, v1.depth + v2.depth);
- return v;
- }
-
- /// @brief Scale the vector using another vector
- /// @param v1 The vector to scale
- /// @param v2 A vector with the scaling factors
- /// @return The scaled vector
- /// @remark Each component of the vector v1 will be multiplied with the
- /// matching component from the scaling vector v2.
- public static Vector3Float Scale(Vector3Float v1, Vector3Float v2) {
- return new Vector3Float(v1.horizontal * v2.horizontal, v1.vertical * v2.vertical, v1.depth * v2.depth);
- }
-
-
- public static Vector3Float operator *(Vector3Float v1, float d) {
- Vector3Float v = new(v1.horizontal * d, v1.vertical * d, v1.depth * d);
- return v;
- }
-
- public static Vector3Float operator *(float d, Vector3Float v1) {
- Vector3Float v = new(d * v1.horizontal, d * v1.vertical, d * v1.depth);
- return v;
- }
-
- public static Vector3Float operator /(Vector3Float v1, float d) {
- Vector3Float v = new(v1.horizontal / d, v1.vertical / d, v1.depth / d);
- return v;
- }
-
-
- //public bool Equals(Vector3Float v) => (horizontal == v.horizontal && vertical == v.vertical && depth == v.depth);
-
- public static bool operator ==(Vector3Float v1, Vector3Float v2) {
- return (v1.horizontal == v2.horizontal && v1.vertical == v2.vertical && v1.depth == v2.depth);
- }
-
- public static bool operator !=(Vector3Float v1, Vector3Float v2) {
- return (v1.horizontal != v2.horizontal || v1.vertical != v2.vertical || v1.depth != v2.depth);
- }
-
- public override readonly bool Equals(object obj) {
- if (obj is not Vector3Float v)
- return false;
-
- return (horizontal == v.horizontal && vertical == v.vertical && depth == v.depth);
- }
-
- public override readonly int GetHashCode() {
- return HashCode.Combine(horizontal, vertical, depth);
- }
-
- /// @brief The distance between two vectors
- /// @param v1 The first vector
- /// @param v2 The second vector
- /// @return The distance between the two vectors
- public static float Distance(Vector3Float v1, Vector3Float v2) {
- return (v2 - v1).magnitude;
- }
-
- /// @brief The dot product of two vectors
- /// @param v1 The first vector
- /// @param v2 The second vector
- /// @return The dot product of the two vectors
- public static float Dot(Vector3Float v1, Vector3Float v2) {
- return v1.horizontal * v2.horizontal + v1.vertical * v2.vertical + v1.depth * v2.depth;
- }
-
- /// @brief The cross product of two vectors
- /// @param v1 The first vector
- /// @param v2 The second vector
- /// @return The cross product of the two vectors
- public static Vector3Float Cross(Vector3Float v1, Vector3Float v2) {
- return new Vector3Float(v1.vertical * v2.depth - v1.depth * v2.vertical, v1.depth * v2.horizontal - v1.horizontal * v2.depth,
- v1.horizontal * v2.vertical - v1.vertical * v2.horizontal);
-
- }
-
- /// @brief Project the vector on another vector
- /// @param v The vector to project
- /// @param n The normal vecto to project on
- /// @return The projected vector
- public static Vector3Float Project(Vector3Float v, Vector3Float n) {
- float sqrMagnitude = Dot(n, n);
- if (sqrMagnitude < Float.epsilon)
- return zero;
- else {
- float dot = Dot(v, n);
- Vector3Float r = n * dot / sqrMagnitude;
- return r;
- }
- }
-
- /// @brief Project the vector on a plane defined by a normal orthogonal to the
- /// plane.
- /// @param v The vector to project
- /// @param n The normal of the plane to project on
- /// @return Teh projected vector
- public static Vector3Float ProjectOnPlane(Vector3Float v, Vector3Float n) {
- Vector3Float r = v - Project(v, n);
- return r;
- }
-
- /// @brief The angle between two vectors
- /// @param v1 The first vector
- /// @param v2 The second vector
- /// @return The angle between the two vectors
- /// @remark This reterns an unsigned angle which is the shortest distance
- /// between the two vectors. Use Vector3::SignedAngle if a signed angle is
- /// needed.
- public static AngleFloat UnsignedAngle(Vector3Float v1, Vector3Float v2) {
- float denominator = MathF.Sqrt(v1.sqrMagnitude * v2.sqrMagnitude);
- if (denominator < Float.epsilon)
- return AngleFloat.zero;
-
- float dot = Dot(v1, v2);
- float fraction = dot / denominator;
- if (float.IsNaN(fraction))
- return AngleFloat.Degrees(
- fraction); // short cut to returning NaN universally
-
- float cdot = Float.Clamp(fraction, -1.0f, 1.0f);
- float r = MathF.Acos(cdot);
- return AngleFloat.Radians(r);
- }
- /// @brief The signed angle between two vectors
- /// @param v1 The starting vector
- /// @param v2 The ending vector
- /// @param axis The axis to rotate around
- /// @return The signed angle between the two vectors
- public static AngleFloat SignedAngle(Vector3Float v1, Vector3Float v2,
- Vector3Float axis) {
- // angle in [0,180]
- AngleFloat angle = UnsignedAngle(v1, v2);
-
- Vector3Float cross = Cross(v1, v2);
- float b = Dot(axis, cross);
- float signd = b < 0 ? -1.0F : (b > 0 ? 1.0F : 0.0F);
-
- // angle in [-179,180]
- AngleFloat signed_angle = angle * signd;
-
- return signed_angle;
- }
-
-
- /// @brief Lerp (linear interpolation) between two vectors
- /// @param v1 The starting vector
- /// @param v2 The ending vector
- /// @param f The interpolation distance
- /// @return The lerped vector
- /// @remark The factor f is unclamped. Value 0 matches the vector *v1*, Value
- /// 1 matches vector *v2*. Value -1 is vector *v1* minus the difference
- /// between *v1* and *v2* etc.
- public static Vector3Float Lerp(Vector3Float v1, Vector3Float v2, float f) {
- Vector3Float v = v1 + (v2 - v1) * f;
- return v;
- }
-
- }
-}
-//#endif
\ No newline at end of file
diff --git a/Runtime/LinearAlgebra/src/Vector3Int.cs b/Runtime/LinearAlgebra/src/Vector3Int.cs
deleted file mode 100644
index 18edf40..0000000
--- a/Runtime/LinearAlgebra/src/Vector3Int.cs
+++ /dev/null
@@ -1,273 +0,0 @@
-//#if !UNITY_5_3_OR_NEWER
-using System;
-
-namespace LinearAlgebra {
-
- ///
- /// 3-dimensional vectors
- ///
- /// This uses the right-handed coordinate system.
- ///
- /// Create a new 3-dimensional vector
- ///
- /// x axis value
- /// y axis value
- /// z axis value
- public struct Vector3Int {
-
- ///
- /// The right axis of the vector
- ///
- public int horizontal; //> left/right
- ///
- /// The upward axis of the vector
- ///
- public int vertical; //> up/down
- ///
- /// The forward axis of the vector
- ///
- public int depth; //> forward/backward
-
- public Vector3Int(int horizontal, int vertical, int depth) {
- this.horizontal = horizontal;
- this.vertical = vertical;
- this.depth = depth;
- }
-
- ///
- /// A vector with zero for all axis
- ///
- public static readonly Vector3Int zero = new(0, 0, 0);
- ///
- /// A vector with one for all axis
- ///
- public static readonly Vector3Int one = new(1, 1, 1);
- ///
- /// A Vector3Int with values (-1, 0, 0)
- ///
- public static readonly Vector3Int left = new(-1, 0, 0);
- ///
- /// A vector with values (1, 0, 0)
- ///
- public static readonly Vector3Int right = new(1, 0, 0);
- ///
- /// A vector with values (0, -1, 0)
- ///
- public static readonly Vector3Int down = new(0, -1, 0);
- ///
- /// A vector with values (0, 1, 0)
- ///
- public static readonly Vector3Int up = new(0, 1, 0);
- ///
- /// A vector with values (0, 0, -1)
- ///
- public static readonly Vector3Int back = new(0, -1, 0);
- ///
- /// A vector with values (0, 0, 1)
- ///
- public static readonly Vector3Int forward = new(0, 1, 0);
-
- /// @brief The vector length
- /// @return The vector length
- public readonly float magnitude => MathF.Sqrt(horizontal * horizontal + vertical * vertical + depth * depth);
- ///
- /// The vector length
- ///
- /// The vector for which you need the length
- /// The vector length
- public static float MagnitudeOf(Vector3Int v) {
- return v.magnitude;
- }
-
- /// @brief The squared vector length
- /// @return The squared vector length
- /// @remark The squared length is computationally simpler than the real
- /// length. Think of Pythagoras A^2 + B^2 = C^2. This leaves out the
- /// calculation of the squared root of C.
- public readonly float sqrMagnitude => (horizontal * horizontal + vertical * vertical + depth * depth);
-
- ///
- /// The squared vector length
- ///
- /// The vector for which you need the squared length
- /// The squared vector length
- /// The squared length is computationally simpler than the real
- /// length. Think of Pythagoras A^2 + B^2 = C^2. This leaves out the
- /// calculation of the squared root of C.
- public static float SqrMagnitudeOf(Vector3Int v) {
- return v.sqrMagnitude;
- }
-
- /// @brief Convert the vector to a length of 1
- /// @return The vector normalized to a length of 1
- public readonly Vector3Float normalized {
- get {
- float l = magnitude;
- Vector3Float v = Vector3Float.zero;
- if (l > Float.epsilon)
- v = new Vector3Float(this) / l;
- return v;
- }
- }
- /// @brief Convert the vector to a length of 1
- /// @param v The vector to convert
- /// @return The vector normalized to a length of 1
- public static Vector3Float Normalize(Vector3Int v) {
- float num = v.magnitude;
- Vector3Float result = Vector3Float.zero;
- if (num > Float.epsilon)
- result = new Vector3Float(v) / num;
-
- return result;
- }
-
- ///
- /// Negate te vector such that it points in the opposite direction
- ///
- ///
- /// The negated vector
- public static Vector3Int operator -(Vector3Int v1) {
- Vector3Int v = new(-v1.horizontal, -v1.vertical, -v1.depth);
- return v;
- }
-
- ///
- /// Subtract two vectors
- ///
- ///
- ///
- /// The result of the subtraction
- public static Vector3Int operator -(Vector3Int v1, Vector3Int v2) {
- Vector3Int v = new(v1.horizontal - v2.horizontal, v1.vertical - v2.vertical, v1.depth - v2.depth);
- return v;
- }
-
- ///
- /// Add two vectors
- ///
- ///
- ///
- /// The result of the addition
- public static Vector3Int operator +(Vector3Int v1, Vector3Int v2) {
- Vector3Int v = new(v1.horizontal + v2.horizontal, v1.vertical + v2.vertical, v1.depth + v2.depth);
- return v;
- }
-
- /// @brief Scale the vector using another vector
- /// @param v1 The vector to scale
- /// @param v2 A vector with the scaling factors
- /// @return The scaled vector
- /// @remark Each component of the vector v1 will be multiplied with the
- /// matching component from the scaling vector v2.
- public static Vector3Int Scale(Vector3Int v1, Vector3Int v2) {
- return new Vector3Int(v1.horizontal * v2.horizontal, v1.vertical * v2.vertical, v1.depth * v2.depth);
- }
-
-
- public static Vector3Int operator *(Vector3Int v1, int d) {
- Vector3Int v = new(v1.horizontal * d, v1.vertical * d, v1.depth * d);
- return v;
- }
-
- public static Vector3Int operator *(int d, Vector3Int v1) {
- Vector3Int v = new(d * v1.horizontal, d * v1.vertical, d * v1.depth);
- return v;
- }
-
- public static Vector3Int operator /(Vector3Int v1, int d) {
- Vector3Int v = new(v1.horizontal / d, v1.vertical / d, v1.depth / d);
- return v;
- }
-
- public bool Equals(Vector3Int v) => (horizontal == v.horizontal && vertical == v.vertical && depth == v.depth);
-
- public override bool Equals(object obj) {
- if (!(obj is Vector3Int v))
- return false;
-
- return (horizontal == v.horizontal && vertical == v.vertical && depth == v.depth);
- }
-
- public static bool operator ==(Vector3Int v1, Vector3Int v2) {
- return (v1.horizontal == v2.horizontal && v1.vertical == v2.vertical && v1.depth == v2.depth);
- }
-
- public static bool operator !=(Vector3Int v1, Vector3Int v2) {
- return (v1.horizontal != v2.horizontal || v1.vertical != v2.vertical || v1.depth != v2.depth);
- }
-
- public override int GetHashCode() {
- return (horizontal, vertical, depth).GetHashCode();
- }
-
- /// @brief The distance between two vectors
- /// @param v1 The first vector
- /// @param v2 The second vector
- /// @return The distance between the two vectors
- public static float Distance(Vector3Int v1, Vector3Int v2) {
- return (v2 - v1).magnitude;
- }
-
- /// @brief The dot product of two vectors
- /// @param v1 The first vector
- /// @param v2 The second vector
- /// @return The dot product of the two vectors
- public static float Dot(Vector3Int v1, Vector3Int v2) {
- return v1.horizontal * v2.horizontal + v1.vertical * v2.vertical + v1.depth * v2.depth;
- }
-
- /// @brief The cross product of two vectors
- /// @param v1 The first vector
- /// @param v2 The second vector
- /// @return The cross product of the two vectors
- public static Vector3Int Cross(Vector3Int v1, Vector3Int v2) {
- return new Vector3Int(v1.vertical * v2.depth - v1.depth * v2.vertical, v1.depth * v2.horizontal - v1.horizontal * v2.depth,
- v1.horizontal * v2.vertical - v1.vertical * v2.horizontal);
-
- }
-
- /// @brief The angle between two vectors
- /// @param v1 The first vector
- /// @param v2 The second vector
- /// @return The angle between the two vectors
- /// @remark This reterns an unsigned angle which is the shortest distance
- /// between the two vectors. Use Vector3::SignedAngle if a signed angle is
- /// needed.
- public static AngleFloat UnsignedAngle(Vector3Int v1, Vector3Int v2) {
- float denominator = MathF.Sqrt(v1.sqrMagnitude * v2.sqrMagnitude);
- if (denominator < Float.epsilon)
- return AngleFloat.zero;
-
- float dot = Dot(v1, v2);
- float fraction = dot / denominator;
- if (float.IsNaN(fraction))
- return AngleFloat.Degrees(
- fraction); // short cut to returning NaN universally
-
- float cdot = Float.Clamp(fraction, -1.0f, 1.0f);
- float r = MathF.Acos(cdot);
- return AngleFloat.Radians(r);
- }
- /// @brief The signed angle between two vectors
- /// @param v1 The starting vector
- /// @param v2 The ending vector
- /// @param axis The axis to rotate around
- /// @return The signed angle between the two vectors
- public static AngleFloat SignedAngle(Vector3Int v1, Vector3Int v2,
- Vector3Int axis) {
- // angle in [0,180]
- AngleFloat angle = UnsignedAngle(v1, v2);
-
- Vector3Int cross = Cross(v1, v2);
- float b = Dot(axis, cross);
- float signd = b < 0 ? -1.0F : (b > 0 ? 1.0F : 0.0F);
-
- // angle in [-179,180]
- AngleFloat signed_angle = angle * signd;
-
- return signed_angle;
- }
-
- }
-}
-//#endif
\ No newline at end of file
diff --git a/Runtime/LinearAlgebra/src/float16.cs b/Runtime/LinearAlgebra/src/float16.cs
deleted file mode 100644
index 4b58cdd..0000000
--- a/Runtime/LinearAlgebra/src/float16.cs
+++ /dev/null
@@ -1,322 +0,0 @@
-using System;
-
-namespace LinearAlgebra {
-
- public class float16 {
- //
- // FILE: float16.cpp
- // AUTHOR: Rob Tillaart
- // VERSION: 0.1.8
- // PURPOSE: library for Float16s for Arduino
- // URL: http://en.wikipedia.org/wiki/Half-precision_floating-point_format
-
- ushort _value;
-
- public float16() { _value = 0; }
-
- public float16(float f) {
- //_value = f32tof16(f);
- _value = F32ToF16__(f);
- }
-
- public float toFloat() {
- return f16tof32(_value);
- }
-
- public ushort GetBinary() { return _value; }
- public void SetBinary(ushort value) { _value = value; }
-
- //////////////////////////////////////////////////////////
- //
- // EQUALITIES
- //
- /*
- bool float16::operator ==(const float16 &f) { return (_value == f._value); }
-
- bool float16::operator !=(const float16 &f) { return (_value != f._value); }
-
- bool float16::operator >(const float16 &f) {
- if ((_value & 0x8000) && (f._value & 0x8000))
- return _value < f._value;
- if (_value & 0x8000)
- return false;
- if (f._value & 0x8000)
- return true;
- return _value > f._value;
- }
-
- bool float16::operator >=(const float16 &f) {
- if ((_value & 0x8000) && (f._value & 0x8000))
- return _value <= f._value;
- if (_value & 0x8000)
- return false;
- if (f._value & 0x8000)
- return true;
- return _value >= f._value;
- }
-
- bool float16::operator <(const float16 &f) {
- if ((_value & 0x8000) && (f._value & 0x8000))
- return _value > f._value;
- if (_value & 0x8000)
- return true;
- if (f._value & 0x8000)
- return false;
- return _value < f._value;
- }
-
- bool float16::operator <=(const float16 &f) {
- if ((_value & 0x8000) && (f._value & 0x8000))
- return _value >= f._value;
- if (_value & 0x8000)
- return true;
- if (f._value & 0x8000)
- return false;
- return _value <= f._value;
- }
-
- //////////////////////////////////////////////////////////
- //
- // NEGATION
- //
- float16 float16::operator -() {
- float16 f16;
- f16.setBinary(_value ^ 0x8000);
- return f16;
- }
-
- //////////////////////////////////////////////////////////
- //
- // MATH
- //
- float16 float16::operator +(const float16 &f) {
- return float16(this->toDouble() + f.toDouble());
- }
-
- float16 float16::operator -(const float16 &f) {
- return float16(this->toDouble() - f.toDouble());
- }
-
- float16 float16::operator *(const float16 &f) {
- return float16(this->toDouble() * f.toDouble());
- }
-
- float16 float16::operator /(const float16 &f) {
- return float16(this->toDouble() / f.toDouble());
- }
-
- float16 & float16::operator+=(const float16 &f) {
- *this = this->toDouble() + f.toDouble();
- return *this;
- }
-
- float16 & float16::operator-=(const float16 &f) {
- *this = this->toDouble() - f.toDouble();
- return *this;
- }
-
- float16 & float16::operator*=(const float16 &f) {
- *this = this->toDouble() * f.toDouble();
- return *this;
- }
-
- float16 & float16::operator/=(const float16 &f) {
- *this = this->toDouble() / f.toDouble();
- return *this;
- }
-
- //////////////////////////////////////////////////////////
- //
- // MATH HELPER FUNCTIONS
- //
- int float16::sign() {
- if (_value & 0x8000)
- return -1;
- if (_value & 0xFFFF)
- return 1;
- return 0;
- }
-
- bool float16::isZero() { return ((_value & 0x7FFF) == 0x0000); }
-
- bool float16::isNaN() {
- if ((_value & 0x7C00) != 0x7C00)
- return false;
- if ((_value & 0x03FF) == 0x0000)
- return false;
- return true;
- }
-
- bool float16::isInf() { return ((_value == 0x7C00) || (_value == 0xFC00)); }
- */
- //////////////////////////////////////////////////////////
- //
- // CORE CONVERSION
- //
- float f16tof32(ushort _value) {
- //ushort sgn;
- ushort man;
- int exp;
- float f;
-
- //Debug.Log($"{_value}");
-
- bool sgn = (_value & 0x8000) > 0;
- exp = (_value & 0x7C00) >> 10;
- man = (ushort)(_value & 0x03FF);
-
- //Debug.Log($"{sgn} {exp} {man}");
-
- // ZERO
- if ((_value & 0x7FFF) == 0) {
- return sgn ? -0 : 0;
- }
- // NAN & INF
- if (exp == 0x001F) {
- if (man == 0)
- return sgn ? float.NegativeInfinity : float.PositiveInfinity; //-INFINITY : INFINITY;
- else
- return float.NaN; // NAN;
- }
-
- // SUBNORMAL/NORMAL
- if (exp == 0)
- f = 0;
- else
- f = 1;
-
- // PROCESS MANTISSE
- for (int i = 9; i >= 0; i--) {
- f *= 2;
- if ((man & (1 << i)) != 0)
- f = f + 1;
- }
- //Debug.Log($"{f}");
- f = f * (float)Math.Pow(2.0f, exp - 25);
- if (exp == 0) {
- f = f * (float)Math.Pow(2.0f, -13); // 5.96046447754e-8;
- }
- //Debug.Log($"{f}");
- return sgn ? -f : f;
- }
-
- public static uint SingleToInt32Bits(float value) {
- byte[] bytes = BitConverter.GetBytes(value);
- if (BitConverter.IsLittleEndian)
- Array.Reverse(bytes); // If the system is little-endian, reverse the byte order
- return BitConverter.ToUInt32(bytes, 0);
- }
-
- public ushort F32ToF16__(float f) {
- uint t = BitConverter.ToUInt32(BitConverter.GetBytes(f), 0);
- ushort man = (ushort)((t & 0x007FFFFF) >> 12);
- int exp = (int)((t & 0x7F800000) >> 23);
- bool sgn = (t & 0x80000000) != 0;
-
- // handle 0
- if ((t & 0x7FFFFFFF) == 0) {
- return sgn ? (ushort)0x8000 : (ushort)0x0000;
- }
- // denormalized float32 does not fit in float16
- if (exp == 0x00) {
- return sgn ? (ushort)0x8000 : (ushort)0x0000;
- }
- // handle infinity & NAN
- if (exp == 0x00FF) {
- if (man != 0)
- return 0xFE00; // NAN
- return sgn ? (ushort)0xFC00 : (ushort)0x7C00; // -INF : INF
- }
-
- // normal numbers
- exp = exp - 127 + 15;
- // overflow does not fit => INF
- if (exp > 30) {
- return sgn ? (ushort)0xFC00 : (ushort)0x7C00; // -INF : INF
- }
- // subnormal numbers
- if (exp < -38) {
- return sgn ? (ushort)0x8000 : (ushort)0x0000; // -0 or 0 ? just 0 ?
- }
- if (exp <= 0) // subnormal
- {
- man >>= (exp + 14);
- // rounding
- man++;
- man >>= 1;
- if (sgn)
- return (ushort)(0x8000 | man);
- return man;
- }
-
- // normal
- // TODO rounding
- exp <<= 10;
- man++;
- man >>= 1;
- if (sgn)
- return (ushort)(0x8000 | exp | man);
- return (ushort)(exp | man);
- }
-
- //This function is faulty!!!!
- ushort f32tof16(float f) {
- //uint t = *(uint*)&f;
- //uint t = (uint)BitConverter.SingleToInt32Bits(f);
- uint t = SingleToInt32Bits(f);
- // man bits = 10; but we keep 11 for rounding
- ushort man = (ushort)((t & 0x007FFFFF) >> 12);
- short exp = (short)((t & 0x7F800000) >> 23);
- bool sgn = (t & 0x80000000) != 0;
-
- // handle 0
- if ((t & 0x7FFFFFFF) == 0) {
- return sgn ? (ushort)0x8000 : (ushort)0x0000;
- }
- // denormalized float32 does not fit in float16
- if (exp == 0x00) {
- return sgn ? (ushort)0x8000 : (ushort)0x0000;
- }
- // handle infinity & NAN
- if (exp == 0x00FF) {
- if (man != 0)
- return 0xFE00; // NAN
- return sgn ? (ushort)0xFC00 : (ushort)0x7C00; // -INF : INF
- }
-
- // normal numbers
- exp = (short)(exp - 127 + 15);
- // overflow does not fit => INF
- if (exp > 30) {
- return sgn ? (ushort)0xFC00 : (ushort)0x7C00; // -INF : INF
- }
- // subnormal numbers
- if (exp < -38) {
- return sgn ? (ushort)0x8000 : (ushort)0x0000; // -0 or 0 ? just 0 ?
- }
- if (exp <= 0) // subnormal
- {
- man >>= (exp + 14);
- // rounding
- man++;
- man >>= 1;
- if (sgn)
- return (ushort)(0x8000 | man);
- return man;
- }
-
- // normal
- // TODO rounding
- exp <<= 10;
- man++;
- man >>= 1;
- ushort uexp = (ushort)exp;
- if (sgn)
- return (ushort)(0x8000 | uexp | man);
- return (ushort)(uexp | man);
- }
-
- // -- END OF FILE --
- }
-
-}
\ No newline at end of file
diff --git a/Runtime/LinearAlgebra/test/AngleTest.cs b/Runtime/LinearAlgebra/test/AngleTest.cs
deleted file mode 100644
index 8362d82..0000000
--- a/Runtime/LinearAlgebra/test/AngleTest.cs
+++ /dev/null
@@ -1,501 +0,0 @@
-#if !UNITY_5_6_OR_NEWER
-using System;
-using System.Formats.Asn1;
-using NUnit.Framework;
-
-namespace LinearAlgebra.Test {
- public class AngleTests {
- [SetUp]
- public void Setup() {
- }
-
- [Test]
- public void Construct() {
- // Degrees
- float angle = 0.0f;
- AngleFloat a = AngleFloat.Degrees(angle);
- Assert.AreEqual(angle, a.inDegrees);
-
- angle = -180.0f;
- a = AngleFloat.Degrees(angle);
- Assert.AreEqual(angle, a.inDegrees);
-
- angle = 270.0f;
- a = AngleFloat.Degrees(angle);
- Assert.AreEqual(-90, a.inDegrees);
-
- angle = -270.0f;
- a = AngleFloat.Degrees(angle);
- Assert.AreEqual(90, a.inDegrees);
-
- // Radians
- angle = 0.0f;
- a = AngleFloat.Radians(angle);
- Assert.AreEqual(angle, a.inRadians);
-
- angle = (float)-Math.PI;
- a = AngleFloat.Radians(angle);
- Assert.AreEqual(angle, a.inRadians);
-
- angle = (float)Math.PI * 1.5f;
- a = AngleFloat.Radians(angle);
- Assert.AreEqual(-Math.PI * 0.5f, a.inRadians, 1.0E-05F);
-
- // Revolutions
- angle = 0.0f;
- a = AngleFloat.Revolutions(angle);
- Assert.AreEqual(angle, a.inRevolutions);
-
- angle = -0.5f;
- a = AngleFloat.Revolutions(angle);
- Assert.AreEqual(angle, a.inRevolutions);
-
- angle = 0.75f;
- a = AngleFloat.Revolutions(angle);
- Assert.AreEqual(-0.25f, a.inRevolutions);
-
- }
-
- [Test]
- public void Revolutions() {
- AngleFloat a;
-
- // Test zero
- a = AngleFloat.Revolutions(0.0f);
- Assert.AreEqual(0.0f, a.inRevolutions);
-
- // Test positive values within range
- a = AngleFloat.Revolutions(0.25f);
- Assert.AreEqual(0.25f, a.inRevolutions);
-
- a = AngleFloat.Revolutions(0.5f);
- Assert.AreEqual(-0.5f, a.inRevolutions);
-
- // Test negative values within range
- a = AngleFloat.Revolutions(-0.25f);
- Assert.AreEqual(-0.25f, a.inRevolutions);
-
- a = AngleFloat.Revolutions(-0.5f);
- Assert.AreEqual(-0.5f, a.inRevolutions);
-
- // Test values outside range (positive)
- a = AngleFloat.Revolutions(1.0f);
- Assert.AreEqual(0.0f, a.inRevolutions);
-
- a = AngleFloat.Revolutions(1.25f);
- Assert.AreEqual(0.25f, a.inRevolutions);
-
- a = AngleFloat.Revolutions(1.75f);
- Assert.AreEqual(-0.25f, a.inRevolutions);
-
- // Test values outside range (negative)
- a = AngleFloat.Revolutions(-1.0f);
- Assert.AreEqual(0.0f, a.inRevolutions);
-
- a = AngleFloat.Revolutions(-1.25f);
- Assert.AreEqual(-0.25f, a.inRevolutions);
-
- a = AngleFloat.Revolutions(-1.75f);
- Assert.AreEqual(0.25f, a.inRevolutions);
-
- // Test infinity
- a = AngleFloat.Revolutions(float.PositiveInfinity);
- Assert.AreEqual(float.PositiveInfinity, a.inRevolutions);
-
- a = AngleFloat.Revolutions(float.NegativeInfinity);
- Assert.AreEqual(float.NegativeInfinity, a.inRevolutions);
- }
-
- [Test]
- public void Equality() {
- // Test equality operator
- Assert.IsTrue(AngleFloat.Degrees(90) == AngleFloat.Degrees(90), "90 == 90");
- Assert.IsFalse(AngleFloat.Degrees(90) == AngleFloat.Degrees(45), "90 == 45");
- Assert.IsTrue(AngleFloat.Degrees(0) == AngleFloat.Degrees(0), "0 == 0");
- Assert.IsTrue(AngleFloat.Degrees(-180) == AngleFloat.Degrees(-180), "-180 == -180");
-
- // Test inequality operator
- Assert.IsTrue(AngleFloat.Degrees(90) != AngleFloat.Degrees(45), "90 != 45");
- Assert.IsFalse(AngleFloat.Degrees(90) != AngleFloat.Degrees(90), "90 != 90");
- Assert.IsTrue(AngleFloat.Degrees(0) != AngleFloat.Degrees(1), "0 != 1");
-
- // Test greater than operator
- Assert.IsTrue(AngleFloat.Degrees(90) > AngleFloat.Degrees(45), "90 > 45");
- Assert.IsFalse(AngleFloat.Degrees(45) > AngleFloat.Degrees(90), "45 > 90");
- Assert.IsFalse(AngleFloat.Degrees(90) > AngleFloat.Degrees(90), "90 > 90");
-
- // Test greater than or equal operator
- Assert.IsTrue(AngleFloat.Degrees(90) >= AngleFloat.Degrees(45), "90 >= 45");
- Assert.IsTrue(AngleFloat.Degrees(90) >= AngleFloat.Degrees(90), "90 >= 90");
- Assert.IsFalse(AngleFloat.Degrees(45) >= AngleFloat.Degrees(90), "45 >= 90");
-
- // Test less than operator
- Assert.IsTrue(AngleFloat.Degrees(45) < AngleFloat.Degrees(90), "45 < 90");
- Assert.IsFalse(AngleFloat.Degrees(90) < AngleFloat.Degrees(45), "90 < 45");
- Assert.IsFalse(AngleFloat.Degrees(90) < AngleFloat.Degrees(90), "90 < 90");
-
- // Test less than or equal operator
- Assert.IsTrue(AngleFloat.Degrees(45) <= AngleFloat.Degrees(90), "45 <= 90");
- Assert.IsTrue(AngleFloat.Degrees(90) <= AngleFloat.Degrees(90), "90 <= 90");
- Assert.IsFalse(AngleFloat.Degrees(90) <= AngleFloat.Degrees(45), "90 <= 45");
- }
-
- // [Test]
- // public void Normalize() {
- // float r = 0;
-
- // r = Angle.Normalize(90);
- // Assert.AreEqual(r, 90, "Normalize 90");
-
- // r = Angle.Normalize(-90);
- // Assert.AreEqual(r, -90, "Normalize -90");
-
- // r = Angle.Normalize(270);
- // Assert.AreEqual(r, -90, "Normalize 270");
-
- // r = Angle.Normalize(270 + 360);
- // Assert.AreEqual(r, -90, "Normalize 270+360");
-
- // r = Angle.Normalize(-270);
- // Assert.AreEqual(r, 90, "Normalize -270");
-
- // r = Angle.Normalize(-270 - 360);
- // Assert.AreEqual(r, 90, "Normalize -270-360");
-
- // r = Angle.Normalize(0);
- // Assert.AreEqual(r, 0, "Normalize 0");
-
- // r = Angle.Normalize(float.PositiveInfinity);
- // Assert.AreEqual(r, float.PositiveInfinity, "Normalize INFINITY");
-
- // r = Angle.Normalize(float.NegativeInfinity);
- // Assert.AreEqual(r, float.NegativeInfinity, "Normalize INFINITY");
- // }
-
- [Test]
- public void Clamp() {
- float r = 0;
-
- r = AngleFloat.Clamp(AngleFloat.Degrees(1), AngleFloat.Degrees(0), AngleFloat.Degrees(2));
- Assert.AreEqual(1, r, "Clamp 1 0 2");
-
- r = AngleFloat.Clamp(AngleFloat.Degrees(-1), AngleFloat.Degrees(0), AngleFloat.Degrees(2));
- Assert.AreEqual(0, r, "Clamp -1 0 2");
-
- r = AngleFloat.Clamp(AngleFloat.Degrees(3), AngleFloat.Degrees(0), AngleFloat.Degrees(2));
- Assert.AreEqual(2, r, "Clamp 3 0 2");
-
- r = AngleFloat.Clamp(AngleFloat.Degrees(1), AngleFloat.Degrees(0), AngleFloat.Degrees(0));
- Assert.AreEqual(0, r, "Clamp 1 0 0");
-
- r = AngleFloat.Clamp(AngleFloat.Degrees(0), AngleFloat.Degrees(0), AngleFloat.Degrees(0));
- Assert.AreEqual(0, r, "Clamp 0 0 0");
-
- r = AngleFloat.Clamp(AngleFloat.Degrees(0), AngleFloat.Degrees(1), AngleFloat.Degrees(-1));
- Assert.AreEqual(1, r, "Clamp 0 1 -1");
-
- r = AngleFloat.Clamp(AngleFloat.Degrees(1), AngleFloat.Degrees(0), AngleFloat.Degrees(float.PositiveInfinity));
- Assert.AreEqual(1, r, "Clamp 1 0 INFINITY");
-
- r = AngleFloat.Clamp(AngleFloat.Degrees(1), AngleFloat.Degrees(float.NegativeInfinity), AngleFloat.Degrees(1));
- Assert.AreEqual(1, r, "Clamp 1 -INFINITY 1");
- }
-
- [Test]
- public void Cos() {
- // Test zero
- Assert.AreEqual(1.0f, AngleFloat.Cos(AngleFloat.Degrees(0)), 1.0E-05F, "Cos(0°)");
-
- // Test 90 degrees
- Assert.AreEqual(0.0f, AngleFloat.Cos(AngleFloat.Degrees(90)), 1.0E-05F, "Cos(90°)");
-
- // Test 180 degrees
- Assert.AreEqual(-1.0f, AngleFloat.Cos(AngleFloat.Degrees(180)), 1.0E-05F, "Cos(180°)");
-
- // Test 270 degrees
- Assert.AreEqual(0.0f, AngleFloat.Cos(AngleFloat.Degrees(270)), 1.0E-05F, "Cos(270°)");
-
- // Test 45 degrees
- Assert.AreEqual(MathF.Sqrt(2) / 2, AngleFloat.Cos(AngleFloat.Degrees(45)), 1.0E-05F, "Cos(45°)");
-
- // Test negative angle
- Assert.AreEqual(1.0f, AngleFloat.Cos(AngleFloat.Degrees(-360)), 1.0E-05F, "Cos(-360°)");
-
- // Test using radians
- Assert.AreEqual(1.0f, AngleFloat.Cos(AngleFloat.Radians(0)), 1.0E-05F, "Cos(0 rad)");
- Assert.AreEqual(0.0f, AngleFloat.Cos(AngleFloat.Radians((float)Math.PI / 2)), 1.0E-05F, "Cos(Ï€/2)");
- Assert.AreEqual(-1.0f, AngleFloat.Cos(AngleFloat.Radians((float)Math.PI)), 1.0E-05F, "Cos(Ï€)");
- }
-
- [Test]
- public void Sin() {
- // Test zero
- Assert.AreEqual(0.0f, AngleFloat.Sin(AngleFloat.Degrees(0)), 1.0E-05F, "Sin(0°)");
-
- // Test 90 degrees
- Assert.AreEqual(1.0f, AngleFloat.Sin(AngleFloat.Degrees(90)), 1.0E-05F, "Sin(90°)");
-
- // Test 180 degrees
- Assert.AreEqual(0.0f, AngleFloat.Sin(AngleFloat.Degrees(180)), 1.0E-05F, "Sin(180°)");
-
- // Test 270 degrees
- Assert.AreEqual(-1.0f, AngleFloat.Sin(AngleFloat.Degrees(270)), 1.0E-05F, "Sin(270°)");
-
- // Test 45 degrees
- Assert.AreEqual(MathF.Sqrt(2) / 2, AngleFloat.Sin(AngleFloat.Degrees(45)), 1.0E-05F, "Sin(45°)");
-
- // Test negative angle
- Assert.AreEqual(0.0f, AngleFloat.Sin(AngleFloat.Degrees(-360)), 1.0E-05F, "Sin(-360°)");
-
- // Test using radians
- Assert.AreEqual(0.0f, AngleFloat.Sin(AngleFloat.Radians(0)), 1.0E-05F, "Sin(0 rad)");
- Assert.AreEqual(1.0f, AngleFloat.Sin(AngleFloat.Radians((float)Math.PI / 2)), 1.0E-05F, "Sin(Ï€/2)");
- Assert.AreEqual(0.0f, AngleFloat.Sin(AngleFloat.Radians((float)Math.PI)), 1.0E-05F, "Sin(Ï€)");
- }
-
- [Test]
- public void Tan() {
- // Test zero
- Assert.AreEqual(0.0f, AngleFloat.Tan(AngleFloat.Degrees(0)), 1.0E-05F, "Tan(0°)");
-
- // Test 45 degrees
- Assert.AreEqual(1.0f, AngleFloat.Tan(AngleFloat.Degrees(45)), 1.0E-05F, "Tan(45°)");
-
- // Test -45 degrees
- Assert.AreEqual(-1.0f, AngleFloat.Tan(AngleFloat.Degrees(-45)), 1.0E-05F, "Tan(-45°)");
-
- // Test using radians
- Assert.AreEqual(0.0f, AngleFloat.Tan(AngleFloat.Radians(0)), 1.0E-05F, "Tan(0 rad)");
- Assert.AreEqual(1.0f, AngleFloat.Tan(AngleFloat.Radians((float)Math.PI / 4)), 1.0E-05F, "Tan(Ï€/4)");
- }
-
- [Test]
- public void Acos() {
- // Test 1 (0 degrees)
- Assert.AreEqual(0.0f, AngleFloat.Acos(1.0f).inRadians, 1.0E-05F, "Acos(1)");
-
- // Test 0 (90 degrees or π/2 radians)
- Assert.AreEqual((float)Math.PI / 2, AngleFloat.Acos(0.0f).inRadians, 1.0E-05F, "Acos(0)");
-
- // Test -1 (-180 degrees or π radians)
- Assert.AreEqual((float)-Math.PI, AngleFloat.Acos(-1.0f).inRadians, 1.0E-05F, "Acos(-1)");
-
- // Test 0.5 (60 degrees or π/3 radians)
- Assert.AreEqual((float)Math.PI / 3, AngleFloat.Acos(0.5f).inRadians, 1.0E-05F, "Acos(0.5)");
-
- // Test sqrt(2)/2 (45 degrees or π/4 radians)
- Assert.AreEqual((float)Math.PI / 4, AngleFloat.Acos(MathF.Sqrt(2) / 2).inRadians, 1.0E-05F, "Acos(√2/2)");
- }
-
- [Test]
- public void Asin() {
- // Test 0 (0 degrees)
- Assert.AreEqual(0.0f, AngleFloat.Asin(0.0f).inRadians, 1.0E-05F, "Asin(0)");
-
- // Test 1 (90 degrees or π/2 radians)
- Assert.AreEqual((float)Math.PI / 2, AngleFloat.Asin(1.0f).inRadians, 1.0E-05F, "Asin(1)");
-
- // Test -1 (-90 degrees or -Ï€/2 radians)
- Assert.AreEqual(-(float)Math.PI / 2, AngleFloat.Asin(-1.0f).inRadians, 1.0E-05F, "Asin(-1)");
-
- // Test 0.5 (30 degrees or π/6 radians)
- Assert.AreEqual((float)Math.PI / 6, AngleFloat.Asin(0.5f).inRadians, 1.0E-05F, "Asin(0.5)");
-
- // Test sqrt(2)/2 (45 degrees or π/4 radians)
- Assert.AreEqual((float)Math.PI / 4, AngleFloat.Asin(MathF.Sqrt(2) / 2).inRadians, 1.0E-05F, "Asin(√2/2)");
- }
-
-
- [Test]
- public void Atan() {
- // Test zero
- Assert.AreEqual(0.0f, AngleFloat.Atan(0.0f).inRadians, 1.0E-05F, "Atan(0)");
-
- // Test 1 (45 degrees or π/4 radians)
- Assert.AreEqual((float)Math.PI / 4, AngleFloat.Atan(1.0f).inRadians, 1.0E-05F, "Atan(1)");
-
- // Test -1 (-45 degrees or -Ï€/4 radians)
- Assert.AreEqual(-(float)Math.PI / 4, AngleFloat.Atan(-1.0f).inRadians, 1.0E-05F, "Atan(-1)");
-
- // Test sqrt(3) (60 degrees or π/3 radians)
- Assert.AreEqual((float)Math.PI / 3, AngleFloat.Atan(MathF.Sqrt(3)).inRadians, 1.0E-05F, "Atan(√3)");
-
- // Test 1/sqrt(3) (30 degrees or π/6 radians)
- Assert.AreEqual((float)Math.PI / 6, AngleFloat.Atan(1.0f / MathF.Sqrt(3)).inRadians, 1.0E-05F, "Atan(1/√3)");
-
- // Test positive infinity
- Assert.AreEqual((float)Math.PI / 2, AngleFloat.Atan(float.PositiveInfinity).inRadians, 1.0E-05F, "Atan(+∞)");
-
- // Test negative infinity
- Assert.AreEqual(-(float)Math.PI / 2, AngleFloat.Atan(float.NegativeInfinity).inRadians, 1.0E-05F, "Atan(-∞)");
- }
-
- [Test]
- public void Atan2() {
- // Test basic quadrant I
- Assert.AreEqual((float)Math.PI / 4, AngleFloat.Atan2(1.0f, 1.0f).inRadians, 1.0E-05F, "Atan2(1, 1)");
-
- // Test quadrant II
- Assert.AreEqual(3 * (float)Math.PI / 4, AngleFloat.Atan2(1.0f, -1.0f).inRadians, 1.0E-05F, "Atan2(1, -1)");
-
- // Test quadrant III
- Assert.AreEqual(-(float)Math.PI * 0.75f, AngleFloat.Atan2(-1.0f, -1.0f).inRadians, 1.0E-05F, "Atan2(-1, -1)");
-
- // Test quadrant IV
- Assert.AreEqual(-(float)Math.PI / 4, AngleFloat.Atan2(-1.0f, 1.0f).inRadians, 1.0E-05F, "Atan2(-1, 1)");
-
- // Test positive x-axis
- Assert.AreEqual(0.0f, AngleFloat.Atan2(0.0f, 1.0f).inRadians, 1.0E-05F, "Atan2(0, 1)");
-
- // Test positive y-axis
- Assert.AreEqual((float)Math.PI / 2, AngleFloat.Atan2(1.0f, 0.0f).inRadians, 1.0E-05F, "Atan2(1, 0)");
-
- // Test negative y-axis
- Assert.AreEqual(-(float)Math.PI / 2, AngleFloat.Atan2(-1.0f, 0.0f).inRadians, 1.0E-05F, "Atan2(-1, 0)");
-
- // Test origin
- Assert.AreEqual(0.0f, AngleFloat.Atan2(0.0f, 0.0f).inRadians, 1.0E-05F, "Atan2(0, 0)");
-
- // Test with different magnitudes
- Assert.AreEqual((float)Math.PI / 3, AngleFloat.Atan2(MathF.Sqrt(3), 1.0f).inRadians, 1.0E-05F, "Atan2(√3, 1)");
-
- // Test negative x-axis
- Assert.AreEqual((float)-Math.PI, AngleFloat.Atan2(0.0f, -1.0f).inRadians, 1.0E-05F, "Atan2(0, -1)");
- }
-
- [Test]
- public void Multiplication() {
- AngleFloat r = AngleFloat.zero;
-
- // Angle * float
- r = AngleFloat.Degrees(90) * 2;
- Assert.AreEqual(-180, r.inDegrees, "Multiply 90 * 2");
-
- r = AngleFloat.Degrees(45) * 0.5f;
- Assert.AreEqual(22.5f, r.inDegrees, "Multiply 45 * 0.5");
-
- r = AngleFloat.Degrees(90) * 0;
- Assert.AreEqual(0, r.inDegrees, "Multiply 90 * 0");
-
- r = AngleFloat.Degrees(-90) * 2;
- Assert.AreEqual(-180, r.inDegrees, "Multiply -90 * 2");
-
- r = AngleFloat.Degrees(270) * 2;
- Assert.AreEqual(-180, r.inDegrees, "Multiply 270 * 2 (normalized)");
-
- // float * Angle
- r = 2 * AngleFloat.Degrees(90);
- Assert.AreEqual(-180, r.inDegrees, "Multiply 2 * 90");
-
- r = 0.5f * AngleFloat.Degrees(45);
- Assert.AreEqual(22.5, r.inDegrees, "Multiply 0.5 * 45");
-
- r = 0 * AngleFloat.Degrees(90);
- Assert.AreEqual(0, r.inDegrees, "Multiply 0 * 90");
-
- r = 2 * AngleFloat.Degrees(-90);
- Assert.AreEqual(-180, r.inDegrees, "Multiply 2 * -90");
-
- // Negative factor
- r = AngleFloat.Degrees(90) * -1;
- Assert.AreEqual(-90, r.inDegrees, "Multiply 90 * -1");
-
- r = -1 * AngleFloat.Degrees(90);
- Assert.AreEqual(-90, r.inDegrees, "Multiply -1 * 90");
- }
-
- [Test]
- public void MoveTowards() {
- AngleFloat r = AngleFloat.zero;
-
- r = AngleFloat.MoveTowards(AngleFloat.Degrees(0), AngleFloat.Degrees(90), 30);
- Assert.AreEqual(30, r.inDegrees, "MoveTowards 0 90 30");
-
- r = AngleFloat.MoveTowards(AngleFloat.Degrees(0), AngleFloat.Degrees(90), 90);
- Assert.AreEqual(90, r.inDegrees, "MoveTowards 0 90 90");
-
- r = AngleFloat.MoveTowards(AngleFloat.Degrees(0), AngleFloat.Degrees(90), 180);
- Assert.AreEqual(90, r.inDegrees, "MoveTowards 0 90 180");
-
- r = AngleFloat.MoveTowards(AngleFloat.Degrees(0), AngleFloat.Degrees(90), 270);
- Assert.AreEqual(90, r.inDegrees, "MoveTowrads 0 90 270");
-
- r = AngleFloat.MoveTowards(AngleFloat.Degrees(0), AngleFloat.Degrees(90), -30);
- Assert.AreEqual(0, r.inDegrees, "MoveTowards 0 90 -30");
-
- r = AngleFloat.MoveTowards(AngleFloat.Degrees(0), AngleFloat.Degrees(-90), -30);
- Assert.AreEqual(0, r.inDegrees, "MoveTowards 0 -90 -30");
-
- r = AngleFloat.MoveTowards(AngleFloat.Degrees(0), AngleFloat.Degrees(-90), -90);
- Assert.AreEqual(0, r.inDegrees, "MoveTowards 0 -90 -90");
-
- r = AngleFloat.MoveTowards(AngleFloat.Degrees(0), AngleFloat.Degrees(-90), -180);
- Assert.AreEqual(0, r.inDegrees, "MoveTowards 0 -90 -180");
-
- r = AngleFloat.MoveTowards(AngleFloat.Degrees(0), AngleFloat.Degrees(-90), -270);
- Assert.AreEqual(0, r.inDegrees, "MoveTowrads 0 -90 -270");
-
- r = AngleFloat.MoveTowards(AngleFloat.Degrees(0), AngleFloat.Degrees(90), 0);
- Assert.AreEqual(0, r.inDegrees, "MoveTowards 0 90 0");
-
- r = AngleFloat.MoveTowards(AngleFloat.Degrees(0), AngleFloat.Degrees(0), 0);
- Assert.AreEqual(0, r.inDegrees, "MoveTowards 0 0 0");
-
- r = AngleFloat.MoveTowards(AngleFloat.Degrees(0), AngleFloat.Degrees(0), 30);
- Assert.AreEqual(0, r.inDegrees, "MoveTowrads 0 0 30");
-
- r = AngleFloat.MoveTowards(AngleFloat.Degrees(0), AngleFloat.Degrees(90), float.PositiveInfinity);
- Assert.AreEqual(90, r.inDegrees, "MoveTowards 0 90 INFINITY");
-
- r = AngleFloat.MoveTowards(AngleFloat.Degrees(0), AngleFloat.Degrees(float.PositiveInfinity), 30);
- Assert.AreEqual(30, r.inDegrees, "MoveTowrads 0 INFINITY 30");
-
- r = AngleFloat.MoveTowards(AngleFloat.Degrees(0), AngleFloat.Degrees(-90), float.NegativeInfinity);
- Assert.AreEqual(0, r.inDegrees, "MoveTowards 0 -90 -INFINITY");
-
- r = AngleFloat.MoveTowards(AngleFloat.Degrees(0), AngleFloat.Degrees(float.NegativeInfinity), -30);
- Assert.AreEqual(0, r.inDegrees, "MoveTowrads 0 -INFINITY -30");
-
- }
-
- [Test]
- public void Difference() {
- float r = 0;
-
- r = Angles.Difference(0, 90);
- Assert.AreEqual(90, r, "Difference 0 90");
-
- r = Angles.Difference(0, -90);
- Assert.AreEqual(-90, r, "Difference 0 -90");
-
- r = Angles.Difference(0, 270);
- Assert.AreEqual(-90, r, "Difference 0 270");
-
- r = Angles.Difference(0, -270);
- Assert.AreEqual(90, r, "Difference 0 -270");
-
- r = Angles.Difference(90, 0);
- Assert.AreEqual(-90, r, "Difference 90 0");
-
- r = Angles.Difference(-90, 0);
- Assert.AreEqual(90, r, "Difference -90 0");
-
- r = Angles.Difference(0, 0);
- Assert.AreEqual(0, r, "Difference 0 0");
-
- r = Angles.Difference(90, 90);
- Assert.AreEqual(0, r, "Difference 90 90");
-
- r = Angles.Difference(0, float.PositiveInfinity);
- Assert.AreEqual(float.PositiveInfinity, r, "Difference 0 INFINITY");
-
- r = Angles.Difference(0, float.NegativeInfinity);
- Assert.AreEqual(float.NegativeInfinity, r, "Difference 0 -INFINITY");
-
- r = Angles.Difference(float.NegativeInfinity, float.PositiveInfinity);
- Assert.AreEqual(float.PositiveInfinity, r, "Difference -INFINITY INFINITY");
- }
- }
-
-}
-#endif
diff --git a/Runtime/LinearAlgebra/test/DirectionTest.cs b/Runtime/LinearAlgebra/test/DirectionTest.cs
deleted file mode 100644
index 0eb9882..0000000
--- a/Runtime/LinearAlgebra/test/DirectionTest.cs
+++ /dev/null
@@ -1,226 +0,0 @@
-#if !UNITY_5_6_OR_NEWER
-using System;
-using NUnit.Framework;
-
-namespace LinearAlgebra.Test {
- public class DirectionTest {
-
- [Test]
- public void RadiansForward() {
- Direction d = Direction.Radians(0, 0);
- Assert.AreEqual(0, d.horizontal.inDegrees, 0.0001f);
- Assert.AreEqual(0, d.vertical.inDegrees, 0.0001f);
- }
-
- [Test]
- public void RadiansUp() {
- Direction d = Direction.Radians(0, (float)Math.PI / 2);
- Assert.AreEqual(0, d.horizontal.inDegrees, 0.0001f);
- Assert.AreEqual(90, d.vertical.inDegrees, 0.0001f);
- }
-
- [Test]
- public void RadiansDown() {
- Direction d = Direction.Radians(0, -(float)Math.PI / 2);
- Assert.AreEqual(0, d.horizontal.inDegrees, 0.0001f);
- Assert.AreEqual(-90, d.vertical.inDegrees, 0.0001f);
- }
-
- [Test]
- public void RadiansArbitrary() {
- Direction d = Direction.Radians((float)Math.PI / 4, (float)Math.PI / 6);
- Assert.AreEqual(45, d.horizontal.inDegrees, 0.0001f);
- Assert.AreEqual(30, d.vertical.inDegrees, 0.0001f);
- }
-
- [Test]
- public void DegreesNormalize1() {
- Direction d = Direction.Degrees(112, 91);
- Assert.AreEqual(-68, d.horizontal.inDegrees, 0.0001f);
- Assert.AreEqual(89, d.vertical.inDegrees, 0.0001f);
- }
-
- [Test]
- public void RadiansEquivalentToDegreesConversion() {
- Direction d1 = Direction.Radians((float)Math.PI / 3, (float)Math.PI / 4);
- Direction d2 = Direction.Degrees(60, 45);
- Assert.AreEqual(d1.horizontal.inDegrees, d2.horizontal.inDegrees, 0.0001f);
- Assert.AreEqual(d1.vertical.inDegrees, d2.vertical.inDegrees, 0.0001f);
- }
-
- [Test]
- public void ToVector3Forward() {
- Direction d = Direction.forward;
- Vector3Float v = d.ToVector3();
- Assert.AreEqual(0, v.horizontal, 0.0001f);
- Assert.AreEqual(0, v.vertical, 0.0001f);
- Assert.AreEqual(1, v.depth, 0.0001f);
- }
-
- [Test]
- public void ToVector3Up() {
- Direction d = Direction.up;
- Vector3Float v = d.ToVector3();
- Assert.AreEqual(0, v.horizontal, 0.0001f);
- Assert.AreEqual(1, v.vertical, 0.0001f);
- Assert.AreEqual(0, v.depth, 0.0001f);
- }
-
- [Test]
- public void ToVector3Down() {
- Direction d = Direction.down;
- Vector3Float v = d.ToVector3();
- Assert.AreEqual(0, v.horizontal, 0.0001f);
- Assert.AreEqual(-1, v.vertical, 0.0001f);
- Assert.AreEqual(0, v.depth, 0.0001f);
- }
-
- [Test]
- public void ToVector3Left() {
- Direction d = Direction.left;
- Vector3Float v = d.ToVector3();
- Assert.AreEqual(-1, v.horizontal, 0.0001f);
- Assert.AreEqual(0, v.vertical, 0.0001f);
- Assert.AreEqual(0, v.depth, 0.0001f);
- }
-
- [Test]
- public void FromVector3Forward() {
- Vector3Float v = new(0, 0, 1);
- Direction d = Direction.FromVector3(v);
- Assert.AreEqual(0, d.horizontal.inDegrees, 0.0001f);
- Assert.AreEqual(0, d.vertical.inDegrees, 0.0001f);
- }
-
- [Test]
- public void ToVector3AndBack() {
- Direction d1 = Direction.Degrees(45, 30);
- Vector3Float v = d1.ToVector3();
- Direction d2 = Direction.FromVector3(v);
- Assert.AreEqual(d1.horizontal.inDegrees, d2.horizontal.inDegrees, 0.0001f);
- Assert.AreEqual(d1.vertical.inDegrees, d2.vertical.inDegrees, 0.0001f);
- }
-
- [Test]
- public void ToVector3AndBack2() {
- Direction d1 = Direction.Degrees(-135, 85);
- Vector3Float v = d1.ToVector3();
- Direction d2 = Direction.FromVector3(v);
- Assert.AreEqual(d1.horizontal.inDegrees, d2.horizontal.inDegrees, 0.0001f);
- Assert.AreEqual(d1.vertical.inDegrees, d2.vertical.inDegrees, 0.0001f);
- }
-
- [Test]
- public void Compare() {
- Direction d1 = Direction.Degrees(45, 135);
- Direction d2 = new(AngleFloat.Degrees(45), AngleFloat.Degrees(135));
- bool r;
- r = d1 == d2;
- Assert.True(r);
- Assert.AreEqual(d1, d2);
- }
-
- [Test]
- public void NotEqualWithDifferentHorizontal() {
- Direction d1 = Direction.Degrees(45, 30);
- Direction d2 = Direction.Degrees(90, 30);
- Assert.True(d1 != d2);
- }
-
- [Test]
- public void NotEqualWithDifferentVertical() {
- Direction d1 = Direction.Degrees(45, 30);
- Direction d2 = Direction.Degrees(45, 60);
- Assert.True(d1 != d2);
- }
-
- [Test]
- public void NotEqualWithDifferentBoth() {
- Direction d1 = Direction.Degrees(45, 30);
- Direction d2 = Direction.Degrees(90, 60);
- Assert.True(d1 != d2);
- }
-
- [Test]
- public void NotEqualWithSameValues() {
- Direction d1 = Direction.Degrees(45, 30);
- Direction d2 = Direction.Degrees(45, 30);
- Assert.False(d1 != d2);
- }
-
-
- [Test]
- public void EqualsWithSameValues() {
- Direction d1 = Direction.Degrees(45, 30);
- Direction d2 = Direction.Degrees(45, 30);
- Assert.True(d1.Equals(d2));
- }
-
- [Test]
- public void EqualsWithDifferentHorizontal() {
- Direction d1 = Direction.Degrees(45, 30);
- Direction d2 = Direction.Degrees(90, 30);
- Assert.False(d1.Equals(d2));
- }
-
- [Test]
- public void EqualsWithDifferentVertical() {
- Direction d1 = Direction.Degrees(45, 30);
- Direction d2 = Direction.Degrees(45, 60);
- Assert.False(d1.Equals(d2));
- }
-
- [Test]
- public void EqualsWithDifferentBoth() {
- Direction d1 = Direction.Degrees(45, 30);
- Direction d2 = Direction.Degrees(90, 60);
- Assert.False(d1.Equals(d2));
- }
-
- [Test]
- public void EqualsWithNonDirectionObject() {
- Direction d = Direction.Degrees(45, 30);
- Assert.False(d.Equals("not a direction"));
- }
-
- [Test]
- public void EqualsWithNull() {
- Direction d = Direction.Degrees(45, 30);
- Assert.False(d.Equals(null));
- }
-
- [Test]
- public void EqualsWithZeros() {
- Direction d1 = Direction.forward;
- Direction d2 = Direction.Degrees(0, 0);
- Assert.True(d1.Equals(d2));
- }
-
- [Test]
- public void HashCode() {
- Direction d1 = Direction.Degrees(45, 30);
- Direction d2 = Direction.Degrees(45, 30);
- Assert.AreEqual(d1.GetHashCode(), d2.GetHashCode());
-
- d1 = Direction.Degrees(45, 30);
- d2 = Direction.Degrees(90, 30);
- Assert.AreNotEqual(d1.GetHashCode(), d2.GetHashCode());
-
- d1 = Direction.Degrees(45, 30);
- d2 = Direction.Degrees(45, 60);
- Assert.AreNotEqual(d1.GetHashCode(), d2.GetHashCode());
-
- Direction d = Direction.Degrees(45, 30);
- int hash1 = d.GetHashCode();
- int hash2 = d.GetHashCode();
- Assert.AreEqual(hash1, hash2);
-
- d1 = Direction.forward;
- d2 = Direction.Degrees(0, 0);
- Assert.AreEqual(d1.GetHashCode(), d2.GetHashCode());
- }
-
- };
-}
-#endif
-
diff --git a/Runtime/LinearAlgebra/test/LinearAlgebra_Test.csproj b/Runtime/LinearAlgebra/test/LinearAlgebra_Test.csproj
deleted file mode 100644
index 5b48e60..0000000
--- a/Runtime/LinearAlgebra/test/LinearAlgebra_Test.csproj
+++ /dev/null
@@ -1,19 +0,0 @@
-
-
-
- net8.0
- false
- true
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/Runtime/LinearAlgebra/test/QuaternionTest.cs b/Runtime/LinearAlgebra/test/QuaternionTest.cs
deleted file mode 100644
index 9dd5a96..0000000
--- a/Runtime/LinearAlgebra/test/QuaternionTest.cs
+++ /dev/null
@@ -1,185 +0,0 @@
-#if !UNITY_5_6_OR_NEWER
-using NUnit.Framework;
-
-namespace LinearAlgebra.Test {
-
- public class QuaternionTest {
-
- [SetUp]
- public void Setup() {
- }
-
- [Test]
- public void Normalize() {
- Quaternion q1 = new(0, 0, 0, 1);
- Quaternion r = Quaternion.identity;
-
- r = q1.normalized;
- Assert.AreEqual(r, q1, "q.normalized 0 0 0 1");
-
- r = Quaternion.Normalize(q1);
- Assert.AreEqual(r, q1, "q.normalized 0 0 0 1");
- }
-
- [Test]
- public void ToAngles() {
- Quaternion q1 = new(0, 0, 0, 1);
- Vector3Float v = Vector3Float.zero;
-
- v = Quaternion.ToAngles(q1);
- Assert.AreEqual(v, new Vector3Float(0, 0, 0), "ToAngles 0 0 0 1");
-
- q1 = new(1, 0, 0, 0);
- v = Quaternion.ToAngles(q1);
- Assert.AreEqual(0, v.horizontal, "1 0 0 0 H");
- Assert.AreEqual(180, v.vertical, "1 0 0 0 V");
- Assert.AreEqual(180, v.depth, "1 0 0 0 D");
-
- }
-
- [Test]
- public void Multiplication() {
- Quaternion q1 = new(0, 0, 0, 1);
- Quaternion q2 = new(1, 0, 0, 0);
- Quaternion r;
-
- r = q1 * q2;
- Assert.AreEqual(r, new Quaternion(1, 0, 0, 0), "0 0 0 1 * 1 0 0 0 ");
- }
-
- [Test]
- public void MultiplicationVector() {
- Quaternion q1 = new(0, 0, 0, 1);
- Vector3Float v1 = new(0, 1, 0);
- Vector3Float r;
-
- r = q1 * v1;
- Assert.AreEqual(r, new Vector3Float(0, 1, 0), "0 0 0 1 * Vector 0 1 0");
-
- q1 = new(1, 0, 0, 0);
- r = q1 * v1;
- Assert.AreEqual(r, new Vector3Float(0, -1, 0), "1 0 0 0 * Vector 0 1 0");
- }
-
- [Test]
- public void Equality() {
- Quaternion q1 = new(0, 0, 0, 1);
- Quaternion q2 = new(1, 0, 0, 0);
- Assert.AreNotEqual(q1, q2, "0 0 0 1 == 1 0 0 0");
-
- q2 = new(0, 0, 0, 1);
- Assert.AreEqual(q1, q2, "0 0 0 1 == 1 0 0 0");
- }
-
- [Test, Ignore("ToDo")]
- public void Inverse() { }
-
- [Test, Ignore("ToDo")]
- public void LookRotation() { }
-
- [Test, Ignore("ToDo")]
- public void FromToRotation() { }
-
- [Test, Ignore("ToDo")]
- public void RotateTowards() { }
-
- [Test, Ignore("ToDo")]
- public void AngleAxis() { }
-
- [Test, Ignore("ToDo")]
- public void Angle() { }
-
- [Test, Ignore("ToDo")]
- public void Slerp() { }
-
- [Test, Ignore("ToDo")]
- public void SlerpUnclamped() { }
-
- [Test]
- public void Euler() {
- Vector3Float v1 = new(0, 0, 0);
- Quaternion q;
-
- q = Quaternion.Euler(v1);
- Assert.AreEqual(q, Quaternion.identity, "Euler Vector 0 0 0");
-
- q = Quaternion.Euler(0, 0, 0);
- Assert.AreEqual(q, Quaternion.identity, "Euler 0 0 0");
-
- v1 = new(90, 90, -90);
- q = Quaternion.Euler(v1);
- Assert.AreEqual(q, new Quaternion(0, 0.707106709F, -0.707106709F, 0), "Euler Vector 90 90 -90");
-
- q = Quaternion.Euler(90, 90, -90);
- Assert.AreEqual(q, new Quaternion(0, 0.707106709F, -0.707106709F, 0), "Euler 90 90 -90");
- }
-
- [Test]
- public void EulerToAngles() {
- Vector3Float v;
- Quaternion q;
- Quaternion r;
-
- //v = new(0, 0, 0);
- q = Quaternion.Euler(0, 0 , 0);
- v = Quaternion.ToAngles(q);
- r = Quaternion.Euler(v);
- Assert.AreEqual(0, Quaternion.UnsignedAngle(q, r), 10e-2f, "0 0 0");
-
- q = Quaternion.Euler(-45, -30, -15);
- v = Quaternion.ToAngles(q);
- r = Quaternion.Euler(v);
- Assert.AreEqual(0, Quaternion.UnsignedAngle(q, r), 10e-2f, "-45, -30, -15");
-
- // Gimball lock
- // q = Quaternion.Euler(90, 90, -90);
- // v = Quaternion.ToAngles(q);
- // r = Quaternion.Euler(v);
- // Assert.AreEqual(0, Quaternion.UnsignedAngle(q, r), 10e-2f, "0 0 0");
-
- }
-
- [Test]
- public void GetAngleAround() {
- Vector3Float v1 = new(0, 1, 0);
- Quaternion q1 = new(0, 0, 0, 1);
-
- float f = Quaternion.GetAngleAround(v1, q1);
- Assert.AreEqual(f, 0, "GetAngleAround 0 1 0 , 0 0 0 1");
-
- q1 = new(0, 0.707106709F, -0.707106709F, 0);
- f = Quaternion.GetAngleAround(v1, q1);
- Assert.AreEqual(f, 180, "GetAngleAround 0 1 0 , 0 0.7 -0.7 0");
-
- v1 = new(0, 0, 0);
- f = Quaternion.GetAngleAround(v1, q1);
- Assert.IsTrue(float.IsNaN(f), "GetAngleAround 0 0 0 , 0 0.7 -0.7 0");
- }
-
- [Test]
- public void GetRotationAround() {
- Vector3Float v1 = new(0, 1, 0);
- Quaternion q1 = new(0, 0, 0, 1);
-
- Quaternion q = Quaternion.GetRotationAround(v1, q1);
- Assert.AreEqual(q, new Quaternion(0, 0, 0, 1), "GetRotationAround 0 1 0 , 0 0 0 1");
-
- q1 = new(0, 0.707106709F, -0.707106709F, 0);
- q = Quaternion.GetRotationAround(v1, q1);
- Assert.AreEqual(q, new Quaternion(0, 1, 0, 0), "GetRotationAround 0 1 0 , 0 0.7 -0.7 0");
-
- v1 = new(0, 0, 0);
- q = Quaternion.GetRotationAround(v1, q1);
- bool r = float.IsNaN(q.x) && float.IsNaN(q.y) && float.IsNaN(q.z) && float.IsNaN(q.w);
- Assert.IsTrue(r, "GetRotationAround 0 0 0 , 0 0.7 -0.7 0");
- }
-
- [Test, Ignore("ToDo")]
- public void GetSwingTwist() { }
-
- [Test, Ignore("ToDo")]
- public void Dot() { }
-
- }
-}
-#endif
\ No newline at end of file
diff --git a/Runtime/LinearAlgebra/test/SphericalTest.cs b/Runtime/LinearAlgebra/test/SphericalTest.cs
deleted file mode 100644
index b28b9d9..0000000
--- a/Runtime/LinearAlgebra/test/SphericalTest.cs
+++ /dev/null
@@ -1,271 +0,0 @@
-//#if !UNITY_5_6_OR_NEWER
-using System;
-using System.Collections.Generic;
-using NUnit.Framework;
-
-namespace LinearAlgebra.Test {
- public class SphericalTest {
- [SetUp]
- public void Setup() {
- }
-
- [Test]
- public void FromVector3() {
-#if UNITY_5_6_OR_NEWER
- UnityEngine.Vector3 v = new(0, 0, 1);
-#else
- Vector3Float v = new(0, 0, 1);
-#endif
- Spherical s = Spherical.FromVector3(v);
- Assert.AreEqual(1.0f, s.distance, "s.distance 0 0 1");
- Assert.AreEqual(0.0f, s.direction.horizontal.inDegrees, "s.hor 0 0 1");
- Assert.AreEqual(0.0f, s.direction.vertical.inDegrees, 1.0E-05F, "s.vert 0 0 1");
-
- v = new(0, 1, 0);
- s = Spherical.FromVector3(v);
- Assert.AreEqual(1.0f, s.distance, "s.distance 0 1 0");
- Assert.AreEqual(0.0f, s.direction.horizontal.inDegrees, "s.hor 0 1 0");
- Assert.AreEqual(90.0f, s.direction.vertical.inDegrees, "s.vert 0 1 0");
-
- v = new(1, 0, 0);
- s = Spherical.FromVector3(v);
- Assert.AreEqual(1.0f, s.distance, "s.distance 1 0 0");
- Assert.AreEqual(90.0f, s.direction.horizontal.inDegrees, "s.hor 1 0 0");
- Assert.AreEqual(0.0f, s.direction.vertical.inDegrees, 1.0E-05F, "s.vert 1 0 0");
- }
-
- [Test]
- public void Addition() {
- Spherical v1 = Spherical.Degrees(1, 45, 0);
- Spherical v2 = Spherical.zero;
- Spherical r = Spherical.zero;
-
- r = v1 + v2;
- Assert.AreEqual(v1.distance, r.distance, 1.0E-05F, "Addition(0,0,0)");
-
- r = v1;
- r += v2;
- Assert.AreEqual(v1.distance, r.distance, 1.0E-05F, "Addition(0,0,0)");
-
- v2 = Spherical.Degrees(1, 0, 90);
- r = v1 + v2;
- Assert.AreEqual(Math.Sqrt(2), r.distance, 1.0E-05F, "Addition(1 0 90)");
- Assert.AreEqual(45.0f, r.direction.horizontal.inDegrees, 1e-5f, "Addition(1 0 90)");
- Assert.AreEqual(45.0f, r.direction.vertical.inDegrees, 1.0E-05F, "Addition(1 0 90)");
- }
-
- [Test]
- public void Average2_IdenticalVectors() {
- Direction dir = Direction.Radians(MathF.PI / 4f, MathF.PI / 6f);
- Spherical v = new(2.5f, dir);
-
- Spherical avg = Spherical.Average(v, v);
-
- Assert.AreEqual(2.5f, avg.distance, 1e-5f);
- Assert.AreEqual(dir.horizontal, avg.direction.horizontal);
- Assert.AreEqual(dir.vertical, avg.direction.vertical);
- }
-
- [Test]
- public void Average2_OppositeUnitVectors() {
- // Two opposite vectors: same distance, horizontal opposite (pi apart), same vertical
- Spherical v1 = Spherical.Radians(1f, 0f, 0f);
- Spherical v2 = Spherical.Radians(1f, MathF.PI, 0f);
- Spherical avg = Spherical.Average(v1, v2);
-
- Assert.AreEqual(0f, avg.distance, 1e-4f);
- // When distance is zero, angles may be undefined; allow any angle but ensure near-zero magnitude
- }
-
- [Test]
- public void Average2_WeightedByDistance() {
- // Two vectors same direction but different distances -> weighted average distance
- Direction dir = Direction.Radians(MathF.PI / 3f, MathF.PI / 4f);
- Spherical a = new(1f, dir);
- Spherical b = new(3f, dir);
- Spherical avg = Spherical.Average(a, b);
-
- // average distance should be (1+3)/2 = 2
- Assert.AreEqual(2f, avg.distance, 1e-5f);
- Assert.AreEqual(dir.horizontal.inRadians, avg.direction.horizontal.inRadians, 1e-5f);
- Assert.AreEqual(dir.vertical.inRadians, avg.direction.vertical.inRadians, 1e-5f);
- }
-
- [Test]
- public void Average2_OppositeButNotExact_NotZero() {
- // Nearly opposite but not exact; expect a valid averaged direction and averaged distance
- Direction d1 = Direction.Radians(0f, 0f);
- Direction d2 = Direction.Radians(MathF.PI - 1e-3f, 0.0f); // slight offset
- Spherical v1 = new(2.0f, d1);
- Spherical v2 = new(4.0f, d2);
-
- Spherical avg = Spherical.Average(v1, v2);
-
- // Distance is arithmetic mean
- Assert.AreEqual(3.0f, avg.distance, 1e-5f);
-
- // Averaged azimuth should be near +pi/2 or -pi/2? we can check it's not NaN and unit-vector properties hold
- float ux = MathF.Cos(avg.direction.horizontal.inRadians) * MathF.Cos(avg.direction.vertical.inRadians);
- float uy = MathF.Sin(avg.direction.horizontal.inRadians) * MathF.Cos(avg.direction.vertical.inRadians);
- float uz = MathF.Sin(avg.direction.vertical.inRadians);
- float mag = MathF.Sqrt(ux * ux + uy * uy + uz * uz);
- Assert.IsTrue(mag > 0.999f && mag < 1.001f);
-
- }
-
- [Test]
- public void Average2_BasicAverageDirectionAndDistance() {
- // Two different directions not cancelling: expect vector-average result
- Direction d1 = Direction.Radians(MathF.PI / 6f, MathF.PI / 12f); // 30°, 15°
- Direction d2 = Direction.Radians(MathF.PI / 3f, MathF.PI / 18f); // 60°, 10°
- Spherical v1 = new(2.0f, d1);
- Spherical v2 = new(4.0f, d2);
-
- Spherical avg = Spherical.Average(v1, v2);
-
- // Distance is arithmetic mean
- Assert.AreEqual(3.0f, avg.distance, 1e-5f);
-
- // Check averaged unit-vector equals normalized sum of unit vectors computed here
- float a1 = d1.horizontal.inRadians;
- float a2 = d2.horizontal.inRadians;
- float e1 = d1.vertical.inRadians;
- float e2 = d2.vertical.inRadians;
-
- float cx = MathF.Cos(a1) + MathF.Cos(a2);
- float cy = MathF.Sin(a1) + MathF.Sin(a2);
- float z1 = MathF.Sin(e1);
- float z2 = MathF.Sin(e2);
- float cz = z1 + z2;
- float mag = MathF.Sqrt(cx * cx + cy * cy + cz * cz);
- Assert.IsTrue(mag > 1e-6f);
-
- float ux = cx / mag;
- float uy = cy / mag;
- float uz = cz / mag;
-
- // Reconstruct direction from avg result
- float uxAvg = MathF.Cos(avg.direction.horizontal.inRadians) * MathF.Cos(avg.direction.vertical.inRadians);
- float uyAvg = MathF.Sin(avg.direction.horizontal.inRadians) * MathF.Cos(avg.direction.vertical.inRadians);
- float uzAvg = MathF.Sin(avg.direction.vertical.inRadians);
-
- Assert.AreEqual(ux, uxAvg, 1e-4f);
- Assert.AreEqual(uy, uyAvg, 1e-4f);
- Assert.AreEqual(uz, uzAvg, 1e-4f);
- }
-
- [Test]
- public void Average_IdenticalVectors() {
- var dir = Direction.Radians(MathF.PI / 4f, MathF.PI / 6f);
- var v = new Spherical(2.5f, dir);
- var list = new List { v, v, v };
-
- var avg = Spherical.Average(list);
-
- Assert.AreEqual(2.5f, avg.distance, 1e-5f);
- Assert.AreEqual(dir.horizontal, avg.direction.horizontal);
- Assert.AreEqual(dir.vertical, avg.direction.vertical);
- }
-
- [Test]
- public void Average_SingleElement() {
- Spherical s = Spherical.Radians(1.234f, 0.3f, -0.7f);
- Spherical avg = Spherical.Average(new List { s });
-
- Assert.AreEqual(s.distance, avg.distance, 1e-5f);
- Assert.AreEqual(s.direction.horizontal.inRadians, avg.direction.horizontal.inRadians, 1e-5f);
- Assert.AreEqual(s.direction.vertical.inRadians, avg.direction.vertical.inRadians, 1e-5f);
- }
-
- [Test]
- public void Average_OppositeUnitVectors() {
- // Two opposite vectors: same distance, horizontal opposite (pi apart), same vertical
- Spherical v1 = Spherical.Radians(1f, 0f, 0f);
- Spherical v2 = Spherical.Radians(1f, MathF.PI, 0f);
- Spherical avg = Spherical.Average(new List { v1, v2 });
-
- Assert.AreEqual(0f, avg.distance, 1e-4f);
- // When distance is zero, angles may be undefined; allow any angle but ensure near-zero magnitude
- }
-
- [Test]
- public void Average_WeightedByDistance() {
- // Two vectors same direction but different distances -> weighted average distance
- Direction dir = Direction.Radians(MathF.PI / 3f, MathF.PI / 4f);
- Spherical a = new(1f, dir);
- Spherical b = new(3f, dir);
- Spherical avg = Spherical.Average(new List { a, b });
-
- // average distance should be (1+3)/2 = 2
- Assert.AreEqual(2f, avg.distance, 1e-5f);
- Assert.AreEqual(dir.horizontal.inRadians, avg.direction.horizontal.inRadians, 1e-5f);
- Assert.AreEqual(dir.vertical.inRadians, avg.direction.vertical.inRadians, 1e-5f);
- }
-
- [Test]
- public void Average_AxisSymmetricAroundVertical() {
- // Four vectors around azimuth 0, pi/2, pi, 3pi/2 at same elevation (vertical) angle phi
- float phi = MathF.PI / 6f; // elevation from horizontal plane
- var dirs = new List {
- new(1f, Direction.Radians(0f, phi)),
- new(1f, Direction.Radians(MathF.PI/2, phi)),
- new(1f, Direction.Radians(MathF.PI, phi)),
- new(1f, Direction.Radians(3*MathF.PI/2, phi))
- };
-
- Spherical avg = Spherical.Average(dirs);
-
- // rAvg should equal r * sin(elevation) = sin(phi)
- Assert.AreEqual(MathF.Sin(phi), avg.distance, 1e-4f);
- // vertical angle undefined when horizontal xy components cancel; allow any angle but ensure r matches
- }
-
- [Test]
- public void Average_AxisSymmetricAroundVertical2() {
- // Four vectors around azimuth 0, pi/2, pi, 3pi/2 at same polar angle from vertical (alpha)
- float alpha = MathF.PI / 6f; // polar angle from vertical
- float elevation = MathF.PI / 2f - alpha; // convert polar-from-vertical to elevation
- var dirs = new List {
- new(1f, Direction.Radians(0f, elevation)),
- new(1f, Direction.Radians(MathF.PI/2, elevation)),
- new(1f, Direction.Radians(MathF.PI, elevation)),
- new(1f, Direction.Radians(3*MathF.PI/2, elevation))
- };
-
- Spherical avg = Spherical.Average(dirs);
-
- // rAvg should equal r * sin(elevation) which equals cos(alpha)
- Assert.AreEqual(MathF.Cos(alpha), avg.distance, 1e-4f);
- }
-
- [Test]
- public void Average_CompareWithVector3() {
- // Four vectors around azimuth 0, pi/2, pi, 3pi/2 at same polar angle from vertical (alpha)
- float alpha = MathF.PI / 6f; // polar angle from vertical
- float elevation = MathF.PI / 2f - alpha; // convert polar-from-vertical to elevation
- List dirs = new List {
- new(1f, Direction.Radians(0f, elevation)),
- new(2f, Direction.Radians(MathF.PI/2, elevation+1)),
- new(3f, Direction.Radians(MathF.PI, elevation+2)),
- new(4f, Direction.Radians(3*MathF.PI/2, elevation+3))
- };
-
- Spherical avg = Spherical.Average(dirs);
-
-#if UNITY_5_3_OR_NEWER
- UnityEngine.Vector3 r = UnityEngine.Vector3.zero;
-#else
- Vector3Float r = Vector3Float.zero;
-#endif
- foreach (Spherical dir in dirs) {
- r += dir.ToVector3();
- }
- r = r / 4;
- Spherical avg2 = Spherical.FromVector3(r);
-
- Assert.AreEqual(avg, avg2);
- }
-
- }
-}
-//#endif
\ No newline at end of file
diff --git a/Runtime/LinearAlgebra/test/SwingTwistTest.cs b/Runtime/LinearAlgebra/test/SwingTwistTest.cs
deleted file mode 100644
index 5f05a96..0000000
--- a/Runtime/LinearAlgebra/test/SwingTwistTest.cs
+++ /dev/null
@@ -1,131 +0,0 @@
-#if !UNITY_5_6_OR_NEWER
-using NUnit.Framework;
-
-namespace LinearAlgebra.Test {
-
- [TestFixture]
- public class SwingTwistTest {
-
- [Test]
- public void Degrees_CreatesSwingTwistWithDegreeAngles() {
- SwingTwist st = SwingTwist.Degrees(45, 30, 15);
- Assert.IsNotNull(st);
- Assert.AreEqual(45, st.swing.horizontal.inDegrees, 0.01f);
- Assert.AreEqual(30, st.swing.vertical.inDegrees, 0.01f);
- Assert.AreEqual(15, st.twist.inDegrees, 0.01f);
- }
-
- [Test]
- public void Radians_CreatesSwingTwistWithRadianAngles() {
- float pi = (float)System.Math.PI;
- SwingTwist st = SwingTwist.Radians(pi / 4, pi / 6, pi / 12);
- Assert.IsNotNull(st);
- Assert.AreEqual(45, st.swing.horizontal.inDegrees, 0.01f);
- Assert.AreEqual(30, st.swing.vertical.inDegrees, 0.01f);
- Assert.AreEqual(15, st.twist.inDegrees, 0.01f);
- }
-
- [Test]
- public void Zero_CreatesZeroRotation() {
- SwingTwist st = SwingTwist.zero;
- Assert.AreEqual(0, st.swing.horizontal.inDegrees, 0.01f);
- Assert.AreEqual(0, st.swing.vertical.inDegrees, 0.01f);
- Assert.AreEqual(0, st.twist.inDegrees, 0.01f);
- }
-
- [Test]
- public void QuaternionTest() {
- Quaternion q;
- SwingTwist s;
- Quaternion r;
-
- q = Quaternion.identity;
- s = SwingTwist.FromQuaternion(q);
- r = s.ToQuaternion();
- Assert.AreEqual(q, r);
-
- q = Quaternion.Euler(90, 0, 0);
- s = SwingTwist.FromQuaternion(q);
- Assert.AreEqual(0, s.swing.horizontal.inDegrees, 10e-2f);
- Assert.AreEqual(90, s.swing.vertical.inDegrees, 10e-2f);
- Assert.AreEqual(0, s.twist.inDegrees, 0.01f);
- r = s.ToQuaternion();
- Assert.AreEqual(0, Quaternion.UnsignedAngle(q, r), 10e-2f);
-
- q = Quaternion.Euler(0, 90, 0);
- s = SwingTwist.FromQuaternion(q);
- Assert.AreEqual(90, s.swing.horizontal.inDegrees,10e-2f);
- Assert.AreEqual(0, s.swing.vertical.inDegrees, 0.01f);
- Assert.AreEqual(0, s.twist.inDegrees, 0.01f);
- r = s.ToQuaternion();
- Assert.AreEqual(0, Quaternion.UnsignedAngle(q, r), 10e-2f);
-
- q = Quaternion.Euler(0, 0, 90);
- s = SwingTwist.FromQuaternion(q);
- Assert.AreEqual(0, s.swing.horizontal.inDegrees, 0.01f);
- Assert.AreEqual(0, s.swing.vertical.inDegrees, 0.01f);
- Assert.AreEqual(90, s.twist.inDegrees, 0.01f);
- r = s.ToQuaternion();
- Assert.AreEqual(0, Quaternion.UnsignedAngle(q, r), 10e-2f);
-
- q = Quaternion.Euler(0, 180, 0);
- s = SwingTwist.FromQuaternion(q);
- Assert.AreEqual(-180, s.swing.horizontal.inDegrees, 0.01f);
- Assert.AreEqual(0, s.swing.vertical.inDegrees, 0.01f);
- Assert.AreEqual(0, s.twist.inDegrees, 0.01f);
- r = s.ToQuaternion();
- Assert.AreEqual(0, Quaternion.UnsignedAngle(q, r), 10e-2f);
-
- q = Quaternion.Euler(0, 135, 0);
- s = SwingTwist.FromQuaternion(q);
- Assert.AreEqual(135, s.swing.horizontal.inDegrees, 0.01f);
- Assert.AreEqual(0, s.swing.vertical.inDegrees, 0.01f);
- Assert.AreEqual(0, s.twist.inDegrees, 0.01f);
- r = s.ToQuaternion();
- Assert.AreEqual(0, Quaternion.UnsignedAngle(q, r), 10e-2f);
-
- q = Quaternion.Euler(60, 45, 30);
- s = SwingTwist.FromQuaternion(q);
- Assert.AreEqual(45, s.swing.horizontal.inDegrees, 0.01f);
- Assert.AreEqual(60, s.swing.vertical.inDegrees, 0.01f);
- Assert.AreEqual(30, s.twist.inDegrees, 0.01f);
- // r = s.ToQuaternion();
- // Assert.AreEqual(0, Quaternion.UnsignedAngle(q, r), 10e-2f);
-
- // q = Quaternion.Euler(-45, -30, -15);
- // s = SwingTwist.FromQuaternion(q);
- // Assert.AreEqual(-30, s.swing.horizontal.inDegrees, 0.01f);
- // Assert.AreEqual(-45, s.swing.vertical.inDegrees, 0.01f);
- // Assert.AreEqual(-15, s.twist.inDegrees, 0.01f);
- // r = s.ToQuaternion();
- // Assert.AreEqual(0, Quaternion.UnsignedAngle(q, r), 10e-2f);
-
- // q = Quaternion.Euler(180, 180, 180);
- // s = SwingTwist.FromQuaternion(q);
- // Assert.AreEqual(-180, s.swing.horizontal.inDegrees, 0.01f);
- // Assert.AreEqual(-180, s.swing.vertical.inDegrees, 0.01f);
- // Assert.AreEqual(-180, s.twist.inDegrees, 0.01f);
- // r = s.ToQuaternion();
- // Assert.AreEqual(0, Quaternion.UnsignedAngle(q, r), 10e-2f);
-
- }
-
- [Test]
- public void ToAngleAxis_ConvertsToSpherical() {
- SwingTwist st = SwingTwist.Degrees(45, 30, 15);
- Spherical s = st.ToAngleAxis();
- Assert.IsNotNull(s);
- }
-
- [Test]
- public void FromAngleAxis_ConvertsFromSpherical() {
- Spherical s = new(90, Direction.Degrees(45, 0));
- SwingTwist st = SwingTwist.FromAngleAxis(s);
- Assert.IsNotNull(st);
- }
-
- }
-
-}
-
-#endif
\ No newline at end of file
diff --git a/Runtime/LinearAlgebra/test/Vector2FloatTest.cs b/Runtime/LinearAlgebra/test/Vector2FloatTest.cs
deleted file mode 100644
index 867765a..0000000
--- a/Runtime/LinearAlgebra/test/Vector2FloatTest.cs
+++ /dev/null
@@ -1,364 +0,0 @@
-#if !UNITY_5_6_OR_NEWER
-using NUnit.Framework;
-
-namespace LinearAlgebra.Test {
- using Vector2 = Vector2Float;
-
- public class Vector2FloatTest {
-
- [SetUp]
- public void Setup() {
- }
-
- [Test]
- public void FromPolar() {
- }
-
- [Test]
- public void Equality() {
- Vector2 v1 = new(4, 5);
- Vector2 v2 = new(1, 2);
-
- Assert.IsFalse(v1 == v2, "4 5 == 1 2");
- Assert.IsTrue(v1 != v2, "4 5 != 1 2");
-
- v2 = new(4, 5);
- Assert.IsTrue(v1 == v2, "4 5 == 4 5");
- Assert.IsFalse(v1 != v2, "4 5 != 4 5");
- }
-
- [Test]
- public void Magnitude() {
- Vector2 v = new(1, 2);
- float m = 0;
- m = v.magnitude;
- Assert.AreEqual(m, 2.236068F, "v.magnitude 1 2");
-
- m = Vector2.MagnitudeOf(v);
- Assert.AreEqual(m, 2.236068F, "MagnitudeOf 1 2");
-
- v = new(-1, -2);
- m = v.magnitude;
- Assert.AreEqual(m, 2.236068F, "v.magnitude -1 -2");
-
- v = new(0, 0);
- m = v.magnitude;
- Assert.AreEqual(m, 0, "v.magnitude 0 0");
- }
-
- [Test]
- public void SqrMagnitude() {
- Vector2 v = new(1, 2);
- float m = 0;
-
- m = v.sqrMagnitude;
- Assert.AreEqual(m, 5, "v.sqrMagnitude 1 2");
-
- m = Vector2.SqrMagnitudeOf(v);
- Assert.AreEqual(m, 5, "SqrMagnitudeOf 1 2");
-
- v = new(-1, -2);
- m = v.sqrMagnitude;
- Assert.AreEqual(m, 5, "v.sqrMagnitude -1 -2");
-
- v = new(0, 0);
- m = v.sqrMagnitude;
- Assert.AreEqual(m, 0, "v.sqrMagnitude 0 0");
- }
-
- [Test]
- public void Distance() {
- Vector2 v1 = new(4, 5);
- Vector2 v2 = new(1, 2);
- float f = 0;
-
- f = Vector2.Distance(v1, v2);
- Assert.AreEqual(f, 4.24264002f, 1.0E-05F, "Distance(4 5, 1 2)");
-
- v2 = new(-1, -2);
- f = Vector2.Distance(v1, v2);
- Assert.AreEqual(f, 8.602325F, "Distance(4 5, 1 2)");
-
- v2 = new(0, 0);
- f = Vector2.Distance(v1, v2);
- Assert.AreEqual(f, 6.403124F, 1.0E-05F, "Distance(4 5, 1 2)");
- }
-
- [Test]
- public void Normalize() {
- Vector2 v = new(0, 3);
- Vector2Float r;
-
- r = v.normalized;
- Assert.AreEqual(0, r.horizontal, "normalized 0 3 H");
- Assert.AreEqual(1, r.vertical, "normalized 0 3 V");
-
- r = Vector2.Normalize(v);
- Assert.AreEqual(0, r.horizontal, "Normalize 0 3 H");
- Assert.AreEqual(1, r.vertical, "Normalize 0 3 V");
-
- v = new(0, -3);
- r = v.normalized;
- Assert.AreEqual(0, r.horizontal, "normalized 0 -3 H");
- Assert.AreEqual(-1, r.vertical, "normalized 0 -3 V");
-
- v = new(0, 0);
- r = v.normalized;
- Assert.AreEqual(0, r.horizontal, "normalized 0 0 H");
- Assert.AreEqual(0, r.vertical, "normalized 0 0 V");
- }
-
- [Test]
- public void Negate() {
- Vector2 v = new(4, 5);
- Vector2 r;
-
- r = -v;
- Assert.AreEqual(-4, r.horizontal, "- 4 5 H");
- Assert.AreEqual(-5, r.vertical, "- 4 5 V");
-
- v = new(-4, -5);
- r = -v;
- Assert.AreEqual(4, r.horizontal, "- -4 -5 H");
- Assert.AreEqual(5, r.vertical, "- -4 -5 V");
-
- v = new(0, 0);
- r = -v;
- Assert.AreEqual(0, r.horizontal, "- 0 0 H");
- Assert.AreEqual(0, r.vertical, "- 0 0 V");
- }
-
- [Test]
- public void Subtract() {
- Vector2 v1 = new(4, 5);
- Vector2 v2 = new(1, 2);
- Vector2 r = Vector2.zero;
-
- r = v1 - v2;
- Assert.IsTrue(r == new Vector2(3, 3), "4 5 - 1 2");
-
- v2 = new(-1, -2);
- r = v1 - v2;
- Assert.IsTrue(r == new Vector2(5, 7), "4 5 - -1 -2");
-
- v2 = new(4, 5);
- r = v1 - v2;
- Assert.IsTrue(r == new Vector2(0, 0), "4 5 - 4 5");
- r = v1;
- r -= v2;
- Assert.AreEqual(r, new Vector2(0, 0), "4 5 - 4 5");
-
- v2 = new(0, 0);
- r = v1 - v2;
- Assert.AreEqual(r, new Vector2(4, 5), "4 5 - 0 0");
- r -= v2;
- Assert.AreEqual(r, new Vector2(4, 5), "4 5 - 0 0");
- }
-
- [Test]
- public void Addition() {
- Vector2 v1 = new(4, 5);
- Vector2 v2 = new(1, 2);
- Vector2 r = Vector2.zero;
-
- r = v1 + v2;
- Assert.IsTrue(r == new Vector2(5, 7), "4 5 + 1 2");
-
- v2 = new(-1, -2);
- r = v1 + v2;
- Assert.IsTrue(r == new Vector2(3, 3), "4 5 + -1 -2");
- r = v1;
- r += v2;
- Assert.AreEqual(r, new Vector2(3, 3), "4 5 + -1 -2");
-
- v2 = new(0, 0);
- r = v1 + v2;
- Assert.AreEqual(r, new Vector2(4, 5), "4 5 + 0 0");
- r += v2;
- Assert.AreEqual(r, new Vector2(4, 5), "4 5 + 0 0");
- }
-
- [Test]
- public void Scale() {
- Vector2 v1 = new(4, 5);
- Vector2 v2 = new(1, 2);
- Vector2 r;
-
- r = Vector2.Scale(v1, v2);
- Assert.AreEqual(4, r.horizontal, "Scale 4 5 , 1 2 H");
- Assert.AreEqual(10, r.vertical, "Scale 4 5 , 1 2 V");
-
- v2 = new(-1, -2);
- r = Vector2.Scale(v1, v2);
- Assert.AreEqual(-4, r.horizontal, "Scale 4 5 , -1 -2 H");
- Assert.AreEqual(-10, r.vertical, "Scale 4 5 , -1 -2 V");
-
- v2 = new(0, 0);
- r = Vector2.Scale(v1, v2);
- Assert.AreEqual(0, r.horizontal, "Scale 4 5 , 0 0 H");
- Assert.AreEqual(0, r.vertical, "Scale 4 5 , 0 0 V");
- }
-
- [Test]
- public void Multiply() {
- Vector2 v1 = new(4, 5);
- int f = 3;
- Vector2 r;
-
- r = v1 * f;
- Assert.AreEqual(12, r.horizontal, "4 5 * 3 H");
- Assert.AreEqual(15, r.vertical, "4 5 * 3 V");
-
- r = f * v1;
- Assert.AreEqual(12, r.horizontal, "3 * 4 5 H");
- Assert.AreEqual(15, r.vertical, "3 * 4 5 V");
-
- f = -3;
- r = v1 * f;
- Assert.AreEqual(-12, r.horizontal, "4 5 * -3 H");
- Assert.AreEqual(-15, r.vertical, "4 5 * -3 V");
-
- f = 0;
- r = v1 * f;
- Assert.AreEqual(0, r.horizontal, "4 5 * 0 H");
- Assert.AreEqual(0, r.vertical, "4 5 * 0 V");
- }
-
- [Test]
- public void Divide() {
- Vector2 v1 = new(4, 5);
- float f = 2;
- Vector2 r;
-
- r = v1 / f;
- Assert.AreEqual(2, r.horizontal, "4 5 / 2 H");
- Assert.AreEqual(2.5, r.vertical, "4 5 / 2 V");
-
- f = -2;
- r = v1 / f;
- Assert.AreEqual(-2, r.horizontal, "4 5 / -2 H");
- Assert.AreEqual(-2.5, r.vertical, "4 5 / -2 V");
-
- f = 0;
- r = v1 / f;
- Assert.AreEqual(float.PositiveInfinity, r.horizontal, "4 5 / 0 H");
- Assert.AreEqual(float.PositiveInfinity, r.vertical, "4 5 / 0 V");
- }
-
- [Test]
- public void Dot() {
- Vector2 v1 = new(4, 5);
- Vector2 v2 = new(1, 2);
- float f;
-
- f = Vector2.Dot(v1, v2);
- Assert.AreEqual(14, f, "Dot(4 5, 1 2)");
-
- v2 = new(-1, -2);
- f = Vector2.Dot(v1, v2);
- Assert.AreEqual(-14, f, "Dot(4 5, -1 -2)");
-
- v2 = new(0, 0);
- f = Vector2.Dot(v1, v2);
- Assert.AreEqual(0, f, "Dot(4 5, 0 0)");
- }
-
- [Test]
- public void SignedAngle() {
- Vector2 v1 = new(4, 5);
- Vector2 v2 = new(1, 2);
- float f;
-
- f = Vector2.SignedAngle(v1, v2);
- Assert.AreEqual(-12.094758f, f);
-
- v2 = new(-1, -2);
- f = Vector2.SignedAngle(v1, v2);
- Assert.AreEqual(167.905228f, f);
-
- v2 = new(0, 0);
- f = Vector2.SignedAngle(v1, v2);
- Assert.AreEqual(0, f);
-
- v1 = new(0, 1);
- v2 = new(1, 0);
- f = Vector2.SignedAngle(v1, v2);
- Assert.AreEqual(90, f);
-
- v1 = new(0, 1);
- v2 = new(0, -1);
- f = Vector2.SignedAngle(v1, v2);
- Assert.AreEqual(180, f);
- }
-
- [Test]
- public void UnsignedAngle() {
- Vector2 v1 = new(4, 5);
- Vector2 v2 = new(1, 2);
- float f;
-
- f = Vector2.UnsignedAngle(v1, v2);
- Assert.AreEqual(12.094758f, f);
-
- v2 = new(-1, -2);
- f = Vector2.UnsignedAngle(v1, v2);
- Assert.AreEqual(167.905228f, f);
-
- v2 = new(0, 0);
- f = Vector2.UnsignedAngle(v1, v2);
- Assert.AreEqual(0, f);
-
- v1 = new(0, 1);
- v2 = new(1, 0);
- f = Vector2.UnsignedAngle(v1, v2);
- Assert.AreEqual(90, f);
-
- v1 = new(0, 1);
- v2 = new(0, -1);
- f = Vector2.UnsignedAngle(v1, v2);
- Assert.AreEqual(180, f);
- }
-
- [Test]
- public void Rotate() {
- Vector2 v1 = new(1, 2);
- Vector2 r;
-
- r = Vector2.Rotate(v1, AngleFloat.Degrees(0));
- Assert.AreEqual(0, Vector2.Distance(r, v1));
-
- r = Vector2.Rotate(v1, AngleFloat.Degrees(180));
- Assert.AreEqual(0, Vector2.Distance(r, new Vector2(-1, -2)), 1.0e-06);
-
- r = Vector2.Rotate(v1, AngleFloat.Degrees(-90));
- Assert.AreEqual(0, Vector2.Distance(r, new Vector2(2, -1)), 1.0e-06);
-
- r = Vector2.Rotate(v1, AngleFloat.Degrees(270));
- Assert.AreEqual(0, Vector2.Distance(r, new Vector2(2, -1)), 1.0e-06);
- }
-
- [Test]
- public void Lerp() {
- Vector2 v1 = new(4, 5);
- Vector2 v2 = new(1, 2);
- Vector2 r;
-
- r = Vector2.Lerp(v1, v2, 0);
- Assert.AreEqual(0, Vector2.Distance(r, v1), 0);
-
- r = Vector2.Lerp(v1, v2, 1);
- Assert.AreEqual(0, Vector2.Distance(r, v2), 0);
-
- r = Vector2.Lerp(v1, v2, 0.5f);
- Assert.AreEqual(0, Vector2.Distance(r, new Vector2(2.5f, 3.5f)), 0);
-
- r = Vector2.Lerp(v1, v2, -1);
- Assert.AreEqual(0, Vector2.Distance(r, new Vector2(7, 8)), 0);
-
- r = Vector2.Lerp(v1, v2, 2);
- Assert.AreEqual(0, Vector2.Distance(r, new Vector2(-2, -1)), 0);
- }
-
- }
-}
-#endif
\ No newline at end of file
diff --git a/Runtime/LinearAlgebra/test/Vector2IntTest.cs b/Runtime/LinearAlgebra/test/Vector2IntTest.cs
deleted file mode 100644
index 3647ca0..0000000
--- a/Runtime/LinearAlgebra/test/Vector2IntTest.cs
+++ /dev/null
@@ -1,270 +0,0 @@
-#if !UNITY_5_6_OR_NEWER
-using NUnit.Framework;
-
-namespace LinearAlgebra.Test {
- using Vector2 = Vector2Int;
-
- public class Vector2IntTest {
-
- [SetUp]
- public void Setup() {
- }
-
- [Test]
- public void FromPolar() {
- }
-
- [Test]
- public void Equality() {
- Vector2 v1 = new(4, 5);
- Vector2 v2 = new(1, 2);
-
- Assert.IsFalse(v1 == v2, "4 5 == 1 2");
- Assert.IsTrue(v1 != v2, "4 5 != 1 2");
-
- v2 = new(4, 5);
- Assert.IsTrue(v1 == v2, "4 5 == 4 5");
- Assert.IsFalse(v1 != v2, "4 5 != 4 5");
- }
-
- [Test]
- public void Magnitude() {
- Vector2 v = new(1, 2);
- float m = 0;
- m = v.magnitude;
- Assert.AreEqual(m, 2.236068F, "v.magnitude 1 2");
-
- m = Vector2.MagnitudeOf(v);
- Assert.AreEqual(m, 2.236068F, "MagnitudeOf 1 2");
-
- v = new(-1, -2);
- m = v.magnitude;
- Assert.AreEqual(m, 2.236068F, "v.magnitude -1 -2");
-
- v = new(0, 0);
- m = v.magnitude;
- Assert.AreEqual(m, 0, "v.magnitude 0 0");
- }
-
- [Test]
- public void SqrMagnitude() {
- Vector2 v = new(1, 2);
- float m = 0;
-
- m = v.sqrMagnitude;
- Assert.AreEqual(m, 5, "v.sqrMagnitude 1 2");
-
- m = Vector2.SqrMagnitudeOf(v);
- Assert.AreEqual(m, 5, "SqrMagnitudeOf 1 2");
-
- v = new(-1, -2);
- m = v.sqrMagnitude;
- Assert.AreEqual(m, 5, "v.sqrMagnitude -1 -2");
-
- v = new(0, 0);
- m = v.sqrMagnitude;
- Assert.AreEqual(m, 0, "v.sqrMagnitude 0 0");
- }
-
- [Test]
- public void Distance() {
- Vector2 v1 = new(4, 5);
- Vector2 v2 = new(1, 2);
- float f = 0;
-
- f = Vector2.Distance(v1, v2);
- Assert.AreEqual(f, 4.24264002f, 1.0E-05F, "Distance(4 5, 1 2)");
-
- v2 = new(-1, -2);
- f = Vector2.Distance(v1, v2);
- Assert.AreEqual(f, 8.602325F, "Distance(4 5, 1 2)");
-
- v2 = new(0, 0);
- f = Vector2.Distance(v1, v2);
- Assert.AreEqual(f, 6.403124F, 1.0E-05F, "Distance(4 5, 1 2)");
- }
-
- [Test]
- public void Normalize() {
- Vector2 v = new(0, 3);
- Vector2Float r;
-
- r = v.normalized;
- Assert.AreEqual(0, r.horizontal, "normalized 0 3 H");
- Assert.AreEqual(1, r.vertical, "normalized 0 3 V");
-
- r = Vector2.Normalize(v);
- Assert.AreEqual(0, r.horizontal, "Normalize 0 3 H");
- Assert.AreEqual(1, r.vertical, "Normalize 0 3 V");
-
- v = new(0, -3);
- r = v.normalized;
- Assert.AreEqual(0, r.horizontal, "normalized 0 -3 H");
- Assert.AreEqual(-1, r.vertical, "normalized 0 -3 V");
-
- v = new(0, 0);
- r = v.normalized;
- Assert.AreEqual(0, r.horizontal, "normalized 0 0 H");
- Assert.AreEqual(0, r.vertical, "normalized 0 0 V");
- }
-
- [Test]
- public void Negate() {
- Vector2 v = new(4, 5);
- Vector2 r;
-
- r = -v;
- Assert.AreEqual(-4, r.horizontal, "- 4 5 H");
- Assert.AreEqual(-5, r.vertical, "- 4 5 V");
-
- v = new(-4, -5);
- r = -v;
- Assert.AreEqual(4, r.horizontal, "- -4 -5 H");
- Assert.AreEqual(5, r.vertical, "- -4 -5 V");
-
- v = new(0, 0);
- r = -v;
- Assert.AreEqual(0, r.horizontal, "- 0 0 H");
- Assert.AreEqual(0, r.vertical, "- 0 0 V");
- }
-
- [Test]
- public void Subtract() {
- Vector2 v1 = new(4, 5);
- Vector2 v2 = new(1, 2);
- Vector2 r = Vector2.zero;
-
- r = v1 - v2;
- Assert.IsTrue(r == new Vector2(3, 3), "4 5 - 1 2");
-
- v2 = new(-1, -2);
- r = v1 - v2;
- Assert.IsTrue(r == new Vector2(5, 7), "4 5 - -1 -2");
-
- v2 = new(4, 5);
- r = v1 - v2;
- Assert.IsTrue(r == new Vector2(0, 0), "4 5 - 4 5");
- r = v1;
- r -= v2;
- Assert.AreEqual(r, new Vector2(0, 0), "4 5 - 4 5");
-
- v2 = new(0, 0);
- r = v1 - v2;
- Assert.AreEqual(r, new Vector2(4, 5), "4 5 - 0 0");
- r -= v2;
- Assert.AreEqual(r, new Vector2(4, 5), "4 5 - 0 0");
- }
-
- [Test]
- public void Addition() {
- Vector2 v1 = new(4, 5);
- Vector2 v2 = new(1, 2);
- Vector2 r = Vector2.zero;
-
- r = v1 + v2;
- Assert.IsTrue(r == new Vector2(5, 7), "4 5 + 1 2");
-
- v2 = new(-1, -2);
- r = v1 + v2;
- Assert.IsTrue(r == new Vector2(3, 3), "4 5 + -1 -2");
- r = v1;
- r += v2;
- Assert.AreEqual(r, new Vector2(3, 3), "4 5 + -1 -2");
-
- v2 = new(0, 0);
- r = v1 + v2;
- Assert.AreEqual(r, new Vector2(4, 5), "4 5 + 0 0");
- r += v2;
- Assert.AreEqual(r, new Vector2(4, 5), "4 5 + 0 0");
- }
-
- [Test]
- public void Scale() {
- Vector2 v1 = new(4, 5);
- Vector2 v2 = new(1, 2);
- Vector2 r;
-
- r = Vector2.Scale(v1, v2);
- Assert.AreEqual(4, r.horizontal, "Scale 4 5 , 1 2 H");
- Assert.AreEqual(10, r.vertical, "Scale 4 5 , 1 2 V");
-
- v2 = new(-1, -2);
- r = Vector2.Scale(v1, v2);
- Assert.AreEqual(-4, r.horizontal, "Scale 4 5 , -1 -2 H");
- Assert.AreEqual(-10, r.vertical, "Scale 4 5 , -1 -2 V");
-
- v2 = new(0, 0);
- r = Vector2.Scale(v1, v2);
- Assert.AreEqual(0, r.horizontal, "Scale 4 5 , 0 0 H");
- Assert.AreEqual(0, r.vertical, "Scale 4 5 , 0 0 V");
- }
-
- [Test]
- public void Multiply() {
- Vector2 v1 = new(4, 5);
- int f = 3;
- Vector2 r;
-
- r = v1 * f;
- Assert.AreEqual(12, r.horizontal, "4 5 * 3 H");
- Assert.AreEqual(15, r.vertical, "4 5 * 3 V");
-
- r = f * v1;
- Assert.AreEqual(12, r.horizontal, "3 * 4 5 H");
- Assert.AreEqual(15, r.vertical, "3 * 4 5 V");
-
- f = -3;
- r = v1 * f;
- Assert.AreEqual(-12, r.horizontal, "4 5 * -3 H");
- Assert.AreEqual(-15, r.vertical, "4 5 * -3 V");
-
- f = 0;
- r = v1 * f;
- Assert.AreEqual(0, r.horizontal, "4 5 * 0 H");
- Assert.AreEqual(0, r.vertical, "4 5 * 0 V");
- }
-
- [Test]
- public void Divide() {
- Vector2 v1 = new(4, 5);
- int f = 2;
- Vector2 r;
-
- r = v1 / f;
- Assert.AreEqual(2, r.horizontal, "4 5 / 2 H");
- Assert.AreEqual(2, r.vertical, "4 5 / 2 V");
-
- f = -2;
- r = v1 / f;
- Assert.AreEqual(-2, r.horizontal, "4 5 / -2 H");
- Assert.AreEqual(-2, r.vertical, "4 5 / -2 V");
-
- Assert.Throws(() => {
- f = 0;
- r = v1 / f;
- Assert.AreEqual(float.PositiveInfinity, r.horizontal, "4 5 / 0 H");
- Assert.AreEqual(float.PositiveInfinity, r.vertical, "4 5 / 0 V");
- });
- }
-
- [Test]
- public void Dot() {
- Vector2 v1 = new(4, 5);
- Vector2 v2 = new(1, 2);
- int f;
-
- f = Vector2.Dot(v1, v2);
- Assert.AreEqual(14, f, "Dot(4 5, 1 2)");
-
- v2 = new(-1, -2);
- f = Vector2.Dot(v1, v2);
- Assert.AreEqual(-14, f, "Dot(4 5, -1 -2)");
-
- v2 = new(0, 0);
- f = Vector2.Dot(v1, v2);
- Assert.AreEqual(0, f, "Dot(4 5, 0 0)");
- }
-
- }
-}
-#endif
\ No newline at end of file
diff --git a/Runtime/LinearAlgebra/test/Vector3FloatTest.cs b/Runtime/LinearAlgebra/test/Vector3FloatTest.cs
deleted file mode 100644
index fd3c2dc..0000000
--- a/Runtime/LinearAlgebra/test/Vector3FloatTest.cs
+++ /dev/null
@@ -1,581 +0,0 @@
-#if !UNITY_5_6_OR_NEWER
-using NUnit.Framework;
-
-namespace LinearAlgebra.Test {
- using Vector3 = Vector3Float;
-
- public class Vector3FloatTest {
-
- [Test]
- public void FromSpherical() {
- Vector3 v = new(0, 0, 1);
- Spherical s = Spherical.FromVector3(v);
- Vector3 r = Vector3.FromSpherical(s);
-
- Assert.AreEqual(0, r.horizontal, "0 0 1");
- Assert.AreEqual(0, r.vertical, 1.0e-06, "0 0 1");
- Assert.AreEqual(1, r.depth, "0 0 1");
-
- v = new(0, 1, 0);
- s = Spherical.FromVector3(v);
- r = Vector3.FromSpherical(s);
- Assert.AreEqual(0, r.horizontal, "0 0 1");
- Assert.AreEqual(1, r.vertical, "0 0 1");
- Assert.AreEqual(0, r.depth, 1.0e-06, "0 0 1");
-
- v = new(1, 0, 0);
- s = Spherical.FromVector3(v);
- r = Vector3.FromSpherical(s);
- Assert.AreEqual(1, r.horizontal, "0 0 1");
- Assert.AreEqual(0, r.vertical, 1.0e-06, "0 0 1");
- Assert.AreEqual(0, r.depth, 1.0e-06, "0 0 1");
- }
-
- [Test]
- public void Magnitude() {
- Vector3 v = new(1, 2, 3);
- float m = 0;
-
- m = v.magnitude;
- Assert.AreEqual(3.7416575f, m, "magnitude 1 2 3");
-
- m = Vector3.MagnitudeOf(v);
- Assert.AreEqual(3.7416575f, m, "MagnitudeOf 1 2 3");
-
- v = new(-1, -2, -3);
- m = v.magnitude;
- Assert.AreEqual(3.7416575f, m, "magnitude -1 -2 -3");
-
- v = new(0, 0, 0);
- m = v.magnitude;
- Assert.AreEqual(0, m, "magnitude 0 0 0");
-
- // Infinity tests are still missing
- }
-
- [Test]
- public void SqrMagnitude() {
- Vector3 v = new(1, 2, 3);
- float m = 0;
-
- m = v.sqrMagnitude;
- Assert.AreEqual(14, m, "sqrMagnitude 1 2 3");
-
- m = Vector3.SqrMagnitudeOf(v);
- Assert.AreEqual(14, m, "SqrMagnitudeOf 1 2 3");
-
- v = new(-1, -2, -3);
- m = v.sqrMagnitude;
- Assert.AreEqual(14, m, "sqrMagnitude -1 -2 -3");
-
- v = new(0, 0, 0);
- m = v.sqrMagnitude;
- Assert.AreEqual(0, m, "sqrMagnitude 0 0 0");
-
- // Infinity tests are still missing
- }
-
- [Test]
- public void Normalize() {
- Vector3 v = new(0, 2, 0);
- Vector3 r;
-
- r = v.normalized;
- Assert.AreEqual(new Vector3(0, 1, 0), r, "normalized 0 2 0");
-
- r = Vector3.Normalize(v);
- Assert.AreEqual(new Vector3(0, 1, 0), r, "Normalize 0 2 0");
-
- v = new(0, -2, 0);
- r = v.normalized;
- Assert.AreEqual(new Vector3(0, -1, 0), r, "normalized 0 -2 0");
- v = new(0, 0, 0);
- r = v.normalized;
- Assert.AreEqual(new Vector3(0, 0, 0), r, "normalized 0 0 0");
-
- v = new(float.PositiveInfinity, float.PositiveInfinity, float.PositiveInfinity);
- r = v.normalized;
- Assert.IsTrue(float.IsNaN(r.horizontal), "normalized infinity infinity infinity");
- Assert.IsTrue(float.IsNaN(r.vertical), "normalized infinity infinity infinity");
- Assert.IsTrue(float.IsNaN(r.depth), "normalized infinity infinity infinity");
-
- v = new(float.NegativeInfinity, float.NegativeInfinity, float.NegativeInfinity);
- r = v.normalized;
- Assert.IsTrue(float.IsNaN(r.horizontal), "normalized -infinity -infinity -infinity");
- Assert.IsTrue(float.IsNaN(r.vertical), "normalized -infinity -infinity -infinity");
- Assert.IsTrue(float.IsNaN(r.depth), "normalized -infinity -infinity -infinity");
- }
-
- [Test]
- public void Negate() {
- Vector3 v = new(4, 5, 6);
- Vector3 r;
-
- r = -v;
- Assert.AreEqual(-4, r.horizontal, "- 4 5 6 H");
- Assert.AreEqual(-5, r.vertical, "- 4 5 6 V");
- Assert.AreEqual(-6, r.depth, "- 4 5 6 D");
-
- v = new(-4, -5, -6);
- r = -v;
- Assert.AreEqual(4, r.horizontal, "- -4 -5 -6 H");
- Assert.AreEqual(5, r.vertical, "- -4 -5 -6 V");
- Assert.AreEqual(6, r.depth, "- -4 -5 -6 D");
-
- v = new(0, 0, 0);
- r = -v;
- Assert.AreEqual(new Vector3(0, 0, 0), r, "- 0 0 0");
- Assert.AreEqual(0, r.horizontal, "- 0 0 0 H");
- Assert.AreEqual(0, r.vertical, "- 0 0 0 V");
- Assert.AreEqual(0, r.depth, "- 0 0 0 D");
-
-
- v = new(float.PositiveInfinity, float.PositiveInfinity, float.PositiveInfinity);
- r = -v;
- Assert.AreEqual(new Vector3(float.NegativeInfinity, float.NegativeInfinity, float.NegativeInfinity), r, "- inifinty infinity infinity");
-
- v = new(float.NegativeInfinity, float.NegativeInfinity, float.NegativeInfinity);
- r = -v;
- Assert.AreEqual(new Vector3(float.PositiveInfinity, float.PositiveInfinity, float.PositiveInfinity), r, "- -inifinty -infinity -infinity");
- }
-
- [Test]
- public void Subtract() {
- Vector3 v1 = new(4, 5, 6);
- Vector3 v2 = new(1, 2, 3);
- Vector3 r = Vector3.zero;
-
- r = v1 - v2;
- Assert.IsTrue(r == new Vector3(3, 3, 3), "4 5 6 - 1 2 3");
-
- v2 = new(-1, -2, -3);
- r = v1 - v2;
- Assert.IsTrue(r == new Vector3(5, 7, 9), "4 5 6 - -1 -2 -3");
-
- v2 = new(4, 5, 6);
- r = v1 - v2;
- Assert.IsTrue(r == new Vector3(0, 0, 0), "4 5 6 - 4 5 6");
- r = v1;
- r -= v2;
- Assert.AreEqual(r, new Vector3(0, 0, 0), "4 5 6 - 4 5 6");
-
- v2 = new(0, 0, 0);
- r = v1 - v2;
- Assert.AreEqual(r, new Vector3(4, 5, 6), "4 5 6 - 0 0 0");
- r -= v2;
- Assert.AreEqual(r, new Vector3(4, 5, 6), "4 5 6 - 0 0 0");
-
- // Infinity tests are still missing
- }
-
- [Test]
- public void Addition() {
- Vector3 v1 = new(4, 5, 6);
- Vector3 v2 = new(1, 2, 3);
- Vector3 r = Vector3.zero;
-
- r = v1 + v2;
- Assert.IsTrue(r == new Vector3(5, 7, 9), "4 5 6 + 1 2 3");
-
- v2 = new(-1, -2, -3);
- r = v1 + v2;
- Assert.IsTrue(r == new Vector3(3, 3, 3), "4 5 6 + -1 -2 -3");
- r = v1;
- r += v2;
- Assert.AreEqual(r, new Vector3(3, 3, 3), "4 5 6 + -1 -2 -3");
-
- v2 = new(0, 0, 0);
- r = v1 + v2;
- Assert.AreEqual(r, new Vector3(4, 5, 6), "4 5 6 + 0 0 0");
- r += v2;
- Assert.AreEqual(r, new Vector3(4, 5, 6), "4 5 6 + 0 0 0");
-
- // Infinity tests are still missing
- }
-
- [Test]
- public void Scale() {
- Vector3 v1 = new(4, 5, 6);
- Vector3 v2 = new(1, 2, 3);
- Vector3 r;
-
- r = Vector3.Scale(v1, v2);
- Assert.AreEqual(4, r.horizontal, "Scale 4 5 6 , 1 2 3 H");
- Assert.AreEqual(10, r.vertical, "Scale 4 5 6 , 1 2 3 V");
- Assert.AreEqual(18, r.depth, "Scale 4 5 6 , 1 2 3 D");
-
- v2 = new(-1, -2, -3);
- r = Vector3.Scale(v1, v2);
- Assert.AreEqual(-4, r.horizontal, "Scale 4 5 6 , -1 -2 -3 H");
- Assert.AreEqual(-10, r.vertical, "Scale 4 5 6 , -1 -2 -3 V");
- Assert.AreEqual(-18, r.depth, "Scale 4 5 6 , -1 -2 -3 D");
-
- v2 = new(0, 0, 0);
- r = Vector3.Scale(v1, v2);
- Assert.AreEqual(0, r.horizontal, "Scale 4 5 6 , 0 0 0 H");
- Assert.AreEqual(0, r.vertical, "Scale 4 5 6 , 0 0 0 V");
- Assert.AreEqual(0, r.depth, "Scale 4 5 6 , 0 0 0 D");
-
- v2 = new(float.PositiveInfinity, float.PositiveInfinity, float.PositiveInfinity);
- r = Vector3.Scale(v1, v2);
- Assert.AreEqual(float.PositiveInfinity, r.horizontal, "Scale 4 5 6 , inf inf inf H");
- Assert.AreEqual(float.PositiveInfinity, r.vertical, "Scale 4 5 6 , inf inf inf V");
- Assert.AreEqual(float.PositiveInfinity, r.depth, "Scale 4 5 6 , inf inf inf D");
-
- v2 = new(float.NegativeInfinity, float.NegativeInfinity, float.NegativeInfinity);
- r = Vector3.Scale(v1, v2);
- Assert.AreEqual(float.NegativeInfinity, r.horizontal, "Scale 4 5 6 , -inf -inf -inf H");
- Assert.AreEqual(float.NegativeInfinity, r.vertical, "Scale 4 5 6 , -inf -inf -inf V");
- Assert.AreEqual(float.NegativeInfinity, r.depth, "Scale 4 5 6 , -inf -inf -inf D");
- }
-
- [Test]
- public void Multiply() {
- Vector3 v1 = new(4, 5, 6);
- float f = 3;
- Vector3 r;
-
- r = v1 * f;
- Assert.AreEqual(12, r.horizontal, "4 5 6 * 3 H");
- Assert.AreEqual(15, r.vertical, "4 5 6 * 3 V");
- Assert.AreEqual(18, r.depth, "4 5 6 * 3 D");
-
- f = -3;
- r = v1 * f;
- Assert.AreEqual(-12, r.horizontal, "4 5 6 * -3 H");
- Assert.AreEqual(-15, r.vertical, "4 5 6 * -3 V");
- Assert.AreEqual(-18, r.depth, "4 5 6 * -3 D");
-
- f = 0;
- r = v1 * f;
- Assert.AreEqual(0, r.horizontal, "4 5 6 * 0 H");
- Assert.AreEqual(0, r.vertical, "4 5 6 * 0 V");
- Assert.AreEqual(0, r.depth, "4 5 6 * 0 D");
-
- f = float.PositiveInfinity;
- r = v1 * f;
- Assert.AreEqual(float.PositiveInfinity, r.horizontal, "4 5 6 * inf H");
- Assert.AreEqual(float.PositiveInfinity, r.vertical, "4 5 6 * inf V");
- Assert.AreEqual(float.PositiveInfinity, r.depth, "4 5 6 * inf D");
-
- f = float.NegativeInfinity;
- r = v1 * f;
- Assert.AreEqual(float.NegativeInfinity, r.horizontal, "4 5 6 * -inf H");
- Assert.AreEqual(float.NegativeInfinity, r.vertical, "4 5 6 * -inf V");
- Assert.AreEqual(float.NegativeInfinity, r.depth, "4 5 6 * -inf D");
- }
-
- [Test]
- public void Divide() {
- Vector3 v1 = new(4, 5, 6);
- float f = 2;
- Vector3 r;
-
- r = v1 / f;
- Assert.AreEqual(2, r.horizontal, "4 5 6 / 2 H");
- Assert.AreEqual(2.5, r.vertical, "4 5 6 / 2 V");
- Assert.AreEqual(3, r.depth, "4 5 6 / 2 D");
-
- f = -2;
- r = v1 / f;
- Assert.AreEqual(-2, r.horizontal, "4 5 6 / -2 H");
- Assert.AreEqual(-2.5, r.vertical, "4 5 6 / -2 V");
- Assert.AreEqual(-3, r.depth, "4 5 6 / -2 D");
-
- f = 0;
- r = v1 / f;
- Assert.AreEqual(float.PositiveInfinity, r.horizontal, "4 5 6 / 0 H");
- Assert.AreEqual(float.PositiveInfinity, r.vertical, "4 5 6 / 0 V");
- Assert.AreEqual(float.PositiveInfinity, r.depth, "4 5 6 / 0 D");
-
- f = float.PositiveInfinity;
- r = v1 / f;
- Assert.AreEqual(0, r.horizontal, "4 5 6 / inf H");
- Assert.AreEqual(0, r.vertical, "4 5 6 / inf V");
- Assert.AreEqual(0, r.depth, "4 5 6 / inf D");
-
- f = float.NegativeInfinity;
- r = v1 / f;
- Assert.AreEqual(0, r.horizontal, "4 5 6 / -inf H");
- Assert.AreEqual(0, r.vertical, "4 5 6 / -inf V");
- Assert.AreEqual(0, r.depth, "4 5 6 / -inf D");
- }
-
- [Test]
- public void Dot() {
- Vector3 v1 = new(4, 5, 6);
- Vector3 v2 = new(1, 2, 3);
- float f;
-
- f = Vector3.Dot(v1, v2);
- Assert.AreEqual(32, f, "Dot(4 5 6, 1 2 3)");
-
- v2 = new(-1, -2, -3);
- f = Vector3.Dot(v1, v2);
- Assert.AreEqual(-32, f, "Dot(4 5 6, -1 -2 -3)");
-
- v2 = new(0, 0, 0);
- f = Vector3.Dot(v1, v2);
- Assert.AreEqual(0, f, "Dot(4 5 6, 0 0 0)");
-
- v2 = new(float.PositiveInfinity, float.PositiveInfinity, float.PositiveInfinity);
- f = Vector3.Dot(v1, v2);
- Assert.AreEqual(float.PositiveInfinity, f, "Dot(4 5 6, inf inf inf)");
-
- v2 = new(float.NegativeInfinity, float.NegativeInfinity, float.NegativeInfinity);
- f = Vector3.Dot(v1, v2);
- Assert.AreEqual(float.NegativeInfinity, f, "Dot(4 5 6, -inf -inf -inf)");
- }
-
- [Test]
- public void Equality() {
- Vector3 v1 = new(4, 5, 6);
- Vector3 v2 = new(1, 2, 3);
- bool r;
-
- r = v1 == v2;
- Assert.IsFalse(r, "4 5 6 == 1 2 3");
-
- v2 = new(4, 5, 6);
- r = v1 == v2;
- Assert.IsTrue(r, "4 5 6 == 4 5 6");
-
- v2 = new(float.PositiveInfinity, float.PositiveInfinity, float.PositiveInfinity);
- r = v1 == v2;
- Assert.IsFalse(r, "4 5 6 == inf inf inf");
-
- v1 = new(float.NegativeInfinity, float.NegativeInfinity, float.NegativeInfinity);
- r = v1 == v2;
- Assert.IsFalse(r, "-inf -inf -inf == inf inf inf");
- }
-
- [Test]
- public void Distance() {
- Vector3 v1 = new(4, 5, 6);
- Vector3 v2 = new(1, 2, 3);
- float f;
-
- f = Vector3.Distance(v1, v2);
- Assert.AreEqual(5.19615221F, f, "Distance(4 5 6, 1 2 3)");
-
- v2 = new(-1, -2, -3);
- f = Vector3.Distance(v1, v2);
- Assert.AreEqual(12.4498997F, f, "Distance(4 5 6, -1 -2 -3)");
-
- v2 = new(0, 0, 0);
- f = Vector3.Distance(v1, v2);
- Assert.AreEqual(v1.magnitude, f, "Distance(4 5 6, 0 0 0)");
-
- v2 = new(float.PositiveInfinity, float.PositiveInfinity, float.PositiveInfinity);
- f = Vector3.Distance(v1, v2);
- Assert.AreEqual(float.PositiveInfinity, f, "Distance(4 5 6, inf inf inf)");
-
- v2 = new(float.NegativeInfinity, float.NegativeInfinity, float.NegativeInfinity);
- f = Vector3.Distance(v1, v2);
- Assert.AreEqual(float.PositiveInfinity, f, "Distance(4 5 6, -inf -inf -inf)");
- }
-
- [Test]
- public void Cross() {
- Vector3 v1 = new(4, 5, 6);
- Vector3 v2 = new(1, 2, 3);
- Vector3 r;
-
- r = Vector3.Cross(v1, v2);
- Assert.AreEqual(3, r.horizontal, "Cross(4 5 6, 1 2 3) H");
- Assert.AreEqual(-6, r.vertical, "Cross(4 5 6, 1 2 3) V");
- Assert.AreEqual(3, r.depth, "Cross(4 5 6, 1 2 3) D");
-
- v2 = new(-1, -2, -3);
- r = Vector3.Cross(v1, v2);
- Assert.AreEqual(-3, r.horizontal, "Cross(4 5 6, -1 -2 -3) H");
- Assert.AreEqual(6, r.vertical, "Cross(4 5 6, -1 -2 -3) V");
- Assert.AreEqual(-3, r.depth, "Cross(4 5 6, -1 -2 -3) D");
-
- v2 = new(0, 0, 0);
- r = Vector3.Cross(v1, v2);
- Assert.AreEqual(0, r.horizontal, "Cross(4 5 6, 0 0 0) H");
- Assert.AreEqual(0, r.vertical, "Cross(4 5 6, 0 0 0) V");
- Assert.AreEqual(0, r.depth, "Cross(4 5 6, 0 0 0) D");
-
- v2 = new(float.PositiveInfinity, float.PositiveInfinity, float.PositiveInfinity);
- r = Vector3.Cross(v1, v2);
- Assert.IsTrue(float.IsNaN(r.horizontal), "Cross(4 5 6, inf inf inf) H");
- Assert.IsTrue(float.IsNaN(r.vertical), "Cross(4 5 6, inf inf inf) V");
- Assert.IsTrue(float.IsNaN(r.depth), "Cross(4 5 6, inf inf inf) D");
-
- v2 = new(float.NegativeInfinity, float.NegativeInfinity, float.NegativeInfinity);
- r = Vector3.Cross(v1, v2);
- Assert.IsTrue(float.IsNaN(r.horizontal), "Cross(4 5 6, -inf -inf -inf) H");
- Assert.IsTrue(float.IsNaN(r.vertical), "Cross(4 5 6, -inf -inf -inf) V");
- Assert.IsTrue(float.IsNaN(r.depth), "Cross(4 5 6, -inf -inf -inf) D");
- }
-
- [Test]
- public void Project() {
- Vector3 v1 = new(4, 5, 6);
- Vector3 v2 = new(1, 2, 3);
- Vector3 r;
-
- r = Vector3.Project(v1, v2);
- Assert.AreEqual(2.28571439F, r.horizontal, "Project(4 5 6, 1 2 3) H");
- Assert.AreEqual(4.57142878F, r.vertical, "Project(4 5 6, 1 2 3) V");
- Assert.AreEqual(6.85714293F, r.depth, "Project(4 5 6, 1 2 3) D");
-
- v2 = new(-1, -2, -3);
- r = Vector3.Project(v1, v2);
- Assert.AreEqual(2.28571439F, r.horizontal, "Project(4 5 6, -1 -2 -3) H");
- Assert.AreEqual(4.57142878F, r.vertical, "Project(4 5 6, -1 -2 -3) V");
- Assert.AreEqual(6.85714293F, r.depth, "Project(4 5 6, -1 -2 -3) D");
-
- v2 = new(0, 0, 0);
- r = Vector3.Project(v1, v2);
- Assert.AreEqual(0, r.horizontal, "Project(4 5 6, 0 0 0) H");
- Assert.AreEqual(0, r.vertical, "Project(4 5 6, 0 0 0) V");
- Assert.AreEqual(0, r.depth, "Project(4 5 6, 0 0 0) D");
-
- r = Vector3.Project(v2, v1);
- Assert.AreEqual(0, r.horizontal, "Project(0 0 0, 4 5 6) H");
- Assert.AreEqual(0, r.vertical, "Project(0 0 0, 4 5 6) V");
- Assert.AreEqual(0, r.depth, "Project(0 0 0, 4 5 6) D");
-
- v2 = new(float.PositiveInfinity, float.PositiveInfinity, float.PositiveInfinity);
- r = Vector3.Project(v1, v2);
- Assert.IsTrue(float.IsNaN(r.horizontal), "Project(4 5 6, inf inf inf) H");
- Assert.IsTrue(float.IsNaN(r.vertical), "Project(4 5 6, inf inf inf) V");
- Assert.IsTrue(float.IsNaN(r.depth), "Project(4 5 6, inf inf inf) D");
-
- v2 = new(float.NegativeInfinity, float.NegativeInfinity, float.NegativeInfinity);
- r = Vector3.Project(v1, v2);
- Assert.IsTrue(float.IsNaN(r.horizontal), "Project(4 5 6, -inf -inf -inf) H");
- Assert.IsTrue(float.IsNaN(r.vertical), "Project(4 5 6, -inf -inf -inf) V");
- Assert.IsTrue(float.IsNaN(r.depth), "Project(4 5 6, -inf -inf -inf) D");
- }
-
- [Test]
- public void ProjectOnPlane() {
- Vector3 v1 = new(4, 5, 6);
- Vector3 v2 = new(1, 2, 3);
- Vector3 r;
-
- r = Vector3.ProjectOnPlane(v1, v2);
- Assert.AreEqual(1.71428561F, r.horizontal, "ProjectOnPlane(4 5 6, 1 2 3) H");
- Assert.AreEqual(0.428571224F, r.vertical, "ProjectOnPlane(4 5 6, 1 2 3) V");
- Assert.AreEqual(-0.857142925F, r.depth, "ProjectOnPlane(4 5 6, 1 2 3) D");
-
- v2 = new(-1, -2, -3);
- r = Vector3.ProjectOnPlane(v1, v2);
- Assert.AreEqual(1.71428561F, r.horizontal, "ProjectOnPlane(4 5 6, -1 -2 -3) H");
- Assert.AreEqual(0.428571224F, r.vertical, "ProjectOnPlane(4 5 6, -1 -2 -3) V");
- Assert.AreEqual(-0.857142925F, r.depth, "ProjectOnPlane(4 5 6, -1 -2 -3) D");
-
- v2 = new(0, 0, 0);
- r = Vector3.ProjectOnPlane(v1, v2);
- Assert.AreEqual(4, r.horizontal, "ProjectOnPlane(4 5 6, 0 0 0) H");
- Assert.AreEqual(5, r.vertical, "ProjectOnPlane(4 5 6, 0 0 0) V");
- Assert.AreEqual(6, r.depth, "ProjectOnPlane(4 5 6, 0 0 0) D");
-
- r = Vector3.ProjectOnPlane(v2, v1);
- Assert.AreEqual(0, r.horizontal, "ProjectOnPlane(0 0 0, 4 5 6) H");
- Assert.AreEqual(0, r.vertical, "ProjectOnPlane(0 0 0, 4 5 6) V");
- Assert.AreEqual(0, r.depth, "ProjectOnPlane(0 0 0, 4 5 6) D");
-
- v2 = new(float.PositiveInfinity, float.PositiveInfinity, float.PositiveInfinity);
- r = Vector3.ProjectOnPlane(v1, v2);
- Assert.IsTrue(float.IsNaN(r.horizontal), "ProjectOnPlane(4 5 6, inf inf inf) H");
- Assert.IsTrue(float.IsNaN(r.vertical), "ProjectOnPlane(4 5 6, inf inf inf) V");
- Assert.IsTrue(float.IsNaN(r.depth), "ProjectOnPlane(4 5 6, inf inf inf) D");
-
- v2 = new(float.NegativeInfinity, float.NegativeInfinity, float.NegativeInfinity);
- r = Vector3.ProjectOnPlane(v1, v2);
- Assert.IsTrue(float.IsNaN(r.horizontal), "ProjectOnPlane(4 5 6, -inf -inf -inf) H");
- Assert.IsTrue(float.IsNaN(r.vertical), "ProjectOnPlane(4 5 6, -inf -inf -inf) V");
- Assert.IsTrue(float.IsNaN(r.depth), "ProjectOnPlane(4 5 6, -inf -inf -inf) D");
- }
-
- [Test]
- public void UnsignedAngle() {
- Vector3 v1 = new(4, 5, 6);
- Vector3 v2 = new(1, 2, 3);
- AngleFloat a;
-
- a = Vector3.UnsignedAngle(v1, v2);
- Assert.AreEqual(12.9331379F, a.inDegrees, "Angle(4 5 6, 1 2 3)");
-
- v2 = new(-1, -2, -3);
- a = Vector3.UnsignedAngle(v1, v2);
- Assert.AreEqual(167.066849F, a.inDegrees, "Angle(4 5 6, -1 -2 -3)");
-
- v2 = new(0, 0, 0);
- a = Vector3.UnsignedAngle(v1, v2);
- Assert.AreEqual(0, a.inDegrees, "Angle(4 5 6, 0 0 0)");
-
- v2 = new(float.PositiveInfinity, float.PositiveInfinity, float.PositiveInfinity);
- a = Vector3.UnsignedAngle(v1, v2);
- Assert.IsTrue(float.IsNaN(a.inDegrees), "Angle(4 5 6, inf inf inf)");
-
- v2 = new(float.NegativeInfinity, float.NegativeInfinity, float.NegativeInfinity);
- a = Vector3.UnsignedAngle(v1, v2);
- Assert.IsTrue(float.IsNaN(a.inDegrees), "Angle(4 5 6, inf inf inf)");
- }
-
- [Test]
- public void SignedAngle() {
- Vector3 v1 = new(4, 5, 6);
- Vector3 v2 = new(1, 2, 3);
- Vector3 v3 = new(7, 8, -9);
- AngleFloat a;
-
- a = Vector3.SignedAngle(v1, v2, v3);
- Assert.AreEqual(-12.9331379F, a.inDegrees, "SignedAngle(4 5 6, 1 2 3, 7 8 -9)");
-
- v2 = new(-1, -2, -3);
- a = Vector3.SignedAngle(v1, v2, v3);
- Assert.AreEqual(167.066849F, a.inDegrees, "SignedAngle(4 5 6, -1 -2 -3, 7 8 -9)");
-
- v2 = new(0, 0, 0);
- a = Vector3.SignedAngle(v1, v2, v3);
- Assert.AreEqual(0, a.inDegrees, "SignedAngle(4 5 6, 0 0 0, 7 8 -9)");
-
- v2 = new(1, 2, 3);
- v3 = new(-7, -8, 9);
- a = Vector3.SignedAngle(v1, v2, v3);
- Assert.AreEqual(12.9331379F, a.inDegrees, "SignedAngle(4 5 6, 1 2 3, -7 -8 9)");
-
- v3 = new(0, 0, 0);
- a = Vector3.SignedAngle(v1, v2, v3);
- Assert.AreEqual(0, a.inDegrees, "SignedAngle(4 5 6, 1 2 3, 0 0 0)");
-
- v2 = new(float.PositiveInfinity, float.PositiveInfinity, float.PositiveInfinity);
- a = Vector3.SignedAngle(v1, v2, v3);
- Assert.IsTrue(float.IsNaN(a.inDegrees), "SignedAngle(4 5 6, inf inf inf, 0 0 0)");
-
- v2 = new(float.NegativeInfinity, float.NegativeInfinity, float.NegativeInfinity);
- a = Vector3.SignedAngle(v1, v2, v3);
- Assert.IsTrue(float.IsNaN(a.inDegrees), "SignedAngle(4 5 6, -inf -inf -inf, 0 0 0)");
- }
-
- [Test]
- public void Lerp() {
- Vector3 v1 = new(4, 5, 6);
- Vector3 v2 = new(1, 2, 3);
- Vector3 r;
-
- r = Vector3.Lerp(v1, v2, 0);
- Assert.AreEqual(0, Vector3.Distance(r, v1), 0);
-
- r = Vector3.Lerp(v1, v2, 1);
- Assert.AreEqual(0, Vector3.Distance(r, v2), 0);
-
- r = Vector3.Lerp(v1, v2, 0.5f);
- Assert.AreEqual(0, Vector3.Distance(r, new Vector3(2.5f, 3.5f, 4.5f)), 0);
-
- r = Vector3.Lerp(v1, v2, -1);
- Assert.AreEqual(0, Vector3.Distance(r, new Vector3(7, 8, 9)), 0);
-
- r = Vector3.Lerp(v1, v2, 2);
- Assert.AreEqual(0, Vector3.Distance(r, new Vector3(-2, -1, 0)), 0);
- }
- }
-}
-#endif
\ No newline at end of file
diff --git a/Runtime/LinearAlgebra/test/Vector3IntTest.cs b/Runtime/LinearAlgebra/test/Vector3IntTest.cs
deleted file mode 100644
index b718178..0000000
--- a/Runtime/LinearAlgebra/test/Vector3IntTest.cs
+++ /dev/null
@@ -1,349 +0,0 @@
-#if !UNITY_5_6_OR_NEWER
-using NUnit.Framework;
-
-namespace LinearAlgebra.Test {
- using Vector3 = Vector3Int;
-
- public class Vector3IntTest {
-
- [Test]
- public void Equality() {
- Vector3 v1 = new(4, 5, 6);
- Vector3 v2 = new(1, 2, 3);
-
- Assert.IsFalse(v1 == v2, "4 5 6 == 1 2 3");
- Assert.IsTrue(v1 != v2, "4 5 6 != 1 2 3");
-
- v2 = new(4, 5, 6);
- Assert.IsTrue(v1 == v2, "4 5 6 == 4 5 6");
- Assert.IsFalse(v1 != v2, "4 5 6 != 4 5 6");
- }
-
- [Test]
- public void Magnitude() {
- Vector3 v = new(1, 2, 3);
- float m = 0;
-
- m = v.magnitude;
- Assert.AreEqual(3.7416575f, m, "magnitude 1 2 3");
-
- m = Vector3.MagnitudeOf(v);
- Assert.AreEqual(3.7416575f, m, "MagnitudeOf 1 2 3");
-
- v = new(-1, -2, -3);
- m = v.magnitude;
- Assert.AreEqual(3.7416575f, m, "magnitude -1 -2 -3");
-
- v = new(0, 0, 0);
- m = v.magnitude;
- Assert.AreEqual(0, m, "magnitude 0 0 0");
-
- // Infinity tests are still missing
- }
-
- [Test]
- public void SqrMagnitude() {
- Vector3 v = new(1, 2, 3);
- float m = 0;
-
- m = v.sqrMagnitude;
- Assert.AreEqual(14, m, "sqrMagnitude 1 2 3");
-
- m = Vector3.SqrMagnitudeOf(v);
- Assert.AreEqual(14, m, "SqrMagnitudeOf 1 2 3");
-
- v = new(-1, -2, -3);
- m = v.sqrMagnitude;
- Assert.AreEqual(14, m, "sqrMagnitude -1 -2 -3");
-
- v = new(0, 0, 0);
- m = v.sqrMagnitude;
- Assert.AreEqual(0, m, "sqrMagnitude 0 0 0");
-
- // Infinity tests are still missing
- }
-
- [Test]
- public void Distance() {
- Vector3 v1 = new(4, 5, 6);
- Vector3 v2 = new(1, 2, 3);
- float f;
-
- f = Vector3.Distance(v1, v2);
- Assert.AreEqual(5.19615221F, f, "Distance(4 5 6, 1 2 3)");
-
- v2 = new(-1, -2, -3);
- f = Vector3.Distance(v1, v2);
- Assert.AreEqual(12.4498997F, f, "Distance(4 5 6, -1 -2 -3)");
-
- v2 = new(0, 0, 0);
- f = Vector3.Distance(v1, v2);
- Assert.AreEqual(v1.magnitude, f, "Distance(4 5 6, 0 0 0)");
- }
-
- [Test]
- public void Normalize() {
- Vector3 v = new(0, 2, 0);
- Vector3Float r;
-
- r = v.normalized;
- //Assert.AreEqual(new Vector3(0, 1, 0), r, "normalized 0 2 0");
- Assert.AreEqual(0, r.horizontal, "normalized 0 2 0");
- Assert.AreEqual(1, r.vertical, "normalized 0 2 0");
- Assert.AreEqual(0, r.depth, "normalized 0 2 0");
-
- r = Vector3.Normalize(v);
- Assert.AreEqual(new Vector3Float(0, 1, 0), r, "Normalize 0 2 0");
-
- v = new(0, -2, 0);
- r = v.normalized;
- Assert.AreEqual(new Vector3Float(0, -1, 0), r, "normalized 0 -2 0");
- v = new(0, 0, 0);
- r = v.normalized;
- Assert.AreEqual(new Vector3Float(0, 0, 0), r, "normalized 0 0 0");
- }
-
- [Test]
- public void Negate() {
- Vector3 v = new(4, 5, 6);
- Vector3 r;
-
- r = -v;
- Assert.AreEqual(-4, r.horizontal, "- 4 5 6 H");
- Assert.AreEqual(-5, r.vertical, "- 4 5 6 V");
- Assert.AreEqual(-6, r.depth, "- 4 5 6 D");
-
- v = new(-4, -5, -6);
- r = -v;
- Assert.AreEqual(4, r.horizontal, "- -4 -5 -6 H");
- Assert.AreEqual(5, r.vertical, "- -4 -5 -6 V");
- Assert.AreEqual(6, r.depth, "- -4 -5 -6 D");
-
- v = new(0, 0, 0);
- r = -v;
- Assert.AreEqual(new Vector3(0, 0, 0), r, "- 0 0 0");
- Assert.AreEqual(0, r.horizontal, "- 0 0 0 H");
- Assert.AreEqual(0, r.vertical, "- 0 0 0 V");
- Assert.AreEqual(0, r.depth, "- 0 0 0 D");
- }
-
- [Test]
- public void Subtract() {
- Vector3 v1 = new(4, 5, 6);
- Vector3 v2 = new(1, 2, 3);
- Vector3 r = Vector3.zero;
-
- r = v1 - v2;
- Assert.IsTrue(r == new Vector3(3, 3, 3), "4 5 6 - 1 2 3");
-
- v2 = new(-1, -2, -3);
- r = v1 - v2;
- Assert.IsTrue(r == new Vector3(5, 7, 9), "4 5 6 - -1 -2 -3");
-
- v2 = new(4, 5, 6);
- r = v1 - v2;
- Assert.IsTrue(r == new Vector3(0, 0, 0), "4 5 6 - 4 5 6");
- r = v1;
- r -= v2;
- Assert.AreEqual(r, new Vector3(0, 0, 0), "4 5 6 - 4 5 6");
-
- v2 = new(0, 0, 0);
- r = v1 - v2;
- Assert.AreEqual(r, new Vector3(4, 5, 6), "4 5 6 - 0 0 0");
- r -= v2;
- Assert.AreEqual(r, new Vector3(4, 5, 6), "4 5 6 - 0 0 0");
-
- // Infinity tests are still missing
- }
-
- [Test]
- public void Addition() {
- Vector3 v1 = new(4, 5, 6);
- Vector3 v2 = new(1, 2, 3);
- Vector3 r = Vector3.zero;
-
- r = v1 + v2;
- Assert.IsTrue(r == new Vector3(5, 7, 9), "4 5 6 + 1 2 3");
-
- v2 = new(-1, -2, -3);
- r = v1 + v2;
- Assert.IsTrue(r == new Vector3(3, 3, 3), "4 5 6 + -1 -2 -3");
- r = v1;
- r += v2;
- Assert.AreEqual(r, new Vector3(3, 3, 3), "4 5 6 + -1 -2 -3");
-
- v2 = new(0, 0, 0);
- r = v1 + v2;
- Assert.AreEqual(r, new Vector3(4, 5, 6), "4 5 6 + 0 0 0");
- r += v2;
- Assert.AreEqual(r, new Vector3(4, 5, 6), "4 5 6 + 0 0 0");
-
- // Infinity tests are still missing
- }
-
- [Test]
- public void Scale() {
- Vector3 v1 = new(4, 5, 6);
- Vector3 v2 = new(1, 2, 3);
- Vector3 r;
-
- r = Vector3.Scale(v1, v2);
- Assert.AreEqual(4, r.horizontal, "Scale 4 5 6 , 1 2 3 H");
- Assert.AreEqual(10, r.vertical, "Scale 4 5 6 , 1 2 3 V");
- Assert.AreEqual(18, r.depth, "Scale 4 5 6 , 1 2 3 D");
-
- v2 = new(-1, -2, -3);
- r = Vector3.Scale(v1, v2);
- Assert.AreEqual(-4, r.horizontal, "Scale 4 5 6 , -1 -2 -3 H");
- Assert.AreEqual(-10, r.vertical, "Scale 4 5 6 , -1 -2 -3 V");
- Assert.AreEqual(-18, r.depth, "Scale 4 5 6 , -1 -2 -3 D");
-
- v2 = new(0, 0, 0);
- r = Vector3.Scale(v1, v2);
- Assert.AreEqual(0, r.horizontal, "Scale 4 5 6 , 0 0 0 H");
- Assert.AreEqual(0, r.vertical, "Scale 4 5 6 , 0 0 0 V");
- Assert.AreEqual(0, r.depth, "Scale 4 5 6 , 0 0 0 D");
- }
-
- [Test]
- public void Multiply() {
- Vector3 v1 = new(4, 5, 6);
- int f = 3;
- Vector3 r;
-
- r = v1 * f;
- Assert.AreEqual(12, r.horizontal, "4 5 6 * 3 H");
- Assert.AreEqual(15, r.vertical, "4 5 6 * 3 V");
- Assert.AreEqual(18, r.depth, "4 5 6 * 3 D");
-
- r = f * v1;
- Assert.AreEqual(12, r.horizontal, "3 * 4 5 6 H");
- Assert.AreEqual(15, r.vertical, "3 * 4 5 6 V");
- Assert.AreEqual(18, r.depth, "3 * 4 5 6 D");
-
- f = -3;
- r = v1 * f;
- Assert.AreEqual(-12, r.horizontal, "4 5 6 * -3 H");
- Assert.AreEqual(-15, r.vertical, "4 5 6 * -3 V");
- Assert.AreEqual(-18, r.depth, "4 5 6 * -3 D");
-
- f = 0;
- r = v1 * f;
- Assert.AreEqual(0, r.horizontal, "4 5 6 * 0 H");
- Assert.AreEqual(0, r.vertical, "4 5 6 * 0 V");
- Assert.AreEqual(0, r.depth, "4 5 6 * 0 D");
- }
-
- [Test]
- public void Divide() {
- Vector3 v1 = new(4, 5, 6);
- int f = 2;
- Vector3 r;
-
- r = v1 / f;
- Assert.AreEqual(2, r.horizontal, "4 5 6 / 2 H");
- Assert.AreEqual(2, r.vertical, "4 5 6 / 2 V");
- Assert.AreEqual(3, r.depth, "4 5 6 / 2 D");
-
- f = -2;
- r = v1 / f;
- Assert.AreEqual(-2, r.horizontal, "4 5 6 / -2 H");
- Assert.AreEqual(-2, r.vertical, "4 5 6 / -2 V");
- Assert.AreEqual(-3, r.depth, "4 5 6 / -2 D");
-
- Assert.Throws(() => {
- f = 0;
- r = v1 / f;
- });
- }
-
- [Test]
- public void Dot() {
- Vector3 v1 = new(4, 5, 6);
- Vector3 v2 = new(1, 2, 3);
- float f;
-
- f = Vector3.Dot(v1, v2);
- Assert.AreEqual(32, f, "Dot(4 5 6, 1 2 3)");
-
- v2 = new(-1, -2, -3);
- f = Vector3.Dot(v1, v2);
- Assert.AreEqual(-32, f, "Dot(4 5 6, -1 -2 -3)");
-
- v2 = new(0, 0, 0);
- f = Vector3.Dot(v1, v2);
- Assert.AreEqual(0, f, "Dot(4 5 6, 0 0 0)");
- }
-
- [Test]
- public void Cross() {
- Vector3 v1 = new(4, 5, 6);
- Vector3 v2 = new(1, 2, 3);
- Vector3 r;
-
- r = Vector3.Cross(v1, v2);
- Assert.AreEqual(3, r.horizontal, "Cross(4 5 6, 1 2 3) H");
- Assert.AreEqual(-6, r.vertical, "Cross(4 5 6, 1 2 3) V");
- Assert.AreEqual(3, r.depth, "Cross(4 5 6, 1 2 3) D");
-
- v2 = new(-1, -2, -3);
- r = Vector3.Cross(v1, v2);
- Assert.AreEqual(-3, r.horizontal, "Cross(4 5 6, -1 -2 -3) H");
- Assert.AreEqual(6, r.vertical, "Cross(4 5 6, -1 -2 -3) V");
- Assert.AreEqual(-3, r.depth, "Cross(4 5 6, -1 -2 -3) D");
-
- v2 = new(0, 0, 0);
- r = Vector3.Cross(v1, v2);
- Assert.AreEqual(0, r.horizontal, "Cross(4 5 6, 0 0 0) H");
- Assert.AreEqual(0, r.vertical, "Cross(4 5 6, 0 0 0) V");
- Assert.AreEqual(0, r.depth, "Cross(4 5 6, 0 0 0) D");
- }
-
- [Test]
- public void UnsignedAngle() {
- Vector3 v1 = new(4, 5, 6);
- Vector3 v2 = new(1, 2, 3);
- AngleFloat a;
-
- a = Vector3.UnsignedAngle(v1, v2);
- Assert.AreEqual(12.9331379F, a.inDegrees, "Angle(4 5 6, 1 2 3)");
-
- v2 = new(-1, -2, -3);
- a = Vector3.UnsignedAngle(v1, v2);
- Assert.AreEqual(167.066849F, a.inDegrees, "Angle(4 5 6, -1 -2 -3)");
-
- v2 = new(0, 0, 0);
- a = Vector3.UnsignedAngle(v1, v2);
- Assert.AreEqual(0, a.inDegrees, "Angle(4 5 6, 0 0 0)");
- }
-
- [Test]
- public void SignedAngle() {
- Vector3 v1 = new(4, 5, 6);
- Vector3 v2 = new(1, 2, 3);
- Vector3 v3 = new(7, 8, -9);
- AngleFloat a;
-
- a = Vector3.SignedAngle(v1, v2, v3);
- Assert.AreEqual(-12.9331379F, a.inDegrees, "SignedAngle(4 5 6, 1 2 3, 7 8 -9)");
-
- v2 = new(-1, -2, -3);
- a = Vector3.SignedAngle(v1, v2, v3);
- Assert.AreEqual(167.066849F, a.inDegrees, "SignedAngle(4 5 6, -1 -2 -3, 7 8 -9)");
-
- v2 = new(0, 0, 0);
- a = Vector3.SignedAngle(v1, v2, v3);
- Assert.AreEqual(0, a.inDegrees, "SignedAngle(4 5 6, 0 0 0, 7 8 -9)");
-
- v2 = new(1, 2, 3);
- v3 = new(-7, -8, 9);
- a = Vector3.SignedAngle(v1, v2, v3);
- Assert.AreEqual(12.9331379F, a.inDegrees, "SignedAngle(4 5 6, 1 2 3, -7 -8 9)");
-
- v3 = new(0, 0, 0);
- a = Vector3.SignedAngle(v1, v2, v3);
- Assert.AreEqual(0, a.inDegrees, "SignedAngle(4 5 6, 1 2 3, 0 0 0)");
- }
- }
-}
-#endif
\ No newline at end of file
diff --git a/Runtime/Scripts/Brain.cs b/Runtime/Scripts/Brain.cs
index acb28f3..afffba0 100644
--- a/Runtime/Scripts/Brain.cs
+++ b/Runtime/Scripts/Brain.cs
@@ -45,7 +45,7 @@ namespace NanoBrain {
/// The name of the Neuron for which the weights are updated
/// The new Synapse weight
public static void UpdateWeight(Cluster brain, string name, float weight) {
- Nucleus root = brain.defaultOutput;
+ Neuron root = brain.defaultOutput;
foreach (Synapse synapse in root.synapses) {
if (synapse.neuron.name == name) {
if (synapse.weight != weight) {
diff --git a/Runtime/Scripts/Brain.cs.meta b/Runtime/Scripts/Brain.cs.meta
index 1666c60..fc8b1c9 100644
--- a/Runtime/Scripts/Brain.cs.meta
+++ b/Runtime/Scripts/Brain.cs.meta
@@ -1,2 +1,11 @@
fileFormatVersion: 2
-guid: 92f34a5e4027a1dc39efd8ce63cf6aba
\ No newline at end of file
+guid: 92f34a5e4027a1dc39efd8ce63cf6aba
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Runtime/Scripts/Core/Cluster.cs b/Runtime/Scripts/Core/Cluster.cs
index 87366f3..8779e03 100644
--- a/Runtime/Scripts/Core/Cluster.cs
+++ b/Runtime/Scripts/Core/Cluster.cs
@@ -17,6 +17,10 @@ namespace NanoBrain {
public class Cluster : Nucleus {
// It may be that clusters will not be nuclei anymore in the future....
+ ///
+ /// The prefab used to create this cluster
+ ///
+ /// Cluster should always be created from prefabs
public ClusterPrefab prefab;
///
@@ -31,20 +35,37 @@ namespace NanoBrain {
}
}
- // This should not be serialized
- //[SerializeReference]
+ ///
+ /// All cluster instance of a multi-cluster
+ ///
+ /// A cluster is a multi-cluster when there is more than one instance.
+ /// The actual instances are only created at runtime.
+ /// The value instanceCount determines how many instances will be present at runtime.
[NonSerialized]
- public Cluster[] siblingClusters;
- // This serialization should be enough
+ public Cluster[] instances;
+
+ ///
+ /// The number of cluster instances in a multi-cluster
+ ///
+ /// A cluster is a multi-clsuter when there is more than one instance.
[SerializeField]
public int instanceCount = 1;
+ ///
+ /// The mapping from things to cluster instances
+ ///
+ /// In a multi-cluster each instance can be used for a thing.
+ /// Cluster instance may also not (yet) be mapped to a thing.
public Dictionary thingClusters = new();
+ ///
+ /// All nuclei in this cluster
+ ///
[SerializeReference]
- public List clusterNuclei = new();
+ public List nuclei = new();
// the nuclei sorted using topological sorting
// to ensure that the cluster is computer in the right order
- public List sortedNuclei;
+
+ //public List sortedNuclei;
#region Init
@@ -58,10 +79,10 @@ namespace NanoBrain {
this.name = prefab.name;
this.parent = parent;
- this.parent?.clusterNuclei.Add(this);
+ this.parent?.nuclei.Add(this);
ClonePrefab();
- _ = this.inputs;
- this.sortedNuclei = TopologicalSort(this.clusterNuclei);
+ // _ = this.inputs;
+ //this.sortedNuclei = TopologicalSort(this.nuclei);
}
///
@@ -72,14 +93,12 @@ namespace NanoBrain {
public Cluster(ClusterPrefab prefab, ClusterPrefab parent = null) {
this.prefab = prefab;
this.name = prefab.name;
- this.clusterPrefab = parent;
-
- if (this.clusterPrefab != null)
- this.clusterPrefab.nuclei.Add(this);
+ if (parent != null)
+ this.parent = parent.cluster;
ClonePrefab();
- _ = this.inputs;
- this.sortedNuclei = TopologicalSort(this.clusterNuclei);
+ // _ = this.inputs;
+ //this.sortedNuclei = TopologicalSort(this.nuclei);
}
///
@@ -88,15 +107,13 @@ namespace NanoBrain {
/// Strange that this does not take any parameters or return values.
/// Where which the clone be found???
private void ClonePrefab() {
- Nucleus[] prefabNuclei = this.prefab.nuclei.ToArray();
+ Nucleus[] prefabNuclei = this.prefab.cluster.nuclei.ToArray();
// first clone the nuclei without their connections
foreach (Nucleus nucleus in prefabNuclei) {
nucleus.ShallowCloneTo(this);
}
- Nucleus[] clonedNuclei = this.clusterNuclei.ToArray();
- // foreach (Nucleus n in clonedNuclei)
- // n.name += "(c)";
+ Nucleus[] clonedNuclei = this.nuclei.ToArray();
// Now clone the connections
for (int nucleusIx = 0; nucleusIx < prefabNuclei.Length; nucleusIx++) {
@@ -110,10 +127,10 @@ namespace NanoBrain {
foreach (Synapse prefabSynapse in prefabNeuron.synapses) {
Neuron synapseNeuron = prefabSynapse.neuron;
- if (synapseNeuron.clusterPrefab != null && synapseNeuron.clusterPrefab != this.prefab) {
+ if (synapseNeuron.parent.prefab != null && synapseNeuron.parent.prefab != this.prefab) {
// Neuron is in another cluster, find the cloned cluster first
- ClusterPrefab prefabCluster = synapseNeuron.clusterPrefab;
- Cluster clonedCluster = this.clusterNuclei.Find(n => n.name == prefabCluster.name) as Cluster;
+ Cluster prefabCluster = synapseNeuron.parent;
+ Cluster clonedCluster = this.nuclei.Find(n => n.name == prefabCluster.name) as Cluster;
if (clonedCluster == null)
continue;
@@ -122,7 +139,7 @@ namespace NanoBrain {
if (neuronIx < 0)
// Could not find the neuron in the prefab cluster
continue;
- if (clonedCluster.clusterNuclei[neuronIx] is not Neuron clonedSender)
+ if (clonedCluster.nuclei[neuronIx] is not Neuron clonedSender)
// Could not find the neuron in the cloned cluster
continue;
@@ -130,7 +147,7 @@ namespace NanoBrain {
//Debug.Log($"Add synapse {clonedCluster.name}.{clonedSender.name} -> {clonedNeuron.name} [{clonedSender.receivers.Count}]");
}
else {
- int ix = GetNucleusIndex(prefabNuclei, prefabSynapse.neuron);
+ int ix = GetNucleusIndex(this.prefab.cluster.nuclei, prefabSynapse.neuron);
if (ix < 0)
continue;
if (clonedNuclei[ix] is not Neuron clonedSender)
@@ -141,28 +158,6 @@ namespace NanoBrain {
// Debug.Log($"Add synapse {clonedSender.name} -> {clonedNeuron.name}");
}
}
-
- // // Copy the receivers, which will also create the synapses
- // foreach (Nucleus receiver in prefabNeuron.receivers.ToArray()) {
- // int ix = GetNucleusIndex(prefabNuclei, receiver);
- // if (ix < 0)
- // continue;
-
- // if (clonedNuclei[ix] is not Nucleus clonedReceiver)
- // continue;
-
- // // Find the synapse for the weight
- // float weight = 1;
- // foreach (Synapse synapse in receiver.synapses) {
- // // Find the weight for this synapse
- // if (synapse.neuron == prefabNucleus) {
- // weight = synapse.weight;
- // break;
- // }
- // }
-
- // clonedNeuron.AddReceiver(clonedReceiver, weight);
- // }
}
if (Application.isPlaying) {
@@ -179,7 +174,7 @@ namespace NanoBrain {
Debug.Log($"create {clonedCluster.prefab.name} sibling");
Cluster sibling = new(clonedCluster.prefab, this) {
name = $"{clonedCluster.baseName}: {instanceIx}",
- clusterPrefab = this.clusterPrefab,
+ parent = this.parent,
instanceCount = this.instanceCount,
};
siblings.Add(sibling);
@@ -187,226 +182,104 @@ namespace NanoBrain {
}
Cluster[] siblingClusters = siblings.ToArray();
foreach (Cluster sibling in siblings)
- sibling.siblingClusters = siblingClusters;
+ sibling.instances = siblingClusters;
+ }
+
+ // Ensure that all neurons are computed to initialize bias
+ foreach (Nucleus clonedNucleus in clonedNuclei) {
+ if (clonedNucleus is not Cluster)
+ clonedNucleus.UpdateStateIsolated();
}
}
- /*
- for (int nucleusIx = 0; nucleusIx < clonedNuclei.Length; nucleusIx++) {
- Nucleus prefabNucleus = prefabNuclei[nucleusIx];
- if (prefabNucleus is not Cluster prefabCluster)
- continue;
-
- if (prefabCluster.instanceCount <= 1)
- continue;
-
- Cluster clonedNucleus = clonedNuclei[nucleusIx] as Cluster;
- if (prefabCluster == prefabCluster.siblingClusters[0]) {
- // We clone the array only for the first entry
- //NucleusArray clonedArray = new(prefabReceptor.nucleiArray.Length);
- Cluster[] clonedArray = new Cluster[prefabCluster.siblingClusters.Length];
- int arrayIx = 0;
- foreach (Cluster prefabArrayNucleus in prefabCluster.siblingClusters) {
- int arrayNucleusIx = GetNucleusIndex(prefabNuclei, prefabArrayNucleus);
- if (arrayNucleusIx >= 0) {
- Cluster clonedArrayNucleus = clonedNuclei[arrayNucleusIx] as Cluster;
- clonedArray[arrayIx] = clonedArrayNucleus;
- }
- else {
- Debug.LogError($" Could not find prefab nucleus {prefabNucleus.name} in the clones");
- }
- arrayIx++;
- }
- clonedNucleus.siblingClusters = clonedArray;
- }
- else {
- // The others will refer to the array created for the first nucleus in the array
- int firstNucleusIx = GetNucleusIndex(prefabNuclei, prefabCluster.siblingClusters[0]);
- Cluster clonedFirstNucleus = clonedNuclei[firstNucleusIx] as Cluster;
- clonedNucleus.siblingClusters = clonedFirstNucleus.siblingClusters;
- }
- }
}
- /*
- // Collect the subclusters
- List subClusters = new();
- foreach (Nucleus nucleus in prefabNuclei) {
- foreach (Synapse synapse in nucleus.synapses) {
- Nucleus synapseNucleus = synapse.neuron;
- Cluster subCluster = synapseNucleus.parent;
- if (subCluster is null ||
- synapseNucleus.clusterPrefab == this.clusterPrefab) {
+ // ///
+ // /// Sort the nuclei in a correct evaluation order
+ // ///
+ // ///
+ // ///
+ // ///
+ // private List TopologicalSort(List nodes) {
+ // Dictionary inDegree = new();
+ // foreach (Nucleus node in nodes)
+ // inDegree[node] = 0; // Initialize in-degree to zero
- continue;
- }
- // if (synapseNucleus is not Cluster subCluster)
- // continue;
- if (subClusters.Contains(subCluster))
- continue;
- subClusters.Add(subCluster);
- }
- }
- // Create the subcluster instances
- foreach (Cluster subCluster in subClusters) {
- for (int ix = 0; ix < subCluster.instanceCount; ix++) {
- // create the new instance
- Cluster clusterInstance = new(subCluster.prefab);
- // connect it
- foreach ((Neuron sender, Nucleus receiver) in subCluster.CollectConnections()) {
- int receiverIx = GetNucleusIndex(prefabNuclei, receiver);
- if (receiverIx < 0)
- continue;
+ // // Calculate in-degrees
+ // foreach (Nucleus node in nodes) {
+ // if (node is Cluster cluster) {
+ // foreach (Nucleus receiver in cluster.CollectReceivers())
+ // inDegree[receiver]++;
+ // }
+ // else if (node is Neuron neuron) {
+ // foreach (Nucleus receiver in neuron.receivers)
+ // inDegree[receiver]++;
+ // }
+ // }
- if (clonedNuclei[receiverIx] is not Nucleus clonedReceiver)
- continue;
+ // Queue queue = new();
+ // foreach (Nucleus node in nodes) {
+ // if (inDegree[node] == 0) // Nodes with no dependencies
+ // queue.Enqueue(node);
+ // }
+ // // The queue basically stores all input nuclei?
- // Find the synapse for the weight
- float weight = 1;
- foreach (Synapse synapse in receiver.synapses) {
- // Find the weight for this synapse
- if (synapse.neuron == sender) {
- weight = synapse.weight;
- break;
- }
- }
+ // List sortedOrder = new();
+ // while (queue.Count > 0) {
+ // Nucleus current = queue.Dequeue();
+ // sortedOrder.Add(current); // Process the node
- if (clusterInstance.GetNucleus(sender.name) is not Neuron clonedSender)
- continue;
+ // if (current is Neuron neuron) {
+ // foreach (Nucleus receiver in neuron.receivers) {
+ // inDegree[receiver]--;
+ // if (inDegree[receiver] == 0) // If all dependencies resolved
+ // queue.Enqueue(receiver);
+ // }
+ // }
+ // else if (current is Cluster cluster) {
+ // foreach (Nucleus receiver in cluster.CollectReceivers()) {
+ // inDegree[receiver]--;
+ // if (inDegree[receiver] == 0) // If all dependencies resolved
+ // queue.Enqueue(receiver);
+ // }
+ // }
+ // }
- clonedSender.AddReceiver(clonedReceiver, weight);
- }
- }
- }
- */
+ // // Check for cycles in the graph
+ // if (sortedOrder.Count != nodes.Count)
+ // throw new InvalidOperationException("Graph is not a DAG; a cycle exists.");
- // foreach (Nucleus nucleus in this.clusterNuclei) {
- // if (nucleus is Cluster clonedSubCluster)
- // RestoreAllExternalReceivers(clonedSubCluster, this.prefab, this);
- // }
- }
+ // return sortedOrder;
+ // }
- private void CloneSynapses(Neuron prefabNeuron, Neuron clonedNeuron) {
- foreach (Synapse prefabSynapse in prefabNeuron.synapses) {
- Neuron synapseNeuron = prefabSynapse.neuron;
- if (synapseNeuron.clusterPrefab != null && synapseNeuron.clusterPrefab != this.prefab) {
- // Neuron is in another cluster, find the cloned cluster first
- ClusterPrefab prefabCluster = synapseNeuron.clusterPrefab;
- Cluster clonedCluster = this.clusterNuclei.Find(n => n.name == prefabCluster.name) as Cluster;
- if (clonedCluster == null)
- continue;
- // Now find the neuron in that cloned cluster
- int neuronIx = GetNucleusIndex(prefabCluster.nuclei, prefabSynapse.neuron.name);
- if (neuronIx < 0)
- // Could not find the neuron in the prefab cluster
- continue;
- if (clonedCluster.clusterNuclei[neuronIx] is not Neuron clonedSender)
- // Could not find the neuron in the cloned cluster
- continue;
+ // public override Nucleus Clone(ClusterPrefab parent) {
+ // Cluster clone = new(this.prefab, parent);
- clonedSender.AddReceiver(clonedNeuron, prefabSynapse.weight);
- //Debug.Log($"Add synapse {clonedCluster.name}.{clonedSender.name} -> {clonedNeuron.name} [{clonedSender.receivers.Count}]");
- }
- else {
- Neuron clonedSender = this.clusterNuclei.Find(n => n.name == prefabSynapse.neuron.name) as Neuron;
- // Copy the receivers which will also create the synapse
- clonedSender.AddReceiver(clonedNeuron, prefabSynapse.weight);
- // Debug.Log($"Add synapse {clonedSender.name} -> {clonedNeuron.name}");
- }
- }
+ // foreach (Nucleus nucleus in this.nuclei) {
+ // if (nucleus is Neuron output) {
+ // foreach (Nucleus receiver in output.receivers) {
+ // int ix = GetNucleusIndex(this.nuclei, output);
+ // Debug.Log($"{output.name} -> {receiver.name}: {ix}");
+ // if (ix < 0)
+ // continue;
- }
+ // if (clone.nuclei[ix] is not Neuron clonedOutput)
+ // continue;
- ///
- /// Sort the nuclei in a correct evaluation order
- ///
- ///
- ///
- ///
- private List TopologicalSort(List nodes) {
- Dictionary inDegree = new();
- foreach (Nucleus node in nodes)
- inDegree[node] = 0; // Initialize in-degree to zero
+ // clonedOutput.AddReceiver(receiver);
+ // }
+ // }
+ // }
- // Calculate in-degrees
- foreach (Nucleus node in nodes) {
- if (node is Cluster cluster) {
- foreach (Nucleus receiver in cluster.CollectReceivers())
- inDegree[receiver]++;
- }
- else if (node is Neuron neuron) {
- foreach (Nucleus receiver in neuron.receivers)
- inDegree[receiver]++;
- }
- }
-
- Queue queue = new();
- foreach (Nucleus node in nodes) {
- if (inDegree[node] == 0) // Nodes with no dependencies
- queue.Enqueue(node);
- }
- // The queue basically stores all input nuclei?
-
- List sortedOrder = new();
- while (queue.Count > 0) {
- Nucleus current = queue.Dequeue();
- sortedOrder.Add(current); // Process the node
-
- if (current is Neuron neuron) {
- foreach (Nucleus receiver in neuron.receivers) {
- inDegree[receiver]--;
- if (inDegree[receiver] == 0) // If all dependencies resolved
- queue.Enqueue(receiver);
- }
- }
- else if (current is Cluster cluster) {
- foreach (Nucleus receiver in cluster.CollectReceivers()) {
- inDegree[receiver]--;
- if (inDegree[receiver] == 0) // If all dependencies resolved
- queue.Enqueue(receiver);
- }
- }
- }
-
- // Check for cycles in the graph
- if (sortedOrder.Count != nodes.Count)
- throw new InvalidOperationException("Graph is not a DAG; a cycle exists.");
-
- return sortedOrder;
- }
-
- public override Nucleus Clone(ClusterPrefab parent) {
- Cluster clone = new(this.prefab, parent);
-
- foreach (Synapse synapse in this.synapses) {
- Synapse clonedSynapse = clone.AddSynapse(synapse.neuron);
- clonedSynapse.weight = synapse.weight;
- }
-
- foreach (Nucleus nucleus in this.clusterNuclei) {
- if (nucleus is Neuron output) {
- foreach (Nucleus receiver in output.receivers) {
- int ix = GetNucleusIndex(this.clusterNuclei, output);
- Debug.Log($"{output.name} -> {receiver.name}: {ix}");
- if (ix < 0)
- continue;
-
- if (clone.clusterNuclei[ix] is not Neuron clonedOutput)
- continue;
-
- clonedOutput.AddReceiver(receiver);
- }
- }
- }
-
- return clone;
- }
+ // return clone;
+ // }
+ /// \copydoc NanoBrain::Nucleus::ShallowCloneTo
public override Nucleus ShallowCloneTo(Cluster parent) {
// Clusters should not be cloned, but instantiated from the prefab....
Cluster clone = new(this.prefab, parent) {
name = this.name,
- clusterPrefab = this.clusterPrefab,
+ parent = this.parent,
instanceCount = this.instanceCount,
};
// Somehow siblingClusters should be cloned too. Believe I do this in ClonePrefab right now.
@@ -416,23 +289,26 @@ namespace NanoBrain {
private static void CopyAllExternalReceivers(Cluster sourceCluster, Cluster sibling, ClusterPrefab prefabParent, Cluster clonedParent) {
- for (int nucleusIx = 0; nucleusIx < sourceCluster.clusterNuclei.Count; nucleusIx++) {
- Nucleus sourceNucleus = sourceCluster.clusterNuclei[nucleusIx];
+ for (int nucleusIx = 0; nucleusIx < sourceCluster.nuclei.Count; nucleusIx++) {
+ Nucleus sourceNucleus = sourceCluster.nuclei[nucleusIx];
if (sourceNucleus is not Neuron sourceNeuron)
continue;
- if (sibling.clusterNuclei[nucleusIx] is not Neuron clonedNeuron)
+ if (sibling.nuclei[nucleusIx] is not Neuron clonedNeuron)
continue;
// copy the receivers (and thus synapses) from the source to the sibling
foreach (Nucleus receiver in sourceNeuron.receivers) {
- int ix = GetNucleusIndex(clonedParent.clusterNuclei, receiver);
- if (ix < 0 || ix >= clonedParent.clusterNuclei.Count)
+ if (receiver is not Neuron receiverNeuron)
+ continue;
+
+ int ix = GetNucleusIndex(clonedParent.nuclei, receiver);
+ if (ix < 0 || ix >= clonedParent.nuclei.Count)
continue;
// Find the synapse for the weight
float weight = 1;
- foreach (Synapse synapse in receiver.synapses) {
+ foreach (Synapse synapse in receiverNeuron.synapses) {
// Find the weight for this synapse
if (synapse.neuron == sourceNucleus) {
weight = synapse.weight;
@@ -447,14 +323,12 @@ namespace NanoBrain {
}
- protected int GetNucleusIndex(Nucleus[] nuclei, Nucleus nucleus) {
- for (int i = 0; i < nuclei.Length; i++) {
- if (nucleus == nuclei[i])
- return i;
- }
- return -1;
- }
-
+ ///
+ /// Get the index of a nucleus in a list of nuclei
+ ///
+ /// The list of nuclei to search
+ /// The nucleus to find
+ /// The index of the nucleus in the list or -1 when it has not been found
public static int GetNucleusIndex(List nuclei, Nucleus nucleus) {
int i = 0;
foreach (Nucleus nucleiElement in nuclei) {
@@ -466,6 +340,12 @@ namespace NanoBrain {
return -1;
}
+ ///
+ /// Get the index of a nucleus with the given name in a list of nuclei
+ ///
+ /// The list of nuclei to search
+ /// The name of the nucleus to find
+ /// The index of the nucleus in the list or -1 when it has not been found
public static int GetNucleusIndex(List nuclei, string nucleusName) {
int i = 0;
foreach (Nucleus nucleiElement in nuclei) {
@@ -477,28 +357,39 @@ namespace NanoBrain {
return -1;
}
-
#endregion Init
#region Cluster Array
+ ///
+ /// Increase the number of instances in an multi-cluster
+ ///
+ /// /remark Note this does not create the instances.
+ /// This is only intended to be used for prefabs.
public void AddInstance() {
this.instanceCount++;
}
+ ///
+ /// Create an new instance in a multi-cluster
+ ///
+ /// The prefab to use to create the new instance
+ /// /remark This does not change the instanceCount.
+ /// It should only be used at runtime.
public void AddInstance(ClusterPrefab prefab) {
// Ensure siblingClusters exists
- if (this.siblingClusters == null || this.siblingClusters.Length == 0)
- this.siblingClusters = new Cluster[1] { this };
+ if (this.instances == null || this.instances.Length == 0)
+ this.instances = new Cluster[1] { this };
// Prepare the new array
- int newLength = this.siblingClusters.Length + 1;
+ int newLength = this.instances.Length + 1;
Cluster[] newSiblings = new Cluster[newLength];
for (int i = 0; i < newSiblings.Length - 1; i++)
- newSiblings[i] = this.siblingClusters[i];
+ newSiblings[i] = this.instances[i];
- Cluster newCluster = this.Clone(prefab) as Cluster;
+ //Cluster newCluster = this.Clone(prefab) as Cluster;
+ Cluster newCluster = new(prefab);
string baseName = this.name;
int colonPos = baseName.IndexOf(":");
if (colonPos > 0)
@@ -508,65 +399,37 @@ namespace NanoBrain {
// All siblingClusters need to user this array!
foreach (Cluster sibling in newSiblings)
- sibling.siblingClusters = newSiblings;
+ sibling.instances = newSiblings;
}
+ ///
+ /// Decrease the number of instance in a multi-cluster
+ ///
public void RemoveInstance() {
if (instanceCount > 1)
instanceCount--;
else {
- if (this.siblingClusters == null || this.siblingClusters.Length <= 1)
+ // It is not clear to me why we update the siblingClusters when the
+ // instanceCount <= 1....
+ if (this.instances == null || this.instances.Length <= 1)
return;
// Prepare the new array
- int newLength = this.siblingClusters.Length - 1;
+ int newLength = this.instances.Length - 1;
Cluster[] newClusters = new Cluster[newLength];
for (int i = 0; i < newLength; i++)
- newClusters[i] = this.siblingClusters[i];
+ newClusters[i] = this.instances[i];
- Neuron.Delete(this.siblingClusters[^1]);
- this.siblingClusters = newClusters;
+ Neuron.Delete(this.instances[^1]);
+ this.instances = newClusters;
}
}
- public virtual Cluster GetThingCluster() {
- Cluster selectedCluster = SelectCluster();
- return selectedCluster;
- }
- public virtual Cluster GetThingCluster(int thingId, string thingName = null) {
- if (thingClusters.TryGetValue(thingId, out Cluster cluster))
- return cluster;
-
- Cluster selectedCluster = SelectCluster();
- selectedCluster.name = baseName + ": " + thingName;
- thingClusters[thingId] = selectedCluster;
- return selectedCluster;
- }
-
- private Cluster SelectCluster() {
- if (this.siblingClusters == null)
- return this;
-
- // Find a sleeping cluster
- foreach (Cluster cluster in this.siblingClusters) {
- if (cluster.defaultOutput.isSleeping) {
- RemoveThingCluster(cluster);
- return cluster;
- }
- }
-
- // Otherwise find longest unused cluster
- Cluster unusedCluster = this.siblingClusters[0];
- for (int ix = 1; ix < this.siblingClusters.Length; ix++) {
- if (this.siblingClusters[ix].defaultOutput.lastUpdate < unusedCluster.defaultOutput.lastUpdate)
- unusedCluster = this.siblingClusters[ix];
- }
-
- RemoveThingCluster(unusedCluster);
- return unusedCluster;
- }
-
+ ///
+ /// Remove a mapping from a thing to a cluster such that it becomes available for new things
+ ///
+ /// The multi-cluster instance which not no longer be mapped
private void RemoveThingCluster(Cluster cluster) {
List keysToRemove = new();
foreach (KeyValuePair kvp in thingClusters) {
@@ -578,60 +441,68 @@ namespace NanoBrain {
thingClusters.Remove(thingId);
}
- public bool SameSiblingsAs(Cluster[] otherSiblingClusters) {
- if (this.siblingClusters == null)
- return false;
- for (int ix = 0; ix < this.siblingClusters.Length; ix++) {
- if (this.siblingClusters[ix] != otherSiblingClusters[ix])
- return false;
- }
- return true;
- }
+ // public bool SameSiblingsAs(Cluster[] otherSiblingClusters) {
+ // if (this.siblingClusters == null)
+ // return false;
+ // for (int ix = 0; ix < this.siblingClusters.Length; ix++) {
+ // if (this.siblingClusters[ix] != otherSiblingClusters[ix])
+ // return false;
+ // }
+ // return true;
+ // }
- public void AddArrayReceiver(Nucleus receiverToAdd, float weight = 1) {
- this.defaultOutput.AddReceiver(receiverToAdd, weight);
- // foreach (Cluster cluster in this.siblingClusters) {
- // cluster.defaultOutput.AddReceiver(receiverToAdd, weight);
- // }
+ // public void AddArrayReceiver(Nucleus receiverToAdd, float weight = 1) {
+ // this.defaultOutput.AddReceiver(receiverToAdd, weight);
+ // // foreach (Cluster cluster in this.siblingClusters) {
+ // // cluster.defaultOutput.AddReceiver(receiverToAdd, weight);
+ // // }
- }
+ // }
#endregion ClusterArray
- public List _inputs = null;
- public virtual List inputs {
+
+ // private List _inputs = null;
+ // public virtual List inputs {
+ // get {
+ // if (this._inputs == null) {
+ // this._inputs = new();
+ // foreach (Nucleus nucleus in this.nuclei) {
+ // if (nucleus is not Neuron neuron)
+ // continue;
+
+ // // inputs have no synapses
+ // if (neuron.synapses.Count == 0)
+ // this._inputs.Add(nucleus);
+ // }
+ // RefreshComputeOrders();
+ // }
+ // return this._inputs;
+ // }
+ // }
+
+ ///
+ /// This gives the order in which nuclei should be computed when a nucleus is updated
+ ///
+ private Dictionary> _computeOrders;
+ ///
+ /// This gives the order in which nuclei should be computed when a nucleus is updated
+ ///
+ public Dictionary> computeOrders {
get {
- if (this._inputs == null) {
- this._inputs = new();
- foreach (Nucleus nucleus in this.clusterNuclei) {
- // inputs have no synapses
- if (nucleus.synapses.Count == 0)
- this._inputs.Add(nucleus);
- }
- ComputeOrders();
+ if (_computeOrders == null || _computeOrders.Count == 0) {
+ _computeOrders = new();
+ foreach (Nucleus nucleus in this.nuclei)
+ _computeOrders[nucleus] = TopologicalSort2(nucleus);
}
- return this._inputs;
+ return _computeOrders;
}
}
-
- public Dictionary> computeOrders = new();
- private void ComputeOrders() {
- foreach (Nucleus nucleus in this.clusterNuclei) {
- // if (nucleus is Cluster cluster) {
- // List synapses = this.CollectSynapsesTo(cluster);
- // foreach (Synapse synapse in synapses) {
- // computeOrders[synapse.neuron] = TopologicalSort2(synapse.neuron);
- // Debug.Log($"{this.baseName}: Order for {cluster.baseName}.{synapse.neuron.name}");
- // }
- // // List receivers = cluster.CollectReceivers();
- // // foreach (Nucleus receiver in receivers)
- // // computeOrders[receiver] = TopologicalSort2(receiver);
- // }
- // else {
- computeOrders[nucleus] = TopologicalSort2(nucleus);
- Debug.Log($"{this.baseName} Order for {nucleus.name}");
- // }
- }
+ ///
+ /// Refresh the order in which neurons should be computed
+ ///
+ public void RefreshComputeOrders() {
+ this._computeOrders = null;
}
private List TopologicalSort2(Nucleus startNode) {
@@ -696,19 +567,31 @@ namespace NanoBrain {
return sortedOrder;
}
+ ///
+ /// The first nucleus in a cluster is the default output
+ ///
public virtual Neuron defaultOutput {//=> this.nuclei[0] as Nucleus;
get {
- if (this.clusterNuclei.Count > 0)
- return this.clusterNuclei[0] as Neuron;
+ if (this.nuclei.Count > 0)
+ return this.nuclei[0] as Neuron;
return null;
}
}
+
+ ///
+ /// The neurons without outgoing connections
+ ///
+ /// These neurons can potentially be connected to neurons in other clusters
protected List _outputs = null;
+ ///
+ /// The neurons without outgoing connections
+ ///
+ /// These neurons can potentially be connected to neurons in other clusters
public List outputs {
get {
- if (this._outputs == null) {
+ if (this._outputs == null || this._outputs.Count == 0) {
this._outputs = new();
- foreach (Nucleus nucleus in this.clusterNuclei) {
+ foreach (Nucleus nucleus in this.nuclei) {
if (nucleus is Neuron neuron && neuron.receivers.Count == 0)
this._outputs.Add(neuron);
}
@@ -716,12 +599,21 @@ namespace NanoBrain {
return this._outputs;
}
}
+ ///
+ /// Reset the list of outputs such that they will be re-determined
+ ///
public void RefreshOutputs() {
this._outputs = null;
}
+ ///
+ /// Try to find a nucleus in this cluster
+ ///
+ /// The name of the nucleus to find
+ /// The found nucleus or null if it is not found
+ /// True when the nucleus is found, false otherwise
public bool TryGetNucleus(string nucleusName, out Nucleus foundNucleus) {
- foreach (Nucleus receptor in this.clusterNuclei) {
+ foreach (Nucleus receptor in this.nuclei) {
if (receptor is Nucleus nucleus)
if (nucleus.name == nucleusName) {
foundNucleus = nucleus;
@@ -732,12 +624,17 @@ namespace NanoBrain {
return false;
}
+ ///
+ /// Get a nucleus in this cluster
+ ///
+ /// The name of the nucleus to find
+ /// The found nucleus or null when it is not found
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.clusterNuclei) {
+ foreach (Nucleus nucleus in this.nuclei) {
if (nucleus is Cluster cluster) {
if (cluster.name == clusterName || cluster.name == clusterName0) {
string subNucleusName = nucleusName[(dotPosition + 1)..];
@@ -749,9 +646,9 @@ namespace NanoBrain {
}
else {
string nucleusName0 = nucleusName + ": 0";
- foreach (Nucleus nucleus in this.clusterNuclei) {
- if (nucleus is Cluster) { //IReceptor receptor) {
- if (nucleus.name == nucleusName | nucleus.name == nucleusName0)
+ foreach (Nucleus nucleus in this.nuclei) {
+ if (nucleus is Cluster) {
+ if (nucleus.name == nucleusName || nucleus.name == nucleusName0)
return nucleus;
}
else if (nucleus.name == nucleusName)
@@ -761,17 +658,89 @@ namespace NanoBrain {
}
}
+ ///
+ /// Get a neuron in this cluster
+ ///
+ /// The name of the neuron to find
+ /// The found neuron or null when it is not found
+ public Neuron GetNeuron(string neuronName) {
+ foreach (Nucleus nucleus in this.nuclei) {
+ if (nucleus is Neuron neuron && neuron.name == neuronName)
+ return neuron;
+ }
+ return null;
+ }
+
+ ///
+ /// Get a neuron in an instance of a multi-cluster
+ ///
+ /// The id of the thing mapped to the cluster instance
+ /// The name of the neuron to find
+ /// The name of the thing mapped to the cluster instance
+ /// The found neuron or null when it is not found
+ /// The cluster instance mapped to the thing will be neuron.parent if a neuron is found.
+ public Neuron GetNeuron(int thingId, string neuronName, string thingName = null) {
+ if (this.instances == null || this.instances.Length <= 1)
+ return this.GetNeuron(neuronName);
+
+ // See if we are already using a cluster for thingId
+ if (thingClusters.TryGetValue(thingId, out Cluster cluster))
+ return cluster.GetNeuron(neuronName);
+
+ // Find the cluster with the lowest value neuron
+ Neuron lowestNeuron = null;
+ foreach (Cluster sibling in this.instances) {
+ Neuron neuron = sibling.GetNeuron(neuronName);
+ if (lowestNeuron == null || neuron.outputMagnitude < lowestNeuron.outputMagnitude)
+ lowestNeuron = neuron;
+ }
+ Cluster selectedCluster = lowestNeuron.parent;
+ RemoveThingCluster(selectedCluster);
+ selectedCluster.name = baseName + ": " + thingName;
+ thingClusters[thingId] = selectedCluster;
+ return lowestNeuron;
+ /*
+ // Find a sleeping cluster
+ // foreach (Cluster cluster in this.siblingClusters) {
+ // if (cluster.defaultOutput.isSleeping) {
+ // RemoveThingCluster(cluster);
+ // return cluster;
+ // }
+ // }
+
+ // Find longest unused cluster
+ // Note this uses the default output...
+ Cluster unusedCluster = this.siblingClusters[0];
+ for (int ix = 1; ix < this.siblingClusters.Length; ix++) {
+ if (this.siblingClusters[ix].defaultOutput.lastUpdate < unusedCluster.defaultOutput.lastUpdate)
+ unusedCluster = this.siblingClusters[ix];
+ }
+
+ RemoveThingCluster(unusedCluster);
+ //return unusedCluster;
+
+ Cluster cluster = GetThingCluster(thingId, thingName);
+ Neuron neuron = cluster?.GetNeuron(neuronName);
+ return neuron;
+ */
+ }
+
+ ///
+ /// Delete a nucleus from this clsuter
+ ///
+ /// The nucleus to delete
+ /// True if a nucleus was deleted, false if the nucleus could not be found
public bool DeleteNucleus(Nucleus nucleus) {
- if (this.clusterNuclei.Contains(nucleus) == false) {
+ if (this.nuclei.Contains(nucleus) == false) {
// Try to find the nucleus by name
if (TryGetNucleus(nucleus.name, out nucleus) == false)
return false;
}
Neuron.Delete(nucleus);
- int nucleusIx = this.clusterNuclei.IndexOf(nucleus);
- this.clusterNuclei.Remove(nucleus);
- this.prefab.nuclei.RemoveAt(nucleusIx);
+ //int nucleusIx = this.nuclei.IndexOf(nucleus);
+ this.nuclei.Remove(nucleus);
+ //this.prefab.cluster.nuclei.RemoveAt(nucleusIx);
RefreshOutputs();
return true;
@@ -779,9 +748,14 @@ namespace NanoBrain {
#region Receivers
+ ///
+ /// Collect all receiving nuclei of signals from this cluster
+ ///
+ /// Ensure that a receiver is only listed once in the result
+ /// The list of receivers
public virtual List CollectReceivers(bool removeDuplicates = false) {
List receivers = new();
- foreach (Nucleus outputNucleus in this.clusterNuclei) {
+ foreach (Nucleus outputNucleus in this.nuclei) {
if (outputNucleus is not Neuron output)
continue;
@@ -789,7 +763,7 @@ namespace NanoBrain {
foreach (Nucleus receiver in output.receivers) {
// Debug.Log($"output {receiver.name}");
// Only add receivers outside this cluster
- if (receiver.clusterPrefab != this.prefab) {
+ if (receiver.parent.prefab != this.prefab) {
if (removeDuplicates == false || receivers.Contains(receiver) == false)
// Debug.Log($" YES");
receivers.Add(receiver);
@@ -799,28 +773,38 @@ namespace NanoBrain {
return receivers;
}
- public List<(Neuron, Nucleus)> CollectConnections() {
- List<(Neuron, Nucleus)> connections = new();
+ ///
+ /// Collect all connections to receivers of signals from this cluster
+ ///
+ /// A list of pairs of the sending neuron in this cluster and the matching receiving nucleus
+ // public List<(Neuron, Nucleus)> CollectConnections() {
+ // List<(Neuron, Nucleus)> connections = new();
- foreach (Nucleus outputNucleus in this.clusterNuclei) {
- if (outputNucleus is not Neuron output)
- continue;
+ // foreach (Nucleus outputNucleus in this.nuclei) {
+ // if (outputNucleus is not Neuron output)
+ // continue;
- foreach (Nucleus receiver in output.receivers) {
- // Only add receivers outside this cluster
- if (receiver.clusterPrefab != this.prefab)
- connections.Add((output, receiver));
- }
- }
- return connections;
- }
+ // foreach (Nucleus receiver in output.receivers) {
+ // // Only add receivers outside this cluster
+ // if (receiver.parent.prefab != this.prefab)
+ // connections.Add((output, receiver));
+ // }
+ // }
+ // return connections;
+ // }
+
+ ///
+ /// Collect all synapses of senders in another cluster of signals to this cluster
+ ///
+ /// The other cluster with sending neurons
+ /// A list of synapses to the neurons in the other clusters
public List CollectSynapsesTo(Cluster otherCluster) {
List collectedSynapses = new();
- foreach (Nucleus nucleus in this.clusterNuclei) {
+ foreach (Nucleus nucleus in this.nuclei) {
if (nucleus is not Neuron neuron)
continue;
- foreach (Synapse synapse in nucleus.synapses) {
+ foreach (Synapse synapse in neuron.synapses) {
if (synapse.neuron.parent == otherCluster)
collectedSynapses.Add(synapse);
}
@@ -828,36 +812,43 @@ namespace NanoBrain {
return collectedSynapses;
}
- public void MoveReceivers(Cluster newCluster) {
- Debug.Log($"Move receivers for {this.name} to {newCluster.name}");
- foreach (Nucleus outputNucleus in this.clusterNuclei) {
- if (outputNucleus is not Neuron output)
- continue;
- // Find the existing output in the new cluster
- if (newCluster.GetNucleus(output.name) is not Neuron newOutput) {
- Debug.LogWarning($"Could not find output {this.name}.{output.name} in {newCluster.name}");
- continue;
- }
- Debug.Log($"Check {this.name}.{output.name} receivers");
- Nucleus[] receivers = output.receivers.ToArray();
- foreach (Nucleus receiver in receivers) {
- if (receiver.clusterPrefab != this.prefab) {
- // Replace synapse with new synapse
- // to the new cluster
- Debug.Log($"move {receiver.name} from {this.name}.{output.name} to {newCluster.name}.{newOutput.name}");
- Synapse synapse = receiver.GetSynapse(output);
- newOutput.AddReceiver(receiver, synapse.weight);
- output.RemoveReceiver(receiver);
- }
- }
- }
- }
+ // public void MoveReceivers(Cluster newCluster) {
+ // Debug.Log($"Move receivers for {this.name} to {newCluster.name}");
+ // foreach (Nucleus outputNucleus in this.nuclei) {
+ // if (outputNucleus is not Neuron output)
+ // continue;
+
+ // // Find the existing output in the new cluster
+ // if (newCluster.GetNucleus(output.name) is not Neuron newOutput) {
+ // Debug.LogWarning($"Could not find output {this.name}.{output.name} in {newCluster.name}");
+ // continue;
+ // }
+ // Debug.Log($"Check {this.name}.{output.name} receivers");
+ // Nucleus[] receivers = output.receivers.ToArray();
+ // foreach (Nucleus receiver in receivers) {
+ // if (receiver.parent.prefab != this.prefab) {
+ // // Replace synapse with new synapse
+ // // to the new cluster
+ // Debug.Log($"move {receiver.name} from {this.name}.{output.name} to {newCluster.name}.{newOutput.name}");
+ // if (receiver is not Neuron receiverNeuron)
+ // continue;
+ // Synapse synapse = receiverNeuron.GetSynapse(output);
+ // newOutput.AddReceiver(receiver, synapse.weight);
+ // output.RemoveReceiver(receiver);
+ // }
+ // }
+ // }
+ // }
#endregion Receivers
#region Update
+ ///
+ /// Update the state of the nucleus and all nuclei receiving from it
+ ///
+ /// The nucleus to start updating
public void UpdateFromNucleus(Nucleus startNucleus) {
// no bias+synapse input state calculation for now...
@@ -867,41 +858,50 @@ namespace NanoBrain {
}
List computeOrder = this.computeOrders[startNucleus];
- //if (startNucleus.trace)
- Debug.Log($"Update from {startNucleus.name}");
foreach (Nucleus nucleus in computeOrder) {
if (nucleus is not Cluster) {
nucleus.UpdateStateIsolated();
- //if (startNucleus.trace && nucleus is Neuron neuron)
- Debug.Log($" {nucleus.name}");
if (nucleus is Neuron neuron) {
foreach (Nucleus receiver in neuron.receivers) {
if (receiver.parent != this) {
- Debug.Log($" External: {receiver.parent.name}.{receiver.name}");
+ //Debug.Log($" External: {receiver.parent.name}.{receiver.name}");
receiver.parent.UpdateFromNucleus(receiver);
}
}
}
}
}
-
- // continue in parent
- //this.parent?.UpdateFromNucleus(this);
-
- UpdateNuclei();
+ //UpdateNuclei();
}
+ /// \copydoc NanoBrain::Nucleus::UpdateStateIsolated
public override void UpdateStateIsolated() {
throw new Exception("Cluster should not be updated!");
}
- public override void UpdateNuclei() {
- foreach (Nucleus nucleus in this.clusterNuclei)
- nucleus.UpdateNuclei();
- }
+ // Don't think this does anything anymore...
+ // public override void UpdateNuclei() {
+ // foreach (Nucleus nucleus in this.nuclei)
+ // nucleus.UpdateNuclei();
+ // }
#endregion Update
+ ///
+ /// Recalculate derived properties
+ ///
+ /// This can be used to recalculate derived properties after the set of nuclei has been changed
+ public void Refresh() {
+ // This should not be needed, but somehow somewhere the parent is changed...
+ foreach (Nucleus nucleus in this.nuclei) {
+ // if (nucleus is not Neuron neuron)
+ // continue;
+ nucleus.parent = this;
+ }
+ RefreshOutputs();
+ RefreshComputeOrders();
+ }
+
}
}
\ No newline at end of file
diff --git a/Runtime/Scripts/Core/Cluster.cs.meta b/Runtime/Scripts/Core/Cluster.cs.meta
index a10caff..c77fea0 100644
--- a/Runtime/Scripts/Core/Cluster.cs.meta
+++ b/Runtime/Scripts/Core/Cluster.cs.meta
@@ -1,2 +1,11 @@
fileFormatVersion: 2
-guid: f13cdc4a175a9f379a00317ae68d8bea
\ No newline at end of file
+guid: f13cdc4a175a9f379a00317ae68d8bea
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Runtime/Scripts/Core/MemoryCell.cs b/Runtime/Scripts/Core/MemoryCell.cs
index 7f9fe6e..e959e16 100644
--- a/Runtime/Scripts/Core/MemoryCell.cs
+++ b/Runtime/Scripts/Core/MemoryCell.cs
@@ -12,7 +12,7 @@ namespace NanoBrain {
[Serializable]
public class MemoryCell : Neuron {
- public MemoryCell(ClusterPrefab cluster, string name) : base(cluster, name) { }
+ // public MemoryCell(ClusterPrefab cluster, string name) : base(cluster, name) { }
public MemoryCell(Cluster parent, string name) : base(parent, name) { }
public bool staticMemory = false;
diff --git a/Runtime/Scripts/Core/MemoryCell.cs.meta b/Runtime/Scripts/Core/MemoryCell.cs.meta
index ef74aba..24dc14d 100644
--- a/Runtime/Scripts/Core/MemoryCell.cs.meta
+++ b/Runtime/Scripts/Core/MemoryCell.cs.meta
@@ -1,2 +1,11 @@
fileFormatVersion: 2
-guid: 29633aa3fe5cd9dcc8d886051f45d4d8
\ No newline at end of file
+guid: 29633aa3fe5cd9dcc8d886051f45d4d8
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Runtime/Scripts/Core/Neuron.cs b/Runtime/Scripts/Core/Neuron.cs
index a4bbed8..a4927d8 100644
--- a/Runtime/Scripts/Core/Neuron.cs
+++ b/Runtime/Scripts/Core/Neuron.cs
@@ -23,26 +23,91 @@ namespace NanoBrain {
public Neuron(Cluster parent, string name) {
this.parent = parent;
this.name = name;
- this.parent?.clusterNuclei.Add(this);
+ this.parent?.nuclei.Add(this);
}
///
/// Create a new Neuron in a Cluster Prefab
///
/// The Cluster Preafb in which the new Neuron should be created
/// The name of the new Neuron
- public Neuron(ClusterPrefab prefab, string name) {
- this.clusterPrefab = prefab;
- this.name = name;
- if (this.clusterPrefab != null) {
- this.clusterPrefab.nuclei.Add(this);
- this.clusterPrefab.RefreshOutputs();
- }
- else
- Debug.LogError("No prefab when adding neuron to prefab");
- }
+ // public Neuron(ClusterPrefab prefab, string name) {
+ // this.clusterPrefab = prefab;
+ // this.name = name;
+ // if (this.clusterPrefab != null) {
+ // this.clusterPrefab.cluster.nuclei.Add(this);
+ // this.clusterPrefab.cluster.RefreshOutputs();
+ // }
+ // else
+ // Debug.LogError("No prefab when adding neuron to prefab");
+ // }
#region Serialization
+ ///
+ /// The bias
+ ///
+ /// The bias which a value which is always added to the combined value of the neuron
+ /// It does not have a synapse and therefore no weight of source nucleus
+ public Vector3 bias = Vector3.zero;
+
+ #region Synapses
+
+ [SerializeField]
+ private List _synapses = new();
+ ///
+ /// The synapses of the nucleus
+ ///
+ public List synapses => _synapses;
+
+ ///
+ /// Add a new synapse to this nuclues
+ ///
+ /// The nucleus from which the signals may originate
+ /// The weight applied to the input. Default value = 1
+ /// The created Synapse
+ /// This will add a new input to this nucleus with the given weight.
+ public Synapse AddSynapse(Neuron sendingNucleus, float weight = 1) {
+ Synapse synapse = new(sendingNucleus, weight);
+ this.synapses.Add(synapse);
+ return synapse;
+ }
+
+ // public Synapse AddSynapse(ClusterPrefab clusterPrefab, string neuronName, float weight = 1) {
+
+ // }
+
+ ///
+ /// Find a synapse
+ ///
+ /// The sender of the input to the Synapse
+ /// The found Synapse or null when the sender has no synapse to this nucleus.
+ public Synapse GetSynapse(Nucleus sender) {
+ foreach (Synapse synapse in this.synapses)
+ if (synapse.neuron == sender)
+ return synapse;
+ return null;
+ }
+
+ ///
+ /// Remove a synapse from a Nucleus
+ ///
+ /// Remote the synapse connecting to this Nucleus
+ public void RemoveSynapse(Nucleus sendingNucleus) {
+ this.synapses.RemoveAll(synapse => synapse.neuron == sendingNucleus);
+ }
+
+ #endregion Synapses
+
+ ///
+ /// Set the bias, recalculate the output and update all Nuclei receiving from this Nucleus
+ ///
+ ///
+ public virtual void SetBias(Vector3 inputValue) {
+ this.bias = inputValue;
+ this.lastUpdate = Time.time;
+ this.parent?.UpdateFromNucleus(this);
+ }
+
///
/// The type of combinators
///
@@ -52,8 +117,6 @@ namespace NanoBrain {
Sum,
/// Multiply the weighted values
Product,
- /// Take the maximum of all the weighted values
- Max,
}
///
/// The type of combinator used for this Neuron
@@ -211,16 +274,11 @@ namespace NanoBrain {
public float outputSqrMagnitude => _outputValue.sqrMagnitude;
#endif
- public bool isFiring {
- get {
- SleepCheck();
- return this.outputMagnitude > 0.5f;
- }
- }
+ public bool isFiring => this.outputMagnitude > 0.5f;
public Action WhenFiring;
-
- public virtual bool isSleeping => Time.time - this.lastUpdate > this.timeToSleep; //this.outputMagnitude == 0;
+ public bool persistOutput = false;
+ public virtual bool isSleeping => !persistOutput && (Time.time - this.lastUpdate > this.timeToSleep);
public void SleepCheck() {
if (this.isSleeping) {
#if UNITY_MATHEMATICS
@@ -231,34 +289,41 @@ namespace NanoBrain {
}
}
- [NonSerialized]
+ ///
+ /// Toggle for printing debugging trace data
+ ///
+ //public bool trace = false;
+
+ //[NonSerialized]
public float lastUpdate = 0;
public readonly float timeToSleep = 1f;
/// \copydoc NanoBrain::Nucleus::ShallowCloneTo
public override Nucleus ShallowCloneTo(Cluster newParent) {
- Neuron clone = new(newParent, this.name);
+ Neuron clone = new(newParent, this.name) {
+ // prefabNucleus = this
+ };
CloneFields(clone);
return clone;
}
- /// \copydoc NanoBrain::Nucleus::Clone
- public override Nucleus Clone(ClusterPrefab prefab) {
- Neuron clone = new(prefab, this.name);
- CloneFields(clone);
- foreach (Synapse synapse in this.synapses) {
- Synapse clonedSynapse = clone.AddSynapse(synapse.neuron);
- clonedSynapse.weight = synapse.weight;
- }
- foreach (Nucleus receiver in this.receivers) {
- clone.AddReceiver(receiver);
- }
- return clone;
- }
+ // \copydoc NanoBrain::Nucleus::Clone
+ // public override Nucleus Clone(ClusterPrefab prefab) {
+ // Neuron clone = new(prefab.cluster, this.name);
+ // CloneFields(clone);
+ // foreach (Synapse synapse in this.synapses) {
+ // Synapse clonedSynapse = clone.AddSynapse(synapse.neuron);
+ // clonedSynapse.weight = synapse.weight;
+ // }
+ // foreach (Nucleus receiver in this.receivers) {
+ // clone.AddReceiver(receiver);
+ // }
+ // return clone;
+ // }
protected virtual void CloneFields(Neuron clone) {
- clone.clusterPrefab = this.clusterPrefab;
clone.bias = this.bias;
+ clone.persistOutput = this.persistOutput;
clone.combinator = this.combinator;
clone.curve = this.curve;
clone.curvePreset = this.curvePreset;
@@ -268,8 +333,8 @@ namespace NanoBrain {
public static void Delete(Nucleus nucleus) {
if (nucleus == null)
return;
- if (nucleus.synapses != null) {
- foreach (Synapse synapse in nucleus.synapses) {
+ if (nucleus is Neuron neuron) {
+ foreach (Synapse synapse in neuron.synapses) {
if (synapse.neuron is Neuron synapse_nucleus) {
if (synapse_nucleus.receivers.Count > 1) {
// there is another nucleus feeding into this input nucleus
@@ -281,45 +346,43 @@ namespace NanoBrain {
}
}
}
- }
- if (nucleus is Neuron neuron) {
foreach (Nucleus receiver in neuron.receivers) {
- if (receiver != null && receiver.synapses != null)
- receiver.synapses.RemoveAll(s => s.neuron == nucleus);
+ if (receiver is not Neuron receiverNeuron)
+ continue;
+ if (receiver != null && receiverNeuron.synapses != null)
+ receiverNeuron.synapses.RemoveAll(s => s.neuron == nucleus);
}
}
else if (nucleus is Cluster cluster) {
// remove all receivers for this cluster
- foreach (Nucleus clusterNucleus in cluster.clusterNuclei) {
+ foreach (Nucleus clusterNucleus in cluster.nuclei) {
if (clusterNucleus is Neuron output) {
foreach (Nucleus receiver in output.receivers) {
- receiver.synapses.RemoveAll(s => s.neuron == output);
+ if (receiver is not Neuron receiverNeuron)
+ continue;
+ receiverNeuron.synapses.RemoveAll(s => s.neuron == output);
}
}
}
}
- if (nucleus.clusterPrefab != null) {
- nucleus.clusterPrefab.nuclei.RemoveAll(n => n == nucleus);
- nucleus.clusterPrefab.RefreshOutputs();
- nucleus.clusterPrefab.GarbageCollection();
+ if (nucleus.parent.prefab != null) {
+ nucleus.parent.prefab.cluster.nuclei.RemoveAll(n => n == nucleus);
+ nucleus.parent.prefab.cluster.RefreshOutputs();
+ nucleus.parent.prefab.GarbageCollection();
}
}
public override void UpdateStateIsolated() {
- CheckSleepingSynapses();
var result = Combinator();
- this.outputValue = Activator(result);
+ this.outputValue = ApplyActivator(result);
this.lastUpdate = Time.time;
}
protected void CheckSleepingSynapses() {
- foreach (Synapse synapse in this.synapses) {
- if (synapse.isSleeping) {
- synapse.neuron.outputValue = Vector3.zero;
- }
- }
+ foreach (Synapse synapse in this.synapses)
+ synapse.neuron.SleepCheck();
}
#region Combinator
@@ -329,42 +392,27 @@ namespace NanoBrain {
protected Func Combinator => combinator switch {
CombinatorType.Sum => CombinatorSum,
CombinatorType.Product => CombinatorProduct,
- CombinatorType.Max => CombinatorMax,
_ => CombinatorSum
};
public float3 CombinatorSum() {
float3 sum = this.bias;
- foreach (Synapse synapse in this.synapses)
+ foreach (Synapse synapse in this.synapses) {
+ synapse.neuron.SleepCheck();
sum += synapse.weight * synapse.neuron.outputValue;
+ }
return sum;
}
public float3 CombinatorProduct() {
float3 product = this.bias;
foreach (Synapse synapse in this.synapses) {
+ synapse.neuron.SleepCheck();
product *= synapse.weight * synapse.neuron.outputValue;
}
return product;
}
- public float3 CombinatorMax() {
- float3 max = this.bias;
- float maxLength = length(max);
-
- //Applying the weight factors
- foreach (Synapse synapse in this.synapses) {
- float3 input = synapse.weight * synapse.neuron.outputValue;
-
- float inputLength = length(input);
- if (inputLength > maxLength) {
- max = input;
- maxLength = inputLength;
- }
- }
- return max;
- }
-
#else
protected Func Combinator => combinator switch {
@@ -413,6 +461,20 @@ namespace NanoBrain {
#if UNITY_MATHEMATICS
+ // This does not allocate memory and seems faster than the solution below
+ float3 ApplyActivator(float3 x) {
+ switch (curvePreset) {
+ case ActivationType.Linear: return ActivatorLinear(x);
+ case ActivationType.Sqrt: return ActivatorSqrt(x);
+ case ActivationType.Power: return ActivatorPower(x);
+ case ActivationType.Reciprocal: return ActivatorReciprocal(x);
+ case ActivationType.Tanh: return ActivatorTanh(x);
+ case ActivationType.Binary: return ActivatorBinary(x);
+ case ActivationType.Normalized: return ActivatorNormalized(x);
+ default: return ActivatorCustom(x);
+ }
+ }
+
public Func Activator => this.curvePreset switch {
ActivationType.Linear => ActivatorLinear,
ActivationType.Sqrt => ActivatorSqrt,
@@ -524,25 +586,40 @@ namespace NanoBrain {
}
public virtual void AddReceiver(Nucleus receiverToAdd, float weight = 1) {
- this._receivers.Add(receiverToAdd);
- receiverToAdd.AddSynapse(this, weight);
+ if (receiverToAdd is not Neuron receiverNeuron)
+ return;
+ this._receivers.Add(receiverNeuron);
+ receiverNeuron.AddSynapse(this, weight);
//Debug.Log($"Add synapse {this.clusterPrefab.name}.{this.name} -> {receiverToAdd.name} --- [{this.receivers.Count}]");
}
public virtual void RemoveReceiver(Nucleus receiverToRemove) {
- this._receivers.RemoveAll(receiver => receiver == receiverToRemove);
- receiverToRemove.synapses.RemoveAll(synapse => synapse.neuron == this);
+ if (receiverToRemove is not Neuron receiverNeuron)
+ return;
+ this._receivers.RemoveAll(receiver => receiver == receiverNeuron);
+ receiverNeuron.synapses.RemoveAll(synapse => synapse.neuron == this);
+
+ // Nucleus prefabReceiver = receiverToRemove.prefabNucleus;
+ // if (this.prefabNucleus is Neuron prefabNeuron && prefabReceiver != null) {
+ // prefabNeuron.receivers.RemoveAll(receiver => receiver == prefabReceiver);
+ // prefabReceiver.synapses.RemoveAll(synapse => synapse.neuron == prefabNeuron);
+ // }
}
#endregion Receivers
- public override void ProcessStimulus(Vector3 inputValue) {
- ;
+ ///
+ /// Process an external stimulus
+ ///
+ /// The value of the stimulus
+ /// The id of the thing causing the stimulus
+ /// The name of the thing causing the stimulus
+ public virtual void ProcessStimulus(Vector3 inputValue) {
this.lastUpdate = Time.time;
this.bias = inputValue;
- this.parent.UpdateFromNucleus(this);
+ this.parent?.UpdateFromNucleus(this);
}
}
diff --git a/Runtime/Scripts/Core/Neuron.cs.meta b/Runtime/Scripts/Core/Neuron.cs.meta
index e520090..37266c0 100644
--- a/Runtime/Scripts/Core/Neuron.cs.meta
+++ b/Runtime/Scripts/Core/Neuron.cs.meta
@@ -1,2 +1,11 @@
fileFormatVersion: 2
-guid: 750748f3f0e7d472fbf88ab02987074c
\ No newline at end of file
+guid: 750748f3f0e7d472fbf88ab02987074c
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Runtime/Scripts/Core/Nucleus.cs b/Runtime/Scripts/Core/Nucleus.cs
index 314fee3..4864165 100644
--- a/Runtime/Scripts/Core/Nucleus.cs
+++ b/Runtime/Scripts/Core/Nucleus.cs
@@ -17,11 +17,15 @@ public abstract class Nucleus {
///
public string name;
+ // [NonSerialized]
+ // public Nucleus prefabNucleus;
+
///
/// The cluster prefab in which the nucleus is located
///
- [SerializeReference]
- public ClusterPrefab clusterPrefab;
+ // [SerializeReference]
+ // public ClusterPrefab clusterPrefab;
+
///
/// The cluster instance in which the nucleus is located
///
@@ -31,7 +35,7 @@ public abstract class Nucleus {
///
/// Toggle for printing debugging trace data
///
- public bool trace = false;
+ //public bool trace = false;
///
/// Function to make a partial clone of this nucleus
@@ -44,7 +48,7 @@ public abstract class Nucleus {
///
///
///
- public abstract Nucleus Clone(ClusterPrefab prefab);
+ // public abstract Nucleus Clone(ClusterPrefab prefab);
///
/// The types of Nucleus
@@ -59,62 +63,62 @@ public abstract class Nucleus {
//ClusterArray,
}
- public virtual void Initialize() {}
+ // public virtual void Initialize() {}
- #region Synapses
+ // #region Synapses
- ///
- /// The bias of the nucleus
- ///
- /// The bias which a value which is always added to the combined value of the nucleus
- /// It does not have a synapse and therefore no weight of source nucleus
- public Vector3 bias = Vector3.zero;
+ // ///
+ // /// The bias of the nucleus
+ // ///
+ // /// The bias which a value which is always added to the combined value of the nucleus
+ // /// It does not have a synapse and therefore no weight of source nucleus
+ // //public Vector3 bias = Vector3.zero;
- [SerializeField]
- private List _synapses = new();
- ///
- /// The synapses of the nucleus
- ///
- public List synapses => _synapses;
+ // [SerializeField]
+ // private List _synapses = new();
+ // ///
+ // /// The synapses of the nucleus
+ // ///
+ // public List synapses => _synapses;
- ///
- /// Add a new synapse to this nuclues
- ///
- /// The nucleus from which the signals may originate
- /// The weight applied to the input. Default value = 1
- /// The created Synapse
- /// This will add a new input to this nucleus with the given weight.
- public Synapse AddSynapse(Neuron sendingNucleus, float weight = 1) {
- Synapse synapse = new(sendingNucleus, weight);
- this.synapses.Add(synapse);
- return synapse;
- }
+ // ///
+ // /// Add a new synapse to this nuclues
+ // ///
+ // /// The nucleus from which the signals may originate
+ // /// The weight applied to the input. Default value = 1
+ // /// The created Synapse
+ // /// This will add a new input to this nucleus with the given weight.
+ // public Synapse AddSynapse(Neuron sendingNucleus, float weight = 1) {
+ // Synapse synapse = new(sendingNucleus, weight);
+ // this.synapses.Add(synapse);
+ // return synapse;
+ // }
- // public Synapse AddSynapse(ClusterPrefab clusterPrefab, string neuronName, float weight = 1) {
+ // // public Synapse AddSynapse(ClusterPrefab clusterPrefab, string neuronName, float weight = 1) {
- // }
+ // // }
- ///
- /// Find a synapse
- ///
- /// The sender of the input to the Synapse
- /// The found Synapse or null when the sender has no synapse to this nucleus.
- public Synapse GetSynapse(Nucleus sender) {
- foreach (Synapse synapse in this.synapses)
- if (synapse.neuron == sender)
- return synapse;
- return null;
- }
+ // ///
+ // /// Find a synapse
+ // ///
+ // /// The sender of the input to the Synapse
+ // /// The found Synapse or null when the sender has no synapse to this nucleus.
+ // public Synapse GetSynapse(Nucleus sender) {
+ // foreach (Synapse synapse in this.synapses)
+ // if (synapse.neuron == sender)
+ // return synapse;
+ // return null;
+ // }
- ///
- /// Remove a synapse from a Nucleus
- ///
- /// Remote the synapse connecting to this Nucleus
- public void RemoveSynapse(Nucleus sendingNucleus) {
- this.synapses.RemoveAll(synapse => synapse.neuron == sendingNucleus);
- }
+ // ///
+ // /// Remove a synapse from a Nucleus
+ // ///
+ // /// Remote the synapse connecting to this Nucleus
+ // public void RemoveSynapse(Nucleus sendingNucleus) {
+ // this.synapses.RemoveAll(synapse => synapse.neuron == sendingNucleus);
+ // }
- #endregion Synapses
+ // #endregion Synapses
#region Update
@@ -129,23 +133,14 @@ public abstract class Nucleus {
public virtual void UpdateNuclei() {
}
- ///
- /// Set the bias, recalculate the output and update all Nuclei receiving from this Nucleus
- ///
- ///
- public virtual void SetBias(Vector3 inputValue) {
- this.bias = inputValue;
- this.parent.UpdateFromNucleus(this);
- }
-
- ///
- /// Process an external stimulus
- ///
- /// The value of the stimulus
- /// The id of the thing causing the stimulus
- /// The name of the thing causing the stimulus
- public virtual void ProcessStimulus(Vector3 inputValue) { //, int thingId = 0, string thingName = "") {
- }
+ // ///
+ // /// Set the bias, recalculate the output and update all Nuclei receiving from this Nucleus
+ // ///
+ // ///
+ // public virtual void SetBias(Vector3 inputValue) {
+ // this.bias = inputValue;
+ // this.parent.UpdateFromNucleus(this);
+ // }
#endregion Update
diff --git a/Runtime/Scripts/Core/Nucleus.cs.meta b/Runtime/Scripts/Core/Nucleus.cs.meta
index 08b3cf8..0868066 100644
--- a/Runtime/Scripts/Core/Nucleus.cs.meta
+++ b/Runtime/Scripts/Core/Nucleus.cs.meta
@@ -1,2 +1,11 @@
fileFormatVersion: 2
-guid: 4310eea6ab77628b085387a226c1c386
\ No newline at end of file
+guid: 4310eea6ab77628b085387a226c1c386
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Runtime/Scripts/Core/Synapse.cs.meta b/Runtime/Scripts/Core/Synapse.cs.meta
index e62612c..7c45e30 100644
--- a/Runtime/Scripts/Core/Synapse.cs.meta
+++ b/Runtime/Scripts/Core/Synapse.cs.meta
@@ -1,2 +1,11 @@
fileFormatVersion: 2
-guid: 334a58eafccd60cbdb32f719e9e861c6
\ No newline at end of file
+guid: 334a58eafccd60cbdb32f719e9e861c6
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Runtime/Scripts/ScriptableObjects/ClusterPrefab.cs b/Runtime/Scripts/ScriptableObjects/ClusterPrefab.cs
index 2920733..c00f234 100644
--- a/Runtime/Scripts/ScriptableObjects/ClusterPrefab.cs
+++ b/Runtime/Scripts/ScriptableObjects/ClusterPrefab.cs
@@ -8,134 +8,146 @@ namespace NanoBrain {
///
[CreateAssetMenu(menuName = "Passer/Cluster")]
public class ClusterPrefab : ScriptableObject {
- /// The nuclei in this cluster
- [SerializeReference]
- // This list should not include any clusters...
- public List nuclei = new();
- ///
- /// The output of this cluster
- ///
- /// This only returens the first(default) nucleus. Use outputs[0] instead
- public virtual Nucleus output => this.nuclei[0] as Nucleus;
+ public Cluster cluster;
+ /*
+ /// The nuclei in this cluster
+ [SerializeReference]
+ // This list should not include any clusters...
+ public List nuclei = new();
- ///
- /// The nuclei in this cluster which are meant for receiving signals from outside the cluster
- ///
- /// This is currently the nuclei which do not have any incoming synapse
- public List _inputs = null;
- public virtual List inputs {
- get {
- if (this._inputs == null) {
- this._inputs = new();
- foreach (Nucleus receptor in this.nuclei) {
- if (receptor is Nucleus nucleus) {
- // inputs have no incoming synapses yet.
- if (nucleus.synapses.Count == 0)
- this._inputs.Add(nucleus);
+ ///
+ /// The output of this cluster
+ ///
+ /// This only returens the first(default) nucleus. Use outputs[0] instead
+ public virtual Nucleus output => this.nuclei[0] as Nucleus;
+
+ ///
+ /// The nuclei in this cluster which are meant for receiving signals from outside the cluster
+ ///
+ /// This is currently the nuclei which do not have any incoming synapse
+ public List _inputs = null;
+ public virtual List inputs {
+ get {
+ if (this._inputs == null) {
+ this._inputs = new();
+ foreach (Nucleus receptor in this.nuclei) {
+ if (receptor is Nucleus nucleus) {
+ // inputs have no incoming synapses yet.
+ if (nucleus.synapses.Count == 0)
+ this._inputs.Add(nucleus);
+ }
+ }
}
+ return this._inputs;
}
}
- return this._inputs;
- }
- }
- ///
- /// The nuclei in this cluster which are meant for sending signals onward
- ///
- private List _outputs = null;
- public List outputs {
- get {
- if (this._outputs == null)
- RefreshOutputs();
- return this._outputs;
- }
- }
- ///
- /// Redetermine the outpus in the cluster
- ///
- public void RefreshOutputs() {
- this._outputs = new();
- foreach (Nucleus nucleus in this.nuclei) {
- if (nucleus is Neuron neuron && neuron.receivers.Count == 0)
- this._outputs.Add(nucleus);
- }
- }
-
+ ///
+ /// The nuclei in this cluster which are meant for sending signals onward
+ ///
+ private List _outputs = null;
+ public List outputs {
+ get {
+ if (this._outputs == null)
+ RefreshOutputs();
+ return this._outputs;
+ }
+ }
+ ///
+ /// Redetermine the outpus in the cluster
+ ///
+ public void RefreshOutputs() {
+ this._outputs = new();
+ foreach (Nucleus nucleus in this.nuclei) {
+ if (nucleus is Neuron neuron && neuron.receivers.Count == 0)
+ this._outputs.Add(nucleus);
+ }
+ }
+ */
///
/// Retrieve a nucleus in this cluster
///
/// The name of the nucleus
/// The Nucleus with the given name or null if no such Nucleus could be found
public Nucleus GetNucleus(string nucleusName) {
- foreach (Nucleus nucleus in this.nuclei) {
- if (nucleus.name == nucleusName)
- return nucleus;
- }
- return null;
+ return cluster.GetNucleus(nucleusName);
+ // foreach (Nucleus nucleus in this.nuclei) {
+ // if (nucleus.name == nucleusName)
+ // return nucleus;
+ // }
+ // return null;
}
// Call this function to ensure that there is at least one nucleus
// This is an invariant and should be ensured before the nucleus is used
// because output requires it.
public void EnsureInitialization() {
- nuclei ??= new List();
- if (nuclei.Count == 0)
- new Neuron(this, "Output"); // Every cluster should have at least 1 neuron
+ this.cluster.prefab = this;
+ this.cluster.name = this.name;
+ this.cluster.nuclei ??= new List();
+ if (this.cluster.nuclei.Count <= 0)
+ new Neuron(this.cluster, "Output"); // Every cluster should have at least 1 neuron
+ this.cluster.instanceCount = 1;
+ // nuclei ??= new List();
+ // if (nuclei.Count == 0)
+ // new Neuron(this, "Output"); // Every cluster should have at least 1 neuron
}
public void GarbageCollection() {
- HashSet visitedNuclei = new();
- foreach (Nucleus output in this.outputs)
- MarkNuclei(visitedNuclei, output);
- //Debug.Log($"Garbage collection found {visitedNuclei.Count} Nuclei");
- this.nuclei.RemoveAll(nucleus => visitedNuclei.Contains(nucleus) == false);
+ // HashSet visitedNuclei = new();
+ // foreach (Nucleus output in this.outputs)
+ // MarkNuclei(visitedNuclei, output);
+ // //Debug.Log($"Garbage collection found {visitedNuclei.Count} Nuclei");
+ // this.nuclei.RemoveAll(nucleus => visitedNuclei.Contains(nucleus) == false);
}
- public void MarkNuclei(HashSet visitedNuclei, Nucleus nucleus) {
- if (nucleus is null)
- return;
+ // public void MarkNuclei(HashSet visitedNuclei, Nucleus nucleus) {
+ // if (nucleus is null)
+ // return;
- if (nucleus.parent != null && nucleus.parent.prefab != this)
- visitedNuclei.Add(nucleus.parent);
- else
- visitedNuclei.Add(nucleus);
- if (nucleus.synapses != null) {
- HashSet visitedSynapses = new();
- foreach (Synapse synapse in nucleus.synapses) {
- if (synapse != null && synapse.neuron != null) {
- visitedSynapses.Add(synapse);
- if (synapse.neuron is Nucleus synapse_nucleus)
- MarkNuclei(visitedNuclei, synapse_nucleus);
- }
- }
- nucleus.synapses.RemoveAll(synapse => visitedSynapses.Contains(synapse) == false);
- }
- if (nucleus is Neuron neuron && neuron.receivers != null) {
- HashSet visitedReceivers = new();
- foreach (Nucleus receiver in neuron.receivers) {
- if (receiver != null && receiver != null) {
- visitedReceivers.Add(receiver);
- visitedNuclei.Add(receiver);
- }
- }
- neuron.receivers.RemoveAll(receiver => visitedReceivers.Contains(receiver) == false);
- }
- }
+ // if (nucleus.parent != null && nucleus.parent.prefab != this)
+ // visitedNuclei.Add(nucleus.parent);
+ // else
+ // visitedNuclei.Add(nucleus);
+ // if (nucleus is Neuron neuron) {
+ // if (neuron.synapses != null) {
+ // HashSet visitedSynapses = new();
+ // foreach (Synapse synapse in neuron.synapses) {
+ // if (synapse != null && synapse.neuron != null) {
+ // visitedSynapses.Add(synapse);
+ // if (synapse.neuron is Nucleus synapse_nucleus)
+ // MarkNuclei(visitedNuclei, synapse_nucleus);
+ // }
+ // }
+ // neuron.synapses.RemoveAll(synapse => visitedSynapses.Contains(synapse) == false);
+ // }
+ // if (neuron.receivers != null) {
+ // HashSet visitedReceivers = new();
+ // foreach (Nucleus receiver in neuron.receivers) {
+ // if (receiver != null && receiver != null) {
+ // visitedReceivers.Add(receiver);
+ // visitedNuclei.Add(receiver);
+ // }
+ // }
+ // neuron.receivers.RemoveAll(receiver => visitedReceivers.Contains(receiver) == false);
+ // }
+ // }
+ // }
- public virtual void UpdateNuclei() {
- foreach (Nucleus nucleus in this.nuclei)
- nucleus.UpdateNuclei();
- }
+ // public virtual void UpdateNuclei() {
+ // foreach (Nucleus nucleus in this.nuclei)
+ // nucleus.UpdateNuclei();
+ // }
- public int GetNucleusIndex(Nucleus receiver) {
- int ix = 0;
- foreach (Nucleus nucleus in this.nuclei) {
- if (receiver == nucleus)
- return ix;
- ix++;
- }
- return -1;
- }
+ // public int GetNucleusIndex(Nucleus receiver) {
+ // int ix = 0;
+ // foreach (Nucleus nucleus in this.nuclei) {
+ // if (receiver == nucleus)
+ // return ix;
+ // ix++;
+ // }
+ // return -1;
+ // }
}
}
diff --git a/doxygen/DoxyWarnLogfile.txt b/doxygen/DoxyWarnLogfile.txt
deleted file mode 100644
index 14f5b84..0000000
--- a/doxygen/DoxyWarnLogfile.txt
+++ /dev/null
@@ -1,230 +0,0 @@
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Angle.cs:294: warning: Member pi (variable) of class LinearAlgebra.Angles is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Direction.cs:76: warning: Member ToString() (function) of struct LinearAlgebra.Direction is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Direction.cs:223: warning: Member Equals(object obj) (function) of struct LinearAlgebra.Direction is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Direction.cs:234: warning: Member GetHashCode() (function) of struct LinearAlgebra.Direction is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Direction.cs:191: warning: Member operator-(Direction d) (function) of struct LinearAlgebra.Direction is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Direction.cs:239: warning: Member UnsignedAngle(Direction d1, Direction d2) (function) of struct LinearAlgebra.Direction is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Spherical.cs:12: warning: Unsupported xml/html tag found
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Spherical.cs:75: warning: Member ToVector3() (function) of struct LinearAlgebra.Spherical is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Spherical.cs:92: warning: Member ToVector3() (function) of struct LinearAlgebra.Spherical is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Spherical.cs:111: warning: Member ToString() (function) of struct LinearAlgebra.Spherical is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Spherical.cs:151: warning: Member Equals(object o) (function) of struct LinearAlgebra.Spherical is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Spherical.cs:157: warning: Member GetHashCode() (function) of struct LinearAlgebra.Spherical is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Spherical.cs:43: warning: Member Radians(float distance, float horizontal, float vertical) (function) of struct LinearAlgebra.Spherical is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Spherical.cs:69: warning: Member FromVector3(Vector3 v) (function) of struct LinearAlgebra.Spherical is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Spherical.cs:81: warning: Member FromVector3(Vector3Float v) (function) of struct LinearAlgebra.Spherical is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Spherical.cs:128: warning: Member operator+(Spherical s1, Spherical s2) (function) of struct LinearAlgebra.Spherical is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Spherical.cs:138: warning: Member operator*(Spherical v, float d) (function) of struct LinearAlgebra.Spherical is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Spherical.cs:143: warning: Member operator==(Spherical v1, Spherical v2) (function) of struct LinearAlgebra.Spherical is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Spherical.cs:147: warning: Member operator!=(Spherical v1, Spherical v2) (function) of struct LinearAlgebra.Spherical is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Spherical.cs:161: warning: Member Distance(Spherical v1, Spherical v2) (function) of struct LinearAlgebra.Spherical is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Spherical.cs:187: warning: Member Average(Spherical v1, Spherical v2) (function) of struct LinearAlgebra.Spherical is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Spherical.cs:240: warning: Member Sum(List< Spherical > vectors) (function) of struct LinearAlgebra.Spherical is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Spherical.cs:256: warning: Member Average(List< Spherical > vectors) (function) of struct LinearAlgebra.Spherical is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Spherical.cs:116: warning: Member magnitude (property) of struct LinearAlgebra.Spherical is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Spherical.cs:118: warning: Member normalized (property) of struct LinearAlgebra.Spherical is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/SwingTwist.cs:16: warning: Member SwingTwist(Direction swing, AngleFloat twist) (function) of struct LinearAlgebra.SwingTwist is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/SwingTwist.cs:55: warning: Member ToAngleAxis() (function) of struct LinearAlgebra.SwingTwist is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/SwingTwist.cs:81: warning: Member ToQuaternion() (function) of struct LinearAlgebra.SwingTwist is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/SwingTwist.cs:93: warning: Member ToAngleAxis() (function) of struct LinearAlgebra.SwingTwist is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/SwingTwist.cs:119: warning: Member ToQuaternion() (function) of struct LinearAlgebra.SwingTwist is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/SwingTwist.cs:64: warning: Member FromAngleAxis(Spherical r) (function) of struct LinearAlgebra.SwingTwist is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/SwingTwist.cs:102: warning: Member FromAngleAxis(Spherical r) (function) of struct LinearAlgebra.SwingTwist is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/SwingTwist.cs:127: warning: Member FromQuat32(Quat32 q32) (function) of struct LinearAlgebra.SwingTwist is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/SwingTwist.cs:13: warning: Member swing (variable) of struct LinearAlgebra.SwingTwist is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/SwingTwist.cs:14: warning: Member twist (variable) of struct LinearAlgebra.SwingTwist is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Vector2Float.cs:218: warning: Member SqrMagnitudeOf(Vector2Float v) (function) of struct LinearAlgebra.Vector2Float is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Vector2Float.cs:227: warning: Member MagnitudeOf(Vector2Float v) (function) of struct LinearAlgebra.Vector2Float is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Vector2Float.cs:244: warning: Member Normalize(Vector2Float v) (function) of struct LinearAlgebra.Vector2Float is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Vector2Float.cs:428: warning: Member UnsignedAngle(Vector2Float from, Vector2Float to) (function) of struct LinearAlgebra.Vector2Float is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Vector2Float.cs:335: warning: argument 'v1' from the argument list of LinearAlgebra.Vector2Float.operator== has multiple @param documentation sections
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Vector2Float.cs:407: warning: argument 'axis' of command @param is not found in the argument list of LinearAlgebra.Vector2Float::SignedAngle(Vector2Float from, Vector2Float to)
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Vector3Float.cs:102: warning: Member Vector3Float(Vector3Int v) (function) of struct LinearAlgebra.Vector3Float is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Vector3Float.cs:122: warning: Member ToString() (function) of struct LinearAlgebra.Vector3Float is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Vector3Float.cs:282: warning: Member Equals(object obj) (function) of struct LinearAlgebra.Vector3Float is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Vector3Float.cs:289: warning: Member GetHashCode() (function) of struct LinearAlgebra.Vector3Float is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Vector3Float.cs:108: warning: Member FromSpherical(Spherical s) (function) of struct LinearAlgebra.Vector3Float is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Vector3Float.cs:256: warning: Member operator*(Vector3Float v1, float d) (function) of struct LinearAlgebra.Vector3Float is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Vector3Float.cs:261: warning: Member operator*(float d, Vector3Float v1) (function) of struct LinearAlgebra.Vector3Float is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Vector3Float.cs:266: warning: Member operator/(Vector3Float v1, float d) (function) of struct LinearAlgebra.Vector3Float is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Vector3Float.cs:274: warning: Member operator==(Vector3Float v1, Vector3Float v2) (function) of struct LinearAlgebra.Vector3Float is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Vector3Float.cs:278: warning: Member operator!=(Vector3Float v1, Vector3Float v2) (function) of struct LinearAlgebra.Vector3Float is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Vector3Int.cs:31: warning: Member Vector3Int(int horizontal, int vertical, int depth) (function) of struct LinearAlgebra.Vector3Int is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Vector3Int.cs:182: warning: Member Equals(Vector3Int v) (function) of struct LinearAlgebra.Vector3Int is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Vector3Int.cs:184: warning: Member Equals(object obj) (function) of struct LinearAlgebra.Vector3Int is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Vector3Int.cs:199: warning: Member GetHashCode() (function) of struct LinearAlgebra.Vector3Int is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Vector3Int.cs:167: warning: Member operator*(Vector3Int v1, int d) (function) of struct LinearAlgebra.Vector3Int is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Vector3Int.cs:172: warning: Member operator*(int d, Vector3Int v1) (function) of struct LinearAlgebra.Vector3Int is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Vector3Int.cs:177: warning: Member operator/(Vector3Int v1, int d) (function) of struct LinearAlgebra.Vector3Int is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Vector3Int.cs:191: warning: Member operator==(Vector3Int v1, Vector3Int v2) (function) of struct LinearAlgebra.Vector3Int is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/src/Vector3Int.cs:195: warning: Member operator!=(Vector3Int v1, Vector3Int v2) (function) of struct LinearAlgebra.Vector3Int is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/test/Vector2FloatTest.cs:5: warning: Member Vector2 (typedef) of namespace LinearAlgebra.Test is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/LinearAlgebra/test/Vector3FloatTest.cs:5: warning: Member Vector3 (typedef) of namespace LinearAlgebra.Test is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Cluster.cs:215: warning: Member Clone(ClusterPrefab parent) (function) of class NanoBrain.Cluster is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Cluster.cs:239: warning: Member ShallowCloneTo(Cluster parent) (function) of class NanoBrain.Cluster is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Cluster.cs:428: warning: Member TryGetNucleus(string nucleusName, out Nucleus foundNucleus) (function) of class NanoBrain.Cluster is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Cluster.cs:440: warning: Member GetNucleus(string nucleusName) (function) of class NanoBrain.Cluster is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Cluster.cs:476: warning: Member CollectReceivers() (function) of class NanoBrain.Cluster is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Cluster.cs:493: warning: Member UpdateFromNucleus(Nucleus startNucleus) (function) of class NanoBrain.Cluster is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Cluster.cs:516: warning: Member UpdateStateIsolated() (function) of class NanoBrain.Cluster is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Cluster.cs:293: warning: Member GetNucleusIndex(List< Nucleus > nuclei, Nucleus nucleus) (function) of class NanoBrain.Cluster is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Cluster.cs:306: warning: Member prefab (variable) of class NanoBrain.Cluster is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Cluster.cs:310: warning: Member clusterNuclei (variable) of class NanoBrain.Cluster is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Cluster.cs:313: warning: Member sortedNuclei (variable) of class NanoBrain.Cluster is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Cluster.cs:316: warning: Member _inputs (variable) of class NanoBrain.Cluster is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Cluster.cs:332: warning: Member computeOrders (variable) of class NanoBrain.Cluster is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Cluster.cs:285: warning: Member GetNucleusIndex(Nucleus[] nuclei, Nucleus nucleus) (function) of class NanoBrain.Cluster is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Cluster.cs:414: warning: Member _outputs (variable) of class NanoBrain.Cluster is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Cluster.cs:317: warning: Member inputs (property) of class NanoBrain.Cluster is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Cluster.cs:407: warning: Member defaultOutput (property) of class NanoBrain.Cluster is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Cluster.cs:415: warning: Member outputs (property) of class NanoBrain.Cluster is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/ClusterPrefab.cs:79: warning: Member EnsureInitialization() (function) of class NanoBrain.ClusterPrefab is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/ClusterPrefab.cs:85: warning: Member GarbageCollection() (function) of class NanoBrain.ClusterPrefab is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/ClusterPrefab.cs:93: warning: Member MarkNuclei(HashSet< Nucleus > visitedNuclei, Nucleus nucleus) (function) of class NanoBrain.ClusterPrefab is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/ClusterPrefab.cs:124: warning: Member UpdateNuclei() (function) of class NanoBrain.ClusterPrefab is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/ClusterPrefab.cs:129: warning: Member GetNucleusIndex(Nucleus receiver) (function) of class NanoBrain.ClusterPrefab is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/ClusterPrefab.cs:26: warning: Member inputs (property) of class NanoBrain.ClusterPrefab is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/ClusterPrefab.cs:45: warning: Member outputs (property) of class NanoBrain.ClusterPrefab is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/ClusterPrefab.cs:24: warning: Unsupported xml/html tag found
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/ClusterPrefab.cs:24: warning: Unsupported xml/html tag found
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/ClusterPrefab.cs:18: warning: Unsupported xml/html tag found
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/ClusterPrefab.cs:18: warning: Unsupported xml/html tag found
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/MemoryCell.cs:15: warning: Member MemoryCell(ClusterPrefab cluster, string name) (function) of class NanoBrain.MemoryCell is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/MemoryCell.cs:16: warning: Member MemoryCell(Cluster parent, string name) (function) of class NanoBrain.MemoryCell is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/MemoryCell.cs:28: warning: Member ShallowCloneTo(Cluster newParent) (function) of class NanoBrain.MemoryCell is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/MemoryCell.cs:45: warning: Member UpdateStateIsolated() (function) of class NanoBrain.MemoryCell is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:83: warning: Member GenerateCurve() (function) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:270: warning: Member CombinatorSum() (function) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:311: warning: Member CombinatorSum() (function) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:277: warning: Member CombinatorProduct() (function) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:318: warning: Member CombinatorProduct() (function) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:285: warning: Member CombinatorMax() (function) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:327: warning: Member CombinatorMax() (function) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:439: warning: Member AddReceiver(Nucleus receiverToAdd, float weight=1) (function) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:444: warning: Member RemoveReceiver(Nucleus receiverToRemove) (function) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:469: warning: Member ProcessStimulusDirect(Vector3 inputValue, int thingId=0, string thingName=null) (function) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:218: warning: Member Delete(Nucleus nucleus) (function) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/MemoryCell.cs:18: warning: Member staticMemory (variable) of class NanoBrain.MemoryCell is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:72: warning: Member _curvePreset (variable) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:80: warning: Member curve (variable) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:81: warning: Member curveMax (variable) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:179: warning: Member WhenFiring (variable) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:185: warning: Member stale (variable) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:186: warning: Member staleValueForSleep (variable) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:209: warning: Member CloneFields(Neuron clone) (function) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:358: warning: Member ActivatorLinear(float3 input) (function) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:397: warning: Member ActivatorLinear(Vector3 input) (function) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:362: warning: Member ActivatorSqrt(float3 input) (function) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:401: warning: Member ActivatorSqrt(Vector3 input) (function) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:367: warning: Member ActivatorPower(float3 input) (function) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:406: warning: Member ActivatorPower(Vector3 input) (function) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:372: warning: Member ActivatorReciprocal(float3 input) (function) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:411: warning: Member ActivatorReciprocal(Vector3 input) (function) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:381: warning: Member ActivatorCustom(float3 input) (function) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:420: warning: Member ActivatorCustom(Vector3 input) (function) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:151: warning: Member _outputValue (variable) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:165: warning: Member _outputValue (variable) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/MemoryCell.cs:19: warning: Member isSleeping (property) of class NanoBrain.MemoryCell is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:73: warning: Member curvePreset (property) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:152: warning: Member outputValue (property) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:166: warning: Member outputValue (property) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:160: warning: Member outputMagnitude (property) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:161: warning: Member outputSqrMagnitude (property) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:178: warning: Member isFiring (property) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:263: warning: Member Combinator (property) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:304: warning: Member Combinator (property) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:350: warning: Member Activator (property) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:389: warning: Member Activator (property) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:434: warning: Member receivers (property) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:83: warning: Member GenerateCurve() (function) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:254: warning: Member UpdateStateIsolated() (function) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:270: warning: Member CombinatorSum() (function) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:277: warning: Member CombinatorProduct() (function) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:285: warning: Member CombinatorMax() (function) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:311: warning: Member CombinatorSum() (function) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:318: warning: Member CombinatorProduct() (function) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:327: warning: Member CombinatorMax() (function) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:439: warning: Member AddReceiver(Nucleus receiverToAdd, float weight=1) (function) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:444: warning: Member RemoveReceiver(Nucleus receiverToRemove) (function) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:469: warning: Member ProcessStimulusDirect(Vector3 inputValue, int thingId=0, string thingName=null) (function) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:218: warning: Member Delete(Nucleus nucleus) (function) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:72: warning: Member _curvePreset (variable) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:80: warning: Member curve (variable) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:81: warning: Member curveMax (variable) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:179: warning: Member WhenFiring (variable) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:185: warning: Member stale (variable) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:186: warning: Member staleValueForSleep (variable) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:209: warning: Member CloneFields(Neuron clone) (function) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:358: warning: Member ActivatorLinear(float3 input) (function) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:362: warning: Member ActivatorSqrt(float3 input) (function) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:367: warning: Member ActivatorPower(float3 input) (function) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:372: warning: Member ActivatorReciprocal(float3 input) (function) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:381: warning: Member ActivatorCustom(float3 input) (function) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:397: warning: Member ActivatorLinear(Vector3 input) (function) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:401: warning: Member ActivatorSqrt(Vector3 input) (function) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:406: warning: Member ActivatorPower(Vector3 input) (function) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:411: warning: Member ActivatorReciprocal(Vector3 input) (function) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:420: warning: Member ActivatorCustom(Vector3 input) (function) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:151: warning: Member _outputValue (variable) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:165: warning: Member _outputValue (variable) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:73: warning: Member curvePreset (property) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:152: warning: Member outputValue (property) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:160: warning: Member outputMagnitude (property) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:161: warning: Member outputSqrMagnitude (property) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:166: warning: Member outputValue (property) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:178: warning: Member isFiring (property) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:182: warning: Member isSleeping (property) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:263: warning: Member Combinator (property) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:304: warning: Member Combinator (property) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:350: warning: Member Activator (property) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:389: warning: Member Activator (property) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:434: warning: Member receivers (property) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:189: warning: argument 'parent' of command @param is not found in the argument list of NanoBrain.Neuron::ShallowCloneTo(Cluster newParent)
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:189: warning: The following parameter of NanoBrain.Neuron.ShallowCloneTo(Cluster newParent) is not documented:
- parameter 'newParent'
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/NucleusArray.cs:83: warning: Member thingReceivers (variable) of class NanoBrain.NucleusArray is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/NucleusArray.cs:22: warning: Member nuclei (property) of class NanoBrain.NucleusArray is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Receptor.cs:81: warning: Member UpdateStateIsolated() (function) of class NanoBrain.Receptor is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:83: warning: Member GenerateCurve() (function) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:270: warning: Member CombinatorSum() (function) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:311: warning: Member CombinatorSum() (function) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:277: warning: Member CombinatorProduct() (function) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:318: warning: Member CombinatorProduct() (function) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:285: warning: Member CombinatorMax() (function) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:327: warning: Member CombinatorMax() (function) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:439: warning: Member AddReceiver(Nucleus receiverToAdd, float weight=1) (function) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:444: warning: Member RemoveReceiver(Nucleus receiverToRemove) (function) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:469: warning: Member ProcessStimulusDirect(Vector3 inputValue, int thingId=0, string thingName=null) (function) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:218: warning: Member Delete(Nucleus nucleus) (function) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:72: warning: Member _curvePreset (variable) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:80: warning: Member curve (variable) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:81: warning: Member curveMax (variable) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:179: warning: Member WhenFiring (variable) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:185: warning: Member stale (variable) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:186: warning: Member staleValueForSleep (variable) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:209: warning: Member CloneFields(Neuron clone) (function) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:358: warning: Member ActivatorLinear(float3 input) (function) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:397: warning: Member ActivatorLinear(Vector3 input) (function) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:362: warning: Member ActivatorSqrt(float3 input) (function) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:401: warning: Member ActivatorSqrt(Vector3 input) (function) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:367: warning: Member ActivatorPower(float3 input) (function) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:406: warning: Member ActivatorPower(Vector3 input) (function) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:372: warning: Member ActivatorReciprocal(float3 input) (function) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:411: warning: Member ActivatorReciprocal(Vector3 input) (function) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:381: warning: Member ActivatorCustom(float3 input) (function) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:420: warning: Member ActivatorCustom(Vector3 input) (function) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:151: warning: Member _outputValue (variable) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:165: warning: Member _outputValue (variable) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Receptor.cs:60: warning: Member array (property) of class NanoBrain.Receptor is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:73: warning: Member curvePreset (property) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:152: warning: Member outputValue (property) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:166: warning: Member outputValue (property) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:160: warning: Member outputMagnitude (property) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:161: warning: Member outputSqrMagnitude (property) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:178: warning: Member isFiring (property) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:182: warning: Member isSleeping (property) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:263: warning: Member Combinator (property) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:304: warning: Member Combinator (property) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:350: warning: Member Activator (property) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:389: warning: Member Activator (property) of class NanoBrain.Neuron is not documented.
-/home/pascal/Development/Projects/Passer/NanoBrain/NanoBrain/Assets/NanoBrain-unitypackage/Runtime/Scripts/Neuron.cs:434: warning: Member receivers (property) of class NanoBrain.Neuron is not documented.