diff --git a/common.py b/common.py index 14195de..32e8e2d 100644 --- a/common.py +++ b/common.py @@ -1,7 +1,4 @@ from typing import Set -def immutable(_self, _name, _value): - raise Exception("Model values are immutable") - def set_to_str(x: Set) -> str: return "{" + ", ".join((str(xi) for xi in x)) + "}" diff --git a/logic.py b/logic.py index 5b2994c..f81059d 100644 --- a/logic.py +++ b/logic.py @@ -1,4 +1,3 @@ -from common import immutable from typing import Optional, Set, Tuple from functools import lru_cache @@ -7,14 +6,13 @@ class Operation: self.symbol = symbol self.arity = arity self.hashed_value = hash(self.symbol) + self.arity + def immutable(self, name, value): + raise Exception("Operations are immutable") self.__setattr__ = immutable def __hash__(self): return self.hashed_value - def __eq__(self, x): - return self.symbol == x.symbol and self.arity == x.arity - def __call__(self, *args): # Ensure the arity is met assert len(args) == self.arity diff --git a/model.py b/model.py index 2fff5ac..1860c70 100644 --- a/model.py +++ b/model.py @@ -2,7 +2,7 @@ Matrix model semantics and satisfiability of a given logic. """ -from common import set_to_str, immutable +from common import set_to_str from logic import ( get_propostional_variables, Logic, Operation, PropositionalVariable, Term @@ -15,10 +15,13 @@ from typing import Dict, List, Optional, Set, Tuple __all__ = ['ModelValue', 'ModelFunction', 'Model', 'Interpretation'] + class ModelValue: def __init__(self, name): self.name = name self.hashed_value = hash(self.name) + def immutable(self, name, value): + raise Exception("Model values are immutable") self.__setattr__ = immutable def __str__(self): return self.name @@ -252,7 +255,7 @@ def model_closure(initial_set: Set[ModelValue], mfunctions: Set[ModelFunction], new_elements.add(element) # Optimization: Break out of computation - # early when forbidden element is found + # early when top or bottom element is foun if forbidden_element is not None and element == forbidden_element: forbidden_found = True break @@ -284,7 +287,7 @@ def model_closure(initial_set: Set[ModelValue], mfunctions: Set[ModelFunction], new_elements.add(element) # Optimization: Break out of computation - # early when forbidden element is found + # early when top or bottom element is foun if forbidden_element is not None and element == forbidden_element: forbidden_found = True break diff --git a/parse_magic.py b/parse_magic.py index bab221a..ca5d671 100644 --- a/parse_magic.py +++ b/parse_magic.py @@ -410,7 +410,7 @@ def mvalue_from_index(i: int) -> ModelValue: Given an index, return the representation of the model value. """ - return ModelValue(f"{i}") + return ModelValue(f"a{i}") def parse_mvalue(x: str) -> ModelValue: """ diff --git a/vspursuer.py b/vspursuer.py index 5a6ee55..f56e2fe 100755 --- a/vspursuer.py +++ b/vspursuer.py @@ -1,13 +1,10 @@ #!/usr/bin/env python3 -from os import cpu_count import argparse -import multiprocessing - from parse_magic import ( SourceFile, parse_matrices ) -from vsp import has_vsp, VSP_Result +from vsp import has_vsp if __name__ == "__main__": parser = argparse.ArgumentParser(description="VSP Checker") @@ -25,21 +22,14 @@ if __name__ == "__main__": print(f"Parsed {len(solutions)} matrices") num_has_vsp = 0 - with multiprocessing.Pool(processes=max(cpu_count() - 2, 1)) as pool: - results = [ - pool.apply_async(has_vsp, (model, interpretation,)) - for model, interpretation in solutions - ] + for i, (model, interpretation) in enumerate(solutions): + vsp_result = has_vsp(model, interpretation) + print(vsp_result) - for i, result in enumerate(results): - vsp_result: VSP_Result = result.get() - print(vsp_result) + if args['verbose'] or vsp_result.has_vsp: + print(model) - if args['verbose'] or vsp_result.has_vsp: - model = solutions[i][0] - print(model) - - if vsp_result.has_vsp: - num_has_vsp += 1 + if vsp_result.has_vsp: + num_has_vsp += 1 print(f"Tested {len(solutions)} models, {num_has_vsp} of which satisfy VSP")