prop_logic 0.2.2 → 0.2.3

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
  SHA1:
3
- metadata.gz: 9157db3af14631a810dee1098d90a7c952c67278
4
- data.tar.gz: ec391493ffe55fadc12b6bf77d550ea840025b31
3
+ metadata.gz: 1dfd97019313a0cf9368c49fc535084abe18637b
4
+ data.tar.gz: 2679c35cd7dbf22235bd92b670077c3f57a64e98
5
5
  SHA512:
6
- metadata.gz: 5f46a0567cc5991360038a1ce802db01346741baa99f0b66bae4eedd3f266b23f98b3f7e28531566ef009582e0d57a97617fcd19ddc1a34c9d5db0ac5bd8b2e3
7
- data.tar.gz: 181b998494156523c584640146a062af319f98316b254f6ef79fe2bfa6280ae5d7d4685777bfc9270a005ae642b1b79e5b62efbf754289c76b7b09a3a28286b0
6
+ metadata.gz: 78b0d8ad6a92ec447534f42eb6a6ceee63778f74a7d4466079f9f35f0efe2824e26421b8b0000a98473f9209147956381ff4e8a1de753d964c2d895f14017c3a
7
+ data.tar.gz: d6c09dce76e172d687c5420b5aa4847ec789282fc40b5daf9f775cfbbf3410bca8723ea0ca549bc55df6aff0f0da3adbb3c1d00f15031a3cad889d4414bd5cae
data/CHANGELOG.md CHANGED
@@ -1,3 +1,7 @@
1
+ # Ver. 0.2.3 (2016/04/06)
2
+ - Inprove performance in negating variables
3
+ - Optionally select normal Hash for caching
4
+
1
5
  # Ver. 0.2.2 (2016/04/04)
2
6
  - Improve performance in `AndTerm`/`OrTerm` generation
3
7
 
data/README.md CHANGED
@@ -54,6 +54,11 @@ diff = (~a | ~b).equiv?(~(a & b)) # true
54
54
  (a & b).assign_true(a).assign_false(b).reduce # PropLogic::False
55
55
  ```
56
56
 
57
+ ### Using normal Hash for caching
58
+ By default, `prop_logic` uses weak reference for caching terms, allowing garbage collection.
59
+
60
+ If this is inappropriate (overhead or unstability), use `require 'prop_logic/hash_cache'` to use `Hash` for caching.
61
+
57
62
  ## Restriction
58
63
  SAT solver bundled with this gem is brute-force solver (intended only for testing), so it is inappropriate to use for
59
64
  real-scale problems.
@@ -61,6 +66,8 @@ real-scale problems.
61
66
  In CRuby and Rubinius, bindings to MiniSat ([jkr2255/prop_logic-minisat](https://github.com/jkr2255/prop_logic-minisat)) is available.
62
67
  It is a plugin for this gem, so no code (except require and Gemfile) needs to be changed to use `prop_logic-minisat`.
63
68
 
69
+ In JRuby binding to Sat4j ([jkr2255/prop_logic-sat4j](https://github.com/jkr2255/prop_logic-sat4j)) is available.
70
+
64
71
  ## References
65
72
  `PropLogic::Term` is immutable, meaning that all calculations return new Terms.
66
73
  ### `PropLogic::Term` instance methods
@@ -0,0 +1,8 @@
1
+ require 'prop_logic'
2
+
3
+ # monkey-patching cache generation
4
+ class PropLogic::Term
5
+ def self.generate_cache
6
+ {}
7
+ end
8
+ end
@@ -102,13 +102,14 @@ module PropLogic
102
102
 
103
103
  private_class_method :validate_terms
104
104
 
105
- def self.get(klass, *terms)
106
- @table ||= Ref::WeakValueMap.new
107
- terms = validate_terms(*terms)
108
- if klass == AndTerm || klass == OrTerm
109
- terms = terms.map{|t| t.is_a?(klass) ? t.terms : t}.flatten
110
- return terms[0] if terms.length == 1
111
- end
105
+ def self.generate_cache
106
+ Ref::WeakValueMap.new
107
+ end
108
+
109
+ private_class_method :generate_cache
110
+
111
+ def self.cached(klass, *terms)
112
+ @table ||= generate_cache
112
113
  key = klass.name + terms.map(&:object_id).join(',')
113
114
  return @table[key] if @table[key]
114
115
  ret = klass.__send__ :new, *terms
@@ -118,6 +119,17 @@ module PropLogic
118
119
  ret.freeze
119
120
  end
120
121
 
122
+ private_class_method :cached
123
+
124
+ def self.get(klass, *terms)
125
+ terms = validate_terms(*terms)
126
+ if klass == AndTerm || klass == OrTerm
127
+ terms = terms.map { |t| t.is_a?(klass) ? t.terms : t }.flatten
128
+ return terms[0] if terms.length == 1
129
+ end
130
+ cached klass, *terms
131
+ end
132
+
121
133
  # check if this term is a cnf term.
122
134
  # @return [Boolean] false unless overridden.
123
135
  def cnf?
@@ -45,5 +45,16 @@ module PropLogic
45
45
  self
46
46
  end
47
47
  end
48
+
49
+ # bypassing Term.get
50
+ # @return [NotTerm] negated variable
51
+ def not
52
+ Term.__send__ :cached, NotTerm, self
53
+ end
54
+
55
+ alias_method :~, :not
56
+ alias_method :-@, :not
57
+
58
+
48
59
  end
49
60
  end
@@ -1,3 +1,3 @@
1
1
  module PropLogic
2
- VERSION = '0.2.2'
2
+ VERSION = '0.2.3'
3
3
  end
metadata CHANGED
@@ -1,66 +1,66 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: prop_logic
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.2
4
+ version: 0.2.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jkr2255
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-04-03 00:00:00.000000000 Z
11
+ date: 2016-04-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: ref
15
14
  requirement: !ruby/object:Gem::Requirement
16
15
  requirements:
17
16
  - - "~>"
18
17
  - !ruby/object:Gem::Version
19
18
  version: '2.0'
20
- type: :runtime
19
+ name: ref
21
20
  prerelease: false
21
+ type: :runtime
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '2.0'
27
27
  - !ruby/object:Gem::Dependency
28
- name: bundler
29
28
  requirement: !ruby/object:Gem::Requirement
30
29
  requirements:
31
30
  - - "~>"
32
31
  - !ruby/object:Gem::Version
33
32
  version: '1.7'
34
- type: :development
33
+ name: bundler
35
34
  prerelease: false
35
+ type: :development
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
40
  version: '1.7'
41
41
  - !ruby/object:Gem::Dependency
42
- name: rake
43
42
  requirement: !ruby/object:Gem::Requirement
44
43
  requirements:
45
44
  - - "~>"
46
45
  - !ruby/object:Gem::Version
47
46
  version: '10.0'
48
- type: :development
47
+ name: rake
49
48
  prerelease: false
49
+ type: :development
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: '10.0'
55
55
  - !ruby/object:Gem::Dependency
56
- name: rspec
57
56
  requirement: !ruby/object:Gem::Requirement
58
57
  requirements:
59
58
  - - "~>"
60
59
  - !ruby/object:Gem::Version
61
60
  version: '3.0'
62
- type: :development
61
+ name: rspec
63
62
  prerelease: false
63
+ type: :development
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - "~>"
@@ -89,6 +89,7 @@ files:
89
89
  - lib/prop_logic/constants.rb
90
90
  - lib/prop_logic/default_incremental_solver.rb
91
91
  - lib/prop_logic/functions.rb
92
+ - lib/prop_logic/hash_cache.rb
92
93
  - lib/prop_logic/not_term.rb
93
94
  - lib/prop_logic/or_term.rb
94
95
  - lib/prop_logic/sat_solver.rb
@@ -101,7 +102,7 @@ homepage: https://github.com/jkr2255/prop_logic
101
102
  licenses:
102
103
  - MIT
103
104
  metadata: {}
104
- post_install_message:
105
+ post_install_message:
105
106
  rdoc_options: []
106
107
  require_paths:
107
108
  - lib
@@ -116,9 +117,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
116
117
  - !ruby/object:Gem::Version
117
118
  version: '0'
118
119
  requirements: []
119
- rubyforge_project:
120
- rubygems_version: 2.4.5.1
121
- signing_key:
120
+ rubyforge_project:
121
+ rubygems_version: 2.4.8
122
+ signing_key:
122
123
  specification_version: 4
123
124
  summary: Propositional logic for Ruby
124
125
  test_files: []