Added case for when negation is defined

This commit is contained in:
Brandon Rozek 2025-02-09 11:28:09 -05:00
parent 4b907281a5
commit d431030b41
2 changed files with 12 additions and 6 deletions

7
vsp.py
View file

@ -107,7 +107,10 @@ Subalgebra 1: {set_to_str(self.subalgebra1)}
Subalgebra 2: {set_to_str(self.subalgebra2)} Subalgebra 2: {set_to_str(self.subalgebra2)}
""" """
def has_vsp(model: Model, impfunction: ModelFunction, mconjunction: Optional[ModelFunction] = None, mdisjunction: Optional[ModelFunction] = None) -> VSP_Result: def has_vsp(model: Model, impfunction: ModelFunction,
mconjunction: Optional[ModelFunction] = None,
mdisjunction: Optional[ModelFunction] = None,
mnegation: Optional[ModelFunction] = None) -> VSP_Result:
""" """
Checks whether a model has the variable Checks whether a model has the variable
sharing property. sharing property.
@ -173,6 +176,8 @@ def has_vsp(model: Model, impfunction: ModelFunction, mconjunction: Optional[Mod
# If the subalgebras are order-dependent, skip this pair # If the subalgebras are order-dependent, skip this pair
if order_dependent(xs, ys, model.ordering): if order_dependent(xs, ys, model.ordering):
continue continue
if mnegation is not None and order_dependent(ys, xs, model.ordering):
continue
# Compute the closure of all operations # Compute the closure of all operations
# with just the xs # with just the xs

View file

@ -3,7 +3,7 @@ from os import cpu_count
import argparse import argparse
import multiprocessing as mp import multiprocessing as mp
from logic import Conjunction, Disjunction, Implication from logic import Conjunction, Disjunction, Negation, Implication
from parse_magic import SourceFile, parse_matrices from parse_magic import SourceFile, parse_matrices
from vsp import has_vsp, VSP_Result from vsp import has_vsp, VSP_Result
@ -24,19 +24,20 @@ if __name__ == "__main__":
# NOTE: When subprocess gets spawned, the logical operations will # NOTE: When subprocess gets spawned, the logical operations will
# have a different memory address than what's expected in interpretation. # have a different memory address than what's expected in interpretation.
# This will make it so that we can pass the model functions directly instead. # Therefore, we need to pass the model functions directly instead.
solutions_expanded = [] solutions_expanded = []
for model, interpretation in solutions: for model, interpretation in solutions:
impfunction = interpretation[Implication] impfunction = interpretation[Implication]
mconjunction = interpretation.get(Conjunction) mconjunction = interpretation.get(Conjunction)
mdisjunction = interpretation.get(Disjunction) mdisjunction = interpretation.get(Disjunction)
solutions_expanded.append((model, impfunction, mconjunction, mdisjunction)) mnegation = interpretation.get(Negation)
solutions_expanded.append((model, impfunction, mconjunction, mdisjunction, mnegation))
num_has_vsp = 0 num_has_vsp = 0
with mp.Pool(processes=max(cpu_count() - 2, 1)) as pool: with mp.Pool(processes=max(cpu_count() - 2, 1)) as pool:
results = [ results = [
pool.apply_async(has_vsp, (model, impfunction, mconjunction, mdisjunction,)) pool.apply_async(has_vsp, (model, impfunction, mconjunction, mdisjunction, mnegation))
for model, impfunction, mconjunction, mdisjunction in solutions_expanded for model, impfunction, mconjunction, mdisjunction, mnegation in solutions_expanded
] ]
for i, result in enumerate(results): for i, result in enumerate(results):