Esempio n. 1
0
    def test_rule_and_params(self):
        domain = XMLDomainReader.extract_domain(TestRuleAndParams.domain_file)
        system = DialogueSystem(domain)

        system.get_settings().show_gui = False

        system.start_system()
        assert system.get_content("theta_moves").to_continuous().get_function().get_mean()[0] == pytest.approx(0.2, abs=0.02)
        assert system.get_content("a_u^p").get_prob("I want left") == pytest.approx(0.12, abs=0.03)
        assert len(system.get_state().get_chance_node("theta_moves").get_output_node_ids()) == 1
        assert system.get_state().has_chance_node("movements")
        assert isinstance(system.get_state().get_chance_node("movements").get_distrib(), AnchoredRule)

        t = CategoricalTableBuilder("a_u")
        t.add_row("I want left", 0.8)
        t.add_row("I want forward", 0.1)
        system.add_content(t.build())

        assert len(system.get_state().get_chance_node("theta_moves").get_output_node_ids()) == 0
        assert not system.get_state().has_chance_node("movements")
        assert system.get_content("theta_moves").to_continuous().get_function().get_mean()[0] == pytest.approx(2.0 / 6.0, abs=0.07)

        system.add_content("a_m", "turning left")

        assert system.get_content("a_u^p").get_prob("I want left") == pytest.approx(0.23, abs=0.04)
        assert len(system.get_state().get_chance_node("theta_moves").get_output_node_ids()) == 1
Esempio n. 2
0
    def test_3(self):
        system = DialogueSystem(TestRule2.domain)
        system.get_settings().show_gui = False
        system.detach_module(ForwardPlanner)
        eq_factor = EquivalenceDistribution.none_prob
        EquivalenceDistribution.none_prob = 0.1
        old_prune_threshold = StatePruner.value_pruning_threshold
        StatePruner.value_pruning_threshold = 0.0
        system.start_system()

        TestRule2.inference.check_util(system.get_state(), "a_m'", "Do(A)",
                                       0.6)
        TestRule2.inference.check_util(system.get_state(), "a_m'", "Do(B)",
                                       -2.6)

        builder = CategoricalTableBuilder("a_u")
        builder.add_row("Ask(B)", 0.8)
        builder.add_row("None", 0.2)
        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(builder.build())

        TestRule2.inference.check_util(system.get_state(), "a_m'", "Do(A)",
                                       -4.35)
        TestRule2.inference.check_util(system.get_state(), "a_m'", "Do(B)",
                                       2.357)

        EquivalenceDistribution.none_prob = eq_factor
        StatePruner.value_pruning_threshold = old_prune_threshold
Esempio n. 3
0
    def test_IS2013(self):
        domain = XMLDomainReader.extract_domain(TestLearning.domain_file)
        params = XMLStateReader.extract_bayesian_network(TestLearning.parameters_file, "parameters")
        domain.set_parameters(params)
        system = DialogueSystem(domain)
        system.get_settings().show_gui = False
        system.detach_module(ForwardPlanner)
        Settings.nr_samples = Settings.nr_samples * 3
        Settings.max_sampling_time = Settings.max_sampling_time * 10
        system.start_system()

        init_mean = system.get_content("theta_1").to_continuous().get_function().get_mean()

        builder = CategoricalTableBuilder("a_u")
        builder.add_row("Move(Left)", 1.0)
        builder.add_row("Move(Right)", 0.0)
        builder.add_row("None", 0.0)
        system.add_content(builder.build())
        system.get_state().remove_nodes(system.get_state().get_utility_node_ids())
        system.get_state().remove_nodes(system.get_state().get_action_node_ids())

        after_mean = system.get_content("theta_1").to_continuous().get_function().get_mean()

        assert after_mean[0] - init_mean[0] > 0.04
        assert after_mean[1] - init_mean[1] < 0.04
        assert after_mean[2] - init_mean[2] < 0.04
        assert after_mean[3] - init_mean[3] < 0.04
        assert after_mean[4] - init_mean[4] < 0.04
        assert after_mean[5] - init_mean[5] < 0.04
        assert after_mean[6] - init_mean[6] < 0.04
        assert after_mean[7] - init_mean[7] < 0.04

        Settings.nr_samples = int(Settings.nr_samples / 3)
        Settings.max_sampling_time = Settings.max_sampling_time / 10
Esempio n. 4
0
    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)
Esempio n. 5
0
    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)
Esempio n. 6
0
    def test_1(self):
        system = DialogueSystem(TestRule2.domain)
        eq_factor = EquivalenceDistribution.none_prob
        EquivalenceDistribution.none_prob = 0.1
        old_prune_threshold = StatePruner.value_pruning_threshold
        StatePruner.value_pruning_threshold = 0.0

        system.get_settings().show_gui = False
        system.detach_module(ForwardPlanner)
        system.start_system()

        TestRule2.inference.check_prob(system.get_state(), "a_u^p", "Ask(A)",
                                       0.63)
        TestRule2.inference.check_prob(system.get_state(), "a_u^p", "Ask(B)",
                                       0.27)
        TestRule2.inference.check_prob(system.get_state(), "a_u^p", "None",
                                       0.1)

        builder = CategoricalTableBuilder("a_u")
        builder.add_row("Ask(B)", 0.8)
        builder.add_row("None", 0.2)

        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(builder.build())

        TestRule2.inference.check_prob(system.get_state(), "i_u", "Want(A)",
                                       0.090)
        TestRule2.inference.check_prob(system.get_state(), "i_u", "Want(B)",
                                       0.91)

        TestRule2.inference.check_prob(system.get_state(), "a_u^p", "Ask(B)",
                                       0.91 * 0.9)
        TestRule2.inference.check_prob(system.get_state(), "a_u^p", "Ask(A)",
                                       0.09 * 0.9)
        TestRule2.inference.check_prob(system.get_state(), "a_u^p", "None",
                                       0.1)

        TestRule2.inference.check_prob(system.get_state(), "a_u", "Ask(B)",
                                       0.918)
        TestRule2.inference.check_prob(system.get_state(), "a_u", "None",
                                       0.081)

        EquivalenceDistribution.none_prob = eq_factor
        StatePruner.value_pruning_threshold = old_prune_threshold
Esempio n. 7
0
    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)
Esempio n. 8
0
    def test_2(self):
        system = DialogueSystem(TestRule2.domain)
        system.get_settings().show_gui = False
        system.detach_module(ForwardPlanner)
        eq_factor = EquivalenceDistribution.none_prob
        EquivalenceDistribution.none_prob = 0.1
        old_prune_threshold = StatePruner.value_pruning_threshold
        StatePruner.value_pruning_threshold = 0.0
        system.start_system()

        TestRule2.inference.check_prob(system.get_state(), "u_u2^p", "Do A",
                                       0.216)
        TestRule2.inference.check_prob(system.get_state(), "u_u2^p",
                                       "Please do C", 0.027)
        TestRule2.inference.check_prob(system.get_state(), "u_u2^p",
                                       "Could you do B?", 0.054)
        TestRule2.inference.check_prob(system.get_state(), "u_u2^p",
                                       "Could you do A?", 0.162)
        TestRule2.inference.check_prob(system.get_state(), "u_u2^p", "none",
                                       0.19)

        builder = CategoricalTableBuilder("u_u2")
        builder.add_row("Please do B", 0.4)
        builder.add_row("Do B", 0.4)

        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(builder.build())

        TestRule2.inference.check_prob(system.get_state(), "i_u2", "Want(B)",
                                       0.654)
        TestRule2.inference.check_prob(system.get_state(), "i_u2", "Want(A)",
                                       0.1963)
        TestRule2.inference.check_prob(system.get_state(), "i_u2", "Want(C)",
                                       0.0327)
        TestRule2.inference.check_prob(system.get_state(), "i_u2", "none",
                                       0.1168)

        EquivalenceDistribution.none_prob = eq_factor
        StatePruner.value_pruning_threshold = old_prune_threshold
Esempio n. 9
0
    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
Esempio n. 10
0
    def test_6(self):
        InferenceChecks.exact_threshold = 0.06

        system = DialogueSystem(TestRule1.domain)
        system.detach_module(ForwardPlanner)
        system.get_settings().show_gui = False
        system.start_system()

        builder = CategoricalTableBuilder("var1")
        builder.add_row("value2", 0.9)
        system.add_content(builder.build())

        TestRule1.inference.check_prob(system.get_state(), "o",
                                       "and we have var1=value2", 0.9)
        TestRule1.inference.check_prob(system.get_state(), "o",
                                       "and we have localvar=value1", 0.05)
        TestRule1.inference.check_prob(system.get_state(), "o",
                                       "and we have localvar=value3", 0.04)

        StatePruner.enable_reduction = True
Esempio n. 11
0
    def test_param_5(self):
        system = DialogueSystem(TestParameters.domain2)
        system.detach_module(ForwardPlanner)
        system.get_settings().show_gui = False
        system.start_system()

        rules = TestParameters.domain2.get_models()[0].get_rules()
        outputs = rules[0].get_output(Assignment("u_u", "brilliant"))
        o = Effect(BasicEffect("a_u", "approval"))
        assert isinstance(outputs.get_parameter(o), ComplexParameter)
        input = Assignment([Assignment("theta_6", 2.1), Assignment("theta_7", 1.3)])
        assert outputs.get_parameter(o).get_value(input) == pytest.approx(0.74, 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", "brilliant")

        assert system.get_state().query_prob("theta_6").to_continuous().get_function().get_mean()[0] == pytest.approx(1.0, abs=0.08)

        assert system.get_content("a_u").get_prob("approval") == pytest.approx(0.63, abs=0.08)
        assert system.get_content("a_u").get_prob("irony") == pytest.approx(0.3, abs=0.08)
Esempio n. 12
0
    def test_param1(self):
        domain = XMLDomainReader.extract_domain(TestDemo.domain_file)
        params = XMLStateReader.extract_bayesian_network(
            TestDemo.param_file, "parameters")
        domain.set_parameters(params)
        system = DialogueSystem(domain)
        system.get_settings().show_gui = False

        system.detach_module(ForwardPlanner)
        system.get_settings().show_gui = False

        system.start_system()
        system.add_content("a_m", "AskRepeat")

        t = CategoricalTableBuilder("a_u")
        t.add_row("DoA", 0.7)
        t.add_row("a_u", 0.2)
        t.add_row("a_u", 0.1)
        system.add_content(t.build())
        for i in range(3000):
            print((system.get_state().get_chance_node("theta").sample()
                   ).get_array()[0])
Esempio n. 13
0
    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())
Esempio n. 14
0
    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()
Esempio n. 15
0
    def test_demo(self):
        domain = XMLDomainReader.extract_domain(TestDemo.domain_file2)
        system = DialogueSystem(domain)
        system.get_settings().show_gui = False

        system.start_system()
        assert len(system.get_state().get_chance_nodes()) == 5

        t = CategoricalTableBuilder("u_u")
        t.add_row("hello there", 0.7)
        t.add_row("hello", 0.2)
        updates = system.add_content(t.build())
        assert updates.issuperset({"a_u", "a_m", "u_m"})

        assert str(system.get_content("u_m").get_best()) == "Hi there"

        t2 = dict()
        t2["move forward"] = 0.06
        system.add_user_input(t2)

        assert not system.get_state().has_chance_node("u_m")

        t2 = dict()
        t2["move forward"] = 0.45
        system.add_user_input(t2)

        assert str(
            system.get_content("u_m").get_best()) == "OK, moving Forward"

        t = CategoricalTableBuilder("u_u")
        t.add_row("now do that again", 0.3)
        t.add_row("move backward", 0.22)
        t.add_row("move a bit to the left", 0.22)
        system.add_content(t.build())

        assert str(
            system.get_content("u_m").get_best()) == "Sorry, could you repeat?"

        t = CategoricalTableBuilder("u_u")
        t.add_row("do that one more time", 0.65)
        system.add_content(t.build())

        assert str(
            system.get_content("u_m").get_best()) == "OK, moving Forward"

        system.add_content(SingleValueDistribution("perceived", "[BlueObj]"))

        t = CategoricalTableBuilder("u_u")
        t.add_row("what do you see", 0.6)
        t.add_row("do you see it", 0.3)
        system.add_content(t.build())
        assert str(
            system.get_content("u_m").get_best()) == "I see a blue cylinder"

        t = CategoricalTableBuilder("u_u")
        t.add_row("pick up the blue object", 0.75)
        t.add_row("turn left", 0.12)
        system.add_content(t.build())

        assert str(system.get_content(
            "u_m").get_best()) == "OK, picking up the blue object"

        system.add_content(SingleValueDistribution("perceived", "[]"))
        system.add_content(SingleValueDistribution("carried", "[BlueObj]"))

        t = CategoricalTableBuilder("u_u")
        t.add_row("now please move a bit forward", 0.21)
        t.add_row("move backward a little bit", 0.13)
        system.add_content(t.build())

        assert str(system.get_content(
            "u_m").get_best()) == "Should I move a bit forward?"

        t = CategoricalTableBuilder("u_u")
        t.add_row("yes", 0.8)
        t.add_row("move backward", 0.1)
        system.add_content(t.build())

        assert str(system.get_content(
            "u_m").get_best()) == "OK, moving Forward a little bit"

        t = CategoricalTableBuilder("u_u")
        t.add_row("and now move forward", 0.21)
        t.add_row("move backward", 0.09)
        system.add_content(t.build())

        assert str(
            system.get_content("u_m").get_best()) == "Should I move forward?"

        t = CategoricalTableBuilder("u_u")
        t.add_row("no", 0.6)
        system.add_content(t.build())

        assert str(
            system.get_content("u_m").get_best()) == "Should I move backward?"

        t = CategoricalTableBuilder("u_u")
        t.add_row("yes", 0.5)
        system.add_content(t.build())

        assert str(
            system.get_content("u_m").get_best()) == "OK, moving Backward"

        t = CategoricalTableBuilder("u_u")
        t.add_row("now what can you see now?", 0.7)
        system.add_content(t.build())

        assert str(
            system.get_content("u_m").get_best()) == "I do not see anything"

        t = CategoricalTableBuilder("u_u")
        t.add_row("please release the object", 0.5)
        system.add_content(t.build())

        assert str(system.get_content(
            "u_m").get_best()) == "OK, putting down the object"

        t = CategoricalTableBuilder("u_u")
        t.add_row("something unexpected", 0.7)
        system.add_content(t.build())

        assert not system.get_state().has_chance_node("u_m")

        t = CategoricalTableBuilder("u_u")
        t.add_row("goodbye", 0.7)
        system.add_content(t.build())

        assert str(
            system.get_content("u_m").get_best()) == "Bye, see you next time"