ravensat 1.0.9 → 1.1.0

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: e2be04a5683be973ab9a882393a2ac6ed25d40d19899d3222841a0727e7a9ccc
4
+ data.tar.gz: 6674ab1b25282eb389672ed0e53857272fe048a0d08c6ec0d632c56ff126bbc9
5
5
  SHA512:
6
- metadata.gz: 986c50547e5026650eef971aaa706a8d7515e5a6e861d3c027ce6b273b56094448c62fcd796b6f9dd2734d96f10cde2e5ba7bd0ac58ac389e16ad5404a0cd623
7
- data.tar.gz: 3a29d33a8761a862c8bf04ce69aa8b64c8241a64f867c1ee337eedf311eeafad2ffee899db6e1f3c544a0cec5df17ce554b24b16c125ca1181b1cb7b260ad099
6
+ metadata.gz: fb557522b6b17eeaec4171a76169887b1392a9d321ed6e723911df41d6caddcc00dd31e376e340c78cc71dd5a29267a0c4050a6f1c91bba21dbb4d4aafcebb61
7
+ data.tar.gz: d046a5e639fdb03a2c372b96cc992ef6c8ef6b1c3a73bf0c26f460a82acfce84495bc20ce4661cef99a858e7dc5ed5b6a373bb1788d78cb737c0c8eb7e20e273
@@ -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,48 @@ 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
+ group_size = k + 2
55
+ commander_variables = []
56
+ formula = Ravensat::InitialNode.new
57
+
58
+ bool_vars.each_slice(group_size) do |g|
59
+ cmds = Array.new(k){Ravensat::VarNode.new}
60
+ subset = g + cmds.map(&:~)
61
+ formula &= at_most_k(subset, k)
62
+ formula &= at_least_k(subset, k)
63
+ cmds.each_cons(2) do |e1, e2|
64
+ formula &= ~e1 | e2
65
+ end
66
+ commander_variables += cmds
48
67
  end
68
+
69
+ formula &= at_most_k(commander_variables, k)
70
+ end
71
+
72
+ def self.exactly_one(bool_vars)
73
+ formula = Ravensat::InitialNode.new
74
+ formula &= commander_at_most_one(bool_vars)
75
+ formula &= at_least_one(bool_vars)
76
+ end
77
+
78
+ def self.exactly_k(bool_vars, k)
79
+ formula = Ravensat::InitialNode.new
80
+ formula &= commander_at_most_k(bool_vars, k)
81
+ formula &= at_least_k(bool_vars, k)
49
82
  end
50
83
 
51
84
  def self.all_different(*int_vars)
@@ -57,7 +90,5 @@ module Ravensat
57
90
  def self.all_only_one(*int_vars)
58
91
  int_vars.map(&:only_one).reduce(:&)
59
92
  end
60
-
61
- # alias :amo :pairwise_amo
62
93
  end
63
94
  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.0"
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.0
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: