def test_flat(): NNF = circuit_io.parse_NNF_DIMACS("../nnf_examples/test_CNF.nnf") assert circuits.LanguageProperties.flat in NNF.language_properties CNF = circuit_io.parse_CNF_DIMACS("../nnf_examples/test_CNF.cnf") assert circuits.LanguageProperties.flat in CNF.language_properties DNF = circuit_io.parse_NNF_DIMACS("../nnf_examples/test_DNF.nnf") assert circuits.LanguageProperties.flat in DNF.language_properties
def convert_nnf_to_sdDNNF(circuit): # if the circuit is eps-inverted, convert to nnf circuit = convert_to_nnf(circuit) # convert nnf to cnf circuit = convert_to_cnf(circuit) circuit = simplify_cnf(circuit) # record the file circuit_io.write_CNF_DIMACS(circuit, "../nnf_examples/tmp_nnf_2.cnf") subprocess.call( '../code/compiled_binaries/dsharp -disableAllLits -smoothNNF -Fnnf ../nnf_examples/nnf_conv_sddnnf.nnf ../nnf_examples/tmp_nnf_2.cnf', shell=True) return circuit_io.parse_NNF_DIMACS("../nnf_examples/nnf_conv_sddnnf.nnf")
def test_one_leaf(): NNF = circuit_io.parse_NNF_DIMACS("../nnf_examples/test_NNF_one_leaf.nnf") assert circuits.Languages.NNF in NNF.languages assert circuits.Languages.DNNF in NNF.languages assert circuits.Languages.dNNF in NNF.languages assert circuits.Languages.sNNF in NNF.languages assert circuits.Languages.fNNF in NNF.languages assert circuits.Languages.dDNNF in NNF.languages assert circuits.Languages.sdDNNF in NNF.languages assert circuits.Languages.BDD in NNF.languages assert circuits.Languages.FBDD in NNF.languages assert circuits.Languages.OBDD in NNF.languages assert circuits.Languages.OBDD_LT in NNF.languages assert circuits.Languages.DNF in NNF.languages assert circuits.Languages.CNF in NNF.languages assert circuits.Languages.MODS in NNF.languages assert circuits.Languages.ODNF in NNF.languages
def convert_nnf_to_dDNNF(circuit): # if the circuit is eps-inverted, convert to nnf circuit = convert_to_nnf(circuit) # convert nnf to cnf circuit = convert_to_cnf(circuit) circuit = simplify_cnf(circuit) # record the file circuit_io.write_CNF_DIMACS(circuit, "../nnf_examples/tmp_nnf_2.cnf") # convert to dDNNF subprocess.call( '../code/compiled_binaries/dsharp -disableAllLits -Fnnf ../nnf_examples/nnf_conv_ddnnf.nnf ../nnf_examples/tmp_nnf_2.cnf', shell=True) tmp_circuit = circuit_io.parse_NNF_DIMACS( "../nnf_examples/nnf_conv_ddnnf.nnf") # if tmp_circuit == None: # if DEBUG: # print ("dsharp resulted in an empty or non DAG representation") # subprocess.call('../code/compiled_binaries/d4 ../nnf_examples/tmp_nnf_2.cnf -out="../nnf_examples/nnf_conv_ddnnf.nnf"', shell=True) # tmp_circuit = circuit_io.parse_NNF_DIMACS("../nnf_examples/nnf_conv_ddnnf.nnf") # assert tmp_circuit != None, "Yikes... Neither dsharp nor d4 working" return tmp_circuit
def main(): parser = argparse.ArgumentParser(description='Which domain.') parser.add_argument("-d", "--domain", default="chopsticks", required=False, help="Which domain?") args = vars(parser.parse_args()) languages_to_convert_to = [(circuits.Languages.CNF, True), (circuits.Languages.dDNNF, True), (circuits.Languages.DNF, True), circuits.Languages.dDNNF, #circuits.Languages.sdDNNF, circuits.Languages.CNF, circuits.Languages.DNF, circuits.Languages.OBDD, # circuits.Languages.MODS, circuits.Languages.ODNF] languages_to_convert_to_subset = [(circuits.Languages.CNF, True), circuits.Languages.dDNNF, circuits.Languages.DNF, circuits.Languages.ODNF] if args['domain'] == "chopsticks": directory = "../domains/chopsticks_examples/" # generate_study(directory, "good_agent", languages_to_convert_to, "1", args["domain"], True) generate_study(directory, "good_agent", languages_to_convert_to, "1", args["domain"], False) # generate_study(directory, "bad_agent", languages_to_convert_to_subset, "1", "chopsticks", False) elif args['domain'] == "highway": directory = "../domains/highway_examples/" generate_study(directory, "good_agent", languages_to_convert_to, "1", args["domain"], True) generate_study(directory, "good_agent", languages_to_convert_to, "1", args["domain"], False) elif args['domain'] == 'emergency': directory = "../domains/emergency_triage_examples/" generate_study(directory, "good_agent", languages_to_convert_to, "1", args["domain"], True) generate_study(directory, "good_agent", languages_to_convert_to, "1", args["domain"], False) generate_study(directory, "bad_agent", languages_to_convert_to_subset, "1", "emergency", True) elif args['domain'] == "all": directory = "../domains/chopsticks_examples/" study_id = random.getrandbits(32) generate_study(directory, "good_agent", languages_to_convert_to, str(study_id), "chopsticks", True) generate_study(directory, "good_agent", languages_to_convert_to, str(study_id), "chopsticks", False) generate_study(directory, "bad_agent", languages_to_convert_to_subset, str(study_id), "chopsticks", True) directory = "../domains/highway_examples/" generate_study(directory, "good_agent", languages_to_convert_to, str(study_id), "highway", True) generate_study(directory, "good_agent", languages_to_convert_to, str(study_id), "highway", False) generate_study(directory, "bad_agent", languages_to_convert_to_subset, str(study_id), "highway", True) directory = "../domains/emergency_triage_examples/" generate_study(directory, "good_agent", languages_to_convert_to, str(study_id), "emergency", True) generate_study(directory, "good_agent", languages_to_convert_to, str(study_id), "emergency", False) generate_study(directory, "bad_agent", languages_to_convert_to_subset, str(study_id), "emergency", True) elif args['domain'] == "test": state = [0, 1, 1, 14, 1.7, 39] predicate_values = evaluate_predicates(state, "../domains/emergency_triage_examples/good_agent/", "emergency") print (predicate_values) actions = possible_actions(predicate_values, "../domains/emergency_triage_examples/good_agent/questions-formatted.txt") print (actions) action = random_action(actions, False) print(action) circuit = circuit_io.parse_NNF_DIMACS("../domains/emergency_triage_examples/good_agent/immediate.nnf") circuit.graph.graph_logic_formula() circuit_a = formula_conversions.convert_to_given_language(circuit, circuits.Languages.CNF, False) circuit_a.graph.graph_logic_formula() circuit = formula_conversions.convert_to_given_language(circuit, circuits.Languages.CNF, True) circuit.graph.graph_logic_formula() print (circuit.graph.collapse_graph_to_formula(circuit.graph.find_dag_root())) print (circuit.graph.collapse_graph_to_formula(circuit.graph.find_dag_root(), True)) elif args['domain'] == "test2": state = [0,1,1,17,2.1,68] generate_image_emergency(state)
def generate_study(directory, agent, languages, study_id, domain, truth_assignment): """ Create a user study. Write a CSV file. For each language in each domain, generate a random state and select an action with the desired truth assignment. Parameters: ----------- directory : string Where to save the study agent : string Should the agent be good or bad? languages : list A list of all languages to convert to study_id : string An identifier for this study domain : string "all", "emergency", "chopsticks", or "highway" truth_assignment : bool Whether the agent should take the action or not Returns ------- None Writes to .csv file """ directory = directory + agent + "/" file_exists = os.path.isfile('../' + study_id + '_evaluate_logic_interpretability.csv') with open('../' + study_id + '_evaluate_logic_interpretability.csv', mode='a') as csv_file: fieldnames = ['qid', 'domain', 'agent', 'state', 'image_loc', 'target_language', 'eps-inv', 'action', 'action_truth_value', 'explanation', 'explanation_html', 'languages_satisfied', 'epsilon_flips', 'num_predicates', 'circuit_size',] writer = csv.DictWriter(csv_file, fieldnames=fieldnames) if not file_exists: writer.writeheader() for language in languages: invert = False if isinstance(language, tuple): invert = language[1] language = language[0] action = None while (action == None): state = random_state_generator(domain) predicate_values = evaluate_predicates(state, directory, domain) actions = possible_actions(predicate_values, directory + "questions-formatted.txt") action = random_action(actions, truth_assignment) languages_satisfied = [] epsilon_flips = 0 statement_size = 0 # generate explanation(s) for true action circuit = circuit_io.parse_NNF_DIMACS(directory + str(action) + ".nnf") circuit = formula_conversions.convert_to_given_language(circuit, language, invert) num_predicates = circuit.graph.get_variables(circuit.graph.find_dag_root()) logic_formulas = action_natural_language_map[str(action)] + " when " + circuit.graph.collapse_graph_to_formula(circuit.graph.find_dag_root(), True).replace(" ", " ").replace(" ", " ").replace("( ", "(").replace(" )", ")") logic_formulas_html = action_natural_language_map[str(action)] + " when " + circuit.graph.collapse_graph_to_bullet_list().replace(" ", " ").replace(" ", " ").replace("( ", "(").replace(" )", ")") languages_satisfied.append( (action, circuit.languages) ) epsilon_flips = len( [node for node in circuit.graph.nodes() if circuit.graph.nodes[node]['value'] in ['nand','nor'] ] ) statement_size = circuit.num_nodes # true_circuit.graph.graph_logic_formula() # false_circuit.graph.graph_logic_formula() if domain == "chopsticks": image_location = generate_image_chopsticks(state) elif domain == "highway": image_location = generate_image_highway(state) elif domain == "emergency": image_location = generate_image_emergency(state) natural_flatsentence = return_to_natural_language(logic_formulas, directory + "predicates.txt") natural_htmlsentence = return_to_natural_language(logic_formulas_html, directory + "predicates.txt") writer.writerow({'qid': str(domain) + "_" + str(agent) + "_" + str(language) + "_" + str(invert) + "_truth" + str(truth_assignment), 'domain': str(domain), 'agent': str(agent), 'state': str(state), 'image_loc': str(image_location), 'target_language': str(language), 'eps-inv' : str(invert), 'action': str(action), 'action_truth_value': str(truth_assignment), 'explanation': str(natural_flatsentence), 'explanation_html': str(natural_htmlsentence), 'languages_satisfied': str(languages_satisfied), 'epsilon_flips': str(epsilon_flips), 'num_predicates': str(len(num_predicates)), 'circuit_size': str(statement_size) })
def test_tseitin(): NNF = circuit_io.parse_NNF_DIMACS("../nnf_examples/test_CNF.nnf") cnf = formula_conversions.tseitin(NNF) assert circuits.Languages.CNF in cnf.languages NNF = circuit_io.parse_NNF_DIMACS("../nnf_examples/test_dDNNF.nnf") cnf = formula_conversions.tseitin(NNF) assert circuits.Languages.CNF in cnf.languages NNF = circuit_io.parse_NNF_DIMACS("../nnf_examples/test_DNF.nnf") cnf = formula_conversions.tseitin(NNF) assert circuits.Languages.CNF in cnf.languages NNF = circuit_io.parse_NNF_DIMACS("../nnf_examples/test_dNNF.nnf") cnf = formula_conversions.tseitin(NNF) assert circuits.Languages.CNF in cnf.languages NNF = circuit_io.parse_NNF_DIMACS("../nnf_examples/test_FBDD.nnf") cnf = formula_conversions.tseitin(NNF) assert circuits.Languages.CNF in cnf.languages NNF = circuit_io.parse_NNF_DIMACS("../nnf_examples/test_MODS.nnf") cnf = formula_conversions.tseitin(NNF) assert circuits.Languages.CNF in cnf.languages NNF = circuit_io.parse_NNF_DIMACS("../nnf_examples/test_NNF_one_leaf.nnf") cnf = formula_conversions.tseitin(NNF) assert circuits.Languages.CNF in cnf.languages NNF = circuit_io.parse_NNF_DIMACS("../nnf_examples/test_OBDD.nnf") cnf = formula_conversions.tseitin(NNF) assert circuits.Languages.CNF in cnf.languages NNF = circuit_io.parse_NNF_DIMACS("../nnf_examples/test_OBDD_LT.nnf") cnf = formula_conversions.tseitin(NNF) assert circuits.Languages.CNF in cnf.languages NNF = circuit_io.parse_NNF_DIMACS("../nnf_examples/test_sdDNNF.nnf") cnf = formula_conversions.tseitin(NNF) assert circuits.Languages.CNF in cnf.languages NNF = circuit_io.parse_NNF_DIMACS("../nnf_examples/test_sNNF.nnf") cnf = formula_conversions.tseitin(NNF) assert circuits.Languages.CNF in cnf.languages
def test_ordered_less_than(): BDD = circuit_io.parse_NNF_DIMACS("../nnf_examples/test_OBDD_LT.nnf") assert circuits.LanguageProperties.ordered_lt in BDD.language_properties
def test_decisive(): BDD = circuit_io.parse_NNF_DIMACS("../nnf_examples/test_FBDD.nnf") assert circuits.LanguageProperties.decisive in BDD.language_properties
def test_smooth(): sNNF = circuit_io.parse_NNF_DIMACS("../nnf_examples/test_sNNF.nnf") assert circuits.LanguageProperties.smooth in sNNF.language_properties
def test_deterministic(): dNNF = circuit_io.parse_NNF_DIMACS("../nnf_examples/test_dNNF.nnf") assert circuits.LanguageProperties.deterministic in dNNF.language_properties
def test_decomposable(): dDNNF = circuit_io.parse_NNF_DIMACS("../nnf_examples/test_dDNNF.nnf") assert circuits.LanguageProperties.decomposable in dDNNF.language_properties
def test_simple_conjunction(): DNF = circuit_io.parse_NNF_DIMACS("../nnf_examples/test_DNF.nnf") assert circuits.LanguageProperties.simple_conjunction in DNF.language_properties
def test_simple_disjunction(): NNF = circuit_io.parse_NNF_DIMACS("../nnf_examples/test_CNF.nnf") assert circuits.LanguageProperties.simple_disjunction in NNF.language_properties CNF = circuit_io.parse_CNF_DIMACS("../nnf_examples/test_CNF.cnf") assert circuits.LanguageProperties.simple_disjunction in CNF.language_properties
def test_ODNF(): NNF = circuit_io.parse_NNF_DIMACS("../nnf_examples/test_ODNF.nnf") assert circuits.Languages.ODNF in NNF.languages
def test_non_tseitin_cnf(): NNF = circuit_io.parse_NNF_DIMACS("../nnf_examples/test_CNF.nnf") cnf = formula_conversions.convert_to_cnf(NNF) assert circuits.Languages.CNF in cnf.languages assert NNF.graph.collapse_to_truth_table( ) == cnf.graph.collapse_to_truth_table() NNF = circuit_io.parse_NNF_DIMACS("../nnf_examples/test_dDNNF.nnf") cnf = formula_conversions.convert_to_cnf(NNF) assert circuits.Languages.CNF in cnf.languages assert NNF.graph.collapse_to_truth_table( ) == cnf.graph.collapse_to_truth_table() NNF = circuit_io.parse_NNF_DIMACS("../nnf_examples/test_DNF.nnf") cnf = formula_conversions.convert_to_cnf(NNF) assert circuits.Languages.CNF in cnf.languages assert NNF.graph.collapse_to_truth_table( ) == cnf.graph.collapse_to_truth_table() NNF = circuit_io.parse_NNF_DIMACS("../nnf_examples/test_dNNF.nnf") cnf = formula_conversions.convert_to_cnf(NNF) assert circuits.Languages.CNF in cnf.languages assert NNF.graph.collapse_to_truth_table( ) == cnf.graph.collapse_to_truth_table() NNF = circuit_io.parse_NNF_DIMACS("../nnf_examples/test_FBDD.nnf") cnf = formula_conversions.convert_to_cnf(NNF) assert circuits.Languages.CNF in cnf.languages assert NNF.graph.collapse_to_truth_table( ) == cnf.graph.collapse_to_truth_table() NNF = circuit_io.parse_NNF_DIMACS("../nnf_examples/test_MODS.nnf") cnf = formula_conversions.convert_to_cnf(NNF) assert circuits.Languages.CNF in cnf.languages assert NNF.graph.collapse_to_truth_table( ) == cnf.graph.collapse_to_truth_table() NNF = circuit_io.parse_NNF_DIMACS("../nnf_examples/test_NNF_one_leaf.nnf") cnf = formula_conversions.convert_to_cnf(NNF) assert circuits.Languages.CNF in cnf.languages assert NNF.graph.collapse_to_truth_table( ) == cnf.graph.collapse_to_truth_table() NNF = circuit_io.parse_NNF_DIMACS("../nnf_examples/test_OBDD.nnf") cnf = formula_conversions.convert_to_cnf(NNF) assert circuits.Languages.CNF in cnf.languages assert NNF.graph.collapse_to_truth_table( ) == cnf.graph.collapse_to_truth_table() NNF = circuit_io.parse_NNF_DIMACS("../nnf_examples/test_OBDD_LT.nnf") cnf = formula_conversions.convert_to_cnf(NNF) assert circuits.Languages.CNF in cnf.languages assert NNF.graph.collapse_to_truth_table( ) == cnf.graph.collapse_to_truth_table() NNF = circuit_io.parse_NNF_DIMACS("../nnf_examples/test_sdDNNF.nnf") cnf = formula_conversions.convert_to_cnf(NNF) assert circuits.Languages.CNF in cnf.languages assert NNF.graph.collapse_to_truth_table( ) == cnf.graph.collapse_to_truth_table() NNF = circuit_io.parse_NNF_DIMACS("../nnf_examples/test_sNNF.nnf") cnf = formula_conversions.convert_to_cnf(NNF) assert circuits.Languages.CNF in cnf.languages assert NNF.graph.collapse_to_truth_table( ) == cnf.graph.collapse_to_truth_table()