/// <summary>
        /// Find an innovation for a hidden neuron that split a existing link. This
        /// is the means by which hidden neurons are introduced in NEAT.
        /// </summary>
        /// <param name="fromId">The source neuron ID in the link.</param>
        /// <param name="toId">The target neuron ID in the link.</param>
        /// <returns>The newly created innovation, or the one that matched the search.</returns>
        public NEATInnovation FindInnovationSplit(long fromId, long toId)
        {
            String key = ProduceKeyNeuronSplit(fromId, toId);

            lock (_list)
            {
                if (_list.ContainsKey(key))
                {
                    return(_list[key]);
                }
                long neuronId   = Population.AssignGeneId();
                var  innovation = new NEATInnovation
                {
                    InnovationId = Population.AssignInnovationId(),
                    NeuronId     = neuronId
                };
                _list[key] = innovation;

                // create other sides of split, if needed
                FindInnovation(fromId, neuronId);
                FindInnovation(neuronId, toId);
                return(innovation);
            }
        }