The two-site survey
Two sites, two scouts, and a policy whose halves were never ordered.
This is The site survey run twice, in different hands. Two sites may be
contaminated, independently; north and south carry the instruments their
own sites read, relay is the team member both findings have to reach, and
observer is the machine the mission still excludes. The six goal conjuncts
are the survey’s three, once per site.
Nothing links the two halves. They name different atoms, different robots and different places, and no action of one appears in a precondition of the other. What the mission is for is the consequence: a policy dispatched a node at a time runs eighteen seconds of declared duration end to end, and the halves of it never overlap although nothing asked them not to.
Running it
ros2 launch eplansys_demo survey_sites_launch.py
ros2 launch eplansys_demo survey_sites_launch.py north:=clean south:=dirty
ros2 launch eplansys_demo survey_sites_launch.py parallel:=true
north: and south: say what each site turns out to hold, and the policy
takes a different branch for each of the four combinations. parallel:=true
turns on the dispatch described below. It is the same policy either way.
Like the survey, the mission is stated in EPDDL and ground by plank at start
up, so plank has to be built and on PATH.
The goal
(:goal
(and
([Kw. north] (contaminated-north))
([Kw. relay] (contaminated-north))
(<Kw. observer> (contaminated-north))
([Kw. south] (contaminated-south))
([Kw. relay] (contaminated-south))
(<Kw. observer> (contaminated-south))))
Why the instruments
The instruments are not decoration. Without them the cheapest policy sends one
robot to both sites, which answers the mission correctly and leaves nothing to
overlap: one robot cannot be in two places whatever the dispatch. Declaring
that only north reads the north site, as common knowledge, is what puts the
two halves in different hands.
The same goes for what the initial state leaves out. An instrument atom the problem does not settle is one the model has to be uncertain about, and eight such atoms designate two hundred and fifty-six worlds where four would do. Every agent is therefore named for every instrument.
What the dispatch changes
With parallel_dispatch off, which is the default, the policy is dispatched
one node at a time and the mission takes about twenty-two and a half seconds:
eighteen of declared duration and the rest in dispatch.
With it on, the builder moves each action as early as the actions it depends on
allow, and dispatches each run of independent actions as one Parallel. Two
actions are independent classically when neither one’s effects touch what the
other requires, which the domain answers, and epistemically when the agents they
name are disjoint. It says which runs it found:
dispatching together: (goto_north north), (goto_south south)
dispatching together: (scan_north north), (scan_south south)
The south scan is written under both outcomes of the north one, and depends on neither. Every branch of the north scan begins with it once the north report has been moved below it, so it moves above the branch point and runs beside the north scan; the two outcomes then choose the way on, one after the other. The mission takes about fifteen seconds, from eleven of declared duration: the drives, the scans, and the two reports.
Each half takes nine seconds of declared duration on its own. The two together
take eleven because both reports go to relay: two actions that name the
same agent run one after the other, so the south report waits for the north
one.