NanoBrain-unitypackage/ReceptorArray.cs

85 lines
3.8 KiB
C#

using System.Collections.Generic;
using UnityEngine;
public class ReceptorArray {
public string name;
public Cluster parent { get; set; }
public NucleusArray nuclei;
public int size => nuclei.nuclei.Length;
public Dictionary<int, INucleus> thingReceivers = new();
public ReceptorArray(Cluster parent, NucleusArray nuclei) {
this.parent = parent;
this.nuclei = nuclei;
}
public virtual void ProcessStimulus(int thingId, Vector3 newLocalPositionVector, string thingName = null) {
if (!thingReceivers.TryGetValue(thingId, out INucleus selectedReceiver)) {
foreach (IReceptor receptor in this.nuclei.nuclei) {
if (receptor is not INucleus receiver)
continue;
if (thingReceivers.ContainsValue(receiver))
continue;
// receiver is not used yet
thingReceivers.Add(thingId, receiver);
selectedReceiver = receiver;
}
}
//selectedReceiver.outputValue = newLocalPositionVector;
/*
int receiverIx = 0;
INucleus selectedReceiver = null;
int selectedReceiverIx = 0;
foreach (INucleus receiver in this.receivers) {
if (thingIds[receiverIx] == thingId) {
// We found an existing receiver for this thing
selectedReceiver = receiver;
selectedReceiverIx = receiverIx;
// Do not look any further
break;
}
else if (receiver.isSleeping) {
// A sleeping receiver is not active and can therefore always be used
selectedReceiver = receiver;
selectedReceiverIx = receiverIx;
// Look further because we may find an existing receiver for this thing
}
else if (selectedReceiver == null) {
// If we haven't found a receiver yet, just start by taking the first
selectedReceiver = receiver;
selectedReceiverIx = receiverIx;
}
else if (selectedReceiver.isSleeping == false) {
// If no existing or sleeping receiver is found, we look for
// the receiver with the furthest/least interesting stimulus
if (length(receiver.outputValue) < length(selectedReceiver.outputValue)) {
// Debug.Log($"{selectedReceiver.name}[{selectedReceiverIx}] {length(selectedReceiver.outputValue)}" +
// $" {receiver.name}[{receiverIx}] {length(receiver.outputValue)} ");
selectedReceiver = receiver;
selectedReceiverIx = receiverIx;
}
}
receiverIx++;
}
if (selectedReceiverIx >= thingIds.Length)
return;
thingIds[selectedReceiverIx] = thingId;
if (thingName != null) {
string baseName = selectedReceiver.name;
int colonPos = selectedReceiver.name.IndexOf(":");
if (colonPos > 0)
baseName = selectedReceiver.name.Substring(0, colonPos);
selectedReceiver.name = baseName + ": " + thingName;
}
Debug.Log($"Receiver {selectedReceiver.name}[{selectedReceiverIx}] for thing {thingId}");
selectedReceiver.parent.UpdateStateIsolated();
*/
}
}