ravensat 0.2.2 → 0.3.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (58) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/main.yml +18 -0
  3. data/README.md +122 -9
  4. data/docs/Arcteryx/CNF.html +827 -0
  5. data/docs/Arcteryx.html +309 -0
  6. data/docs/Ravensat/AndNode.html +159 -0
  7. data/docs/Ravensat/Claw.html +338 -0
  8. data/docs/Ravensat/DimacsDecoder.html +224 -0
  9. data/docs/Ravensat/DimacsEncoder.html +425 -0
  10. data/docs/Ravensat/Extension/BooleanVariable.html +229 -0
  11. data/docs/Ravensat/Extension/Domain.html +319 -0
  12. data/docs/Ravensat/Extension/IntegerVariable.html +589 -0
  13. data/docs/Ravensat/Extension/UndefinedVariable.html +236 -0
  14. data/docs/Ravensat/Extension/Variable.html +443 -0
  15. data/docs/Ravensat/Extension.html +141 -0
  16. data/docs/Ravensat/InitialNode.html +267 -0
  17. data/docs/Ravensat/Node.html +780 -0
  18. data/docs/Ravensat/NotNode.html +159 -0
  19. data/docs/Ravensat/OprNode.html +226 -0
  20. data/docs/Ravensat/OrNode.html +252 -0
  21. data/docs/Ravensat/Solver.html +373 -0
  22. data/docs/Ravensat/VarNode.html +488 -0
  23. data/docs/Ravensat.html +135 -0
  24. data/docs/_index.html +329 -0
  25. data/docs/class_list.html +51 -0
  26. data/docs/css/common.css +1 -0
  27. data/docs/css/full_list.css +58 -0
  28. data/docs/css/style.css +497 -0
  29. data/docs/file.README.html +233 -0
  30. data/docs/file_list.html +56 -0
  31. data/docs/frames.html +17 -0
  32. data/docs/index.html +233 -0
  33. data/docs/js/app.js +314 -0
  34. data/docs/js/full_list.js +216 -0
  35. data/docs/js/jquery.js +4 -0
  36. data/docs/method_list.html +523 -0
  37. data/docs/top-level-namespace.html +110 -0
  38. data/exe/ravensat +7 -0
  39. data/lib/ravensat/ast/initial_node.rb +11 -0
  40. data/lib/ravensat/ast/node.rb +17 -9
  41. data/lib/ravensat/ast/not_node.rb +3 -0
  42. data/lib/ravensat/ast/var_node.rb +4 -0
  43. data/lib/ravensat/ast.rb +11 -0
  44. data/lib/ravensat/claw.rb +44 -0
  45. data/lib/ravensat/{dimacs_decoder.rb → dimacs/dimacs_decoder.rb} +0 -0
  46. data/lib/ravensat/{dimacs_encoder.rb → dimacs/dimacs_encoder.rb} +4 -7
  47. data/lib/ravensat/dimacs.rb +6 -0
  48. data/lib/ravensat/extension/domain.rb +24 -0
  49. data/lib/ravensat/extension/variable/boolean_variable.rb +17 -0
  50. data/lib/ravensat/extension/variable/integer_variable.rb +63 -0
  51. data/lib/ravensat/extension/variable/undefined_variable.rb +9 -0
  52. data/lib/ravensat/extension/variable/variable.rb +16 -0
  53. data/lib/ravensat/extension.rb +13 -0
  54. data/lib/ravensat/solver.rb +0 -7
  55. data/lib/ravensat/version.rb +1 -1
  56. data/lib/ravensat.rb +5 -10
  57. metadata +52 -6
  58. data/lib/ravensat/ravenclaw.rb +0 -15
@@ -7,10 +7,24 @@ module Ravensat
7
7
  @children = []
8
8
  end
9
9
 
10
+ # def each
11
+ # yield(self)
12
+ # @children.each do |child|
13
+ # child.each {|c| yield(c)}
14
+ # end
15
+ # end
16
+
10
17
  def each
11
- yield(self)
12
- @children.each do |child|
13
- child.each {|c| yield(c)}
18
+ case self
19
+ when AndNode, OrNode
20
+ @children.first.each{|c| yield(c)}
21
+ yield(self)
22
+ @children.last.each{|c| yield(c)}
23
+ when NotNode
24
+ yield(self)
25
+ @children.first.each{|c| yield(c)}
26
+ when VarNode
27
+ yield(self)
14
28
  end
15
29
  end
16
30
 
@@ -22,12 +36,6 @@ module Ravensat
22
36
  OrNode.new(self, object)
23
37
  end
24
38
 
25
- # def tree_text
26
- # self.each do |child|
27
- # child.to_s
28
- # end
29
- # end
30
-
31
39
  def to_s
32
40
  self.class.name
33
41
  end
@@ -1,4 +1,7 @@
1
1
  module Ravensat
2
2
  class NotNode < OprNode
3
+ def ~@
4
+ @children.first
5
+ end
3
6
  end
4
7
  end
@@ -13,5 +13,9 @@ module Ravensat
13
13
  def cnf?
14
14
  true
15
15
  end
16
+
17
+ def result
18
+ @value
19
+ end
16
20
  end
17
21
  end
@@ -0,0 +1,11 @@
1
+ module Ravensat
2
+ dir = File.dirname(__FILE__) + '/ast'
3
+
4
+ autoload :Node, dir + '/node.rb'
5
+ autoload :VarNode, dir + '/var_node.rb'
6
+ autoload :OprNode, dir + '/opr_node.rb'
7
+ autoload :AndNode, dir + '/and_node.rb'
8
+ autoload :OrNode, dir + '/or_node.rb'
9
+ autoload :NotNode, dir + '/not_node.rb'
10
+ autoload :InitialNode, dir + '/initial_node.rb'
11
+ end
@@ -0,0 +1,44 @@
1
+ module Ravensat
2
+ module Claw
3
+ def self.alo(bool_vars)
4
+ bool_vars.reduce(:|)
5
+ end
6
+
7
+ def self.pairwise_amo(bool_vars)
8
+ bool_vars.combination(2).map do |e|
9
+ e.map(&:~@).reduce(:|)
10
+ end.reduce(:&)
11
+ end
12
+
13
+ def self.commander_amo(bool_vars)
14
+ m = bool_vars.size / 2
15
+ introductory_variables = []
16
+ formula = Ravensat::InitialNode.new
17
+ bool_vars.each_slice(2) do |e|
18
+ c = Ravensat::VarNode.new
19
+ subset = e << ~c
20
+ formula &= pairwise_amo(subset)
21
+ formula &= alo(subset)
22
+ introductory_variables << c
23
+ end
24
+
25
+ if m < 6
26
+ formula &= pairwise_amo(introductory_variables)
27
+ else
28
+ formula &= commander_amo(introductory_variables)
29
+ end
30
+ end
31
+
32
+ def self.all_different(*int_vars)
33
+ int_vars.combination(2).map do |int_var|
34
+ int_var.reduce(:!=)
35
+ end.reduce(:&)
36
+ end
37
+
38
+ def self.all_only_one(*int_vars)
39
+ int_vars.map(&:only_one).reduce(:&)
40
+ end
41
+
42
+ # alias :amo :pairwise_amo
43
+ end
44
+ end
@@ -13,16 +13,13 @@ module Ravensat
13
13
  create_table(formula)
14
14
  formula.each do |node|
15
15
  case node
16
- when AndNode
17
- when OrNode then dimacs_body << "\n"
16
+ when AndNode then dimacs_body << " 0\n"
17
+ when OrNode then dimacs_body << " "
18
18
  when NotNode then dimacs_body << "-"
19
- when VarNode then dimacs_body << @name_table[node] << " "
19
+ when VarNode then dimacs_body << @name_table[node]
20
20
  end
21
21
  end
22
-
23
- # dimacs_body formatting
24
- dimacs_body.strip! << ' '
25
- dimacs_body.gsub!(/\n{2,}/, "\n").gsub!(/\n/, "0\n") << '0'
22
+ dimacs_body << " 0\n"
26
23
 
27
24
  dimacs_header + dimacs_body
28
25
  end
@@ -0,0 +1,6 @@
1
+ module Ravensat
2
+ dir = File.dirname(__FILE__) + '/dimacs'
3
+
4
+ autoload :DimacsEncoder, dir + '/dimacs_encoder.rb'
5
+ autoload :DimacsDecoder, dir + '/dimacs_decoder.rb'
6
+ end
@@ -0,0 +1,24 @@
1
+ module Ravensat
2
+ module Extension
3
+ module Domain
4
+ LOCAL_VARIABLE_TABLE = {}
5
+ def int(*vars)
6
+ vars.each do |var|
7
+ next if var.is_defined?
8
+ LOCAL_VARIABLE_TABLE[var.name] = Ravensat::Extension::IntegerVariable.new(var.name, var.args)
9
+ end
10
+ end
11
+
12
+ def bool(*vars)
13
+ vars.each do |var|
14
+ next if var.is_defined?
15
+ LOCAL_VARIABLE_TABLE[var.name] = Ravensat::Extension::BooleanVariable.new(var.name, var.args)
16
+ end
17
+ end
18
+
19
+ def method_missing(name, *args)
20
+ LOCAL_VARIABLE_TABLE[name] || UndefinedVariable.new(name, args)
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,17 @@
1
+ require 'forwardable'
2
+
3
+ module Ravensat
4
+ module Extension
5
+ class BooleanVariable < Variable
6
+ extend Forwardable
7
+ delegate Node.public_instance_methods(false) => :@var_node
8
+ delegate OprNode.public_instance_methods(false) => :@var_node
9
+ delegate VarNode.public_instance_methods(false) => :@var_node
10
+
11
+ def initialize(name, args)
12
+ super
13
+ @var_node = VarNode.new
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,63 @@
1
+ module Ravensat
2
+ module Extension
3
+ class IntegerVariable < Variable
4
+
5
+ attr_reader :var_nodes
6
+ def initialize(name, args)
7
+ super
8
+ return unless args.first.is_a? Range
9
+ @var_nodes = args.first.zip(Array.new(args.first.size){Ravensat::VarNode.new}).to_h
10
+ end
11
+
12
+ def ==(object)
13
+ case object
14
+ when Integer
15
+ return @var_nodes[object]
16
+ when IntegerVariable
17
+ result_formula = Ravensat::InitialNode.new
18
+ duplicated_keys = self.var_nodes.keys & object.var_nodes.keys
19
+
20
+ [self.var_nodes, object.var_nodes].repeated_permutation(duplicated_keys.size) do |var_nodes|
21
+ result_formula &= Ravensat::Claw.alo(var_nodes.zip(duplicated_keys).map{|arr| arr.first[arr.last]})
22
+ end
23
+ return result_formula
24
+ else
25
+ raise ArgumentError
26
+ end
27
+ end
28
+
29
+ def !=(object)
30
+ case object
31
+ when Integer
32
+ return ~(@var_nodes[object])
33
+ when IntegerVariable
34
+ result_formula = Ravensat::InitialNode.new
35
+ duplicated_keys = self.var_nodes.keys & object.var_nodes.keys
36
+
37
+ duplicated_keys.each do |index|
38
+ result_formula &= ~(self.var_nodes[index]) | ~(object.var_nodes[index])
39
+ end
40
+ return result_formula
41
+ else
42
+ raise ArgumentError
43
+ end
44
+ end
45
+
46
+ def only_one
47
+ result_formula = Ravensat::InitialNode.new
48
+ result_formula &= Ravensat::Claw.alo @var_nodes.values
49
+ result_formula &= Ravensat::Claw.amo @var_nodes.values
50
+ result_formula
51
+ end
52
+
53
+ def result
54
+ result = @var_nodes.select{|key, var_node| var_node.value}.keys
55
+ if result.one?
56
+ result.first
57
+ else
58
+ result
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,9 @@
1
+ module Ravensat
2
+ module Extension
3
+ class UndefinedVariable < Variable
4
+ def is_defined?
5
+ false
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,16 @@
1
+ module Ravensat
2
+ module Extension
3
+ class Variable
4
+
5
+ attr_reader :name, :args
6
+ def initialize(name, args)
7
+ @name = name
8
+ @args = args
9
+ end
10
+
11
+ def is_defined?
12
+ true
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,13 @@
1
+ module Ravensat
2
+ module Extension
3
+ dir = File.dirname(__FILE__) + '/extension'
4
+
5
+ autoload :Domain, dir + '/domain.rb'
6
+ autoload :Variable, dir + '/variable/variable.rb'
7
+ autoload :BooleanVariable, dir + '/variable/boolean_variable.rb'
8
+ autoload :IntegerVariable, dir + '/variable/integer_variable.rb'
9
+ autoload :UndefinedVariable, dir + '/variable/undefined_variable.rb'
10
+
11
+ extend Domain
12
+ end
13
+ end
@@ -5,15 +5,8 @@ module Ravensat
5
5
  attr_accessor :name
6
6
  def initialize( default_solver_name = "arcteryx" )
7
7
  @name = default_solver_name
8
- # @cnf = Array.new
9
- # @nr_vars
10
- # @nr_clses
11
8
  end
12
9
 
13
- # def <<( clause )
14
- # 'this is << method'
15
- # end
16
-
17
10
  def solve( cnf )
18
11
  encoder = DimacsEncoder.new
19
12
  @input_file = Tempfile.open(["ravensat",".cnf"])
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Ravensat
4
- VERSION = "0.2.2"
4
+ VERSION = "0.3.2"
5
5
  end
data/lib/ravensat.rb CHANGED
@@ -7,17 +7,12 @@ module Ravensat
7
7
  ast = File.dirname(__FILE__) + '/ravensat/ast'
8
8
  arcteryx = File.dirname(__FILE__) + '/arcteryx'
9
9
 
10
- autoload :Solver, ravensat + '/solver.rb'
11
- autoload :DimacsEncoder, ravensat + '/dimacs_encoder.rb'
12
- autoload :DimacsDecoder, ravensat + '/dimacs_decoder.rb'
13
- autoload :RavenClaw, ravensat + '/ravenclaw.rb'
10
+ require_relative ravensat + "/ast.rb"
11
+ require_relative ravensat + "/dimacs.rb"
14
12
 
15
- autoload :Node, ast + '/node.rb'
16
- autoload :VarNode, ast + '/var_node.rb'
17
- autoload :OprNode, ast + '/opr_node.rb'
18
- autoload :AndNode, ast + '/and_node.rb'
19
- autoload :OrNode, ast + '/or_node.rb'
20
- autoload :NotNode, ast + '/not_node.rb'
13
+ autoload :Solver, ravensat + '/solver.rb'
14
+ autoload :Claw, ravensat + '/claw.rb'
15
+ autoload :Extension, ravensat + '/extension.rb'
21
16
 
22
17
  autoload :Arcteryx, arcteryx + '/arcteryx.rb'
23
18
  end
metadata CHANGED
@@ -1,22 +1,24 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ravensat
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.2
4
+ version: 0.3.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - rikuto matsuda
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-05-16 00:00:00.000000000 Z
11
+ date: 2022-06-15 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description:
14
14
  email:
15
15
  - p99y92og@s.okayama-u.ac.jp
16
- executables: []
16
+ executables:
17
+ - ravensat
17
18
  extensions: []
18
19
  extra_rdoc_files: []
19
20
  files:
21
+ - ".github/workflows/main.yml"
20
22
  - ".gitignore"
21
23
  - ".rspec"
22
24
  - ".ruby-version"
@@ -27,19 +29,63 @@ files:
27
29
  - Rakefile
28
30
  - bin/console
29
31
  - bin/setup
32
+ - docs/Arcteryx.html
33
+ - docs/Arcteryx/CNF.html
34
+ - docs/Ravensat.html
35
+ - docs/Ravensat/AndNode.html
36
+ - docs/Ravensat/Claw.html
37
+ - docs/Ravensat/DimacsDecoder.html
38
+ - docs/Ravensat/DimacsEncoder.html
39
+ - docs/Ravensat/Extension.html
40
+ - docs/Ravensat/Extension/BooleanVariable.html
41
+ - docs/Ravensat/Extension/Domain.html
42
+ - docs/Ravensat/Extension/IntegerVariable.html
43
+ - docs/Ravensat/Extension/UndefinedVariable.html
44
+ - docs/Ravensat/Extension/Variable.html
45
+ - docs/Ravensat/InitialNode.html
46
+ - docs/Ravensat/Node.html
47
+ - docs/Ravensat/NotNode.html
48
+ - docs/Ravensat/OprNode.html
49
+ - docs/Ravensat/OrNode.html
50
+ - docs/Ravensat/Solver.html
51
+ - docs/Ravensat/VarNode.html
52
+ - docs/_index.html
53
+ - docs/class_list.html
54
+ - docs/css/common.css
55
+ - docs/css/full_list.css
56
+ - docs/css/style.css
57
+ - docs/file.README.html
58
+ - docs/file_list.html
59
+ - docs/frames.html
60
+ - docs/index.html
61
+ - docs/js/app.js
62
+ - docs/js/full_list.js
63
+ - docs/js/jquery.js
64
+ - docs/method_list.html
65
+ - docs/top-level-namespace.html
30
66
  - example/magic_square_3x3.rb
67
+ - exe/ravensat
31
68
  - lib/arcteryx/arcteryx.rb
32
69
  - lib/arcteryx/cnf.rb
33
70
  - lib/ravensat.rb
71
+ - lib/ravensat/ast.rb
34
72
  - lib/ravensat/ast/and_node.rb
73
+ - lib/ravensat/ast/initial_node.rb
35
74
  - lib/ravensat/ast/node.rb
36
75
  - lib/ravensat/ast/not_node.rb
37
76
  - lib/ravensat/ast/opr_node.rb
38
77
  - lib/ravensat/ast/or_node.rb
39
78
  - lib/ravensat/ast/var_node.rb
40
- - lib/ravensat/dimacs_decoder.rb
41
- - lib/ravensat/dimacs_encoder.rb
42
- - lib/ravensat/ravenclaw.rb
79
+ - lib/ravensat/claw.rb
80
+ - lib/ravensat/dimacs.rb
81
+ - lib/ravensat/dimacs/dimacs_decoder.rb
82
+ - lib/ravensat/dimacs/dimacs_encoder.rb
83
+ - lib/ravensat/extension.rb
84
+ - lib/ravensat/extension/domain.rb
85
+ - lib/ravensat/extension/variable/boolean_variable.rb
86
+ - lib/ravensat/extension/variable/integer_variable.rb
87
+ - lib/ravensat/extension/variable/undefined_variable.rb
88
+ - lib/ravensat/extension/variable/variable.rb
43
89
  - lib/ravensat/solver.rb
44
90
  - lib/ravensat/version.rb
45
91
  - ravensat.gemspec
@@ -1,15 +0,0 @@
1
- module Ravensat
2
- class RavenClaw
3
- def initialize; end
4
-
5
- def self.alo(prop_vars)
6
- prop_vars.reduce(:|)
7
- end
8
-
9
- def self.amo(prop_vars)
10
- prop_vars.combination(2).map do |e|
11
- e.map(&:~@).reduce(:|)
12
- end.reduce(:&)
13
- end
14
- end
15
- end