예제 #1
0
 def test_with_pytamer(self):
     import pytamer # type: ignore
     with tempfile.TemporaryDirectory() as tempdir:
         temp_file_name = os.path.join(tempdir, 'test_file.anml')
         with OneshotPlanner(name='tamer') as tamer:
             for example in self.problems.values():
                 problem = example.problem
                 if tamer.supports(problem.kind):
                     aw = ANMLWriter(problem)
                     aw.write_problem(temp_file_name)
                     tamer_env = pytamer.tamer_env_new()
                     pytamer_problem = pytamer.tamer_parse_anml(tamer_env, temp_file_name)
                     tamer_actions = list(pytamer.tamer_problem_get_actions(pytamer_problem))
                     self.assertEqual(len(tamer_actions), len(problem.actions))
                     for ta in tamer_actions:
                         up_act = problem.action(pytamer.tamer_action_get_name(ta))
                         ta_params = list(pytamer.tamer_action_get_parameters(ta))
                         self.assertEqual(len(up_act.parameters), len(ta_params))
                     tamer_fluents_and_constants = list(pytamer.tamer_problem_get_fluents(pytamer_problem))
                     number_of_fluents = len(tamer_fluents_and_constants)
                     tamer_fluents_and_constants.extend(list(pytamer.tamer_problem_get_constants(pytamer_problem)))
                     self.assertEqual(len(tamer_fluents_and_constants), len(problem.fluents))
                     for n, tf in enumerate(tamer_fluents_and_constants):
                         if n < number_of_fluents: # the current element is a fluent
                             up_fluent = problem.fluent(pytamer.tamer_fluent_get_name(tf))
                             tf_sign = list(pytamer.tamer_fluent_get_parameters(tf))
                         else: # The current element is a constant
                             up_fluent = problem.fluent(pytamer.tamer_constant_get_name(tf))
                             tf_sign = list(pytamer.tamer_constant_get_parameters(tf))
                         self.assertEqual(len(up_fluent.signature), len(tf_sign))
                     tamer_objects = list(pytamer.tamer_problem_get_instances(pytamer_problem))
                     for to in tamer_objects:
                         problem.object(pytamer.tamer_instance_get_name(to))
                     self.assertEqual(len(tamer_objects), len(problem.all_objects))
예제 #2
0
    def test_ad_hoc_1(self):
        when = UserType('when')
        fl = Fluent('4ction')
        obj = Object('predicate', when)
        act = InstantaneousAction('variable', fluent=when)
        fluent = act.parameter('fluent')
        act.add_effect(fl, True, Equals(fluent, obj))
        problem = Problem('ad_hoc')
        problem.add_fluent(fl)
        problem.add_action(act)
        problem.add_object(obj)
        problem.set_initial_value(fl, False)
        aw = ANMLWriter(problem)
        anml_problem = aw.get_problem()
        expected_result = '''type when_;
fluent boolean f_4ction;
action variable_(when_ fluent_) {
   when [ start ] (fluent_ == predicate_)
   {[ start ] f_4ction := true;
   }
};
instance when_ predicate_;
[ start ] f_4ction := false;
'''
        self.assertEqual(anml_problem, expected_result)
예제 #3
0
 def test_basic(self):
     problem = self.problems['basic'].problem
     aw = ANMLWriter(problem)
     anml_problem = aw.get_problem()
     self.assertIn('fluent boolean x;\n', anml_problem)
     self.assertIn('action a() {\n', anml_problem)
     self.assertIn('   [ start ] (not x);\n', anml_problem)
     self.assertIn('   [ start ] x := true;\n', anml_problem)
     self.assertIn('};\n', anml_problem)
     self.assertIn('[ start ] x := false;\n', anml_problem)
     self.assertIn('[ end ] x;\n', anml_problem)
     self.assertEqual(anml_problem.count('\n'), 7)
예제 #4
0
 def test_hierarchical_blocks_world(self):
     problem = self.problems['hierarchical_blocks_world'].problem
     aw = ANMLWriter(problem)
     anml_problem = aw.get_problem()
     self.assertIn('type Entity;\n', anml_problem)
     self.assertIn('type Location < Entity;\n', anml_problem)
     self.assertIn('type Movable < Location;\n', anml_problem)
     self.assertIn('type Unmovable < Location;\n', anml_problem)
     self.assertIn('type TableSpace < Unmovable;\n', anml_problem)
     self.assertIn('type Block < Movable;\n', anml_problem)
     self.assertIn('fluent boolean clear(Location space);\n', anml_problem)
     self.assertIn('fluent boolean on(Movable object_, Location space);\n', anml_problem)
     self.assertIn('action move(Movable item, Location l_from, Location l_to) {\n', anml_problem)
     self.assertIn('   [ start ] clear(item);\n', anml_problem)
     self.assertIn('   [ start ] clear(l_to);\n', anml_problem)
     self.assertIn('   [ start ] on(item, l_from);\n', anml_problem)
     self.assertIn('   [ start ] clear(l_from) := true;\n', anml_problem)
     self.assertIn('   [ start ] on(item, l_from) := false;\n', anml_problem)
     self.assertIn('   [ start ] clear(l_to) := false;\n', anml_problem)
     self.assertIn('[ start ] on(item, l_to) := true;\n', anml_problem)
     self.assertIn('};\n', anml_problem)
     self.assertIn('instance TableSpace ts_1, ts_2, ts_3;\n', anml_problem)
     self.assertIn('instance Block block_1, block_2, block_3;\n', anml_problem)
     self.assertIn('[ start ] clear(ts_2) := true;\n', anml_problem)
     self.assertIn('[ start ] clear(ts_3) := true;\n', anml_problem)
     self.assertIn('[ start ] clear(block_2) := true;\n', anml_problem)
     self.assertIn('[ start ] on(block_3, ts_1) := true;\n', anml_problem)
     self.assertIn('[ start ] on(block_1, block_3) := true;\n', anml_problem)
     self.assertIn('[ start ] on(block_2, block_1) := true;\n', anml_problem)
     self.assertIn('[ start ] clear(ts_1) := false;\n', anml_problem)
     self.assertIn('[ start ] clear(block_1) := false;\n', anml_problem)
     self.assertIn('[ start ] clear(block_3) := false;\n', anml_problem)
     self.assertIn('[ start ] on(block_1, ts_1) := false;\n', anml_problem)
     self.assertIn('[ start ] on(block_2, ts_1) := false;\n', anml_problem)
     self.assertIn('[ start ] on(block_1, ts_2) := false;\n', anml_problem)
     self.assertIn('[ start ] on(block_2, ts_2) := false;\n', anml_problem)
     self.assertIn('[ start ] on(block_3, ts_2) := false;\n', anml_problem)
     self.assertIn('[ start ] on(block_1, ts_3) := false;\n', anml_problem)
     self.assertIn('[ start ] on(block_2, ts_3) := false;\n', anml_problem)
     self.assertIn('[ start ] on(block_3, ts_3) := false;\n', anml_problem)
     self.assertIn('[ start ] on(block_1, block_1) := false;\n', anml_problem)
     self.assertIn('[ start ] on(block_3, block_1) := false;\n', anml_problem)
     self.assertIn('[ start ] on(block_1, block_2) := false;\n', anml_problem)
     self.assertIn('[ start ] on(block_2, block_2) := false;\n', anml_problem)
     self.assertIn('[ start ] on(block_3, block_2) := false;\n', anml_problem)
     self.assertIn('[ start ] on(block_2, block_3) := false;\n', anml_problem)
     self.assertIn('[ start ] on(block_3, block_3) := false;\n', anml_problem)
     self.assertIn('[ end ] on(block_1, ts_3);\n', anml_problem)
     self.assertIn('[ end ] on(block_2, block_1);\n', anml_problem)
     self.assertIn('[ end ] on(block_3, block_2);\n', anml_problem)
     self.assertEqual(anml_problem.count('\n'), 46)
예제 #5
0
    def test_timed_connected_locations(self):
        problem = self.problems['timed_connected_locations'].problem
        aw = ANMLWriter(problem)
        anml_problem = aw.get_problem()
        expected_result = '''type Location;
fluent boolean is_at(Location position);
constant boolean is_connected(Location location_1, Location location_2);
action move(Location l_from, Location l_to) {
   duration >= 6 and duration <= 6;
   [ start, start ] is_at(l_from);
   [ start, start ] (not is_at(l_to));
   [ start, start ] (exists(Location mid_loc) { ((not ((mid_loc == l_from) or (mid_loc == l_to))) and (is_connected(l_from, mid_loc) or is_connected(mid_loc, l_from)) and (is_connected(l_to, mid_loc) or is_connected(mid_loc, l_to))) });
   [ start, end ] (exists(Location mid_loc) { ((not ((mid_loc == l_from) or (mid_loc == l_to))) and (is_connected(l_from, mid_loc) or is_connected(mid_loc, l_from)) and (is_connected(l_to, mid_loc) or is_connected(mid_loc, l_to))) });
   [ start + 1 ] is_at(l_from) := false;
   [ end + 5 ] is_at(l_to) := true;
};
instance Location l1, l2, l3, l4, l5;
[ start ] is_at(l1) := true;
is_connected(l1, l2) := true;
is_connected(l2, l3) := true;
is_connected(l3, l4) := true;
is_connected(l4, l5) := true;
[ start ] is_at(l2) := false;
[ start ] is_at(l3) := false;
[ start ] is_at(l4) := false;
[ start ] is_at(l5) := false;
is_connected(l1, l1) := false;
is_connected(l2, l1) := false;
is_connected(l3, l1) := false;
is_connected(l4, l1) := false;
is_connected(l5, l1) := false;
is_connected(l2, l2) := false;
is_connected(l3, l2) := false;
is_connected(l4, l2) := false;
is_connected(l5, l2) := false;
is_connected(l1, l3) := false;
is_connected(l3, l3) := false;
is_connected(l4, l3) := false;
is_connected(l5, l3) := false;
is_connected(l1, l4) := false;
is_connected(l2, l4) := false;
is_connected(l4, l4) := false;
is_connected(l5, l4) := false;
is_connected(l1, l5) := false;
is_connected(l2, l5) := false;
is_connected(l3, l5) := false;
is_connected(l5, l5) := false;
[ end ] is_at(l5);
'''
        self.assertEqual(anml_problem, expected_result)
예제 #6
0
    def test_robot_fluent_of_user_type(self):
        problem = self.problems['robot_fluent_of_user_type'].problem
        aw = ANMLWriter(problem)
        anml_problem = aw.get_problem()
        expected_result = '''type Location;
type Robot;
fluent Location is_at(Robot robot);
action move(Robot robot, Location l_from, Location l_to) {
   [ start ] (is_at(robot) == l_from);
   [ start ] (not (is_at(robot) == l_to));
   [ start ] is_at(robot) := l_to;
};
instance Location l1, l2;
instance Robot r1, r2;
[ start ] is_at(r1) := l2;
[ start ] is_at(r2) := l1;
[ end ] (is_at(r1) == l1);
[ end ] (is_at(r2) == l2);
'''
        self.assertEqual(anml_problem, expected_result)
예제 #7
0
    def test_matchcellar(self):
        problem = self.problems['matchcellar'].problem
        aw = ANMLWriter(problem)
        anml_problem = aw.get_problem()
        expected_result = '''type Match;
type Fuse;
fluent boolean handfree;
fluent boolean light;
fluent boolean match_used(Match match);
fluent boolean fuse_mended(Fuse fuse);
action light_match(Match m) {
   duration >= 6 and duration <= 6;
   [ start, start ] (not match_used(m));
   [ start ] match_used(m) := true;
   [ start ] light := true;
   [ end ] light := false;
};
action mend_fuse(Fuse f) {
   duration >= 5 and duration <= 5;
   [ start, start ] handfree;
   [ start, end ] light;
   [ start ] handfree := false;
   [ end ] fuse_mended(f) := true;
   [ end ] handfree := true;
};
instance Match m1, m2, m3;
instance Fuse f1, f2, f3;
[ start ] light := false;
[ start ] handfree := true;
[ start ] match_used(m1) := false;
[ start ] match_used(m2) := false;
[ start ] match_used(m3) := false;
[ start ] fuse_mended(f1) := false;
[ start ] fuse_mended(f2) := false;
[ start ] fuse_mended(f3) := false;
[ end ] fuse_mended(f1);
[ end ] fuse_mended(f2);
[ end ] fuse_mended(f3);
'''
        self.assertEqual(anml_problem, expected_result)
예제 #8
0
    def test_robot(self):
        problem = self.problems['robot'].problem
        aw = ANMLWriter(problem)
        anml_problem = aw.get_problem()
        expected_result = '''type Location;
fluent boolean robot_at(Location position);
fluent float [0.0, 100.0] battery_charge;
action move(Location l_from, Location l_to) {
   [ start ] (10 <= battery_charge);
   [ start ] (not (l_from == l_to));
   [ start ] robot_at(l_from);
   [ start ] (not robot_at(l_to));
   [ start ] robot_at(l_from) := false;
   [ start ] robot_at(l_to) := true;
   [ start ] battery_charge := (battery_charge - 10);
};
instance Location l1, l2;
[ start ] robot_at(l1) := true;
[ start ] robot_at(l2) := false;
[ start ] battery_charge := 100;
[ end ] robot_at(l2);
'''
        self.assertEqual(anml_problem, expected_result)