3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-04-23 00:55:31 +00:00

Extending public API with internal objects

Signed-off-by: Leonardo de Moura <leonardo@microsoft.com>
This commit is contained in:
Leonardo de Moura 2012-10-18 04:47:46 -07:00
parent 9cb29777e2
commit 2a4e6d03f3
21 changed files with 1621 additions and 1042 deletions

View file

@ -904,6 +904,15 @@ def init(PATH):
_lib.Z3_statistics_to_string.argtypes = [ContextObj]
_lib.Z3_get_context_assignment.restype = Ast
_lib.Z3_get_context_assignment.argtypes = [ContextObj]
_lib.Z3_mk_polynomial_manager.restype = PolynomialManagerObj
_lib.Z3_mk_polynomial_manager.argtypes = [ContextObj]
_lib.Z3_del_polynomial_manager.argtypes = [ContextObj, PolynomialManagerObj]
_lib.Z3_mk_zero_polynomial.restype = PolynomialObj
_lib.Z3_mk_zero_polynomial.argtypes = [ContextObj, PolynomialManagerObj]
_lib.Z3_polynomial_inc_ref.argtypes = [ContextObj, PolynomialManagerObj, PolynomialObj]
_lib.Z3_polynomial_dec_ref.argtypes = [ContextObj, PolynomialManagerObj, PolynomialObj]
_lib.Z3_polynomial_to_string.restype = ctypes.c_char_p
_lib.Z3_polynomial_to_string.argtypes = [ContextObj, PolynomialManagerObj, PolynomialObj]
def Z3_mk_config():
r = lib().Z3_mk_config()
@ -4142,3 +4151,42 @@ def Z3_get_context_assignment(a0):
raise Z3Exception(lib().Z3_get_error_msg_ex(a0, err))
return r
def Z3_mk_polynomial_manager(a0):
r = lib().Z3_mk_polynomial_manager(a0)
err = lib().Z3_get_error_code(a0)
if err != Z3_OK:
raise Z3Exception(lib().Z3_get_error_msg_ex(a0, err))
return r
def Z3_del_polynomial_manager(a0, a1):
lib().Z3_del_polynomial_manager(a0, a1)
err = lib().Z3_get_error_code(a0)
if err != Z3_OK:
raise Z3Exception(lib().Z3_get_error_msg_ex(a0, err))
def Z3_mk_zero_polynomial(a0, a1):
r = lib().Z3_mk_zero_polynomial(a0, a1)
err = lib().Z3_get_error_code(a0)
if err != Z3_OK:
raise Z3Exception(lib().Z3_get_error_msg_ex(a0, err))
return r
def Z3_polynomial_inc_ref(a0, a1, a2):
lib().Z3_polynomial_inc_ref(a0, a1, a2)
err = lib().Z3_get_error_code(a0)
if err != Z3_OK:
raise Z3Exception(lib().Z3_get_error_msg_ex(a0, err))
def Z3_polynomial_dec_ref(a0, a1, a2):
lib().Z3_polynomial_dec_ref(a0, a1, a2)
err = lib().Z3_get_error_code(a0)
if err != Z3_OK:
raise Z3Exception(lib().Z3_get_error_msg_ex(a0, err))
def Z3_polynomial_to_string(a0, a1, a2):
r = lib().Z3_polynomial_to_string(a0, a1, a2)
err = lib().Z3_get_error_code(a0)
if err != Z3_OK:
raise Z3Exception(lib().Z3_get_error_msg_ex(a0, err))
return r

67
python/z3poly.py Normal file
View file

@ -0,0 +1,67 @@
############################################
# Copyright (c) 2012 Microsoft Corporation
#
# Z3 Polynomial interface
#
# Author: Leonardo de Moura (leonardo)
############################################
from z3 import *
class PolynomialManager:
"""Polynomial Manager.
"""
def __init__(self, ctx=None):
self.ctx = z3._get_ctx(ctx)
self.manager = Z3_mk_polynomial_manager(self.ctx_ref())
def __del__(self):
Z3_del_polynomial_manager(self.ctx_ref(), self.manager)
def ctx_ref(self):
return self.ctx.ref()
def m(self):
return self.manager
_main_pmanager = None
def main_pmanager():
"""Return a reference to the global Polynomial manager.
"""
global _main_pmanager
if _main_pmanager == None:
_main_pmanager = PolynomialManager()
return _main_pmanager
def _get_pmanager(ctx):
if ctx == None:
return main_pmanager()
else:
return ctx
class Polynomial:
"""Multivariate polynomials.
"""
def __init__(self, poly=None, m=None):
self.pmanager = _get_pmanager(m)
if poly == None:
self.poly = Z3_mk_zero_polynomial(self.ctx_ref(), self.m())
else:
self.poly = poly
Z3_polynomial_inc_ref(self.ctx_ref(), self.m(), self.poly)
def __del__(self):
Z3_polynomial_dec_ref(self.ctx_ref(), self.m(), self.poly)
def m(self):
return self.pmanager.m()
def ctx_ref(self):
return self.pmanager.ctx_ref()
def __repr__(self):
return Z3_polynomial_to_string(self.ctx_ref(), self.m(), self.poly)
# test
p = Polynomial()
print p

View file

@ -105,3 +105,15 @@ class FuncInterpObj(ctypes.c_void_p):
class FuncEntryObj(ctypes.c_void_p):
def __init__(self, e): self._as_parameter_ = e
def from_param(obj): return obj
class PolynomialManagerObj(ctypes.c_void_p):
def __init__(self, e): self._as_parameter_ = e
def from_param(obj): return obj
class PolynomialObj(ctypes.c_void_p):
def __init__(self, e): self._as_parameter_ = e
def from_param(obj): return obj
class MonomialObj(ctypes.c_void_p):
def __init__(self, e): self._as_parameter_ = e
def from_param(obj): return obj