def get_model(self): assignment = {} msat_iterator = mathsat.msat_create_model_iterator(self.msat_env) while mathsat.msat_model_iterator_has_next(msat_iterator): term, value = mathsat.msat_model_iterator_next(msat_iterator) pysmt_term = self.converter.back(term) pysmt_value = self.converter.back(value) if self.environment.stc.get_type(pysmt_term).is_real_type() and \ pysmt_value.is_int_constant(): pysmt_value = self.mgr.Real(pysmt_value.constant_value()) assignment[pysmt_term] = pysmt_value mathsat.msat_destroy_model_iterator(msat_iterator) return EagerModel(assignment=assignment, environment=self.environment)
def __iter__(self): """Overloading of iterator from Model. We iterate only on the variables defined in the assignment. """ it = mathsat.msat_model_create_iterator(self.msat_model) if mathsat.MSAT_ERROR_MODEL_ITERATOR(it): raise InternalSolverError("model iteration") while mathsat.msat_model_iterator_has_next(it): t, v = mathsat.msat_model_iterator_next(it) if mathsat.msat_term_is_constant(self.msat_env(), t): pt = self.converter.back(t) pv = self.converter.back(v) if self.environment.stc.get_type(pt).is_real_type() and \ pv.is_int_constant(): pv = self.environment.formula_manager.Real( pv.constant_value()) yield (pt, pv) mathsat.msat_destroy_model_iterator(it)