abcorrea / powerlifted

Powerlifted Planner
GNU General Public License v3.0
28 stars 12 forks source link

Powerlifted Planner

Powerlifted is a domain-independent classical planner that uses only lifted representations.

The planner supports the STRIPS formalism, but extended with inequalities (e.g., (not (= ?x ?y))), types (e.g., ?b - block), and object creation (e.g., :new ?b - block).

(See References for more details.)

Usage

The powerlifted.py script solves a PDDL task provided as input. It also builds the planner if the --build parameter is passed. To run a single search, you can use the following algorithms:

$ ./powerlifted.py [-d DOMAIN] -i INSTANCE -s SEARCH -e EVALUATOR -g GENERATOR [ADDITIONAL OPTIONS] [--build]

The options for each parameter are described below. If you do not pass any value for SEARCH, EVALUATOR, and GENERATOR, the planner will use the best (known) configuration for satisficing planning (i.e., no optimality guaranteed). (See next section for more details.)

It is also possible to perform multiple search algorithms on the same task iteratively. See the section "Multiple Search Algorithms" below.

You can either use the build.py script to build the planner first, or pass the --build flag to build the planner prior to the search execution.

Best Configuration for Satisficing Planning

Currently, the best configuration for satisficing planning (with respect to total coverage) is the following:

$ ./powerlifted.py [-d DOMAIN] -i INSTANCE -s alt-bfws1 -e ff -g yannakakis [ADDITIONAL OPTIONS] --only-effects-novelty-check

These are also the default values for -s, -e, and -g. To maximize coverage, we also recommend adding --unit-cost (see below) to the ADDITIONAL OPTIONS.

Available Options for SEARCH:

Available Options for EVALUATOR:

Available Options for GENERATOR:

Available ADDITIONAL OPTIONS:

Multiple Search Algorithms

You can use the flag --iteration to specify one single search iteration for the planner. You can pass as many --iteration arguments as you wish, and each argument will execute a different search.

The syntax to specify a search iteration is the following:

$ ./powerlifted.py -i INSTANCE --iteration S,E,G

where S is a search algorithm, E is an evaluator, and G a successor generator. For example, to execute Greedy Best-First Search with FF followed by a Lazy Best-First Search with the additive heuristic (and both using the Yannakakis' algorithm for successor generation), you should run

$ ./powerlifted.py -i INSTANCE --iteration gbfs,ff,yannakakis --iteration lazy,add,yannakakis

The plan founds are then numbered based on its iterations. If the first iteration finds a plan, it will be called plan.1; the second will be called `plan.2; etc.

Unfortunately, the planner has the limitation that additional options are set for all the iterations.

Object Creation

Powerlifted supports object creation as part of object effects. The precise semantics are described in [5]. Currently, Powerlifted only supports a STRIPS-like fragment of the problem where action effects can have the following form:

:effect (:new (?o - some-type) (CONJ-EFFECT))

where CONJ-EFFECT is a conjunctive PDDL effect (e.g., (and (p ?x ?y) (p ?y ?o))) where ?o occurs. The basic semantics is that variable ?o must be instantiated with a fresh object that does not exist on the state the the (ground) action is applied.

Unfortunately, not all features of the planner support object creation. Here is a list of features that do support it:

See this repository for domain examples.

Running Powerlifted as a Apptainer container

You can also build an Apptainer image to run the planner. This might be useful in the case where you are not able to compile the planner locally, for example. You can run the following command to create the planner image:

apptainer build powerlifted.sif Apptainer.powerlifted

Be aware that this might take a while. Once the image powerlifted.sif is created, you can run it with the same parameters as the powerlifted.py script.

Note that VAL and CPDDL are not installed in the container, so it is not possible to use the --validate flag with the image, or to use the CPDDL preprocessor (--preprocess-task). However, you can run VAL with the plan file created by the planner after the execution, and use CPDDL as a standalone to preprocess the task beforehand.

The following command is a usage example on how to run the planner with the Apptainer image:

./powerlifted.sif -i /path/to/instance.pddl

Requirements

Limitations