ravensat 1.0.9 → 1.1.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8b668d5f3c3a44e355f1cab471199b0ab4124a504e38081c40b33348b8d1611d
4
- data.tar.gz: 9c622647b2a9bc34881178cbd546f332f882a07e8b2242c3c37e3f94e437c2c1
3
+ metadata.gz: 6bfe00570d2de6c7da2dfe2075f99d3372435290235f4f581c82697a19e9e415
4
+ data.tar.gz: 25e100b47651b0b146e7f392bc793059a0702bb58fe663618d3f2501059c7783
5
5
  SHA512:
6
- metadata.gz: 986c50547e5026650eef971aaa706a8d7515e5a6e861d3c027ce6b273b56094448c62fcd796b6f9dd2734d96f10cde2e5ba7bd0ac58ac389e16ad5404a0cd623
7
- data.tar.gz: 3a29d33a8761a862c8bf04ce69aa8b64c8241a64f867c1ee337eedf311eeafad2ffee899db6e1f3c544a0cec5df17ce554b24b16c125ca1181b1cb7b260ad099
6
+ metadata.gz: 2cdb626e3c97e72cb4b3221a6a89857cc1fe4d8704235f73b504ed3c2e0fcea13d49d3f17f074bf62ea982c64c5663708332ad86494d59c3bc8403a3c2d9c67c
7
+ data.tar.gz: 152988e5e50542e1bd63c842cee4024144c8154fbf6567383eebfd35dfff530de1342e0f44a3ec30365845aff79e41c964dd8fafb2d626718c94805162b95115
@@ -11,5 +11,9 @@ module Ravensat
11
11
  def to_dimacs
12
12
  " 0\n"
13
13
  end
14
+
15
+ def eval
16
+ @children.map(&:eval).reduce(:&)
17
+ end
14
18
  end
15
19
  end
@@ -87,6 +87,9 @@ module Ravensat
87
87
  @children.map(&:cnf?).reduce(:&)
88
88
  end
89
89
 
90
+ def eval
91
+ end
92
+
90
93
  def vars
91
94
  self.select{|node| node.is_a? VarNode}.uniq
92
95
  end
@@ -7,5 +7,9 @@ module Ravensat
7
7
  def to_dimacs
8
8
  "-"
9
9
  end
10
+
11
+ def eval
12
+ @children.map(&:eval).first ^ true
13
+ end
10
14
  end
11
15
  end
@@ -16,5 +16,9 @@ module Ravensat
16
16
  def to_dimacs
17
17
  " "
18
18
  end
19
+
20
+ def eval
21
+ @children.map(&:eval).reduce(:|)
22
+ end
19
23
  end
20
24
  end
@@ -22,5 +22,9 @@ module Ravensat
22
22
  def to_dimacs
23
23
  @dimacs_name
24
24
  end
25
+
26
+ def eval
27
+ @value
28
+ end
25
29
  end
26
30
  end
data/lib/ravensat/claw.rb CHANGED
@@ -1,6 +1,13 @@
1
1
  module Ravensat
2
2
  module Claw
3
- def self.alo(bool_vars)
3
+ def self.at_most_one(bool_vars)
4
+ return Ravensat::NilNode.new if bool_vars.size == 1
5
+ bool_vars.combination(2).map do |e|
6
+ e.map(&:~@).reduce(:|)
7
+ end.reduce(:&)
8
+ end
9
+
10
+ def self.at_least_one(bool_vars)
4
11
  return Ravensat::NilNode.new if bool_vars.size == 1
5
12
  bool_vars.reduce(:|)
6
13
  end
@@ -15,19 +22,13 @@ module Ravensat
15
22
  def self.at_least_k(bool_vars, k)
16
23
  return Ravensat::NilNode.new if bool_vars.size == 1
17
24
  bool_vars.combination(k-1).map do |e|
18
- alo(bool_vars - e)
25
+ at_least_one(bool_vars - e)
19
26
  end.reduce(:&)
20
27
  end
21
28
 
22
- def self.pairwise_amo(bool_vars)
23
- return Ravensat::NilNode.new if bool_vars.size == 1
24
- bool_vars.combination(2).map do |e|
25
- e.map(&:~@).reduce(:|)
26
- end.reduce(:&)
27
- end
28
29
 
29
30
  # NOTE: Klieber, W. and Kwon, G.: Efficient CNF Encoding for Selecting 1 from N Objects (2007).
30
- def self.commander_amo(bool_vars)
31
+ def self.commander_at_most_one(bool_vars)
31
32
  return Ravensat::NilNode.new if bool_vars.size == 1
32
33
  # XXX: Operator unknown if bool_vars.size is very small.
33
34
  m = bool_vars.size / 2
@@ -36,16 +37,49 @@ module Ravensat
36
37
  bool_vars.each_slice(2) do |g|
37
38
  c = Ravensat::VarNode.new
38
39
  subset = g << ~c
39
- formula &= pairwise_amo(subset)
40
- formula &= alo(subset)
40
+ formula &= at_most_one(subset)
41
+ formula &= at_least_one(subset)
41
42
  commander_variables << c
42
43
  end
43
44
 
44
45
  if m < 6
45
- formula &= pairwise_amo(commander_variables)
46
+ formula &= at_most_one(commander_variables)
46
47
  else
47
- formula &= commander_amo(commander_variables)
48
+ formula &= commander_at_most_one(commander_variables)
49
+ end
50
+ end
51
+
52
+ def self.commander_at_most_k(bool_vars, k)
53
+ return Ravensat::NilNode.new if bool_vars.size == 1
54
+ return commander_at_most_one(bool_vars) if k == 1
55
+ group_size = k + 2
56
+ commander_variables = []
57
+ formula = Ravensat::InitialNode.new
58
+
59
+ bool_vars.each_slice(group_size) do |g|
60
+ cmds = Array.new(k){Ravensat::VarNode.new}
61
+ subset = g + cmds.map(&:~)
62
+ formula &= at_most_k(subset, k)
63
+ formula &= at_least_k(subset, k)
64
+ cmds.each_cons(2) do |e1, e2|
65
+ formula &= ~e1 | e2
66
+ end
67
+ commander_variables += cmds
48
68
  end
69
+
70
+ formula &= at_most_k(commander_variables, k)
71
+ end
72
+
73
+ def self.exactly_one(bool_vars)
74
+ formula = Ravensat::InitialNode.new
75
+ formula &= commander_at_most_one(bool_vars)
76
+ formula &= at_least_one(bool_vars)
77
+ end
78
+
79
+ def self.exactly_k(bool_vars, k)
80
+ formula = Ravensat::InitialNode.new
81
+ formula &= commander_at_most_k(bool_vars, k)
82
+ formula &= at_least_k(bool_vars, k)
49
83
  end
50
84
 
51
85
  def self.all_different(*int_vars)
@@ -57,7 +91,5 @@ module Ravensat
57
91
  def self.all_only_one(*int_vars)
58
92
  int_vars.map(&:only_one).reduce(:&)
59
93
  end
60
-
61
- # alias :amo :pairwise_amo
62
94
  end
63
95
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Ravensat
4
- VERSION = "1.0.9"
4
+ VERSION = "1.1.1"
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ravensat
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.9
4
+ version: 1.1.1
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-08-25 00:00:00.000000000 Z
11
+ date: 2022-11-07 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description:
14
14
  email: