cadical 0.9.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.
Files changed (171) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE.txt +26 -0
  3. data/README.md +101 -0
  4. data/ext/cadical/cadical/LICENSE +28 -0
  5. data/ext/cadical/cadical/README.md +65 -0
  6. data/ext/cadical/cadical/VERSION +1 -0
  7. data/ext/cadical/cadical/src/analyze.cpp +1360 -0
  8. data/ext/cadical/cadical/src/arena.cpp +30 -0
  9. data/ext/cadical/cadical/src/arena.hpp +105 -0
  10. data/ext/cadical/cadical/src/assume.cpp +616 -0
  11. data/ext/cadical/cadical/src/averages.cpp +34 -0
  12. data/ext/cadical/cadical/src/averages.hpp +37 -0
  13. data/ext/cadical/cadical/src/backbone.cpp +631 -0
  14. data/ext/cadical/cadical/src/backtrack.cpp +177 -0
  15. data/ext/cadical/cadical/src/backward.cpp +231 -0
  16. data/ext/cadical/cadical/src/bins.cpp +22 -0
  17. data/ext/cadical/cadical/src/bins.hpp +22 -0
  18. data/ext/cadical/cadical/src/block.cpp +824 -0
  19. data/ext/cadical/cadical/src/block.hpp +37 -0
  20. data/ext/cadical/cadical/src/cadical.cpp +1026 -0
  21. data/ext/cadical/cadical/src/cadical.hpp +1419 -0
  22. data/ext/cadical/cadical/src/ccadical.cpp +208 -0
  23. data/ext/cadical/cadical/src/ccadical.h +74 -0
  24. data/ext/cadical/cadical/src/checker.cpp +649 -0
  25. data/ext/cadical/cadical/src/checker.hpp +173 -0
  26. data/ext/cadical/cadical/src/clause.cpp +689 -0
  27. data/ext/cadical/cadical/src/clause.hpp +190 -0
  28. data/ext/cadical/cadical/src/collect.cpp +545 -0
  29. data/ext/cadical/cadical/src/compact.cpp +550 -0
  30. data/ext/cadical/cadical/src/condition.cpp +940 -0
  31. data/ext/cadical/cadical/src/config.cpp +101 -0
  32. data/ext/cadical/cadical/src/config.hpp +20 -0
  33. data/ext/cadical/cadical/src/congruence.cpp +7880 -0
  34. data/ext/cadical/cadical/src/congruence.hpp +757 -0
  35. data/ext/cadical/cadical/src/constrain.cpp +64 -0
  36. data/ext/cadical/cadical/src/contract.cpp +27 -0
  37. data/ext/cadical/cadical/src/contract.hpp +139 -0
  38. data/ext/cadical/cadical/src/cover.cpp +704 -0
  39. data/ext/cadical/cadical/src/cover.hpp +34 -0
  40. data/ext/cadical/cadical/src/decide.cpp +347 -0
  41. data/ext/cadical/cadical/src/decompose.cpp +738 -0
  42. data/ext/cadical/cadical/src/decompose.hpp +23 -0
  43. data/ext/cadical/cadical/src/deduplicate.cpp +275 -0
  44. data/ext/cadical/cadical/src/definition.cpp +283 -0
  45. data/ext/cadical/cadical/src/delay.hpp +38 -0
  46. data/ext/cadical/cadical/src/drattracer.cpp +153 -0
  47. data/ext/cadical/cadical/src/drattracer.hpp +55 -0
  48. data/ext/cadical/cadical/src/elim.cpp +1171 -0
  49. data/ext/cadical/cadical/src/elim.hpp +53 -0
  50. data/ext/cadical/cadical/src/elimfast.cpp +570 -0
  51. data/ext/cadical/cadical/src/ema.cpp +95 -0
  52. data/ext/cadical/cadical/src/ema.hpp +68 -0
  53. data/ext/cadical/cadical/src/extend.cpp +289 -0
  54. data/ext/cadical/cadical/src/external.cpp +1034 -0
  55. data/ext/cadical/cadical/src/external.hpp +487 -0
  56. data/ext/cadical/cadical/src/external_propagate.cpp +1316 -0
  57. data/ext/cadical/cadical/src/factor.cpp +1011 -0
  58. data/ext/cadical/cadical/src/factor.hpp +54 -0
  59. data/ext/cadical/cadical/src/file.cpp +506 -0
  60. data/ext/cadical/cadical/src/file.hpp +210 -0
  61. data/ext/cadical/cadical/src/flags.cpp +135 -0
  62. data/ext/cadical/cadical/src/flags.hpp +93 -0
  63. data/ext/cadical/cadical/src/flip.cpp +269 -0
  64. data/ext/cadical/cadical/src/format.cpp +89 -0
  65. data/ext/cadical/cadical/src/format.hpp +36 -0
  66. data/ext/cadical/cadical/src/frattracer.cpp +277 -0
  67. data/ext/cadical/cadical/src/frattracer.hpp +67 -0
  68. data/ext/cadical/cadical/src/gates.cpp +766 -0
  69. data/ext/cadical/cadical/src/heap.hpp +212 -0
  70. data/ext/cadical/cadical/src/idruptracer.cpp +566 -0
  71. data/ext/cadical/cadical/src/idruptracer.hpp +112 -0
  72. data/ext/cadical/cadical/src/instantiate.cpp +365 -0
  73. data/ext/cadical/cadical/src/instantiate.hpp +45 -0
  74. data/ext/cadical/cadical/src/internal.cpp +1265 -0
  75. data/ext/cadical/cadical/src/internal.hpp +1941 -0
  76. data/ext/cadical/cadical/src/inttypes.hpp +34 -0
  77. data/ext/cadical/cadical/src/ipasir.cpp +47 -0
  78. data/ext/cadical/cadical/src/ipasir.h +37 -0
  79. data/ext/cadical/cadical/src/kitten.c +2599 -0
  80. data/ext/cadical/cadical/src/kitten.h +97 -0
  81. data/ext/cadical/cadical/src/level.hpp +33 -0
  82. data/ext/cadical/cadical/src/lidruptracer.cpp +657 -0
  83. data/ext/cadical/cadical/src/lidruptracer.hpp +122 -0
  84. data/ext/cadical/cadical/src/limit.cpp +146 -0
  85. data/ext/cadical/cadical/src/limit.hpp +168 -0
  86. data/ext/cadical/cadical/src/logging.cpp +214 -0
  87. data/ext/cadical/cadical/src/logging.hpp +98 -0
  88. data/ext/cadical/cadical/src/lookahead.cpp +520 -0
  89. data/ext/cadical/cadical/src/lratchecker.cpp +833 -0
  90. data/ext/cadical/cadical/src/lratchecker.hpp +168 -0
  91. data/ext/cadical/cadical/src/lrattracer.cpp +200 -0
  92. data/ext/cadical/cadical/src/lrattracer.hpp +61 -0
  93. data/ext/cadical/cadical/src/lucky.cpp +506 -0
  94. data/ext/cadical/cadical/src/message.cpp +218 -0
  95. data/ext/cadical/cadical/src/message.hpp +65 -0
  96. data/ext/cadical/cadical/src/minimize.cpp +224 -0
  97. data/ext/cadical/cadical/src/mobical.cpp +5588 -0
  98. data/ext/cadical/cadical/src/occs.cpp +52 -0
  99. data/ext/cadical/cadical/src/occs.hpp +36 -0
  100. data/ext/cadical/cadical/src/options.cpp +359 -0
  101. data/ext/cadical/cadical/src/options.hpp +442 -0
  102. data/ext/cadical/cadical/src/parse.cpp +471 -0
  103. data/ext/cadical/cadical/src/parse.hpp +75 -0
  104. data/ext/cadical/cadical/src/phases.cpp +56 -0
  105. data/ext/cadical/cadical/src/phases.hpp +19 -0
  106. data/ext/cadical/cadical/src/probe.cpp +990 -0
  107. data/ext/cadical/cadical/src/profile.cpp +107 -0
  108. data/ext/cadical/cadical/src/profile.hpp +283 -0
  109. data/ext/cadical/cadical/src/proof.cpp +691 -0
  110. data/ext/cadical/cadical/src/proof.hpp +125 -0
  111. data/ext/cadical/cadical/src/propagate.cpp +584 -0
  112. data/ext/cadical/cadical/src/queue.cpp +90 -0
  113. data/ext/cadical/cadical/src/queue.hpp +74 -0
  114. data/ext/cadical/cadical/src/radix.hpp +180 -0
  115. data/ext/cadical/cadical/src/random.cpp +207 -0
  116. data/ext/cadical/cadical/src/random.h +44 -0
  117. data/ext/cadical/cadical/src/random.hpp +98 -0
  118. data/ext/cadical/cadical/src/range.hpp +125 -0
  119. data/ext/cadical/cadical/src/reap.cpp +127 -0
  120. data/ext/cadical/cadical/src/reap.hpp +28 -0
  121. data/ext/cadical/cadical/src/reduce.cpp +278 -0
  122. data/ext/cadical/cadical/src/reluctant.hpp +82 -0
  123. data/ext/cadical/cadical/src/rephase.cpp +402 -0
  124. data/ext/cadical/cadical/src/report.cpp +313 -0
  125. data/ext/cadical/cadical/src/resources.cpp +160 -0
  126. data/ext/cadical/cadical/src/resources.hpp +16 -0
  127. data/ext/cadical/cadical/src/restart.cpp +178 -0
  128. data/ext/cadical/cadical/src/restore.cpp +267 -0
  129. data/ext/cadical/cadical/src/score.cpp +51 -0
  130. data/ext/cadical/cadical/src/score.hpp +16 -0
  131. data/ext/cadical/cadical/src/shrink.cpp +507 -0
  132. data/ext/cadical/cadical/src/signal.cpp +136 -0
  133. data/ext/cadical/cadical/src/signal.hpp +33 -0
  134. data/ext/cadical/cadical/src/solution.cpp +50 -0
  135. data/ext/cadical/cadical/src/solver.cpp +1871 -0
  136. data/ext/cadical/cadical/src/stable.cpp +31 -0
  137. data/ext/cadical/cadical/src/stack.h +110 -0
  138. data/ext/cadical/cadical/src/stats.cpp +920 -0
  139. data/ext/cadical/cadical/src/stats.hpp +418 -0
  140. data/ext/cadical/cadical/src/subsume.cpp +645 -0
  141. data/ext/cadical/cadical/src/sweep.cpp +1960 -0
  142. data/ext/cadical/cadical/src/sweep.hpp +61 -0
  143. data/ext/cadical/cadical/src/terminal.cpp +38 -0
  144. data/ext/cadical/cadical/src/terminal.hpp +96 -0
  145. data/ext/cadical/cadical/src/ternary.cpp +450 -0
  146. data/ext/cadical/cadical/src/testing.hpp +24 -0
  147. data/ext/cadical/cadical/src/tier.cpp +189 -0
  148. data/ext/cadical/cadical/src/tracer.hpp +186 -0
  149. data/ext/cadical/cadical/src/transred.cpp +253 -0
  150. data/ext/cadical/cadical/src/unstable.cpp +29 -0
  151. data/ext/cadical/cadical/src/util.cpp +129 -0
  152. data/ext/cadical/cadical/src/util.hpp +181 -0
  153. data/ext/cadical/cadical/src/var.cpp +39 -0
  154. data/ext/cadical/cadical/src/var.hpp +22 -0
  155. data/ext/cadical/cadical/src/veripbtracer.cpp +427 -0
  156. data/ext/cadical/cadical/src/veripbtracer.hpp +106 -0
  157. data/ext/cadical/cadical/src/version.cpp +107 -0
  158. data/ext/cadical/cadical/src/version.hpp +13 -0
  159. data/ext/cadical/cadical/src/vivify.cpp +1893 -0
  160. data/ext/cadical/cadical/src/vivify.hpp +50 -0
  161. data/ext/cadical/cadical/src/walk.cpp +1088 -0
  162. data/ext/cadical/cadical/src/walk.hpp +91 -0
  163. data/ext/cadical/cadical/src/walk_full_occs.cpp +966 -0
  164. data/ext/cadical/cadical/src/warmup.cpp +403 -0
  165. data/ext/cadical/cadical/src/watch.cpp +126 -0
  166. data/ext/cadical/cadical/src/watch.hpp +77 -0
  167. data/ext/cadical/cadical_ext.c +778 -0
  168. data/ext/cadical/extconf.rb +26 -0
  169. data/lib/cadical/version.rb +3 -0
  170. data/lib/cadical.rb +12 -0
  171. metadata +218 -0
@@ -0,0 +1,64 @@
1
+ #include "internal.hpp"
2
+
3
+ namespace CaDiCaL {
4
+
5
+ void Internal::constrain (int lit) {
6
+ if (lit)
7
+ constraint.push_back (lit);
8
+ else {
9
+ if (level)
10
+ backtrack ();
11
+ LOG (constraint, "shrinking constraint");
12
+ bool satisfied_constraint = false;
13
+ const vector<int>::const_iterator end = constraint.end ();
14
+ vector<int>::iterator i = constraint.begin ();
15
+ for (vector<int>::const_iterator j = i; j != end; j++) {
16
+ int tmp = marked (*j);
17
+ if (tmp > 0) {
18
+ LOG ("removing duplicated literal %d from constraint", *j);
19
+ } else if (tmp < 0) {
20
+ LOG ("tautological since both %d and %d occur in constraint", -*j,
21
+ *j);
22
+ satisfied_constraint = true;
23
+ break;
24
+ } else {
25
+ tmp = val (*j);
26
+ if (tmp < 0) {
27
+ LOG ("removing falsified literal %d from constraint clause", *j);
28
+ } else if (tmp > 0) {
29
+ LOG ("satisfied constraint with literal %d", *j);
30
+ satisfied_constraint = true;
31
+ break;
32
+ } else {
33
+ *i++ = *j;
34
+ mark (*j);
35
+ }
36
+ }
37
+ }
38
+ constraint.resize (i - constraint.begin ());
39
+ for (const auto &lit : constraint)
40
+ unmark (lit);
41
+ if (satisfied_constraint)
42
+ constraint.clear ();
43
+ else if (constraint.empty ()) {
44
+ unsat_constraint = true;
45
+ if (!conflict_id)
46
+ marked_failed = false; // allow to trigger failing ()
47
+ } else
48
+ for (const auto lit : constraint)
49
+ freeze (lit);
50
+ }
51
+ }
52
+
53
+ bool Internal::failed_constraint () { return unsat_constraint; }
54
+
55
+ void Internal::reset_constraint () {
56
+ for (auto lit : constraint)
57
+ melt (lit);
58
+ LOG ("cleared %zd constraint literals", constraint.size ());
59
+ constraint.clear ();
60
+ unsat_constraint = false;
61
+ marked_failed = true;
62
+ }
63
+
64
+ } // namespace CaDiCaL
@@ -0,0 +1,27 @@
1
+ #ifndef NCONTRACTS
2
+
3
+ #include "internal.hpp"
4
+
5
+ namespace CaDiCaL {
6
+
7
+ void fatal_message_start ();
8
+
9
+ // See comments in 'contract.hpp'. Ugly hack we keep for now.
10
+
11
+ void require_solver_pointer_to_be_non_zero (const void *ptr,
12
+ const char *function_name,
13
+ const char *file_name) {
14
+ if (ptr)
15
+ return;
16
+ fatal_message_start ();
17
+ fprintf (stderr,
18
+ "invalid API usage of '%s' in '%s': "
19
+ "solver 'this' pointer zero (not initialized)\n",
20
+ function_name, file_name);
21
+ fflush (stderr);
22
+ abort ();
23
+ }
24
+
25
+ } // namespace CaDiCaL
26
+
27
+ #endif
@@ -0,0 +1,139 @@
1
+ #ifndef _contract_hpp_INCLUDED
2
+ #define _contract_hpp_INCLUDED
3
+
4
+ /*------------------------------------------------------------------------*/
5
+ #ifndef NCONTRACTS
6
+ /*------------------------------------------------------------------------*/
7
+
8
+ // If the user violates API contracts while calling functions declared in
9
+ // 'cadical.hpp' and implemented in 'solver.cpp' then an error is reported.
10
+ // Currently we also force aborting the program. In the future it might be
11
+ // better to allow the user to provide a call back function, which then can
12
+ // for instance throw a C++ exception or execute a 'longjmp' in 'C' etc.
13
+
14
+ #define CONTRACT_VIOLATED(...) \
15
+ do { \
16
+ fatal_message_start (); \
17
+ fprintf (stderr, \
18
+ "invalid API usage of '%s' in '%s': ", __PRETTY_FUNCTION__, \
19
+ __FILE__); \
20
+ fprintf (stderr, __VA_ARGS__); \
21
+ fputc ('\n', stderr); \
22
+ fflush (stderr); \
23
+ abort (); \
24
+ } while (0)
25
+
26
+ /*------------------------------------------------------------------------*/
27
+
28
+ namespace CaDiCaL {
29
+
30
+ // It would be much easier to just write 'REQUIRE (this, "not initialized")'
31
+ // which however produces warnings due to the '-Wnonnull' check. Note, that
32
+ // 'this' is always assumed to be non zero in modern C++. Much worse, if we
33
+ // use instead 'this != 0' or something similar like 'this != nullptr' then
34
+ // optimization silently removes this check ('gcc-7.4.0' at least) even
35
+ // though of course a zero pointer might be used as 'this' if the user did
36
+ // not initialize it. The only solution I found is to disable optimization
37
+ // for this check. It does not seem to be necessary for 'clang++' though
38
+ // ('clang++-6.0.0' at least). The alternative is to not check that the
39
+ // user forgot to initialize the solver pointer, but as long this works we
40
+ // keep this ugly hack. It also forces the function not to be inlined.
41
+ // The actual code I is in 'contract.cpp'.
42
+ //
43
+ void require_solver_pointer_to_be_non_zero (const void *ptr,
44
+ const char *function_name,
45
+ const char *file_name);
46
+ #define REQUIRE_NON_ZERO_THIS() \
47
+ do { \
48
+ require_solver_pointer_to_be_non_zero (this, __PRETTY_FUNCTION__, \
49
+ __FILE__); \
50
+ } while (0)
51
+
52
+ } // namespace CaDiCaL
53
+
54
+ /*------------------------------------------------------------------------*/
55
+
56
+ // These are common shortcuts for 'Solver' API contracts (requirements).
57
+
58
+ #define REQUIRE(COND, ...) \
59
+ do { \
60
+ if ((COND)) \
61
+ break; \
62
+ CONTRACT_VIOLATED (__VA_ARGS__); \
63
+ } while (0)
64
+
65
+ #define REQUIRE_INITIALIZED() \
66
+ do { \
67
+ REQUIRE_NON_ZERO_THIS (); \
68
+ REQUIRE (external, "external solver not initialized"); \
69
+ REQUIRE (internal, "internal solver not initialized"); \
70
+ } while (0)
71
+
72
+ #define REQUIRE_VALID_STATE() \
73
+ do { \
74
+ REQUIRE_INITIALIZED (); \
75
+ REQUIRE (this->state () & VALID, "solver in invalid state"); \
76
+ } while (0)
77
+
78
+ #define REQUIRE_READY_STATE() \
79
+ do { \
80
+ REQUIRE_VALID_STATE (); \
81
+ REQUIRE (state () != ADDING, \
82
+ "clause incomplete (terminating zero not added)"); \
83
+ } while (0)
84
+
85
+ #define REQUIRE_VALID_OR_SOLVING_STATE() \
86
+ do { \
87
+ REQUIRE_INITIALIZED (); \
88
+ REQUIRE (this->state () & (VALID | SOLVING), \
89
+ "solver neither in valid nor solving state"); \
90
+ } while (0)
91
+
92
+ #define REQUIRE_VALID_LIT(LIT) \
93
+ do { \
94
+ REQUIRE ((int) (LIT) && ((int) (LIT)) != INT_MIN, \
95
+ "invalid literal '%d'", (int) (LIT)); \
96
+ REQUIRE (external->is_valid_input ((int) (LIT)), \
97
+ "extension variable '%d' defined by the solver internally " \
98
+ "(all user variables have to be declared explicitly " \
99
+ "if 'factor' is enabled)", /* TODO only reason? */ \
100
+ (int) abs (LIT)); \
101
+ } while (0)
102
+
103
+ #define REQUIRE_STEADY_STATE() \
104
+ do { \
105
+ REQUIRE_INITIALIZED (); \
106
+ REQUIRE (this->state () & STEADY, "solver is not in steady state"); \
107
+ } while (0)
108
+
109
+ /*------------------------------------------------------------------------*/
110
+ #else // NCONTRACTS
111
+ /*------------------------------------------------------------------------*/
112
+
113
+ #define REQUIRE(...) \
114
+ do { \
115
+ } while (0)
116
+ #define REQUIRE_INITIALIZED() \
117
+ do { \
118
+ } while (0)
119
+ #define REQUIRE_VALID_STATE() \
120
+ do { \
121
+ } while (0)
122
+ #define REQUIRE_READY_STATE() \
123
+ do { \
124
+ } while (0)
125
+ #define REQUIRE_VALID_OR_SOLVING_STATE() \
126
+ do { \
127
+ } while (0)
128
+ #define REQUIRE_VALID_LIT(...) \
129
+ do { \
130
+ } while (0)
131
+ #define REQUIRE_STEADY_STATE() \
132
+ do { \
133
+ } while (0)
134
+
135
+ /*------------------------------------------------------------------------*/
136
+ #endif
137
+ /*------------------------------------------------------------------------*/
138
+
139
+ #endif