private void assignNeuronDepth(Gene[] nodeGenes, int depth, Chromosome mutated) {
    int i;
    NEATNodeGene node;
    // ArrayList nodeGenes = this.findOutputNodes(this.candidateNodes(genes));

    for (i = 0; i < nodeGenes.length; i++) {
      node = (NEATNodeGene) nodeGenes[i];
      if (node.getType() == NEATNodeGene.OUTPUT) {
        if (depth == 1) {
          node.setDepth(depth);
          this.assignNeuronDepth(
              this.findSourceNodes(node.id(), mutated.genes()), depth + 1, mutated);
        }
      } else if (node.getType() == NEATNodeGene.HIDDEN) {
        if (node.getDepth() == 0) {
          // we have an unassigned depth
          node.setDepth(depth);
          this.assignNeuronDepth(
              this.findSourceNodes(node.id(), mutated.genes()), depth + 1, mutated);
        }
      } else if (node.getType() == NEATNodeGene.INPUT) {
        node.setDepth(Integer.MAX_VALUE);
      }
    }
  }
  private Gene[] ensureLegalLinks(Gene[] genes) {
    ArrayList links;
    NEATLinkGene link;
    NEATNodeGene from;
    NEATNodeGene to;
    Gene[] newGenes = null;
    ArrayList tmpGenes = new ArrayList();
    int i;

    // only need to prune if recurrency not allowed
    if (!this.recurrencyAllowed) {
      // only return enabled links
      links = this.candidateLinks(genes, false);
      for (i = 0; i < genes.length; i++) {
        if (genes[i] instanceof NEATLinkGene) {
          link = (NEATLinkGene) genes[i];
          from = this.findNode(link.getFromId(), genes);
          to = this.findNode(link.getToId(), genes);
          if (from.getDepth() > to.getDepth()) {
            // not recurrent - so keep
            tmpGenes.add(genes[i]);
          }
        } else {
          tmpGenes.add(genes[i]);
        }
      }
      newGenes = new Gene[tmpGenes.size()];
      for (i = 0; i < newGenes.length; i++) {
        newGenes[i] = (Gene) tmpGenes.get(i);
      }
    } else {
      newGenes = genes;
    }

    return (newGenes);
  }