diff --git a/utils/README.md b/utils/README.md new file mode 100644 index 0000000..6c0f260 --- /dev/null +++ b/utils/README.md @@ -0,0 +1 @@ +This folder contains scripts that may be used during experimentation. These are intended to be used ad-hoc and we do not guarentee the maitainance of these scripts. \ No newline at end of file diff --git a/utils/compare_vsp_results.py b/utils/compare_vsp_results.py new file mode 100644 index 0000000..daee3c5 --- /dev/null +++ b/utils/compare_vsp_results.py @@ -0,0 +1,102 @@ +""" +Given two MaGIC ugly data files that correspond to +the same logic. Report any differences in the models +that exhibit VSP. + +Overall process: +- Determine which models in file 1 have VSP +- Print if model does not exist in file 2 +- For models in file 2 that were not already encountered for, + check if they have VSP. +- Print models that do +""" +import argparse +import os +import sys +sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + +import argparse + +from model import model_equivalence +from parse_magic import SourceFile, parse_matrices +from vsp import has_vsp +from vspursuer import restructure_solutions + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description="Compare models that have VSP in two ugly files") + parser.add_argument("ugly1", type=str, help="First ugly data file") + parser.add_argument("ugly2", type=str, help="Second ugly data file") + args = vars(parser.parse_args()) + + data_file1 = open(args['ugly1'], "r") + solutions1 = parse_matrices(SourceFile(data_file1)) + solutions1 = restructure_solutions(solutions1, None) + + data_file2 = open(args['ugly2'], "r") + solutions2 = parse_matrices(SourceFile(data_file2)) + solutions2 = list(restructure_solutions(solutions2, None)) + + # Total count of models + total_models1 = 0 + total_models2 = 0 + + # Models that exhibit VSP + good_models1 = 0 + good_models2 = 0 + + # Models that don't exhibit VSP + bad_models1 = 0 + bad_models2 = 0 + + # Models that exhibit VSP but does + # not exist in the other file. + extra_models1 = 0 + extra_models2 = 0 + + for model, impfunction, negation_defined in solutions1: + total_models1 += 1 + vsp_result = has_vsp(model, impfunction, negation_defined) + + if vsp_result.has_vsp: + good_models1 += 1 + # Check to see if model exists in file 2 + match_found_index = (False, -1) + for i in range(len(solutions2) - 1, -1, -1): + if model_equivalence(model, solutions2[i][0]): + match_found_index = (True, i) + break + + if match_found_index[0]: + # If so, remove the model from the second set + total_models2 += 1 + good_models2 += 1 + del solutions2[match_found_index[1]] + else: + extra_models1 += 1 + print(f"VSP Model {model.name} not found in file 2.") + print(model) + else: + bad_models1 += 1 + + + # Check through the remaining models in the second set + for model, impfunction, negation_defined in solutions2: + total_models2 += 1 + vsp_result = has_vsp(model, impfunction, negation_defined) + + if not vsp_result.has_vsp: + bad_models2 += 1 + else: + print("VSP model", model.name, "does not appear in file 1") + good_models2 += 1 + extra_models2 += 1 + + + print("File 1 has a total of", total_models1, "models.") + print("Out of which,", good_models1, "exhibit VSP while", bad_models1, "do not.") + print("File 1 has a total of", extra_models1, "which exhibit VSP but do not appear in file 2.") + + print("") + print("File 2 has a total of", total_models2, "models") + print("Out of which,", good_models2, "exhibit VSP while", bad_models2, "do not.") + print("File 2 has a total of", extra_models2, "which exhibit VSP but do not appear in file 1.") diff --git a/utils/hasse.py b/utils/hasse.py new file mode 100644 index 0000000..97074bc --- /dev/null +++ b/utils/hasse.py @@ -0,0 +1,54 @@ +""" +Given a model, create a Hasse diagram. + +Note: This has a dependency on the hasse-diagram library +https://pypi.org/project/hasse-diagram/ +""" +import argparse +import os +import sys +sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + +from model import Model +from parse_magic import SourceFile, parse_matrices + +import numpy as np +import hassediagram + +__all__ = ['plot_model_hassee'] + +def plot_model_hassee(model: Model): + assert model.ordering is not None + carrier_list = list(model.carrier_set) + hasse_ordering = [] + for elem1 in carrier_list: + elem_ordering = [] + for elem2 in carrier_list: + elem_ordering.append( + 1 if model.ordering.is_lt(elem1, elem2) else 0 + ) + hasse_ordering.append(elem_ordering) + hassediagram.plot_hasse(np.array(hasse_ordering), carrier_list) + + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description="Show hassee diagram for model") + parser.add_argument("uglyfile", type=str, help="Path to ugly data file") + parser.add_argument("modelname", type=str, help="Name of model within file") + args = vars(parser.parse_args()) + + data_file = open(args['uglyfile'], "r") + solutions = parse_matrices(SourceFile(data_file)) + + requested_model = None + + for model, _ in solutions: + if model.name == args['modelname']: + requested_model = model + break + + if requested_model is None: + print("Model name", args['modelname'], "not found.") + sys.exit(0) + + plot_model_hassee(requested_model) diff --git a/utils/print_model.py b/utils/print_model.py new file mode 100644 index 0000000..027c0e3 --- /dev/null +++ b/utils/print_model.py @@ -0,0 +1,30 @@ +""" +Print a model given it's name +and ugly data file +""" +import argparse +import os +import sys +sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + +from parse_magic import SourceFile, parse_matrices + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description="Show hassee diagram for model") + parser.add_argument("uglyfile", type=str, help="Path to ugly data file") + parser.add_argument("modelname", type=str, help="Name of model within file") + args = vars(parser.parse_args()) + + data_file = open(args['uglyfile'], "r") + solutions = parse_matrices(SourceFile(data_file)) + + model_found = False + + for model, _ in solutions: + if model.name == args['modelname']: + model_found = True + print(model) + break + + if not model_found: + print("Model", args['modelname'], "not found.")