ravensat 1.0.9 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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: