// reset phenotype networks after each turn public void removePhenotypeNetworks() { bool removed = false; List <string> toRemove = new List <string>(); foreach (string netKey in networks[0].Keys) { if (netKey.StartsWith("phenotypeNet")) { toRemove.Add(netKey); removed = true; } } for (int i = 0; i < toRemove.Count; i++) { networks[0].Remove(toRemove[i]); } // remove extra nodes as well // for every output network if (removed) { // remove extra nodes foreach (OutputNetwork net in networks[networks.Count - 1].Values) { List <Node> removeNodes = new List <Node>(); // for every inner input node in first layer, delete if temp foreach (Node node in net.net[0]) { if (node.GetType().Name == "InnerInputNode") { InnerInputNode iiNode = (InnerInputNode)node; if (iiNode.temp) { removeNodes.Add(node); } } } foreach (Node node in removeNodes) { net.net[0].Remove(node); } // reassign previous nodes after deletion for (int i = 1; i < net.net.Count; i++) { for (int j = 0; j < net.net[i].Count; j++) { NonInputNode niNode = (NonInputNode)net.net[i][j]; niNode.assignPrevNodes(); } } } } }
// TODO : test public void addPhenotypeNetworks() { // add network for every neighbor with a creature for (int i = 1; i < neighborLands.Length; i++) { if (neighborLands[i].creatureIsOn()) { // get a copy of the template // Debug.Log("template first layer length: " + phenotypeNetTemplate.net[0].Count); PhenotypeNetwork phenotypeNet = (PhenotypeNetwork)Copier.copyNetwork(phenotypeNetTemplate, this); // set the phenotype used in the template phenotypeNet.setInputNodes(neighborLands[i].creatureOn.phenotype, i); // add the network to the creatures networks string phenoNetName = "phenotypeNet" + i; networks[0].Add(phenoNetName, phenotypeNet); // for every output node in the phenotype network int length = phenotypeNet.net.Count; for (int j = 0; j < phenotypeNet.net[length - 1].Count; j++) { OutputNode outNode = (OutputNode)phenotypeNet.net[length - 1][j]; // for every output network, add an inner-input node for the phenotype node, if applicable foreach (OutputNetwork net in networks[networks.Count - 1].Values) { // output network must match action of phenotype output node if (net.outputAction.name.Equals(outNode.action.name)) { // create a new inner-input node InnerInputNode node = new InnerInputNode(); // set linked node node.parentCreature = this; node.setLinkedNode(this, 0, phenoNetName, phenotypeNet.net.Count - 1, j); node.temp = true; // add inner-input node to first layer of output network net.net[0].Add(node); // add previous node for all nodes in second layer of output network for (int k = 0; k < net.net[1].Count; k++) { NonInputNode niNode = (NonInputNode)net.net[1][k]; niNode.appendPrevNode(net.net[0][net.net[0].Count - 1]); } } } } } } }
public void setNetwork(Network _net) { int x = 130; int y = -50; net = _net; List <List <Node> > layers = net.net; for (int i = 0; i < layers.Count; i++) { for (int j = 0; j < layers[i].Count; j++) { GameObject created = Instantiate(nodePrefab); Text title = created.transform.GetChild(1).gameObject.GetComponent <Text>(); Text value = created.transform.GetChild(2).gameObject.GetComponent <Text>(); Button btn = created.transform.GetChild(3).gameObject.GetComponent <Button>(); //btn.name = j.ToString(); string type = layers[i][j].GetType().Name; //Debug.Log("type " + type); bool castWorked = true; NonInputNode nodeArg = null; try { nodeArg = (NonInputNode)layers[i][j]; } catch (InvalidCastException e) { castWorked = false; } if (castWorked) { btn.onClick.AddListener(() => { createNodePanel(nodeArg); }); } string titleText = ""; switch (type) { case "SensoryInputNode": SensoryInputNode siNode = (SensoryInputNode)layers[i][j]; titleText = "sense " + siNode.sensedResource + " " + Helper.neighborIndexToWord(siNode.neighborLandIndex); break; case "OutputNode": OutputNode outNode = (OutputNode)layers[i][j]; titleText = outNode.action.name; break; case "InternalResourceInputNode": InternalResourceInputNode internNode = (InternalResourceInputNode)layers[i][j]; titleText = internNode.sensedResource + " stored"; break; case "InnerInputNode": InnerInputNode innerNode = (InnerInputNode)layers[i][j]; titleText = innerNode.linkedNetName; break; case "PhenotypeInputNode": PhenotypeInputNode phenoNode = (PhenotypeInputNode)layers[i][j]; titleText = "Pheno: " + phenoNode.neighborIndex; break; case "BiasNode": titleText = "Bias Node"; break; default: titleText = ""; break; } double rounded = System.Math.Round((double)layers[i][j].value, 2); value.text = rounded.ToString(); title.text = titleText; created.transform.SetParent(canvas.transform, false); RectTransform transform = created.GetComponent <RectTransform>(); transform.anchoredPosition = new Vector2(x, y); y -= 40; if (j % 8 == 0 && j != 0) { x += 70; y = -50; } instantiated.Add(created); } x += 120; y = -50; } }
public InnerInputNodeEditor(InnerInputNode node, Creature parentCreature) { this.parentCreature = parentCreature; this.iiNode = node; }
public static Node getNewNode(Node oldNode, Creature creatureCopy, Network parentNet) { if (oldNode.GetType().Name == "SensoryInputNode") { SensoryInputNode newNode = (SensoryInputNode)oldNode.clone(); newNode.creature = creatureCopy; return(newNode); } else if (oldNode.GetType().Name == "InternalResourceInputNode") { InternalResourceInputNode newNode = (InternalResourceInputNode)oldNode.clone(); newNode.creature = creatureCopy; return(newNode); } else if (oldNode.GetType().Name == "OutputNode") { OutputNode oldNode2 = (OutputNode)oldNode; OutputNode newNode = (OutputNode)oldNode.clone(); newNode.resetRand(); newNode.parentNet = parentNet; newNode.parentCreature = creatureCopy; newNode.action = getNewAction(newNode.action); //newNode.setActivBehavior(new LogisticActivBehavior()); newNode.prevNodes = new List <Node>(); newNode.assignPrevNodes(); newNode.weights = new List <float>(); for (int i = 0; i < oldNode2.weights.Count; i++) { newNode.weights.Add(oldNode2.weights[i]); } newNode.extraWeights = new List <float>(); for (int i = 0; i < oldNode2.extraWeights.Count; i++) { newNode.extraWeights.Add(oldNode2.extraWeights[i]); } return(newNode); } else if (oldNode.GetType().Name == "NonInputNode") { NonInputNode oldNode2 = (NonInputNode)oldNode; NonInputNode newNode = (NonInputNode)oldNode.clone(); newNode.resetRand(); newNode.parentNet = parentNet; newNode.parentCreature = creatureCopy; //newNode.setActivBehavior(new LogisticActivBehavior()); newNode.prevNodes = new List <Node>(); newNode.assignPrevNodes(); newNode.weights = new List <float>(); for (int i = 0; i < oldNode2.weights.Count; i++) { newNode.weights.Add(oldNode2.weights[i]); } newNode.extraWeights = new List <float>(); for (int i = 0; i < oldNode2.extraWeights.Count; i++) { newNode.extraWeights.Add(oldNode2.extraWeights[i]); } return(newNode); } else if (oldNode.GetType().Name == "BiasNode") { BiasNode oldNode2 = (BiasNode)oldNode; BiasNode newNode = oldNode2.clone(); return(newNode); } else if (oldNode.GetType().Name == "InnerInputNode") { InnerInputNode oldNode2 = (InnerInputNode)oldNode; InnerInputNode newNode = oldNode2.clone(); newNode.parentCreature = creatureCopy; /* * Debug.Log("linked network layer number: " + oldNode2.linkedNodeNetworkLayer); * Debug.Log("net name: " + oldNode2.linkedNetName); * Debug.Log("node index: " + newNode.linkedNodeIndex); */ Network linkedNetwork = creatureCopy.networks[oldNode2.linkedNodeNetworkLayer][oldNode2.linkedNetName]; newNode.linkedNode = linkedNetwork.net[linkedNetwork.net.Count - 1][newNode.linkedNodeIndex]; return(newNode); } // called when template is being copied else if (oldNode.GetType().Name == "PhenotypeInputNode") { PhenotypeInputNode oldNode2 = (PhenotypeInputNode)oldNode; PhenotypeInputNode newNode = (PhenotypeInputNode)oldNode.clone(); // copy phenotype newNode.parentCreat = creatureCopy; int length = oldNode2.phenotype.Length; newNode.phenotype = new bool[length]; for (int i = 0; i < newNode.phenotype.Length; i++) { newNode.phenotype[i] = oldNode2.phenotype[i]; } return(newNode); } else if (oldNode.GetType().Name == "CommInputNode") { //TODO return(null); } else if (oldNode.GetType().Name == "MemoryInputNode") { //TODO return(null); } else { Debug.LogError("Didn't find correct type of node to add"); return(null); } }