def test_state_copy(self): system = DialogueSystem(TestDialogueState.domain) system.detach_module(ForwardPlanner) StatePruner.enable_reduction = False system.get_settings().show_gui = False system.start_system() initial_state = copy(system.get_state()) rule_id = "" for id in system.get_state().get_node("u_u2").get_output_node_ids(): if str(system.get_content(id)).find("+=HowAreYou") != -1: rule_id = id TestDialogueState.inference.check_prob( initial_state, rule_id, Effect.parse_effect("a_u2+=HowAreYou"), 0.9) TestDialogueState.inference.check_prob(initial_state, rule_id, Effect.parse_effect("Void"), 0.1) TestDialogueState.inference.check_prob(initial_state, "a_u2", "[HowAreYou]", 0.2) TestDialogueState.inference.check_prob(initial_state, "a_u2", "[Greet, HowAreYou]", 0.7) TestDialogueState.inference.check_prob(initial_state, "a_u2", "[]", 0.1) StatePruner.enable_reduction = True
def test_5(self): domain2 = XMLDomainReader.extract_domain(TestRule2.domain_file3) system2 = DialogueSystem(domain2) system2.detach_module(ForwardPlanner) system2.get_settings().show_gui = False system2.start_system() TestRule2.inference.check_util( system2.get_state(), ["a_ml'", "a_mg'", "a_md'"], Assignment([ Assignment("a_ml'", "SayYes"), Assignment("a_mg'", "Nod"), Assignment("a_md'", "None") ]), 2.4) TestRule2.inference.check_util( system2.get_state(), ["a_ml'", "a_mg'", "a_md'"], Assignment([ Assignment("a_ml'", "SayYes"), Assignment("a_mg'", "Nod"), Assignment("a_md'", "DanceAround") ]), -0.6) TestRule2.inference.check_util( system2.get_state(), ["a_ml'", "a_mg'", "a_md'"], Assignment([ Assignment("a_ml'", "SayYes"), Assignment("a_mg'", "None"), Assignment("a_md'", "None") ]), 1.6)
def test_planning(self): system = DialogueSystem(TestPlanning.domain) system.get_settings().show_gui = False system.start_system() assert len(system.get_state().get_nodes()) == 3 assert len(system.get_state().get_chance_nodes()) == 3 assert len(system.get_state().get_evidence().get_variables()) == 0 TestPlanning.inference.check_prob(system.get_state(), "a_m3", "Do", 1.0) TestPlanning.inference.check_prob(system.get_state(), "obj(a_m3)", "A", 1.0)
def test_6(self): domain2 = XMLDomainReader.extract_domain(TestRule2.domain_file4) system2 = DialogueSystem(domain2) system2.detach_module(ForwardPlanner) system2.get_settings().show_gui = False system2.start_system() TestRule2.inference.check_prob(system2.get_state(), "A", ValueFactory.create("[a1,a2]"), 1.0) TestRule2.inference.check_prob(system2.get_state(), "a_u", "Request(ball)", 0.5)
def test_priority(self): system = DialogueSystem(XMLDomainReader.extract_domain(TestRule3.domain_file)) system.get_settings().show_gui = False system.start_system() assert system.get_content("a_u").get_prob("Opening") == pytest.approx(0.8, abs=0.01) assert system.get_content("a_u").get_prob("Nothing") == pytest.approx(0.1, abs=0.01) assert system.get_content("a_u").get_prob("start") == pytest.approx(0.0, abs=0.01) assert not system.get_content("a_u").to_discrete().has_prob(ValueFactory.create("start"))
def test_5(self): system = DialogueSystem(TestRule1.domain) system.detach_module(ForwardPlanner) StatePruner.enable_reduction = False system.get_settings().show_gui = False system.start_system() TestRule1.inference.check_prob(system.get_state(), "o2", "here is value1", 0.35) TestRule1.inference.check_prob(system.get_state(), "o2", "and value2 is over there", 0.07) TestRule1.inference.check_prob(system.get_state(), "o2", "value3, finally", 0.28) StatePruner.enable_reduction = True
def test_4(self): system = DialogueSystem(TestRule1.domain) system.detach_module(ForwardPlanner) StatePruner.enable_reduction = False system.get_settings().show_gui = False system.start_system() TestRule1.inference.check_prob(system.get_state(), "o", "and we have var1=value2", 0.3) TestRule1.inference.check_prob(system.get_state(), "o", "and we have localvar=value1", 0.2) TestRule1.inference.check_prob(system.get_state(), "o", "and we have localvar=value3", 0.28) StatePruner.enable_reduction = True
def test_1(self): system = DialogueSystem(TestRule1.domain) system.detach_module(ForwardPlanner) StatePruner.enable_reduction = False system.get_settings().show_gui = False system.start_system() TestRule1.inference.check_prob(system.get_state(), "a_u", "Greeting", 0.8) TestRule1.inference.check_prob(system.get_state(), "a_u", "None", 0.2) StatePruner.enable_reduction = True
def test_3(self): InferenceChecks.exact_threshold = 0.06 system = DialogueSystem(TestRule1.domain) system.detach_module(ForwardPlanner) StatePruner.enable_reduction = False system.get_settings().show_gui = False system.start_system() TestRule1.inference.check_prob(system.get_state(), "direction", "straight", 0.79) TestRule1.inference.check_prob(system.get_state(), "direction", "left", 0.20) TestRule1.inference.check_prob(system.get_state(), "direction", "right", 0.01) StatePruner.enable_reduction = True
def test_incondition(self): domain = XMLDomainReader.extract_domain(TestRule3.incondition_file) system = DialogueSystem(domain) system.get_settings().show_gui = False system.start_system() assert system.get_content("out").get_prob("val1 is in [val1, val2]") + system.get_content("out").get_prob("val1 is in [val2, val1]") == pytest.approx(0.56, abs=0.01) assert system.get_content("out2").get_prob("this is a string is matched") == pytest.approx(0.5, abs=0.01)
def test_7(self): system = DialogueSystem(TestRule1.domain) system.detach_module(ForwardPlanner) StatePruner.enable_reduction = False system.get_settings().show_gui = False system.start_system() TestRule1.inference.check_prob(system.get_state(), "a_u2", "[Greet, HowAreYou]", 0.7) TestRule1.inference.check_prob(system.get_state(), "a_u2", "[]", 0.1) TestRule1.inference.check_prob(system.get_state(), "a_u2", "[HowAreYou]", 0.2) StatePruner.enable_reduction = True
def test_planning4(self): system = DialogueSystem(TestPlanning.domain3) system.get_settings().show_gui = False system.get_settings().horizon = 3 system.start_system() t1 = CategoricalTableBuilder("a_u") t1.add_row("Ask(Coffee)", 0.95) t1.add_row("Ask(Tea)", 0.02) system.add_content(t1.build()) TestPlanning.inference.check_prob(system.get_state(), "a_m", "Do(Coffee)", 1.0)
def test_planning2(self): system = DialogueSystem(TestPlanning.domain2) system.get_settings().show_gui = False system.start_system() assert len(system.get_state().get_node_ids()) == 2 assert not system.get_state().has_chance_node("a_m")
def test_1(self): domain = XMLDomainReader.extract_domain(TestRule3.test1_domain_file) inference = InferenceChecks() inference.exact_threshold = 0.06 system = DialogueSystem(domain) system.get_settings().show_gui = False system.detach_module(ForwardPlanner) StatePruner.enable_reduction = False system.start_system() inference.check_prob(system.get_state(), "found", "A", 0.7) inference.check_prob(system.get_state(), "found2", "D", 0.3) inference.check_prob(system.get_state(), "found2", "C", 0.5) StatePruner.enable_reduction = True
def test_planning3(self): system = DialogueSystem(TestPlanning.domain2) system.get_settings().show_gui = False system.get_settings().horizon = 2 system.start_system() TestPlanning.inference.check_prob(system.get_state(), "a_m", "AskRepeat", 1.0)
def test_2(self): inference = InferenceChecks() domain = XMLDomainReader.extract_domain(TestRule3.test2_domain_file) system = DialogueSystem(domain) system.get_settings().show_gui = False system.detach_module(ForwardPlanner) StatePruner.enable_reduction = False system.start_system() inference.check_prob(system.get_state(), "graspable(obj1)", "True", 0.81) inference.check_prob(system.get_state(), "graspable(obj2)", "True", 0.16) inference.check_util(system.get_state(), "a_m'", "grasp(obj1)", 0.592) StatePruner.enable_reduction = True
def test_underspec(self): domain = XMLDomainReader.extract_domain("test/data/underspectest.xml") system = DialogueSystem(domain) system.get_settings().show_gui = False StatePruner.enable_reduction = False system.start_system() assert system.get_content("match").get_prob("obj_1") == pytest.approx(0.66, abs=0.05) assert system.get_content("match").get_prob("obj_3") == pytest.approx(0.307, abs=0.05) assert len(system.get_state().get_chance_node_ids()) == 14 StatePruner.enable_reduction = True
def test_template_quick(self): domain = XMLDomainReader.extract_domain("test/data/quicktest.xml") system = DialogueSystem(domain) system.get_settings().show_gui = False system.start_system() assert system.get_content("caught").get_prob(False) == pytest.approx(1.0, abs=0.01) assert system.get_content("caught2").get_prob(True) == pytest.approx(1.0, abs=0.01)
def test_state_copy2(self): InferenceChecks.exact_threshold = 0.08 system = DialogueSystem(TestDialogueState.domain) system.get_settings().show_gui = False system.detach_module(ForwardPlanner) system.start_system() initial_state = copy(system.get_state()) TestDialogueState.inference.check_prob(initial_state, "a_u2", "[HowAreYou]", 0.2) TestDialogueState.inference.check_prob(initial_state, "a_u2", "[Greet, HowAreYou]", 0.7) TestDialogueState.inference.check_prob(initial_state, "a_u2", "[]", 0.1)
def test_4(self): domain2 = XMLDomainReader.extract_domain(TestRule2.domain_file2) system2 = DialogueSystem(domain2) system2.get_settings().show_gui = False system2.detach_module(ForwardPlanner) system2.start_system() TestRule2.inference.check_util( system2.get_state(), ["a_m3'", "obj(a_m3)'"], Assignment( [Assignment("a_m3'", "Do"), Assignment("obj(a_m3)'", "A")]), 0.3) TestRule2.inference.check_util( system2.get_state(), ["a_m3'", "obj(a_m3)'"], Assignment( [Assignment("a_m3'", "Do"), Assignment("obj(a_m3)'", "B")]), -1.7) TestRule2.inference.check_util( system2.get_state(), ["a_m3'", "obj(a_m3)'"], Assignment([ Assignment("a_m3'", "SayHi"), Assignment("obj(a_m3)'", "None") ]), -0.9)
def test_param_6(self): system = DialogueSystem(XMLDomainReader.extract_domain("test/data/testparams3.xml")) system.get_settings().show_gui = False system.start_system() table = system.get_content("b").to_discrete() assert len(table) == 6 assert table.get_prob("something else") == pytest.approx(0.45, abs=0.05) assert table.get_prob("value: first with type 1") == pytest.approx(0.175, abs=0.05) assert table.get_prob("value: second with type 2") == pytest.approx(0.05, abs=0.05)
def test_domain(self): system = DialogueSystem( XMLDomainReader.extract_domain( "test/data/example-step-by-step_params.xml")) system.detach_module(ForwardPlanner) system.get_settings().show_gui = False system.start_system() o1 = CategoricalTableBuilder("u_u") o1.add_row("move a little bit left", 0.4) o1.add_row("please move a little right", 0.3) system.add_content(o1.build()) assert system.get_state().query_util(["a_m'"]).get_util( Assignment("a_m'", "AskRepeat")) == pytest.approx(0.0, abs=0.3) assert system.get_state().query_util(["a_m'"]).get_util( Assignment("a_m'", "Move(Left)")) == pytest.approx(-0.1, abs=0.15) system.get_state().remove_nodes( system.get_state().get_action_node_ids()) system.get_state().remove_nodes( system.get_state().get_utility_node_ids()) o1 = CategoricalTableBuilder("u_u") o1.add_row("move a little bit left", 0.5) o1.add_row("please move a little left", 0.2) system.add_content(o1.build()) assert system.get_state().query_util(["a_m'"]).get_util( Assignment("a_m'", "AskRepeat")) == pytest.approx(0.0, abs=0.3) assert system.get_state().query_util(["a_m'"]).get_util( Assignment("a_m'", "Move(Left)")) == pytest.approx(0.2, abs=0.15) system.get_state().remove_nodes( system.get_state().get_action_node_ids()) system.get_state().remove_nodes( system.get_state().get_utility_node_ids()) o1 = CategoricalTableBuilder("u_u") o1.add_row("now move right please", 0.8) system.add_content(o1.build()) assert system.get_state().query_util(["a_m'"]).get_util( Assignment("a_m'", "AskRepeat")) == pytest.approx(0.0, abs=0.3) assert system.get_state().query_util(["a_m'"]).get_util( Assignment("a_m'", "Move(Right)")) == pytest.approx(0.3, abs=0.15) system.get_state().remove_nodes( system.get_state().get_action_node_ids()) system.get_state().remove_nodes( system.get_state().get_utility_node_ids()) o1 = CategoricalTableBuilder("u_u") o1.add_row("move left", 0.7) system.add_content(o1.build()) assert system.get_state().query_util(["a_m'"]).get_util( Assignment("a_m'", "AskRepeat")) == pytest.approx(0.0, abs=0.3) assert system.get_state().query_util(["a_m'"]).get_util( Assignment("a_m'", "Move(Left)")) == pytest.approx(0.2, abs=0.15) system.get_state().remove_nodes( system.get_state().get_action_node_ids()) system.get_state().remove_nodes( system.get_state().get_utility_node_ids()) o1 = CategoricalTableBuilder("u_u") o1.add_row("turn left", 0.32) o1.add_row("move left again", 0.3) system.add_content(o1.build()) assert system.get_state().query_util(["a_m'"]).get_util( Assignment("a_m'", "AskRepeat")) == pytest.approx(0.0, abs=0.3) assert system.get_state().query_util(["a_m'"]).get_util( Assignment("a_m'", "Move(Left)")) == pytest.approx(0.1, abs=0.15) system.get_state().remove_nodes( system.get_state().get_action_node_ids()) system.get_state().remove_nodes( system.get_state().get_utility_node_ids()) o1 = CategoricalTableBuilder("u_u") o1.add_row("and do that again", 0.0) system.add_content(o1.build()) system.get_state().remove_nodes( system.get_state().get_action_node_ids()) system.get_state().remove_nodes( system.get_state().get_utility_node_ids()) o1 = CategoricalTableBuilder("u_u") o1.add_row("turn left", 1.0) system.add_content(o1.build()) assert system.get_state().query_util(["a_m'"]).get_util( Assignment("a_m'", "AskRepeat")) == pytest.approx(0.0, abs=0.3) assert system.get_state().query_util(["a_m'"]).get_util( Assignment("a_m'", "Move(Left)")) == pytest.approx(0.5, abs=0.15) system.get_state().remove_nodes( system.get_state().get_action_node_ids()) system.get_state().remove_nodes( system.get_state().get_utility_node_ids()) o1 = CategoricalTableBuilder("u_u") o1.add_row("turn right", 0.4) system.add_content(o1.build()) assert system.get_state().query_util(["a_m'"]).get_util( Assignment("a_m'", "AskRepeat")) == pytest.approx(0.0, abs=0.3) assert system.get_state().query_util(["a_m'"]).get_util( Assignment("a_m'", "Move(Right)")) == pytest.approx(-0.1, abs=0.15) system.get_state().remove_nodes( system.get_state().get_action_node_ids()) system.get_state().remove_nodes( system.get_state().get_utility_node_ids()) o1 = CategoricalTableBuilder("u_u") o1.add_row("please turn right", 0.8) system.add_content(o1.build()) assert system.get_state().query_util(["a_m'"]).get_util( Assignment("a_m'", "AskRepeat")) == pytest.approx(0.0, abs=0.3) assert system.get_state().query_util(["a_m'"]).get_util( Assignment("a_m'", "Move(Right)")) == pytest.approx(0.3, abs=0.15) system.get_state().remove_nodes( system.get_state().get_action_node_ids()) system.get_state().remove_nodes( system.get_state().get_utility_node_ids()) o1 = CategoricalTableBuilder("u_u") o1.add_row("and turn a bit left", 0.3) o1.add_row("move a bit left", 0.3) system.add_content(o1.build()) assert system.get_state().query_util(["a_m'"]).get_util( Assignment("a_m'", "AskRepeat")) == pytest.approx(0.0, abs=0.3) assert system.get_state().query_util(["a_m'"]).get_util( Assignment("a_m'", "Move(Left)")) == pytest.approx(0.1, abs=0.15) system.get_state().remove_nodes( system.get_state().get_action_node_ids()) system.get_state().remove_nodes( system.get_state().get_utility_node_ids())
from plugins.GoogleTTS import GoogleTTS from readers.xml_domain_reader import XMLDomainReader parser = argparse.ArgumentParser() parser.add_argument('--domain', type=str, help='domain file path') # parser.add_argument('--dialogue', type=str, help='dialogue file path') parser.add_argument('--simulator', type=str, help='simulator file path') args = parser.parse_args() # Set logger logger = logging.getLogger('PyOpenDial') logger.setLevel(logging.DEBUG) logger.addHandler(logging.StreamHandler()) if args.domain is not None: system = DialogueSystem(args.domain) else: system = DialogueSystem() if args.domain: try: domain = XMLDomainReader.extract_domain(args.domain) system.log.info("Domain from %s successfully extracted" % args.domain) except Exception as e: system.display_comment("Cannot load domain: %s" % e) domain = XMLDomainReader.extract_empty_domain(args.domain) system.change_domain(domain) if args.simulator: simulator = Simulator(system, XMLDomainReader.extract_domain(args.simulator))
def test1(self): domain = XMLDomainReader.extract_domain(TestIncremental.domain_file) system = DialogueSystem(domain) # NEED GUI & Recording system.get_settings().show_gui = False # system.get_settings().recording = Settings.Recording.ALL system.start_system() system.add_content(system.get_settings().user_speech, "busy") system.add_incremental_content(SingleValueDistribution("u_u", "go"), False) sleep(0.1) assert ValueFactory.create("go") in system.get_content( "u_u").get_values() t = CategoricalTableBuilder("u_u") t.add_row("forward", 0.7) t.add_row("backward", 0.2) system.add_incremental_content(t.build(), True) sleep(0.1) assert ValueFactory.create("go forward") in system.get_content( "u_u").get_values() assert system.get_content("u_u").get_prob( "go backward") == pytest.approx(0.2, abs=0.001) assert system.get_state().has_chance_node("nlu") system.add_content(system.get_settings().user_speech, "None") assert len(system.get_state().get_chance_nodes()) == 7 system.add_incremental_content( SingleValueDistribution("u_u", "please"), True) assert system.get_state().get_evidence().contains_pair( "=_a_u", ValueFactory.create(True)) assert system.get_content("u_u").get_prob( "go please") == pytest.approx(0.1, abs=0.001) assert system.get_state().has_chance_node("nlu") system.get_state().set_as_committed("u_u") assert not system.get_state().has_chance_node("nlu") t2 = CategoricalTableBuilder("u_u") t2.add_row("I said go backward", 0.3) system.add_incremental_content(t2.build(), True) assert system.get_content("a_u").get_prob( "Request(Backward)") == pytest.approx(0.82, abs=0.05) assert ValueFactory.create("I said go backward") in system.get_content( "u_u").get_values() assert system.get_state().has_chance_node("nlu") system.get_state().set_as_committed("u_u") assert not system.get_state().has_chance_node("nlu") system.add_incremental_content( SingleValueDistribution("u_u", "yes that is right"), False) assert ValueFactory.create("yes that is right") in system.get_content( "u_u").get_values()
def test_param_1(self): InferenceChecks.exact_threshold = 0.1 system = DialogueSystem(TestParameters.domain1) system.detach_module(ForwardPlanner) system.get_settings().show_gui = False assert system.get_state().has_chance_node("theta_1") TestParameters.inference.check_cdf(system.get_state(), "theta_1", 0.5, 0.5) TestParameters.inference.check_cdf(system.get_state(), "theta_1", 5., 0.99) TestParameters.inference.check_cdf(system.get_state(), "theta_2", 1., 0.07) TestParameters.inference.check_cdf(system.get_state(), "theta_2", 2., 0.5) system.start_system() system.add_content("u_u", "hello there") utils = ((SamplingAlgorithm()).query_util(system.get_state(), "u_m'")) assert utils.get_util(Assignment("u_m'", "yeah yeah talk to my hand")) > 0 assert utils.get_util(Assignment("u_m'", "so interesting!")) > 1.7 assert utils.get_util(Assignment("u_m'", "yeah yeah talk to my hand")) < utils.get_util(Assignment("u_m'", "so interesting!")) assert len(system.get_state().get_node_ids()) == 11
def test_dialogue2(self): system = DialogueSystem(TestFlightBooking.domain) system.get_settings().show_gui = False system.start_system() u_u = dict() u_u["err I don't know, where can I go?"] = 0.8 system.add_user_input(u_u) assert system.get_content("a_u").to_discrete().get_prob("[Other]") == pytest.approx(0.8, abs=0.01) assert str(system.get_content("a_m").get_best()) == "AskRepeat" u_u.clear() u_u["ah ok well I want to go to Tromsø please"] = 0.8 system.add_user_input(u_u) assert system.get_content("a_u").to_discrete().get_prob("[Inform(Airport,Tromsø)]") == pytest.approx(0.91, abs=0.01) assert system.get_content("Destination").to_discrete().get_prob("Tromsø") == pytest.approx(0.91, abs=0.01) assert str(system.get_content("a_m").get_best()) == "Confirm(Destination,Tromsø)" u_u.clear() u_u["that's right"] = 0.6 system.add_user_input(u_u) assert str(system.get_content("a_m").get_best()) == "Ground(Destination,Tromsø)" assert str(system.get_content("u_m").get_best()).find("departure?") != -1 u_u.clear() u_u["I'll be leaving from Moss"] = 0.1 system.add_user_input(u_u) assert system.get_content("a_u").to_discrete().get_prob("[Inform(Airport,Moss)]") == pytest.approx(0.357, abs=0.01) assert system.get_content("Destination").to_discrete().get_prob("Tromsø") == pytest.approx(1.0, abs=0.01) assert system.get_content("Departure").to_discrete().get_prob("Moss") == pytest.approx(0.357, abs=0.01) assert str(system.get_content("a_m").get_best()) == "AskRepeat" u_u.clear() u_u["I am leaving from Moss, did you get that right?"] = 0.2 u_u["Bodø, did you get that right?"] = 0.4 system.add_user_input(u_u) assert system.get_content("a_u").to_discrete().get_prob("[Confirm,Inform(Airport,Moss)]") == pytest.approx(0.72, abs=0.01) assert system.get_content("Departure").to_discrete().get_prob("Moss") == pytest.approx(0.88, abs=0.01) assert system.get_content("Departure").to_discrete().get_prob("Bodø") == pytest.approx(0.10, abs=0.01) assert str(system.get_content("a_m").get_best()) == "Confirm(Departure,Moss)" u_u.clear() u_u["yes"] = 0.6 system.add_user_input(u_u) assert str(system.get_content("a_m").get_best()) == "Ground(Departure,Moss)" assert str(system.get_content("u_m").get_best()).find("which date") != -1 u_u.clear() u_u["March 16"] = 0.7 u_u["March 60"] = 0.2 system.add_user_input(u_u) assert system.get_content("a_u").to_discrete().get_prob("[Inform(Date,March,16)]") == pytest.approx(0.7, abs=0.01) assert system.get_content("a_u").to_discrete().get_prob("[Other]") == pytest.approx(0.2, abs=0.01) assert str(system.get_content("a_m").get_best()) == "AskRepeat" u_u.clear() u_u["March 16"] = 0.05 u_u["March 60"] = 0.3 system.add_user_input(u_u) assert str(system.get_content("a_m").get_best()) == "Confirm(Date,March 16)" u_u.clear() u_u["yes"] = 0.6 system.add_user_input(u_u) assert str(system.get_content("a_m").get_best()) == "Ground(Date,March 16)" assert str(system.get_content("u_m").get_best()).find("return trip?") != -1 u_u.clear() u_u["err"] = 0.1 system.add_user_input(u_u) assert not system.get_state().has_chance_node("a_m") u_u.clear() u_u["yes"] = 0.3 system.add_user_input(u_u) assert str(system.get_content("a_m").get_best()) == "AskRepeat" u_u.clear() u_u["yes"] = 0.5 system.add_user_input(u_u) assert system.get_content("current_step").get_prob("ReturnDate") == pytest.approx(1.0, abs=0.01) assert str(system.get_content("u_m").get_best()).find("travel back") != -1 u_u.clear() u_u["on the 20th of March"] = 0.7 system.add_user_input(u_u) assert str(system.get_content("a_m").get_best()) == "Confirm(ReturnDate,March 20)" assert system.get_content("ReturnDate").to_discrete().get_prob("March 20") == pytest.approx(0.7, abs=0.01) u_u.clear() u_u["yes"] = 0.6 system.add_user_input(u_u) assert str(system.get_content("u_m").get_best()).find("299 EUR") != -1 assert str(system.get_content("u_m").get_best()).find("to order tickets?") != -1 copy_state1 = copy(system.get_state()) u_u.clear() u_u["no"] = 0.7 system.add_user_input(u_u) assert str(system.get_content("a_m").get_best()) == "Ground(Cancel)" assert str(system.get_content("current_step").get_best()) == "Final" assert str(system.get_content("u_m").get_best()).find("additional tickets?") != -1 copy_state2 = copy(system.get_state()) assert str(copy_state2.query_prob("current_step").get_best()) == "Final" u_u.clear() u_u["no"] = 0.7 system.add_user_input(u_u) assert str(copy_state2.query_prob("current_step").get_best()) == "Final" assert str(system.get_content("a_m").get_best()) == "Ground(Close)" assert str(system.get_content("current_step").get_best()) == "Close" assert str(system.get_content("u_m").get_best()).find("welcome back") != -1 system.get_state().remove_nodes(system.get_state().get_chance_node_ids()) system.get_state().add_network(copy_state2) assert str(copy_state2.query_prob("current_step").get_best()) == "Final" u_u.clear() u_u["yes"] = 0.7 system.add_user_input(u_u) assert not system.get_state().has_chance_node("Destination") assert str(system.get_content("u_m").get_best()).find("destination?") != -1 assert sorted(system.get_state().get_chance_node_ids()) == ["Destination^p", "a_m-prev", "current_step", "u_m", "u_u"] system.add_user_input("Oslo") assert str(system.get_content("a_m").get_best()) == "Ground(Destination,Oslo)" system.get_state().remove_nodes(system.get_state().get_chance_node_ids()) system.get_state().add_network(copy_state1) u_u.clear() u_u["yes"] = 0.8 system.add_user_input(u_u) assert system.get_content("current_step").get_prob("NbTickets") == pytest.approx(1.0, abs=0.01) assert str(system.get_content("a_m").to_discrete().get_best()) == "Ground(MakeOffer)" u_u.clear() u_u["one single ticket"] = 0.9 system.add_user_input(u_u) assert system.get_content("a_u").get_prob("[Inform(Number,1)]") == pytest.approx(0.9, abs=0.01) assert system.get_content("current_step").get_prob("NbTickets") == pytest.approx(1.0, abs=0.01) assert str(system.get_content("a_m-prev").to_discrete().get_best()) == "Ground(MakeOffer)" assert str(system.get_content("a_m").to_discrete().get_best()) == "Confirm(NbTickets,1)" u_u.clear() u_u["yes thank you"] = 1.0 system.add_user_input(u_u) assert len(system.get_content("a_u").get_values()) == pytest.approx(1, abs=0.01) assert system.get_content("a_u").get_prob("[Confirm]") == pytest.approx(1.0, abs=0.05) assert system.get_content("NbTickets").get_prob(1.) == pytest.approx(1.0, abs=0.05) assert str(system.get_content("a_m-prev").to_discrete().get_best()) == "Confirm(NbTickets,1)" assert str(system.get_content("a_m").to_discrete().get_best()) == "Ground(NbTickets,1)" assert system.get_content("current_step").get_prob("LastConfirm") == pytest.approx(1.0, abs=0.01) assert str(system.get_content("u_m").get_best()).find("Shall I confirm") != -1 assert str(system.get_content("u_m").get_best()).find("299 EUR") != -1 u_u.clear() u_u["yes please"] = 0.5 u_u["yellow"] = 0.4 system.add_user_input(u_u) assert system.get_content("a_u").get_prob("[Confirm]") == pytest.approx(0.9397, abs=0.01) assert system.get_content("current_step").get_prob("Final") == pytest.approx(1.0, abs=0.01) assert str(system.get_content("a_m").to_discrete().get_best()) == "Book" assert str(system.get_content("u_m").get_best()).find("additional tickets?") != -1 copystate3 = copy(system.get_state()) u_u.clear() u_u["thanks but no thanks"] = 0.7 system.add_user_input(u_u) assert system.get_content("a_u").get_prob("[Disconfirm]") == pytest.approx(0.97, abs=0.01) assert system.get_content("current_step").get_prob("Close") == pytest.approx(1.0, abs=0.01) assert str(system.get_content("u_m").get_best()).find("welcome back!") != -1 assert sorted(system.get_state().get_chance_node_ids()) == ["Date", "Departure", "Destination", "NbTickets", "ReturnDate", "TotalCost", "a_m", "a_m-prev", "a_u", "current_step", "u_m", "u_u"] assert len(system.get_content(["Date", "Departure", "Destination", "NbTickets", "ReturnDate", "TotalCost"]).to_discrete().get_values()) == 1 assert system.get_content(["Date", "Departure", "Destination", "NbTickets", "ReturnDate", "TotalCost"]).to_discrete().get_prob( Assignment([ Assignment("Date", "March 16"), Assignment("Departure", "Moss"), Assignment("Destination", "Tromsø"), Assignment("NbTickets", 1.), Assignment("ReturnDate", "March 20"), Assignment("TotalCost", 299.) ]) ) == pytest.approx(1.0, abs=0.01) system.get_state().remove_nodes(system.get_state().get_chance_node_ids()) ## system.get_state().add_network(copystate3) u_u.clear() u_u["yes"] = 0.7 system.add_user_input(u_u) assert not system.get_state().has_chance_node("Destination") assert str(system.get_content("u_m").get_best()).find("destination?") != -1 assert sorted(system.get_state().get_chance_node_ids()) == ["Destination^p", "a_m-prev", "current_step", "u_m", "u_u"] system.add_user_input("Oslo") assert str(system.get_content("a_m").get_best()) == "Ground(Destination,Oslo)"
def test_dialogue(self): system = DialogueSystem(TestFlightBooking.domain) system.get_settings().show_gui = False system.start_system() assert str(system.get_content("u_m").get_best()).find("your destination?") != -1 u_u = dict() u_u["to Bergen"] = 0.4 u_u["to Bethleem"] = 0.2 system.add_user_input(u_u) assert system.get_content("a_u").get_prob("[Inform(Airport,Bergen)]") == pytest.approx(0.833, abs=0.01) assert len(system.get_content("a_u").get_values()) == pytest.approx(3, abs=0.01) assert system.get_state().query_prob("a_u", False).get_prob("[Other]") == pytest.approx(0.055, abs=0.01) assert str(system.get_content("a_m").to_discrete().get_best()) == "Confirm(Destination,Bergen)" u_u.clear() u_u["yes exactly"] = 0.8 system.add_user_input(u_u) assert system.get_content("a_u").get_prob("[Confirm]") == pytest.approx(0.98, abs=0.01) assert system.get_content("Destination").get_prob("Bergen") == pytest.approx(1.0, abs=0.01) assert str(system.get_content("a_m").to_discrete().get_best()) == "Ground(Destination,Bergen)" assert str(system.get_content("u_m").get_best()).find("your departure?") != -1 u_u.clear() u_u["to Stockholm"] = 0.8 system.add_user_input(u_u) assert system.get_content("a_u").get_prob("[Other]") == pytest.approx(0.8, abs=0.01) assert str(system.get_content("a_m-prev").to_discrete().get_best()) == "Ground(Destination,Bergen)" assert len(system.get_content("Destination").to_discrete().get_values()) == 1 assert system.get_content("Destination").get_prob("Bergen") == pytest.approx(1.0, abs=0.01) assert not system.get_state().has_chance_node("Departure") assert str(system.get_content("a_m").get_best()) == "AskRepeat" assert str(system.get_content("u_m").get_best()).find("you repeat?") != -1 u_u.clear() u_u["to Sandefjord then"] = 0.6 system.add_user_input(u_u) assert system.get_content("a_u").get_prob("None") == pytest.approx(0.149, abs=0.05) assert system.get_content("Departure").get_prob("Sandefjord") == pytest.approx(0.88, abs=0.05) assert str(system.get_content("a_m").to_discrete().get_best()) == "Confirm(Departure,Sandefjord)" assert str(system.get_content("u_m").get_best()).find("that correct?") != -1 u_u.clear() u_u["no to Trondheim sorry"] = 0.08 system.add_user_input(u_u) assert system.get_content("a_u").get_prob("[Inform(Airport,Trondheim),Disconfirm]") == pytest.approx(0.51, abs=0.01) assert system.get_content("Departure").get_prob("Trondheim") == pytest.approx(0.51, abs=0.05) assert str(system.get_content("a_m").to_discrete().get_best()) == "AskRepeat" assert str(system.get_content("u_m").get_best()).find("repeat?") != -1 u_u.clear() u_u["to Trondheim"] = 0.3 u_u["Sandefjord"] = 0.1 system.add_user_input(u_u) assert system.get_content("a_u").get_prob("[Inform(Airport,Trondheim)]") == pytest.approx(0.667, abs=0.01) assert system.get_content("Destination").get_prob("Bergen") == pytest.approx(1.0, abs=0.01) assert system.get_content("Departure").get_prob("Trondheim") == pytest.approx(0.89, abs=0.01) assert str(system.get_content("a_m").to_discrete().get_best()) == "Confirm(Departure,Trondheim)" u_u.clear() u_u["yes exactly that's it"] = 0.8 system.add_user_input(u_u) assert str(system.get_content("a_m").to_discrete().get_best()) == "Ground(Departure,Trondheim)" assert str(system.get_content("u_m").get_best()).find("which date") != -1 u_u.clear() u_u["that will be on May 26"] = 0.4 u_u["this will be on May 24"] = 0.2 system.add_user_input(u_u) assert system.get_content("a_u").get_prob("[Inform(Date,May,24)]") == pytest.approx(0.2, abs=0.01) assert system.get_content("a_u").get_prob("[Inform(Date,May,26)]") == pytest.approx(0.4, abs=0.01) assert system.get_content("Destination").get_prob("Bergen") == pytest.approx(1.0, abs=0.01) assert system.get_content("Departure").get_prob("Trondheim") == pytest.approx(1.0, abs=0.01) assert system.get_content("Date").get_prob("May 26") == pytest.approx(0.4, abs=0.01) assert system.get_content("Date").get_prob("May 24") == pytest.approx(0.2, abs=0.01) assert str(system.get_content("a_m").to_discrete().get_best()) == "AskRepeat" assert str(system.get_content("a_m-prev").to_discrete().get_best()) == "Ground(Departure,Trondheim)" u_u.clear() u_u["May 24"] = 0.5 u_u["Mayday four"] = 0.5 system.add_user_input(u_u) assert system.get_content("a_u").get_prob("[Inform(Date,May,24)]") == pytest.approx(0.82, abs=0.05) assert system.get_content("a_u").get_prob("[Inform(Number,4)]") == pytest.approx(0.176, abs=0.01) assert system.get_content("Date").get_prob("May 26") == pytest.approx(0.02, abs=0.01) assert system.get_content("Date").get_prob("May 24") == pytest.approx(0.94, abs=0.01) assert system.get_state().has_chance_node("a_m") assert str(system.get_content("a_m-prev").to_discrete().get_best()) == "AskRepeat" assert str(system.get_content("a_m").to_discrete().get_best()) == "Ground(Date,May 24)" assert str(system.get_content("u_m").get_best()).find("return trip") != -1 u_u.clear() u_u["no thanks"] = 0.9 system.add_user_input(u_u) assert str(system.get_content("u_m").get_best()).find("to order tickets?") != -1 assert system.get_content("ReturnDate").get_prob("NoReturn") == pytest.approx(1.0, abs=0.01) assert system.get_content("current_step").get_prob("MakeOffer") == pytest.approx(1.0, abs=0.01) assert str(system.get_content("a_m").get_best()) == "MakeOffer(179)" u_u.clear() u_u["yes"] = 0.02 system.add_user_input(u_u) assert system.get_content("a_u").get_prob("[Confirm]") == pytest.approx(0.177, abs=0.01) assert system.get_content("current_step").get_prob("MakeOffer") == pytest.approx(1.0, abs=0.01) assert not system.get_state().has_chance_node("a_m") u_u.clear() u_u["yes"] = 0.8 system.add_user_input(u_u) assert system.get_content("a_u").get_prob("[Confirm]") == pytest.approx(0.978, abs=0.01) assert system.get_content("current_step").get_prob("NbTickets") == pytest.approx(1.0, abs=0.01) assert str(system.get_content("u_m").get_best()).find("many tickets") != -1 u_u.clear() u_u["uh I don't know me"] = 0.6 system.add_user_input(u_u) assert system.get_content("a_u").get_prob("[Other]") == pytest.approx(0.6, abs=0.01) assert system.get_content("current_step").get_prob("NbTickets") == pytest.approx(1.0, abs=0.01) assert str(system.get_content("a_m-prev").to_discrete().get_best()) == "Ground(MakeOffer)" assert str(system.get_content("a_m").to_discrete().get_best()) == "AskRepeat" u_u.clear() u_u["three tickets please"] = 0.9 system.add_user_input(u_u) assert system.get_content("a_u").get_prob("[Inform(Number,3)]") == pytest.approx(0.9, abs=0.01) assert system.get_content("current_step").get_prob("NbTickets") == pytest.approx(1.0, abs=0.01) assert str(system.get_content("a_m-prev").to_discrete().get_best()) == "AskRepeat" assert str(system.get_content("a_m").to_discrete().get_best()) == "Confirm(NbTickets,3)" u_u.clear() u_u["no sorry two tickets"] = 0.4 u_u["sorry to tickets"] = 0.3 system.add_user_input(u_u) assert len(system.get_content("a_u").get_values()) == pytest.approx(3, abs=0.01) assert system.get_content("a_u").get_prob("[Disconfirm,Inform(Number,2)]") == pytest.approx(0.86, abs=0.05) assert system.get_content("NbTickets").get_prob(2) == pytest.approx(0.86, abs=0.05) assert system.get_content("NbTickets").get_prob(3) == pytest.approx(0.125, abs=0.05) assert str(system.get_content("a_m-prev").to_discrete().get_best()) == "Confirm(NbTickets,3)" assert str(system.get_content("a_m").to_discrete().get_best()) == "Confirm(NbTickets,2)" assert system.get_content("current_step").get_prob("NbTickets") == pytest.approx(1.0, abs=0.01) u_u.clear() u_u["yes thank you"] = 0.75 u_u["yes mind you"] = 0.15 system.add_user_input(u_u) assert len(system.get_content("a_u").get_values()) == pytest.approx(2, abs=0.01) assert system.get_content("a_u").get_prob("[Confirm]") == pytest.approx(1.0, abs=0.05) assert system.get_content("NbTickets").get_prob(2) == pytest.approx(1.0, abs=0.05) assert system.get_content("NbTickets").get_prob(3) == pytest.approx(0.0, abs=0.05) assert str(system.get_content("a_m-prev").to_discrete().get_best()) == "Confirm(NbTickets,2)" assert str(system.get_content("a_m").to_discrete().get_best()) == "Ground(NbTickets,2)" assert system.get_content("current_step").get_prob("LastConfirm") == pytest.approx(1.0, abs=0.01) assert str(system.get_content("u_m").get_best()).find("Shall I confirm") != -1 assert str(system.get_content("u_m").get_best()).find("358 EUR") != -1 u_u.clear() u_u["err yes"] = 0.2 system.add_user_input(u_u) assert system.get_content("a_u").get_prob("[Confirm]") == pytest.approx(0.726, abs=0.01) assert system.get_content("current_step").get_prob("LastConfirm") == pytest.approx(1.0, abs=0.01) u_u.clear() u_u["yes please confirm"] = 0.5 system.add_user_input(u_u) assert system.get_content("a_u").get_prob("[Confirm]") == pytest.approx(0.934, abs=0.01) assert system.get_content("current_step").get_prob("Final") == pytest.approx(1.0, abs=0.01) assert str(system.get_content("a_m").to_discrete().get_best()) == "Book" assert str(system.get_content("u_m").get_best()).find("additional tickets?") != -1 u_u.clear() u_u["thanks but no thanks"] = 0.7 system.add_user_input(u_u) assert system.get_content("a_u").get_prob("[Disconfirm]") == pytest.approx(0.97, abs=0.01) assert system.get_content("current_step").get_prob("Close") == pytest.approx(1.0, abs=0.01) assert str(system.get_content("u_m").get_best()).find("welcome back!") != -1 assert sorted(system.get_state().get_chance_node_ids()) == ["Date", "Departure", "Destination", "NbTickets", "ReturnDate", "TotalCost", "a_m", "a_m-prev", "a_u", "current_step", "u_m", "u_u"] assert len(system.get_content(["Date", "Departure", "Destination", "NbTickets", "ReturnDate", "TotalCost"]).to_discrete().get_values()) == 1 assert system.get_content(["Date", "Departure", "Destination", "NbTickets", "ReturnDate", "TotalCost"]).to_discrete().get_prob( Assignment([ Assignment("Date", "May 24"), Assignment("Departure", "Trondheim"), Assignment("Destination", "Bergen"), Assignment("NbTickets", 2.), Assignment("ReturnDate", "NoReturn"), Assignment("TotalCost", 358.) ]) ) == pytest.approx(1.0, abs=0.01)
class TestPruning: domainFile = "test/data/domain1.xml" domain = XMLDomainReader.extract_domain(domainFile) inference = InferenceChecks() InferenceChecks.exact_threshold = 0.1 InferenceChecks.sampling_threshold = 0.1 system = DialogueSystem(domain) system.get_settings().show_gui = False system.start_system() def test_pruning0(self): assert len(TestPruning.system.get_state().get_node_ids()) == 15 assert len(TestPruning.system.get_state().get_evidence().get_variables()) == 0 def test_pruning1(self): TestPruning.inference.check_prob(TestPruning.system.get_state(), "a_u", "Greeting", 0.8) TestPruning.inference.check_prob(TestPruning.system.get_state(), "a_u", "None", 0.2) def test_pruning2(self): TestPruning.inference.check_prob(TestPruning.system.get_state(), "i_u", "Inform", 0.7 * 0.8) TestPruning.inference.check_prob(TestPruning.system.get_state(), "i_u", "None", 1 - 0.7 * 0.8) def test_pruning3(self): TestPruning.inference.check_prob(TestPruning.system.get_state(), "direction", "straight", 0.79) TestPruning.inference.check_prob(TestPruning.system.get_state(), "direction", "left", 0.20) TestPruning.inference.check_prob(TestPruning.system.get_state(), "direction", "right", 0.01) def test_pruning4(self): TestPruning.inference.check_prob(TestPruning.system.get_state(), "o", "and we have var1=value2", 0.3) TestPruning.inference.check_prob(TestPruning.system.get_state(), "o", "and we have localvar=value1", 0.2) TestPruning.inference.check_prob(TestPruning.system.get_state(), "o", "and we have localvar=value3", 0.31) def test_pruning5(self): TestPruning.inference.check_prob(TestPruning.system.get_state(), "o2", "here is value1", 0.35) TestPruning.inference.check_prob(TestPruning.system.get_state(), "o2", "and value2 is over there", 0.07) TestPruning.inference.check_prob(TestPruning.system.get_state(), "o2", "value3, finally", 0.28) def test_pruning6(self): initial_state = copy(TestPruning.system.get_state()) builder = CategoricalTableBuilder("var1") builder.add_row("value2", 0.9) TestPruning.system.get_state().add_to_state(builder.build()) TestPruning.inference.check_prob(TestPruning.system.get_state(), "o", "and we have var1=value2", 0.3) TestPruning.inference.check_prob(TestPruning.system.get_state(), "o", "and we have localvar=value1", 0.2) TestPruning.inference.check_prob(TestPruning.system.get_state(), "o", "and we have localvar=value3", 0.31) TestPruning.system.get_state().reset(initial_state) def test_pruning7(self): TestPruning.inference.check_prob(TestPruning.system.get_state(), "a_u2", "[Greet, HowAreYou]", 0.7) TestPruning.inference.check_prob(TestPruning.system.get_state(), "a_u2", "none", 0.1) TestPruning.inference.check_prob(TestPruning.system.get_state(), "a_u2", "[HowAreYou]", 0.2) def test_pruning8(self): initial_state = copy(TestPruning.system.get_state()) created_nodes = SortedSet() for node_id in TestPruning.system.get_state().get_node_ids(): if node_id.find("a_u3^") != -1: created_nodes.add(node_id) assert len(created_nodes) == 2 values = TestPruning.system.get_state().get_node(created_nodes[0] + "").get_values() if ValueFactory.create("Greet") in values: greet_node = created_nodes[0] # created_nodes.first() howareyou_node = created_nodes[-1] # created_nodes.last() else: greet_node = created_nodes[-1] # created_nodes.last() howareyou_node = created_nodes[0] # created_nodes.first() TestPruning.inference.check_prob(TestPruning.system.get_state(), "a_u3", "[" + howareyou_node + "," + greet_node + "]", 0.7) TestPruning.inference.check_prob(TestPruning.system.get_state(), "a_u3", "none", 0.1) TestPruning.inference.check_prob(TestPruning.system.get_state(), "a_u3", "[" + howareyou_node + "]", 0.2) TestPruning.inference.check_prob(TestPruning.system.get_state(), greet_node + "", "Greet", 0.7) TestPruning.inference.check_prob(TestPruning.system.get_state(), howareyou_node + "", "HowAreYou", 0.9) TestPruning.system.get_state().reset(initial_state)
def test_param_4(self): system = DialogueSystem(TestParameters.domain1) system.detach_module(ForwardPlanner) system.get_settings().show_gui = False system.start_system() rules = TestParameters.domain1.get_models()[1].get_rules() outputs = rules[0].get_output(Assignment("u_u", "my name is")) o = Effect(BasicEffect("u_u^p", "Pierre")) assert isinstance(outputs.get_parameter(o), SingleParameter) input = Assignment("theta_5", ValueFactory.create("[0.36, 0.24, 0.40]")) assert outputs.get_parameter(o).get_value(input) == pytest.approx(0.36, abs=0.01) system.get_state().remove_nodes(system.get_state().get_action_node_ids()) system.get_state().remove_nodes(system.get_state().get_utility_node_ids()) system.add_content("u_u", "my name is") system.get_state().remove_nodes(system.get_state().get_action_node_ids()) system.get_state().remove_nodes(system.get_state().get_utility_node_ids()) system.add_content("u_u", "Pierre") system.get_state().remove_nodes(system.get_state().get_action_node_ids()) system.get_state().remove_nodes(system.get_state().get_utility_node_ids()) system.add_content("u_u", "my name is") system.get_state().remove_nodes(system.get_state().get_action_node_ids()) system.get_state().remove_nodes(system.get_state().get_utility_node_ids()) system.add_content("u_u", "Pierre") assert system.get_state().query_prob("theta_5").to_continuous().get_function().get_mean()[0] == pytest.approx(0.3, abs=0.12)
def test_param_2(self): InferenceChecks.exact_threshold = 0.1 system = DialogueSystem(TestParameters.domain1) system.detach_module(ForwardPlanner) system.get_settings().show_gui = False assert system.get_state().has_chance_node("theta_3") TestParameters.inference.check_cdf(system.get_state(), "theta_3", 0.6, 0.0) TestParameters.inference.check_cdf(system.get_state(), "theta_3", 0.8, 0.5) TestParameters.inference.check_cdf(system.get_state(), "theta_3", 0.95, 1.0) system.start_system() system.add_content("u_u", "brilliant") distrib = system.get_content("a_u") assert distrib.get_prob("approval") == pytest.approx(0.8, abs=0.05)