/// <summary>
        /// Performs a crossover operation with this program and the sibling program.
        /// Crossover is performed on like branches, i.e. RCBs only crossover with sibling
        /// RCBs.
        /// </summary>
        /// <param name="sibling">Which sibling to crossover with</param>
        public override void Crossover(GPProgramBranch sibling)
        {
            GPProgramBranchADR rightADR = (GPProgramBranchADR)sibling;

            //
            // Select a branch
            byte WhichBranch = (byte)GPUtilities.rngNextInt(4);

            switch (WhichBranch)
            {
            case 0:
                Crossover(ref m_BranchADR.m_RCB, m_BranchADR.NodeCountRCB, ref rightADR.m_RCB, rightADR.NodeCountRCB);
                break;

            case 1:
                Crossover(ref m_BranchADR.m_RBB, m_BranchADR.NodeCountRBB, ref rightADR.m_RBB, rightADR.NodeCountRBB);
                break;

            case 2:
                Crossover(ref m_BranchADR.m_RUB, m_BranchADR.NodeCountRUB, ref rightADR.m_RUB, rightADR.NodeCountRUB);
                break;

            case 3:
                Crossover(ref m_BranchADR.m_RGB, m_BranchADR.NodeCountRGB, ref rightADR.m_RGB, rightADR.NodeCountRGB);
                break;
            }

            //
            // Make sure the program stats get updated for both programs
            m_Branch.UpdateStats();
            sibling.UpdateStats();
        }
        /// <summary>
        /// This method directs the construction of an RPB
        /// </summary>
        /// <param name="Branch"></param>
        /// <param name="TreeBuild"></param>
        /// <returns></returns>
        public override bool Build(GPProgramBranch Branch, GPEnums.TreeBuild TreeBuild)
        {
            m_Branch = Branch;
            //
            // Call the recursive method to create the tree
            m_Branch.Root = BuildInternal(TreeBuild, m_Branch.DepthInitial, 0, false);

            //
            // Update the tree stats
            m_Branch.UpdateStats();

            //
            // Convert the program into array representation
            m_Branch.ConvertToArray(m_Config.FunctionSet);

            return(true);
        }