~ruther/guix-local

4fccad83875cf8f5846b181525f814ce5c240ef9 — Nguyễn Gia Phong 1 year, 3 months ago ad59a0c
gnu: python-pysmt: Update to 0.9.6.

* gnu/packages/python-xyz.scm (python-pysmt): Update to 0.9.6.
[source]: Remove obsolete patches.
* gnu/packages/patches/python-pysmt-fix-pow-return-type.patch,
gnu/packages/patches/python-pysmt-fix-smtlib-serialization-test.patch:
Delete files.
* gnu/local.mk (dist_patch_DATA): Remove them.

Change-Id: I3772e8b118f122ddd66644a459a483183ef89193
Reviewed-by: Nicolas Graves <ngraves@ngraves.fr>
Signed-off-by: Leo Famulari <leo@famulari.name>
4 files changed, 3 insertions(+), 350 deletions(-)

M gnu/local.mk
D gnu/packages/patches/python-pysmt-fix-pow-return-type.patch
D gnu/packages/patches/python-pysmt-fix-smtlib-serialization-test.patch
M gnu/packages/python-xyz.scm
M gnu/local.mk => gnu/local.mk +0 -2
@@ 2110,8 2110,6 @@ dist_patch_DATA =						\
  %D%/packages/patches/python-paste-remove-timing-test.patch	\
  %D%/packages/patches/python-pyan3-fix-absolute-path-bug.patch \
  %D%/packages/patches/python-pyan3-fix-positional-arguments.patch \
  %D%/packages/patches/python-pysmt-fix-pow-return-type.patch	\
  %D%/packages/patches/python-pysmt-fix-smtlib-serialization-test.patch	\
  %D%/packages/patches/python-pytorch-fix-codegen.patch		\
  %D%/packages/patches/python-pytorch-runpath.patch		\
  %D%/packages/patches/python-pytorch-system-libraries.patch	\

D gnu/packages/patches/python-pysmt-fix-pow-return-type.patch => gnu/packages/patches/python-pysmt-fix-pow-return-type.patch +0 -258
@@ 1,258 0,0 @@
Backport of an upstream patch which fixes a test failure with our
packaged version of the Z3 SMT solver.

Taken from: https://github.com/pysmt/pysmt/commit/f522e8cd8f3e75ff85f5eae29b427e18a6701859

diff --git a/pysmt/formula.py b/pysmt/formula.py
index ea4b46c..6cb9cbf 100644
--- a/pysmt/formula.py
+++ b/pysmt/formula.py
@@ -252,11 +252,7 @@ class FormulaManager(object):
 
         if base.is_constant():
             val = base.constant_value() ** exponent.constant_value()
-            if base.is_constant(types.REAL):
-                return self.Real(val)
-            else:
-                assert base.is_constant(types.INT)
-                return self.Int(val)
+            return self.Real(val)
         return self.create_node(node_type=op.POW, args=(base, exponent))
 
     def Div(self, left, right):
diff --git a/pysmt/logics.py b/pysmt/logics.py
index ef88dd6..9dc45b1 100644
--- a/pysmt/logics.py
+++ b/pysmt/logics.py
@@ -495,6 +495,12 @@ QF_NRA = Logic(name="QF_NRA",
                real_arithmetic=True,
                linear=False)
 
+QF_NIRA = Logic(name="QF_NIRA",
+                description="""Quantifier-free integer and real arithmetic.""",
+                quantifier_free=True,
+                integer_arithmetic=True,
+                real_arithmetic=True,
+                linear=False)
 
 QF_RDL = Logic(name="QF_RDL",
                description=\
@@ -619,41 +625,41 @@ QF_AUFBVLIRA = Logic(name="QF_AUFBVLIRA",
 AUTO = Logic(name="Auto",
              description="Special logic used to indicate that the logic to be used depends on the formula.")
 
-SMTLIB2_LOGICS = frozenset([ AUFLIA,
-                             AUFLIRA,
-                             AUFNIRA,
-                             ALIA,
-                             LRA,
-                             LIA,
-                             NIA,
-                             NRA,
-                             UFLRA,
-                             UFNIA,
-                             UFLIRA,
-                             QF_ABV,
-                             QF_AUFBV,
-                             QF_AUFLIA,
-                             QF_ALIA,
-                             QF_AX,
-                             QF_BV,
-                             QF_IDL,
-                             QF_LIA,
-                             QF_LRA,
-                             QF_NIA,
-                             QF_NRA,
-                             QF_RDL,
-                             QF_UF,
-                             QF_UFBV ,
-                             QF_UFIDL,
-                             QF_UFLIA,
-                             QF_UFLRA,
-                             QF_UFNRA,
-                             QF_UFNIA,
-                             QF_UFLIRA,
-                             QF_SLIA
-                         ])
-
-LOGICS = SMTLIB2_LOGICS | frozenset([ QF_BOOL, BOOL, QF_AUFBVLIRA])
+SMTLIB2_LOGICS = frozenset([AUFLIA,
+                            AUFLIRA,
+                            AUFNIRA,
+                            ALIA,
+                            LRA,
+                            LIA,
+                            NIA,
+                            NRA,
+                            UFLRA,
+                            UFNIA,
+                            UFLIRA,
+                            QF_ABV,
+                            QF_AUFBV,
+                            QF_AUFLIA,
+                            QF_ALIA,
+                            QF_AX,
+                            QF_BV,
+                            QF_IDL,
+                            QF_LIA,
+                            QF_LRA,
+                            QF_NIA,
+                            QF_NRA,
+                            QF_RDL,
+                            QF_UF,
+                            QF_UFBV,
+                            QF_UFIDL,
+                            QF_UFLIA,
+                            QF_UFLRA,
+                            QF_UFNRA,
+                            QF_UFNIA,
+                            QF_UFLIRA,
+                            QF_SLIA
+                            ])
+
+LOGICS = SMTLIB2_LOGICS | frozenset([QF_BOOL, BOOL, QF_AUFBVLIRA, QF_NIRA])
 
 QF_LOGICS = frozenset(_l for _l in LOGICS if _l.quantifier_free)
 
@@ -668,8 +674,8 @@ PYSMT_LOGICS = frozenset([QF_BOOL, QF_IDL, QF_LIA, QF_LRA, QF_RDL, QF_UF, QF_UFI
                           QF_BV, QF_UFBV,
                           QF_ABV, QF_AUFBV, QF_AUFLIA, QF_ALIA, QF_AX,
                           QF_AUFBVLIRA,
-                          QF_NRA, QF_NIA, UFBV, BV,
-                      ])
+                          QF_NRA, QF_NIA, QF_NIRA, UFBV, BV,
+                          ])
 
 # PySMT Logics includes additional features:
 #  - constant arrays: QF_AUFBV  becomes QF_AUFBV*
@@ -697,7 +703,6 @@ for l in PYSMT_LOGICS:
         ext_logics.add(nl)
 
 
-
 LOGICS = LOGICS | frozenset(ext_logics)
 PYSMT_LOGICS = PYSMT_LOGICS | frozenset(ext_logics)
 
diff --git a/pysmt/solvers/z3.py b/pysmt/solvers/z3.py
index 3fb42b9..210b771 100644
--- a/pysmt/solvers/z3.py
+++ b/pysmt/solvers/z3.py
@@ -595,6 +595,8 @@ class Z3Converter(Converter, DagWalker):
                                              None, None,
                                              0, None,
                                              expr.ast)
+        print("Z3: SMTLIB")
+        print(s)
         stream_in = StringIO(s)
         r = parser.get_script(stream_in).get_last_formula(self.mgr)
         key = (askey(expr), None)
diff --git a/pysmt/test/examples.py b/pysmt/test/examples.py
index 73455ee..b653185 100644
--- a/pysmt/test/examples.py
+++ b/pysmt/test/examples.py
@@ -898,12 +898,12 @@ def get_full_example_formulae(environment=None):
                     logic=pysmt.logics.QF_NRA
                 ),
 
-            Example(hr="((p ^ 2) = 0)",
-                    expr=Equals(Pow(p, Int(2)), Int(0)),
+            Example(hr="((p ^ 2) = 0.0)",
+                    expr=Equals(Pow(p, Int(2)), Real(0)),
                     is_valid=False,
                     is_sat=True,
-                    logic=pysmt.logics.QF_NIA
-                ),
+                    logic=pysmt.logics.QF_NIRA
+                    ),
 
             Example(hr="((r ^ 2.0) = 0.0)",
                     expr=Equals(Pow(r, Real(2)), Real(0)),
diff --git a/pysmt/test/test_back.py b/pysmt/test/test_back.py
index bceb45b..7a0ad63 100644
--- a/pysmt/test/test_back.py
+++ b/pysmt/test/test_back.py
@@ -55,10 +55,10 @@ class TestBasic(TestCase):
         res = msat.converter.back(term)
         self.assertFalse(f == res)
 
-    def do_back(self, solver_name, z3_string_buffer=False):
+    def do_back(self, solver_name, via_smtlib=False):
         for formula, _, _, logic in get_example_formulae():
             if logic.quantifier_free:
-                if logic.theory.custom_type and z3_string_buffer:
+                if logic.theory.custom_type and via_smtlib:
                     # Printing of declare-sort from Z3 is not conformant
                     # with the SMT-LIB. We might consider extending our
                     # parser.
@@ -67,7 +67,7 @@ class TestBasic(TestCase):
                     s = Solver(name=solver_name, logic=logic)
                     term = s.converter.convert(formula)
                     if solver_name == "z3":
-                        if z3_string_buffer:
+                        if via_smtlib:
                             res = s.converter.back_via_smtlib(term)
                         else:
                             res = s.converter.back(term)
@@ -84,8 +84,8 @@ class TestBasic(TestCase):
 
     @skipIfSolverNotAvailable("z3")
     def test_z3_back_formulae(self):
-        self.do_back("z3", z3_string_buffer=False)
-        self.do_back("z3", z3_string_buffer=True)
+        self.do_back("z3", via_smtlib=True)
+        self.do_back("z3", via_smtlib=False)
 
 
 if __name__ == '__main__':
diff --git a/pysmt/type_checker.py b/pysmt/type_checker.py
index b700fcf..7ce05aa 100644
--- a/pysmt/type_checker.py
+++ b/pysmt/type_checker.py
@@ -33,6 +33,8 @@ class SimpleTypeChecker(walkers.DagWalker):
 
     def __init__(self, env=None):
         walkers.DagWalker.__init__(self, env=env)
+        # Return None if the type cannot be computed rather than
+        # raising an exception.
         self.be_nice = False
 
     def _get_key(self, formula, **kwargs):
@@ -42,7 +44,7 @@ class SimpleTypeChecker(walkers.DagWalker):
         """ Returns the pysmt.types type of the formula """
         res = self.walk(formula)
         if not self.be_nice and res is None:
-            raise PysmtTypeError("The formula '%s' is not well-formed" \
+            raise PysmtTypeError("The formula '%s' is not well-formed"
                                  % str(formula))
         return res
 
@@ -114,7 +116,7 @@ class SimpleTypeChecker(walkers.DagWalker):
 
     def walk_bv_comp(self, formula, args, **kwargs):
         # We check that all children are BV and the same size
-        a,b = args
+        a, b = args
         if a != b or (not a.is_bv_type()):
             return None
         return BVType(1)
@@ -187,7 +189,7 @@ class SimpleTypeChecker(walkers.DagWalker):
         if args[0].is_bool_type():
             raise PysmtTypeError("The formula '%s' is not well-formed."
                                  "Equality operator is not supported for Boolean"
-                                 " terms. Use Iff instead." \
+                                 " terms. Use Iff instead."
                                  % str(formula))
         elif args[0].is_bv_type():
             return self.walk_bv_to_bool(formula, args)
@@ -324,10 +326,7 @@ class SimpleTypeChecker(walkers.DagWalker):
     def walk_pow(self, formula, args, **kwargs):
         if args[0] != args[1]:
             return None
-        # Exponent must be positive for INT
-        if args[0].is_int_type() and formula.arg(1).constant_value() < 0 :
-            return None
-        return args[0]
+        return REAL
 
 # EOC SimpleTypeChecker
 

D gnu/packages/patches/python-pysmt-fix-smtlib-serialization-test.patch => gnu/packages/patches/python-pysmt-fix-smtlib-serialization-test.patch +0 -86
@@ 1,86 0,0 @@
Backport of an upstream patch fixing a test suite failure.

Taken from: https://github.com/pysmt/pysmt/commit/a246669a487aff69f5da34570ef867841d18508a

diff --git a/pysmt/test/smtlib/test_parser_examples.py b/pysmt/test/smtlib/test_parser_examples.py
index cca4194..c0852be 100644
--- a/pysmt/test/smtlib/test_parser_examples.py
+++ b/pysmt/test/smtlib/test_parser_examples.py
@@ -29,6 +29,7 @@ from pysmt.shortcuts import Iff
 from pysmt.shortcuts import read_smtlib, write_smtlib, get_env
 from pysmt.exceptions import PysmtSyntaxError
 
+
 class TestSMTParseExamples(TestCase):
 
     def test_parse_examples(self):
@@ -41,7 +42,6 @@ class TestSMTParseExamples(TestCase):
             buf = StringIO()
             script_out = smtlibscript_from_formula(f_out)
             script_out.serialize(outstream=buf)
-            #print(buf)
 
             buf.seek(0)
             parser = SmtLibParser()
@@ -49,7 +49,6 @@ class TestSMTParseExamples(TestCase):
             f_in = script_in.get_last_formula()
             self.assertEqual(f_in.simplify(), f_out.simplify())
 
-
     @skipIfNoSolverForLogic(logics.QF_BV)
     def test_parse_examples_bv(self):
         """For BV we represent a superset of the operators defined in SMT-LIB.
@@ -108,7 +107,18 @@ class TestSMTParseExamples(TestCase):
             self.assertValid(Iff(f_in, f_out), f_in.serialize())
 
     def test_dumped_logic(self):
-        # Dumped logic matches the logic in the example
+        # Dumped logic matches the logic in the example.
+        #
+        # There are a few cases where we use a logic
+        # that does not exist in SMT-LIB, and the SMT-LIB
+        # serialization logic will find a logic that
+        # is more expressive. We need to adjust the test
+        # for those cases (see rewrite dict below).
+        rewrite = {
+            logics.QF_BOOL: logics.QF_UF,
+            logics.BOOL: logics.LRA,
+            logics.QF_NIRA: logics.AUFNIRA,
+        }
         fs = get_example_formulae()
 
         for (f_out, _, _, logic) in fs:
@@ -121,14 +131,9 @@ class TestSMTParseExamples(TestCase):
             for cmd in script_in:
                 if cmd.name == "set-logic":
                     logic_in = cmd.args[0]
-                    if logic == logics.QF_BOOL:
-                        self.assertEqual(logic_in, logics.QF_UF)
-                    elif logic == logics.BOOL:
-                        self.assertEqual(logic_in, logics.LRA)
-                    else:
-                        self.assertEqual(logic_in, logic, script_in)
+                    self.assertEqual(logic_in, rewrite.get(logic, logic))
                     break
-            else: # Loops exited normally
+            else:  # Loops exited normally
                 print("-"*40)
                 print(script_in)
 
@@ -136,7 +141,7 @@ class TestSMTParseExamples(TestCase):
         fs = get_example_formulae()
 
         fdi, tmp_fname = mkstemp()
-        os.close(fdi) # Close initial file descriptor
+        os.close(fdi)  # Close initial file descriptor
         for (f_out, _, _, _) in fs:
             write_smtlib(f_out, tmp_fname)
             # with open(tmp_fname) as fin:
@@ -197,7 +202,6 @@ class TestSMTParseExamples(TestCase):
         f_in = script.get_last_formula()
         self.assertSat(f_in)
 
-
     def test_int_promotion_define_fun(self):
         script = """
         (define-fun x () Int 8)

M gnu/packages/python-xyz.scm => gnu/packages/python-xyz.scm +3 -4
@@ 161,6 161,7 @@
;;; Copyright © 2024 Markku Korkeala <markku.korkeala@iki.fi>
;;; Copyright © 2025 Jordan Moore <lockbox@struct.foo>
;;; Copyright © 2025 Dariqq <dariqq@posteo.net>
;;; Copyright © 2025 Nguyễn Gia Phong <mcsinyx@disroot.org>
;;;
;;; This file is part of GNU Guix.
;;;


@@ 36101,19 36102,17 @@ SMT solvers and is built on top of the Z3 solver.")
(define-public python-pysmt
  (package
    (name "python-pysmt")
    (version "0.9.5")
    (version "0.9.6")
    (source
     (origin
       ;; Fetching from Git as pypi release doesn't include all test files.
       (method git-fetch)
       (patches (search-patches "python-pysmt-fix-pow-return-type.patch"
                 "python-pysmt-fix-smtlib-serialization-test.patch"))
       (uri (git-reference
             (url "https://github.com/pysmt/pysmt")
             (commit (string-append "v" version))))
       (file-name (git-file-name name version))
       (sha256
        (base32 "0hrxv23y5ip4ijfx5pvbwc2fq4zg9jz42wc9zqgqm0g0mjc9ckvh"))))
        (base32 "0jiw8pa6hfh9ajr953q187qgpdnk3bvaa3wmrxs8ilw5jc41sq8y"))))
    (build-system pyproject-build-system)
    (arguments
     `(#:phases (modify-phases %standard-phases