Module: Longjing
- Extended by:
- Logging
- Defined in:
- lib/longjing.rb,
lib/longjing/pddl.rb,
lib/longjing/state.rb,
lib/longjing/logging.rb,
lib/longjing/problem.rb,
lib/longjing/version.rb,
lib/longjing/pddl/obj.rb,
lib/longjing/pddl/var.rb,
lib/longjing/ff/action.rb,
lib/longjing/pddl/type.rb,
lib/longjing/search/ff.rb,
lib/longjing/parameters.rb,
lib/longjing/ff/ordering.rb,
lib/longjing/pddl/action.rb,
lib/longjing/search/base.rb,
lib/longjing/pddl/literal.rb,
lib/longjing/ff/preprocess.rb,
lib/longjing/search/greedy.rb,
lib/longjing/pddl/predicate.rb,
lib/longjing/pddl/parser.tab.rb,
lib/longjing/search/ff_greedy.rb,
lib/longjing/search/statistics.rb,
lib/longjing/ff/connectivity_graph.rb,
lib/longjing/ff/relaxed_graph_plan.rb
Defined Under Namespace
Modules: FF, Logging, PDDL, Search
Classes: Error, Parameters, Problem, State, UnknownDomain, UnsupportedRequirements
Constant Summary
collapse
- VERSION =
"0.1.0"
Class Method Summary
collapse
Methods included from Logging
log, logger, logger=
Class Method Details
.pddl(file) ⇒ Object
10
11
12
13
|
# File 'lib/longjing.rb', line 10
def pddl(file)
raise "File #{file.inspect} does not exist" unless File.exist?(file)
PDDL.parse(File.read(file))
end
|
.pddl_plan(domain_file, problem_file, search = :ff) ⇒ Object
20
21
22
23
24
25
|
# File 'lib/longjing.rb', line 20
def pddl_plan(domain_file, problem_file, search=:ff)
prob = pddl_problem(domain_file, problem_file)
plan(prob, search).tap do |solution|
validate!(prob, solution)
end
end
|
.pddl_problem(domain_file, problem_file) ⇒ Object
15
16
17
18
|
# File 'lib/longjing.rb', line 15
def pddl_problem(domain_file, problem_file)
pddl(domain_file)
pddl(problem_file)
end
|
.plan(problem, search = :ff) ⇒ Object
27
28
29
30
|
# File 'lib/longjing.rb', line 27
def plan(problem, search=:ff)
log(:problem, problem)
Search.send(search).new.search(problem)
end
|
.validate!(prob, solution) ⇒ Object
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
|
# File 'lib/longjing.rb', line 32
def validate!(prob, solution)
raise "No solution" if solution.nil?
goal = prob[:goal]
actions = Hash[prob[:actions].map{|o| [o.name, o]}]
objects = Hash[prob[:objects].map{|o| [o.name, o]}]
state = prob[:init].to_set
solution.each do |step|
name, *args = step.gsub(/[()]/, ' ').strip.split(' ').map(&:to_sym)
action = actions[name]
args = Array(args).map{|arg| objects[arg]}
action = action.substitute(args)
if action.precond.applicable?(state)
state = action.effect.apply(state)
else
raise "Invalid solution, failed at step: #{step.inspect}"
end
end
unless goal.applicable?(state)
raise "Invalid solution, end with #{state}"
end
end
|