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