public void TC_StripsHeuristic()
        {
            var sasProblem  = new Planner.SAS.Problem(new SASInputData(GetFilePath("TC_Gripper.sas")));
            var pddlProblem = new Planner.PDDL.Problem(new PDDLInputData(GetFilePath("TC_Gripper_D.pddl"), GetFilePath("TC_Gripper_P.pddl")));

            var heuristic = new StripsHeuristic(sasProblem);

            Assert.AreEqual(4, heuristic.GetValue(sasProblem.GetInitialState()));
            Assert.AreEqual(4, heuristic.GetValue(new Planner.SAS.State(0, 0, 0, 0, 0, 0, 0)));
            Assert.AreEqual(3, heuristic.GetValue(new Planner.SAS.State(1, 0, 0, 0, 0, 0, 0)));
            Assert.AreEqual(2, heuristic.GetValue(new Planner.SAS.State(0, 1, 1, 0, 0, 0, 0)));
            Assert.AreEqual(0, heuristic.GetValue(new Planner.SAS.State(1, 1, 1, 1, 0, 0, 0)));
            Assert.AreEqual(4, heuristic.GetValue(sasProblem.GetGoalConditions()));
            Assert.AreEqual(0, heuristic.GetValue(new Planner.SAS.Conditions(new Planner.SAS.Assignment(0, 0))));
            Assert.AreEqual(2, heuristic.GetValue(new Planner.SAS.Conditions(new Planner.SAS.Assignment(1, 1), new Planner.SAS.Assignment(2, 1))));
            Assert.AreEqual(1, heuristic.GetValue(new Planner.SAS.ConditionsClause(new Planner.SAS.Conditions(new Planner.SAS.Assignment(0, 1), new Planner.SAS.Assignment(1, 1)), new Planner.SAS.Conditions(new Planner.SAS.Assignment(2, 1)))));
            Assert.AreEqual(int.MaxValue, heuristic.GetValue(new Planner.SAS.ConditionsContradiction()));
            Assert.AreEqual(4, heuristic.GetValue(sasProblem.GetGoalConditions().GetCorrespondingRelativeStates(sasProblem).First()));
            Assert.AreEqual("STRIPS Heuristic", heuristic.GetName());
            Assert.AreEqual(11, heuristic.GetCallsCount());

            var data = new PDDLInputData(GetFilePath("TC_Gripper_D.pddl"), GetFilePath("TC_Gripper_P.pddl"));

            Planner.PDDL.IdManager         idManager         = new Planner.PDDL.IdManager(data);
            Planner.PDDL.PrimitivesFactory factory           = new Planner.PDDL.PrimitivesFactory(idManager);
            Planner.PDDL.GroundingManager  groundingManager  = new Planner.PDDL.GroundingManager(data, idManager);
            Planner.PDDL.EvaluationManager evaluationManager = new Planner.PDDL.EvaluationManager(groundingManager, pddlProblem.RigidRelations);
            var atPred  = factory.CreatePredicate("at", "ball1", "roomb");
            var atPred2 = factory.CreatePredicate("at", "ball2", "roomb");

            var heuristic2 = new StripsHeuristic(pddlProblem);

            Assert.AreEqual(2, heuristic2.GetValue(pddlProblem.GetInitialState()));
            Assert.AreEqual(1, heuristic2.GetValue(new Planner.PDDL.State(new HashSet <Planner.PDDL.IAtom> {
                atPred
            }, null, null, idManager)));
            Assert.AreEqual(0, heuristic2.GetValue(new Planner.PDDL.State(new HashSet <Planner.PDDL.IAtom> {
                atPred, atPred2
            }, null, null, idManager)));
            Assert.AreEqual(2, heuristic2.GetValue(pddlProblem.GetGoalConditions()));
            Assert.AreEqual(1, heuristic2.GetValue(new Planner.PDDL.Conditions(new Planner.PDDL.PredicateExpression(atPred, idManager), evaluationManager)));
            Assert.AreEqual(1, heuristic2.GetValue(new Planner.PDDL.ConditionsCNF(new HashSet <Planner.PDDL.IConjunctCNF> {
                new Planner.PDDL.PredicateLiteralCNF(new Planner.PDDL.PredicateExpression(atPred, idManager), false)
            }, evaluationManager, null)));
            Assert.AreEqual(2, heuristic2.GetValue(pddlProblem.GetGoalConditions().GetCorrespondingRelativeStates(pddlProblem).First()));
            Assert.AreEqual("STRIPS Heuristic", heuristic2.GetName());
            Assert.AreEqual(7, heuristic2.GetCallsCount());
        }
        public void TC_BlindHeuristic()
        {
            var sasProblem  = new Planner.SAS.Problem(new SASInputData(GetFilePath("TC_Gripper.sas")));
            var pddlProblem = new Planner.PDDL.Problem(new PDDLInputData(GetFilePath("TC_Gripper_D.pddl"), GetFilePath("TC_Gripper_P.pddl")));

            var heuristic = new BlindHeuristic();

            Assert.AreEqual(0, heuristic.GetValue(sasProblem.GetInitialState()));
            Assert.AreEqual(0, heuristic.GetValue(sasProblem.GetGoalConditions()));
            Assert.AreEqual(0, heuristic.GetValue(sasProblem.GetGoalConditions().GetCorrespondingRelativeStates(sasProblem).First()));
            Assert.AreEqual(0, heuristic.GetValue(pddlProblem.GetInitialState()));
            Assert.AreEqual(0, heuristic.GetValue(pddlProblem.GetGoalConditions()));
            Assert.AreEqual(0, heuristic.GetValue(pddlProblem.GetGoalConditions().GetCorrespondingRelativeStates(pddlProblem).First()));
            Assert.AreEqual("Blind Heuristic", heuristic.GetName());
            Assert.AreEqual(6, heuristic.GetCallsCount());
        }
        public void TC_WeightedSumHeuristic()
        {
            var sasProblem  = new Planner.SAS.Problem(new SASInputData(GetFilePath("TC_Gripper.sas")));
            var pddlProblem = new Planner.PDDL.Problem(new PDDLInputData(GetFilePath("TC_Gripper_D.pddl"), GetFilePath("TC_Gripper_P.pddl")));

            var heuristic = new WeightedSumHeuristic(true, Tuple.Create((IHeuristic) new AdditiveRelaxationHeuristic(sasProblem), 3.0), Tuple.Create((IHeuristic) new MaxRelaxationHeuristic(sasProblem), 7.0));

            Assert.IsTrue(heuristic.GetValue(sasProblem.GetInitialState()) > 0);
            Assert.IsTrue(heuristic.GetValue(sasProblem.GetGoalConditions()) > 0);
            Assert.IsTrue(heuristic.GetValue(sasProblem.GetGoalConditions().GetCorrespondingRelativeStates(sasProblem).First()) > 0);
            Assert.IsTrue(heuristic.GetName().Contains("Weighted Sum Heuristic of"));
            Assert.AreEqual(3, heuristic.GetCallsCount());

            var heuristic2 = new WeightedSumHeuristic(true, Tuple.Create((IHeuristic) new AdditiveRelaxationHeuristic(pddlProblem), 3.0), Tuple.Create((IHeuristic) new MaxRelaxationHeuristic(pddlProblem), 7.0));

            Assert.IsTrue(heuristic2.GetValue(pddlProblem.GetInitialState()) > 0);
            Assert.IsTrue(heuristic2.GetValue(pddlProblem.GetGoalConditions()) > 0);
            Assert.IsTrue(heuristic2.GetValue(pddlProblem.GetGoalConditions().GetCorrespondingRelativeStates(pddlProblem).First()) > 0);
            Assert.IsTrue(heuristic.GetName().Contains("Weighted Sum Heuristic of"));
            Assert.AreEqual(3, heuristic2.GetCallsCount());
        }
        public void TC_SumHeuristic()
        {
            var sasProblem  = new Planner.SAS.Problem(new SASInputData(GetFilePath("TC_Gripper.sas")));
            var pddlProblem = new Planner.PDDL.Problem(new PDDLInputData(GetFilePath("TC_Gripper_D.pddl"), GetFilePath("TC_Gripper_P.pddl")));

            var heuristic = new SumHeuristic(new AdditiveRelaxationHeuristic(sasProblem), new MaxRelaxationHeuristic(sasProblem));

            Assert.AreEqual(14, heuristic.GetValue(sasProblem.GetInitialState()));
            Assert.AreEqual(14, heuristic.GetValue(sasProblem.GetGoalConditions()));
            Assert.AreEqual(14, heuristic.GetValue(sasProblem.GetGoalConditions().GetCorrespondingRelativeStates(sasProblem).First()));
            Assert.AreEqual("Sum Heuristic of (Additive Relaxation Heuristic, Max Relaxation Heuristic)", heuristic.GetName());
            Assert.AreEqual(3, heuristic.GetCallsCount());

            var heuristic2 = new SumHeuristic(new AdditiveRelaxationHeuristic(pddlProblem), new MaxRelaxationHeuristic(pddlProblem));

            Assert.AreEqual(7, heuristic2.GetValue(pddlProblem.GetInitialState()));
            Assert.AreEqual(7, heuristic2.GetValue(pddlProblem.GetGoalConditions()));
            Assert.AreEqual(7, heuristic2.GetValue(pddlProblem.GetGoalConditions().GetCorrespondingRelativeStates(pddlProblem).First()));
            Assert.AreEqual("Sum Heuristic of (Additive Relaxation Heuristic, Max Relaxation Heuristic)", heuristic2.GetName());
            Assert.AreEqual(3, heuristic2.GetCallsCount());
        }
        public void TC_WeightedHeuristic()
        {
            var sasProblem  = new Planner.SAS.Problem(new SASInputData(GetFilePath("TC_Gripper.sas")));
            var pddlProblem = new Planner.PDDL.Problem(new PDDLInputData(GetFilePath("TC_Gripper_D.pddl"), GetFilePath("TC_Gripper_P.pddl")));

            var heuristic = new WeightedHeuristic(new StripsHeuristic(sasProblem), 3);

            Assert.AreEqual(12, heuristic.GetValue(sasProblem.GetInitialState()));
            Assert.AreEqual(12, heuristic.GetValue(new Planner.SAS.State(0, 0, 0, 0, 0, 0, 0)));
            Assert.AreEqual(6, heuristic.GetValue(new Planner.SAS.State(0, 1, 1, 0, 0, 0, 0)));
            Assert.AreEqual(0, heuristic.GetValue(new Planner.SAS.State(1, 1, 1, 1, 0, 0, 0)));
            Assert.AreEqual(12, heuristic.GetValue(sasProblem.GetGoalConditions()));
            Assert.AreEqual(12, heuristic.GetValue(sasProblem.GetGoalConditions().GetCorrespondingRelativeStates(sasProblem).First()));
            Assert.AreEqual("Weighted STRIPS Heuristic (weight = 3)", heuristic.GetName());
            Assert.AreEqual(6, heuristic.GetCallsCount());

            var heuristic2 = new WeightedHeuristic(new StripsHeuristic(pddlProblem), 9);

            Assert.AreEqual(18, heuristic2.GetValue(pddlProblem.GetInitialState()));
            Assert.AreEqual(18, heuristic2.GetValue(pddlProblem.GetGoalConditions()));
            Assert.AreEqual(18, heuristic2.GetValue(pddlProblem.GetGoalConditions().GetCorrespondingRelativeStates(pddlProblem).First()));
            Assert.AreEqual("Weighted STRIPS Heuristic (weight = 9)", heuristic2.GetName());
            Assert.AreEqual(3, heuristic2.GetCallsCount());
        }
        public void TC_MultiHeuristicAStarSearch()
        {
            var sasProblem = new Planner.SAS.Problem(new SASInputData(GetFilePath("TC_Gripper.sas")));
            var sasSearch  = new MultiHeuristicAStarSearch(sasProblem, new BlindHeuristic());

            sasSearch.Start();
            var sasSolution = sasSearch.GetSearchResults();

            Assert.AreEqual("Multi-Heuristic A* Search", sasSolution.Algorithm);
            Assert.AreEqual("TC_Gripper", sasSolution.ProblemName);
            Assert.AreEqual("Blind Heuristic", sasSolution.Heuristic);
            Assert.AreEqual(ResultStatus.SolutionFound, sasSolution.ResultStatus);
            Assert.IsTrue(sasSolution.SearchTime.TotalMilliseconds > 0);
            Assert.AreEqual(11, sasSolution.SolutionCost);
            Assert.IsNotNull(sasSolution.SolutionPlan);
            Assert.AreEqual(11, sasSolution.SolutionPlan.GetCost());

            var sasSearch2 = new MultiHeuristicAStarSearch(sasProblem, new BlindHeuristic());

            sasSearch2.Start(SearchType.BackwardWithConditions);
            var sasSolution2 = sasSearch2.GetSearchResults();

            Assert.AreEqual("Multi-Heuristic A* Search (Backward)", sasSolution2.Algorithm);
            Assert.AreEqual("TC_Gripper", sasSolution2.ProblemName);
            Assert.AreEqual("Blind Heuristic", sasSolution2.Heuristic);
            Assert.AreEqual(ResultStatus.SolutionFound, sasSolution2.ResultStatus);
            Assert.IsTrue(sasSolution2.SearchTime.TotalMilliseconds > 0);
            Assert.AreEqual(11, sasSolution2.SolutionCost);
            Assert.IsNotNull(sasSolution2.SolutionPlan);
            Assert.AreEqual(11, sasSolution2.SolutionPlan.GetCost());

            var sasSearch3 = new MultiHeuristicAStarSearch(sasProblem, new BlindHeuristic());

            sasSearch3.Start(SearchType.BackwardWithStates);
            var sasSolution3 = sasSearch3.GetSearchResults();

            Assert.AreEqual("Multi-Heuristic A* Search (Backward)", sasSolution3.Algorithm);
            Assert.AreEqual("TC_Gripper", sasSolution3.ProblemName);
            Assert.AreEqual("Blind Heuristic", sasSolution3.Heuristic);
            Assert.AreEqual(ResultStatus.SolutionFound, sasSolution3.ResultStatus);
            Assert.IsTrue(sasSolution3.SearchTime.TotalMilliseconds > 0);
            Assert.AreEqual(11, sasSolution3.SolutionCost);
            Assert.IsNotNull(sasSolution3.SolutionPlan);
            Assert.AreEqual(11, sasSolution3.SolutionPlan.GetCost());

            var pddlProblem = new Planner.PDDL.Problem(new PDDLInputData(GetFilePath("TC_Gripper_D.pddl"), GetFilePath("TC_Gripper_P.pddl")));
            var pddlSearch  = new MultiHeuristicAStarSearch(pddlProblem, new BlindHeuristic());

            pddlSearch.Start();
            var pddlSolution = pddlSearch.GetSearchResults();

            Assert.AreEqual("Multi-Heuristic A* Search", pddlSolution.Algorithm);
            Assert.AreEqual("gripper", pddlSolution.DomainName);
            Assert.AreEqual("problem-1", pddlSolution.ProblemName);
            Assert.AreEqual("Blind Heuristic", pddlSolution.Heuristic);
            Assert.AreEqual(ResultStatus.SolutionFound, pddlSolution.ResultStatus);
            Assert.IsTrue(pddlSolution.SearchTime.TotalMilliseconds > 0);
            Assert.AreEqual(5, pddlSolution.SolutionCost);
            Assert.IsNotNull(pddlSolution.SolutionPlan);
            Assert.AreEqual(5, pddlSolution.SolutionPlan.GetCost());

            var pddlSearch2 = new MultiHeuristicAStarSearch(pddlProblem, new BlindHeuristic());

            pddlSearch2.Start(SearchType.BackwardWithConditions);
            var pddlSolution2 = pddlSearch2.GetSearchResults();

            Assert.AreEqual("Multi-Heuristic A* Search (Backward)", pddlSolution2.Algorithm);
            Assert.AreEqual("gripper", pddlSolution2.DomainName);
            Assert.AreEqual("problem-1", pddlSolution2.ProblemName);
            Assert.AreEqual("Blind Heuristic", pddlSolution2.Heuristic);
            Assert.AreEqual(ResultStatus.SolutionFound, pddlSolution2.ResultStatus);
            Assert.IsTrue(pddlSolution2.SearchTime.TotalMilliseconds > 0);
            Assert.AreEqual(5, pddlSolution2.SolutionCost);
            Assert.IsNotNull(pddlSolution2.SolutionPlan);
            Assert.AreEqual(5, pddlSolution2.SolutionPlan.GetCost());

            var pddlSearch3 = new MultiHeuristicAStarSearch(pddlProblem, new BlindHeuristic());

            pddlSearch3.Start(SearchType.BackwardWithStates);
            var pddlSolution3 = pddlSearch3.GetSearchResults();

            Assert.AreEqual("Multi-Heuristic A* Search (Backward)", pddlSolution3.Algorithm);
            Assert.AreEqual("gripper", pddlSolution3.DomainName);
            Assert.AreEqual("problem-1", pddlSolution3.ProblemName);
            Assert.AreEqual("Blind Heuristic", pddlSolution3.Heuristic);
            Assert.AreEqual(ResultStatus.SolutionFound, pddlSolution3.ResultStatus);
            Assert.IsTrue(pddlSolution3.SearchTime.TotalMilliseconds > 0);
            Assert.AreEqual(5, pddlSolution3.SolutionCost);
            Assert.IsNotNull(pddlSolution3.SolutionPlan);
            Assert.AreEqual(5, pddlSolution3.SolutionPlan.GetCost());
        }
        public void TC_HillClimbingSearch()
        {
            // The search path is basically random, no point to test the solution here

            var sasProblem = new Planner.SAS.Problem(new SASInputData(GetFilePath("TC_Gripper.sas")));
            var sasSearch  = new HillClimbingSearch(sasProblem, new BlindHeuristic(), false, new TimeSpan(0, 0, 1), 50000);

            sasSearch.Start();
            var sasSolution = sasSearch.GetSearchResults();

            Assert.AreEqual("Hill-Climbing Search", sasSolution.Algorithm);
            Assert.AreEqual("TC_Gripper", sasSolution.ProblemName);
            Assert.AreEqual("Blind Heuristic", sasSolution.Heuristic);
            Assert.IsTrue(sasSolution.SearchTime.TotalMilliseconds >= 0);

            var sasSearch2 = new HillClimbingSearch(sasProblem, new BlindHeuristic(), false, new TimeSpan(0, 0, 1), 50000);

            sasSearch2.Start(SearchType.BackwardWithConditions);
            var sasSolution2 = sasSearch2.GetSearchResults();

            Assert.AreEqual("Hill-Climbing Search (Backward)", sasSolution2.Algorithm);
            Assert.AreEqual("TC_Gripper", sasSolution2.ProblemName);
            Assert.AreEqual("Blind Heuristic", sasSolution2.Heuristic);
            Assert.IsTrue(sasSolution2.SearchTime.TotalMilliseconds >= 0);

            var sasSearch3 = new HillClimbingSearch(sasProblem, new BlindHeuristic(), false, new TimeSpan(0, 0, 1), 50000);

            sasSearch3.Start(SearchType.BackwardWithStates);
            var sasSolution3 = sasSearch3.GetSearchResults();

            Assert.AreEqual("Hill-Climbing Search (Backward)", sasSolution3.Algorithm);
            Assert.AreEqual("TC_Gripper", sasSolution3.ProblemName);
            Assert.AreEqual("Blind Heuristic", sasSolution3.Heuristic);
            Assert.IsTrue(sasSolution3.SearchTime.TotalMilliseconds >= 0);

            var pddlProblem = new Planner.PDDL.Problem(new PDDLInputData(GetFilePath("TC_Gripper_D.pddl"), GetFilePath("TC_Gripper_P.pddl")));
            var pddlSearch  = new HillClimbingSearch(pddlProblem, new BlindHeuristic(), false, new TimeSpan(0, 0, 1), 50000);

            pddlSearch.Start();
            var pddlSolution = pddlSearch.GetSearchResults();

            Assert.AreEqual("Hill-Climbing Search", pddlSolution.Algorithm);
            Assert.AreEqual("gripper", pddlSolution.DomainName);
            Assert.AreEqual("problem-1", pddlSolution.ProblemName);
            Assert.AreEqual("Blind Heuristic", pddlSolution.Heuristic);
            Assert.IsTrue(pddlSolution.SearchTime.TotalMilliseconds >= 0);

            var pddlSearch2 = new HillClimbingSearch(pddlProblem, new BlindHeuristic(), false, new TimeSpan(0, 0, 1), 50000);

            pddlSearch2.Start(SearchType.BackwardWithConditions);
            var pddlSolution2 = pddlSearch2.GetSearchResults();

            Assert.AreEqual("Hill-Climbing Search (Backward)", pddlSolution2.Algorithm);
            Assert.AreEqual("gripper", pddlSolution2.DomainName);
            Assert.AreEqual("problem-1", pddlSolution2.ProblemName);
            Assert.AreEqual("Blind Heuristic", pddlSolution2.Heuristic);
            Assert.IsTrue(pddlSolution2.SearchTime.TotalMilliseconds >= 0);

            var pddlSearch3 = new HillClimbingSearch(pddlProblem, new BlindHeuristic(), false, new TimeSpan(0, 0, 1), 50000);

            pddlSearch3.Start(SearchType.BackwardWithStates);
            var pddlSolution3 = pddlSearch3.GetSearchResults();

            Assert.AreEqual("Hill-Climbing Search (Backward)", pddlSolution3.Algorithm);
            Assert.AreEqual("gripper", pddlSolution3.DomainName);
            Assert.AreEqual("problem-1", pddlSolution3.ProblemName);
            Assert.AreEqual("Blind Heuristic", pddlSolution3.Heuristic);
            Assert.IsTrue(pddlSolution3.SearchTime.TotalMilliseconds >= 0);
        }