PySMT 0.9.7.dev452__py2.py3-none-any.whl → 0.9.7.dev457__py2.py3-none-any.whl

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.
pysmt/__init__.py CHANGED
@@ -19,7 +19,7 @@
19
19
  from typing import Tuple, Union
20
20
 
21
21
 
22
- VERSION: Union[Tuple[int, int, int], Tuple[int, int, int, str, int]] = (0, 9, 7, "dev", 452)
22
+ VERSION: Union[Tuple[int, int, int], Tuple[int, int, int, str, int]] = (0, 9, 7, "dev", 457)
23
23
 
24
24
  # Try to provide human-readable version of latest commit for dev versions
25
25
  # E.g. v0.5.1-4-g49a49f2-wip
pysmt/factory.py CHANGED
@@ -190,13 +190,15 @@ class Factory(object):
190
190
 
191
191
  if logic is None:
192
192
  logic = default_logic
193
+ assert isinstance(logic, Logic)
193
194
 
194
195
  solvers = self._filter_solvers(solver_list, logic=logic)
195
196
 
196
197
  if solvers is not None and len(solvers) > 0:
197
198
  # Pick the first solver based on preference list
198
199
  preference_list = self.preferences[solver_type]
199
- SolverClass = self._pick_favorite(preference_list, solver_list, solvers)
200
+ SolverClass = self._pick_favorite(preference_list, solver_list,
201
+ solvers, logic)
200
202
  closer_logic = get_closer_logic(SolverClass.LOGICS, logic)
201
203
  return SolverClass, closer_logic
202
204
 
@@ -205,7 +207,16 @@ class Factory(object):
205
207
  (solver_type, logic))
206
208
 
207
209
 
208
- def _pick_favorite(self, preference_list: List[str], solver_list: Dict[str, Any], solvers: Dict[str, Any]) -> Type[Solver]:
210
+ def _pick_favorite(self, preference_list: List[str], solver_list: Dict[str, Any],
211
+ solvers: Dict[str, Any], logic: Logic) -> Type[Solver]:
212
+ if not logic.theory.linear:
213
+ # The MathSAT family solves nonlinear problems by incremental
214
+ # linearization, which may not terminate on satisfiable instances
215
+ # whose solutions are all irrational (see the note on
216
+ # MathSAT5Solver.LOGICS). Prefer any other capable solver, but keep
217
+ # them as a fallback when nothing else supports the logic.
218
+ preference_list = sorted(preference_list,
219
+ key=lambda n: n.startswith(("msat", "optimsat")))
209
220
  for candidate in preference_list:
210
221
  if candidate in solvers:
211
222
  return solver_list[candidate]
pysmt/solvers/msat.py CHANGED
@@ -35,7 +35,7 @@ from pysmt.utils import assert_not_none
35
35
  from pysmt.walkers import DagWalker
36
36
  from pysmt.exceptions import (SolverReturnedUnknownResultError,
37
37
  InternalSolverError,
38
- NonLinearError, PysmtValueError, PysmtTypeError,
38
+ PysmtValueError, PysmtTypeError,
39
39
  ConvertExpressionError)
40
40
  from pysmt.decorators import clear_pending_pop, catch_conversion_error
41
41
  from pysmt.solvers.qelim import QuantifierEliminator
@@ -180,9 +180,37 @@ class MathSAT5Solver(IncrementalTrackingSolver, UnsatCoreSolver, SmtLibBasicSolv
180
180
 
181
181
  __lib_name__ = "mathsat"
182
182
 
183
+ # NOTE on nonlinear arithmetic (QF_NRA/QF_NIA, and OptiMathSAT, which
184
+ # inherits this LOGICS set).
185
+ #
186
+ # MathSAT solves nonlinear problems by incremental linearization: the
187
+ # nonlinear terms are abstracted away as free symbols and then
188
+ # progressively constrained with linear lemmas, until either the
189
+ # abstraction is refuted (UNSAT) or a model of the abstraction happens to
190
+ # be a model of the original formula (SAT). Every model MathSAT can build
191
+ # therefore assigns *rational* values only; irrational (algebraic) values
192
+ # are not representable.
193
+ #
194
+ # This is fine for UNSAT instances and for SAT instances that admit a
195
+ # rational solution, but not for SAT instances whose solutions are all
196
+ # irrational: on e.g. `x * x = 2` no finite set of linear lemmas refutes
197
+ # the abstraction, and no model of the abstraction ever satisfies the
198
+ # original constraint, so the refinement loop does not terminate. MathSAT
199
+ # diverges rather than returning `unknown`, and there is currently no
200
+ # option to bound the number of refinement rounds. The only available
201
+ # mitigation is a soft timeout installed with `msat_set_termination_test`,
202
+ # which pySMT does not expose, and which could only be wall-clock based
203
+ # (hence non-reproducible), since the internal statistics that would give a
204
+ # deterministic budget cannot be retrieved through the API.
205
+ # See the discussion in https://github.com/pysmt/pysmt/pull/844.
206
+ #
207
+ # Practical consequences:
208
+ # - formulas that need algebraic witnesses must be sent to a solver with a
209
+ # complete NRA decision procedure (z3, cvc5);
210
+ # - the nonlinear examples and tests run against MathSAT are kept
211
+ # rational on purpose (e.g. `r * r = 4.0` instead of `r * r = 2.0`).
183
212
  LOGICS: Iterable[Logic] = PYSMT_QF_LOGICS -\
184
- set(l for l in PYSMT_QF_LOGICS \
185
- if not l.theory.linear or l.theory.strings)
213
+ set(l for l in PYSMT_QF_LOGICS if l.theory.strings)
186
214
 
187
215
  OptionsClass = MathSATOptions
188
216
 
@@ -407,6 +435,7 @@ class MSatConverter(Converter, DagWalker):
407
435
  self._msat_lib.MSAT_TAG_LEQ: self._back_adapter(self.mgr.LE),
408
436
  self._msat_lib.MSAT_TAG_PLUS: self._back_adapter(self.mgr.Plus),
409
437
  self._msat_lib.MSAT_TAG_TIMES: self._back_adapter(self.mgr.Times),
438
+ self._msat_lib.MSAT_TAG_DIVIDE: self._back_adapter(self.mgr.Div),
410
439
  self._msat_lib.MSAT_TAG_BV_MUL: self._back_adapter(self.mgr.BVMul),
411
440
  self._msat_lib.MSAT_TAG_BV_ADD: self._back_adapter(self.mgr.BVAdd),
412
441
  self._msat_lib.MSAT_TAG_BV_UDIV: self._back_adapter(self.mgr.BVUDiv),
@@ -463,6 +492,7 @@ class MSatConverter(Converter, DagWalker):
463
492
  self._msat_lib.MSAT_TAG_LEQ: self._sig_most_generic_bool_binary,
464
493
  self._msat_lib.MSAT_TAG_PLUS: self._sig_most_generic_bool_binary,
465
494
  self._msat_lib.MSAT_TAG_TIMES: self._sig_most_generic_bool_binary,
495
+ self._msat_lib.MSAT_TAG_DIVIDE: self._sig_most_generic_bool_binary,
466
496
  self._msat_lib.MSAT_TAG_FLOOR: lambda term, args:\
467
497
  self.tm.FunctionType(types.INT, [types.REAL]),
468
498
  self._msat_lib.MSAT_TAG_BV_MUL: self._sig_binary,
@@ -987,16 +1017,33 @@ class MSatConverter(Converter, DagWalker):
987
1017
 
988
1018
  def walk_times(self, formula: FNode, args: List[Any], **kwargs) -> Any:
989
1019
  res = args[0]
990
- nl_count = 0 if self._msat_lib.msat_term_is_number(self.msat_env(), res) else 1
991
1020
  for x in args[1:]:
992
- if not self._msat_lib.msat_term_is_number(self.msat_env(), x):
993
- nl_count += 1
994
- if nl_count >= 2:
995
- raise NonLinearError(formula)
996
- else:
997
- res = self._msat_lib.msat_make_times(self.msat_env(), res, x)
1021
+ res = self._msat_lib.msat_make_times(self.msat_env(), res, x)
998
1022
  return res
999
1023
 
1024
+ def walk_pow(self, formula: FNode, args: List[Any], **kwargs) -> Any:
1025
+ # MathSAT rejects exponents it cannot handle by returning an error
1026
+ # term, which convert() turns into an InternalSolverError.
1027
+ return self._msat_lib.msat_make_pow(self.msat_env(), args[0], args[1])
1028
+
1029
+ def walk_div(self, formula: FNode, args: List[Any], **kwargs) -> Any:
1030
+ num, den = args
1031
+ if self.env.stc.get_type(formula).is_real_type():
1032
+ return self._msat_lib.msat_make_divide(self.msat_env(), num, den)
1033
+ # msat_make_divide is real division, while pySMT follows the SMT-LIB
1034
+ # semantics for integers: den >= 0 ? floor(num/den) : ceil(num/den).
1035
+ # ceil(a) is rewritten as -floor(-a).
1036
+ zero = self._msat_lib.msat_make_number(self.msat_env(), "0")
1037
+ neg = self._msat_lib.msat_make_number(self.msat_env(), "-1")
1038
+ cond = self._msat_lib.msat_make_leq(self.msat_env(), zero, den)
1039
+ div = self._msat_lib.msat_make_floor(self.msat_env(),
1040
+ self._msat_lib.msat_make_divide(self.msat_env(), num, den))
1041
+ n_den = self._msat_lib.msat_make_times(self.msat_env(), neg, den)
1042
+ n_div = self._msat_lib.msat_make_times(self.msat_env(), neg,
1043
+ self._msat_lib.msat_make_floor(self.msat_env(),
1044
+ self._msat_lib.msat_make_divide(self.msat_env(), num, n_den)))
1045
+ return self._msat_lib.msat_make_term_ite(self.msat_env(), cond, div, n_div)
1046
+
1000
1047
  def walk_function(self, formula: FNode, args: List[Any], **kwargs) -> Any:
1001
1048
  name = formula.function_name()
1002
1049
  if name not in self.symbol_to_decl:
pysmt/test/examples.py CHANGED
@@ -925,8 +925,8 @@ def get_full_example_formulae(environment: Optional[Environment]=None) -> List[E
925
925
  logic=pysmt.logics.QF_NRA
926
926
  ),
927
927
 
928
- Example(hr="(2.0 = (r * r))",
929
- expr=Equals(Real(2), Times(r,r)),
928
+ Example(hr="(4.0 = (r * r))",
929
+ expr=Equals(Real(4), Times(r,r)),
930
930
  is_valid=False,
931
931
  is_sat=True,
932
932
  logic=pysmt.logics.QF_NRA
@@ -946,8 +946,8 @@ def get_full_example_formulae(environment: Optional[Environment]=None) -> List[E
946
946
  logic=pysmt.logics.QF_NRA
947
947
  ),
948
948
 
949
- Example(hr="((r * r * r) = 25.0)",
950
- expr=Equals(Times(r, r, r), Real(25)),
949
+ Example(hr="((r * r * r) = 27.0)",
950
+ expr=Equals(Times(r, r, r), Real(27)),
951
951
  is_valid=False,
952
952
  is_sat=True,
953
953
  logic=pysmt.logics.QF_NRA
pysmt/test/test_env.py CHANGED
@@ -203,5 +203,17 @@ class TestEnvironment(TestCase):
203
203
  factory.get_quantifier_eliminator()
204
204
 
205
205
 
206
+ def test_nonlinear_demotes_mathsat(self):
207
+ # The MathSAT family is the last resort on nonlinear logics, but still
208
+ # picked when it is the only capable solver.
209
+ pick = get_env().factory._pick_favorite
210
+ available = {'msat': 'MSAT', 'z3': 'Z3'}
211
+ prefs = ['msat', 'z3']
212
+ self.assertEqual(pick(prefs, available, available, logics.QF_NRA), 'Z3')
213
+ self.assertEqual(pick(prefs, available, available, logics.QF_LRA), 'MSAT')
214
+ only_msat = {'msat': 'MSAT'}
215
+ self.assertEqual(pick(prefs, only_msat, only_msat, logics.QF_NRA), 'MSAT')
216
+
217
+
206
218
  if __name__ == '__main__':
207
219
  main()
pysmt/test/test_nlira.py CHANGED
@@ -24,33 +24,33 @@ from pysmt.shortcuts import FreshSymbol, Times, Equals, Div, Real, Int, Pow
24
24
  from pysmt.shortcuts import Solver, Symbol, And, Not, is_sat
25
25
  from pysmt.typing import REAL, INT
26
26
  from pysmt.exceptions import (ConvertExpressionError,
27
- NonLinearError, InternalSolverError,
27
+ NonLinearError,
28
28
  SolverReturnedUnknownResultError)
29
- from pysmt.logics import QF_NRA
29
+ from pysmt.logics import QF_NRA, QF_NIA
30
30
  from pysmt.constants import Fraction
31
31
 
32
32
 
33
33
  class TestNonLinear(TestCase):
34
34
 
35
- @skipIfSolverNotAvailable("z3")
36
35
  def test_times(self):
37
36
  x = FreshSymbol(REAL)
38
37
  f = Equals(Times(x, x), x)
39
- with Solver(name="z3") as s:
40
- self.assertTrue(s.is_sat(f))
38
+ for sname in self.env.factory.all_solvers(logic=QF_NRA):
39
+ with Solver(name=sname, logic=QF_NRA) as s:
40
+ self.assertTrue(s.is_sat(f), sname)
41
41
 
42
- @skipIfSolverNotAvailable("z3")
43
42
  def test_div(self):
44
43
  x = FreshSymbol(REAL)
45
44
  f = Equals(Div(x, x), x)
46
- with Solver(name="z3") as s:
47
- self.assertTrue(s.is_sat(f))
45
+ for sname in self.env.factory.all_solvers(logic=QF_NRA):
46
+ with Solver(name=sname, logic=QF_NRA) as s:
47
+ self.assertTrue(s.is_sat(f), sname)
48
48
 
49
49
  @skipIfSolverNotAvailable("z3")
50
50
  def test_irrational(self):
51
51
  x = FreshSymbol(REAL)
52
52
  f = Equals(Times(x, x), Real(2))
53
- with Solver(name="z3") as s:
53
+ with Solver(name="z3", logic=QF_NRA) as s:
54
54
  self.assertTrue(s.is_sat(f))
55
55
  model = s.get_model()
56
56
  xval = model[x]
@@ -73,38 +73,34 @@ class TestNonLinear(TestCase):
73
73
 
74
74
  def test_unknownresult(self):
75
75
  x = FreshSymbol(REAL)
76
- f = Equals(Times(x, x), Real(2))
76
+ # 4.0 rather than 2.0: the point here is which solvers reject
77
+ # nonlinear arithmetic, not who can represent an algebraic number.
78
+ f = Equals(Times(x, x), Real(4))
77
79
  for sname in self.env.factory.all_solvers():
78
- with Solver(name=sname) as s:
79
- if sname in ["bdd", "picosat", "btor"]:
80
+ if sname in ["bdd", "picosat", "btor"]:
81
+ with Solver(name=sname) as s:
80
82
  with self.assertRaises(ConvertExpressionError):
81
83
  s.is_sat(f)
82
- elif sname in ["yices", "cvc4", "msat", "optimsat"]:
84
+ elif sname in ["yices", "cvc4"]:
85
+ with Solver(name=sname) as s:
83
86
  with self.assertRaises(NonLinearError):
84
87
  s.is_sat(f)
85
- elif sname in ["cvc5"]:
86
- with self.assertRaises(InternalSolverError):
87
- s.is_sat(f)
88
- else:
89
- res = s.is_sat(f)
90
- self.assertTrue(res, sname)
88
+ else:
89
+ with Solver(name=sname, logic=QF_NRA) as s:
90
+ self.assertTrue(s.is_sat(f), sname)
91
91
  self.assertIn(QF_NRA, s.LOGICS, sname)
92
92
 
93
- @skipIfSolverNotAvailable("z3")
94
93
  def test_integer(self):
95
94
  x = FreshSymbol(INT)
96
- f = Equals(Times(x, x), Int(2))
97
- with Solver(name="z3") as s:
98
- self.assertFalse(s.is_sat(f))
99
-
100
- # f = Equals(Times(Int(4), Pow(x, Int(-1))), Int(2))
101
- # self.assertTrue(is_sat(f, solver_name="z3"))
102
-
103
- # f = Equals(Div(Int(4), x), Int(2))
104
- # self.assertTrue(is_sat(f, solver_name="z3"))
105
-
106
- f = Equals(Times(x, x), Int(16))
107
- self.assertTrue(is_sat(f, solver_name="z3"))
95
+ f1 = Equals(Times(x, x), Int(2))
96
+ f2 = Equals(Times(x, x), Int(16))
97
+ for sname in self.env.factory.all_solvers(logic=QF_NIA):
98
+ for f, expected in ((f1, False), (f2, True)):
99
+ with Solver(name=sname, logic=QF_NIA) as s:
100
+ try:
101
+ self.assertEqual(expected, s.is_sat(f), (sname, f))
102
+ except SolverReturnedUnknownResultError:
103
+ pass
108
104
 
109
105
  @skipIfSolverNotAvailable("z3")
110
106
  def test_div_pow(self):
@@ -198,7 +198,6 @@ class TestBasic(TestCase):
198
198
  def test_examples_msat(self):
199
199
  for (f, validity, satisfiability, logic) in get_example_formulae():
200
200
  if not logic.quantifier_free: continue
201
- if not logic.theory.linear: continue
202
201
  if logic.theory.strings: continue
203
202
 
204
203
  v = is_valid(f, solver_name='msat', logic=logic)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: PySMT
3
- Version: 0.9.7.dev452
3
+ Version: 0.9.7.dev457
4
4
  Summary: A solver-agnostic library for SMT Formulae manipulation and solving
5
5
  Home-page: http://www.pysmt.org
6
6
  Author: PySMT Team
@@ -1,11 +1,11 @@
1
- pysmt/__init__.py,sha256=H1RSyIhE62I8bMHuJMFdulWPhnFnfJ5WhtMApT7Oz-8,1701
1
+ pysmt/__init__.py,sha256=Z7If4KtAgb7FCsVxqvzdXiL1R6lGp3Z4clNET3RgY3c,1701
2
2
  pysmt/__main__.py,sha256=rR-MV1QtLYqtVoJyY3m5B5Iz-lua0-5o6YSB0W4lKy8,1085
3
3
  pysmt/configuration.py,sha256=Iq_46QZ9z_jpBMk76euJWTqGEwHad2qyiEDPix5sXsA,4538
4
4
  pysmt/constants.py,sha256=pulb6NvROY_X8BePeyyX8T9MJLB79HZ_1FUYSlZ7Jfg,5769
5
5
  pysmt/decorators.py,sha256=dZWnu0lwfVBq6WGoohH5EWVpi6xr-uAEtFBjDUJgnoo,4106
6
6
  pysmt/environment.py,sha256=UUcccuTIGRYdIxvso4aUvfwJiveoDdOwRgTcVHkuupc,7056
7
7
  pysmt/exceptions.py,sha256=l7JmvC9VML32HeZwIhgxf5L-NQjbbpX4aHCdO9d56nM,5637
8
- pysmt/factory.py,sha256=E0ykatmufugzsOUG5hBPVatuudQ1u5WXlLy8ziKAbdc,31899
8
+ pysmt/factory.py,sha256=nBe8oMy04KPeoOFJexQ1YJS7GQcEIiyg373U-P5jmnk,32575
9
9
  pysmt/fnode.py,sha256=5K0z8Qy3jIbB4N-lyBESXyzDpBDPD92jryNNd50NdLk,36453
10
10
  pysmt/formula.py,sha256=gUqv0V91Tww9GVeOD2Z_gsZlthUe8NADd0ZbYmK2CEk,50770
11
11
  pysmt/logics.py,sha256=HQaq2Odqw8oFNCAo1av0zaFOcPujTopO8frWSBsmNtg,29348
@@ -59,7 +59,7 @@ pysmt/solvers/cvcfour.py,sha256=W8Afm8J7co87Vwt4L80kIoNaPcA3eBLwEnwAw5CcoHg,2579
59
59
  pysmt/solvers/dynmsat.py,sha256=bJokwHoxKWmQGqw9nQerRDb33d5c66Sa91jUYiZXwY0,2124
60
60
  pysmt/solvers/eager.py,sha256=E2wWhRVWe6sVxW2YOwPDhZ8O53uKNuPKwLIvsRsWFPA,3681
61
61
  pysmt/solvers/interpolation.py,sha256=6AO1wMkEKSkptuC4aXlNEO8Be1K2oW3W_er2XGc_aEA,2066
62
- pysmt/solvers/msat.py,sha256=feT1NYkc6cSCvKVtKIk_fPmo_mOIpyKWCrJEMQS9G4s,60568
62
+ pysmt/solvers/msat.py,sha256=4awRHpIym8pgxoHlbb9y3zUeLuAsOxhE2HQ39B4OY34,63642
63
63
  pysmt/solvers/options.py,sha256=DRNUMb5Tlhai4keQkF7Kg34tf3AGbBUd45mqzjsS69c,4036
64
64
  pysmt/solvers/pico.py,sha256=y31QT7ZQVMeKjXc7g4DZrpc1LTzbhCLyE0zyOLd-BsE,10680
65
65
  pysmt/solvers/portfolio.py,sha256=GFKR2S8FoANzZJWUkYVqWEJG7sw04RYgSnwaKJNWuUs,10092
@@ -69,7 +69,7 @@ pysmt/solvers/solver.py,sha256=AqmWoDPKLpjpb0RlyUS-qYGCqPRetZKbiTIT-usczjA,19467
69
69
  pysmt/solvers/yices.py,sha256=uG08Q9iqctXk-2rDP6H5OO88FE_ml83K0k5j8irpbcg,25910
70
70
  pysmt/solvers/z3.py,sha256=IOy2jqpdvY9uGKl7W1ehN-ZEHPS4CfIVYYhNbSOBZqw,44642
71
71
  pysmt/test/__init__.py,sha256=LEFbVYw4X45sgEI4_ax55g-6G5Y7kj6CLaJr1TQr4ks,5750
72
- pysmt/test/examples.py,sha256=6yWa-hHEMJuo5GEbjWmzg509-LQxVAyr26lxGhcK_jU,40756
72
+ pysmt/test/examples.py,sha256=fogqgP2qEpvaOswVFYRr4Q8o6TKoCLPW9460SL9HVvo,40756
73
73
  pysmt/test/omt_examples.py,sha256=LdL43fLaHiR72Cng_2st4UaYf2ueoZgStcvhccy-RdI,10338
74
74
  pysmt/test/optimization_utils.py,sha256=zbj2bN-3uMaNexF7DSjuQAR0889IcMsCiE__tGtR6zM,15665
75
75
  pysmt/test/test_array.py,sha256=-7R_L0d0MMuemdv0AtqNR2y8rX_w4Xc0NiaDKD4H_lY,7163
@@ -83,7 +83,7 @@ pysmt/test/test_constants.py,sha256=vdjjtAOw5oQg57Bl5tllslnVWBHuRq3Zk33F1xDsBtA,
83
83
  pysmt/test/test_cvc_quantifiers.py,sha256=a40NDyPKNynVpqq9M5pDTR8qFL_EumR8whw8escxP4I,1850
84
84
  pysmt/test/test_dwf.py,sha256=nQubO2IYjW3NnRjNz3xkhpXgK_5coZp9uZ_U-ElmFRw,2850
85
85
  pysmt/test/test_eager_model.py,sha256=hF9V8wQYXVeyW2Bo4sACa98xeJtfOMYjMvjWMHQaGag,3662
86
- pysmt/test/test_env.py,sha256=EZ5DbAK7OXwuoiNMz4naaz5MFYUk-fK0_OKknO-YG70,8166
86
+ pysmt/test/test_env.py,sha256=g98aqMU2dlPW2hQmWy8DxCLfm06upMic5mU91MGX_PQ,8758
87
87
  pysmt/test/test_euf.py,sha256=B0VRx1NwfKZZIG5Fc6gYPj7G6gNWMzYJvgbh-2q2E28,3455
88
88
  pysmt/test/test_formula.py,sha256=nd550r7dBRHvoNKedCCdKfmV0WD4oMfjZekfAtk7GSg,40493
89
89
  pysmt/test/test_hr_parsing.py,sha256=bi-iTu7y1C7diMcWsQ7EI40MipDbzTKbMGPnLWX85A8,3118
@@ -95,7 +95,7 @@ pysmt/test/test_logics.py,sha256=bWwE_7rq9SVcXglE-ugteGeCHXAYFiBdi-QgIL9-9KE,689
95
95
  pysmt/test/test_models.py,sha256=npqGoF-3DgAw0DTx6se32ZEZRFBJDcnkppzgyjLDbps,2748
96
96
  pysmt/test/test_native_qe.py,sha256=RGZgwbpAkPBTjIqcCbOkZ_nQXIDZ4Fznrr7Ldx6oA38,3439
97
97
  pysmt/test/test_nia.py,sha256=x51d0X5jnZnxTPvPLrlD0WilunZ5uNrDU4vWY78_xpU,6640
98
- pysmt/test/test_nlira.py,sha256=_E1HeOarw4TN8AI1X7EQv-utjhwy8hJX3vx-05eHJk0,4969
98
+ pysmt/test/test_nlira.py,sha256=RNG90qzQ_XUI9bazoiBUhSt1N7QKcjlzHm3bqraMDj4,5129
99
99
  pysmt/test/test_optimization.py,sha256=xU0gJbD2SSn5_lA7wF7IKcR54KF6NU0g-2_dDEqXmqA,24358
100
100
  pysmt/test/test_optimizing.py,sha256=P-XnTPEPoEp5LvvZfZoiZziI4z3d_FfL7lFcEuI07bE,1512
101
101
  pysmt/test/test_oracles.py,sha256=cHBPTUoi9cPmIvR-DG4bbzohOaBdUJzpKLoQXImxS_c,5615
@@ -107,7 +107,7 @@ pysmt/test/test_rewritings.py,sha256=1eeseDwZyQD2VrOFBABXHTYJFJOXszP4olbCNeLcwfA
107
107
  pysmt/test/test_shannon_expansion.py,sha256=yaiZuB24wj1Zi-KdzRTmWuzAVaF9bQ603uto7zi6XBs,3082
108
108
  pysmt/test/test_simplify.py,sha256=ckQn_DUxVvGspaRNZmSPHkudhpUlG5K2w6C0wDqhL1w,7620
109
109
  pysmt/test/test_size.py,sha256=p3aqCMHfBiGLxvF0P8hE-PRQTT8VMPIJCjblq8Txh1w,3261
110
- pysmt/test/test_solving.py,sha256=sB9Nz7pTg-MjInl3MKo4rCPDLwxti3Yp1QanwxLZ4As,25637
110
+ pysmt/test/test_solving.py,sha256=pf5ZitNQrVAT2VSn-ZstHNromomL6OxPKBJMdyZzdLk,25588
111
111
  pysmt/test/test_sorts.py,sha256=erfInyPH91WVB8JBUYLteTo5X5skKKP3vEXdUUKC-YE,6033
112
112
  pysmt/test/test_string.py,sha256=Y6VBfkLNKuePo8-HIzcwBH3eaYj0i-k1Y8tpFyw03zw,8096
113
113
  pysmt/test/test_typechecker.py,sha256=S2O8HjN_bLN6sz86TnsWqpRtxHk2VcVsGDoRZCcQnzE,7309
@@ -143,10 +143,10 @@ pysmt/walkers/dag.py,sha256=4CWSgoXm6nONhM-1znKRU4SBCb791OTS-M9QlQFhbs8,5751
143
143
  pysmt/walkers/generic.py,sha256=dmp47kJGtO6rhC2t07Mf_FsYN-lcy64LX-dZggNnWm4,5179
144
144
  pysmt/walkers/identitydag.py,sha256=EAxSneEW91Z8GphlkbMPsPdlac7_FDcVj-_6_aunU2s,10902
145
145
  pysmt/walkers/tree.py,sha256=8oyDSXZtUsCdExcrwG3hKuEgARHgdW6fvz0LZJwjp-k,2983
146
- pysmt-0.9.7.dev452.dist-info/licenses/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
147
- pysmt-0.9.7.dev452.dist-info/licenses/NOTICE,sha256=Ns-Jsa6nbqZUiTEEAM6HqioSZIxQ2RCJzxoBlWQaUfc,601
148
- pysmt-0.9.7.dev452.dist-info/METADATA,sha256=7YalyJRjNuUsu3qa8tLhqU498-dd5f4EfE8o_bPpV7w,1774
149
- pysmt-0.9.7.dev452.dist-info/WHEEL,sha256=4YBfCYNH4wlLpv3pzq1hbEuIlXA4WJabKLFurZ7eTL0,109
150
- pysmt-0.9.7.dev452.dist-info/entry_points.txt,sha256=gDc1XM0xTJJMDGC_nXd0kfbX-Omjke9Dn9F3awMLYIU,57
151
- pysmt-0.9.7.dev452.dist-info/top_level.txt,sha256=NwHQbpTaZMEvjIUdC0bvvj-WUyULe-nt-opK3YQNRMk,6
152
- pysmt-0.9.7.dev452.dist-info/RECORD,,
146
+ pysmt-0.9.7.dev457.dist-info/licenses/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
147
+ pysmt-0.9.7.dev457.dist-info/licenses/NOTICE,sha256=Ns-Jsa6nbqZUiTEEAM6HqioSZIxQ2RCJzxoBlWQaUfc,601
148
+ pysmt-0.9.7.dev457.dist-info/METADATA,sha256=pLdugCvQziKFZDtfMfIGU30l51IOnPuE3xrpLyx_ycM,1774
149
+ pysmt-0.9.7.dev457.dist-info/WHEEL,sha256=4YBfCYNH4wlLpv3pzq1hbEuIlXA4WJabKLFurZ7eTL0,109
150
+ pysmt-0.9.7.dev457.dist-info/entry_points.txt,sha256=gDc1XM0xTJJMDGC_nXd0kfbX-Omjke9Dn9F3awMLYIU,57
151
+ pysmt-0.9.7.dev457.dist-info/top_level.txt,sha256=NwHQbpTaZMEvjIUdC0bvvj-WUyULe-nt-opK3YQNRMk,6
152
+ pysmt-0.9.7.dev457.dist-info/RECORD,,