// Returns new child
        private DBNode LinkNewChildToGraph(DBNode node, IDBOperator op)
        {
            IDBSpaceState newState = op.Apply(module, node.State);

            newState.UpdateIsGoal(module);

            DBNode newNode = new DBNode(DBNode.NodeType.Dependency,
                                        newState, level);

            if (newNode.IsGoal)
            {
                goalCount += 1;
            }

            TreeSizeIncreased = true;
            nodeCount        += 1;

            // Graph bookkeeping
            node.Children.Add(newNode);

            module.RegisterNewNode(newNode, root);

            return(newNode);
        }
        public void Search(IDBSpaceState rootState)
        {
            rootState.UpdateIsGoal(module);
            root = new DBNode(DBNode.NodeType.Root, rootState, 0);
            if (root.IsGoal)
            {
                goalCount += 1;
            }

            module.RegisterNewNode(root, root);

            level = 1;

            TreeSizeIncreased = true;
            try {
                while (TreeSizeIncreased)
                {
                    //Console.WriteLine ("level {0}", level);

                    TreeSizeIncreased = false;

                    if (breadthFirst)
                    {
                        dependencyNodeQueue.Clear();
                    }
                    AddDependencyStage(root);

                    if (breadthFirst)
                    {
                        SolveDependencyStage();
                    }
                    //DumpTree (root);

                    /*Console.WriteLine ("level {0} dependency finished: {1} nodes, {2} goals",
                     *      level, nodeCount, goalCount);*/

                    if (TreeSizeIncreased == false)
                    {
                        break;
                    }
                    if (module.GoalCountThresh != 0 && goalCount >= module.GoalCountThresh)
                    {
                        break;
                    }

                    /*
                     * Console.WriteLine ("COMB TEST");
                     * module.CombinationStage (level, root, this);
                     *
                     * if (module.GoalCountThresh != 0 && goalCount >= module.GoalCountThresh)
                     *      break;
                     */

                    AddCombinationStage(root, new Stack());

                    /*Console.WriteLine ("level {0} combination finished: {1} nodes, {2} goals",
                     *      level, nodeCount, goalCount);*/
                    if (TreeSizeIncreased == false)
                    {
                        break;
                    }
                    if (module.GoalCountThresh != 0 && goalCount >= module.GoalCountThresh)
                    {
                        break;
                    }
                    //DumpTree (root);

                    level += 1;
                }
            } catch (GoalCountExceededException) {
                /*
                 * Console.WriteLine ("GOAL count limit of {0} exceeded.",
                 *      module.GoalCountThresh);*/
            }
        }