def test_model_structures(self):
     model_a = DummyInterface(None, "A")
     
     ensemble = ModelEnsemble()
     ensemble.model_structure = model_a
     self.assertEqual(ensemble.model_structure, model_a)
     
     model_a = DummyInterface(None, "A")
     model_b = DummyInterface(None, "B")
     ensemble = ModelEnsemble()
     ensemble.model_structures = [model_a, model_b]
     self.assertEqual(list(ensemble.model_structures), [model_a, model_b])
    def test_model_structures(self):
        model_a = DummyInterface(None, "A")

        ensemble = ModelEnsemble()
        ensemble.model_structure = model_a
        self.assertEqual(ensemble.model_structure, model_a)

        model_a = DummyInterface(None, "A")
        model_b = DummyInterface(None, "B")
        ensemble = ModelEnsemble()
        ensemble.model_structures = [model_a, model_b]
        self.assertEqual(list(ensemble.model_structures), [model_a, model_b])
    def test_generate_experiments(self):
        # everything shared
        model_a = DummyInterface(None, "A")
        model_b = DummyInterface(None, "B")
        model_c = DummyInterface(None, "C")
        
        # let's add some uncertainties to this
        shared_abc_1 = ParameterUncertainty((0,1), "shared abc 1")
        shared_abc_2 = ParameterUncertainty((0,1), "shared abc 2")
        shared_ab_1 = ParameterUncertainty((0,1), "shared ab 1")
        shared_bc_1 = ParameterUncertainty((0,1), "shared bc 1")
        a_1 = ParameterUncertainty((0,1), "a 1")
        b_1 = ParameterUncertainty((0,1), "b 1")
        model_a.uncertainties = [shared_abc_1, shared_abc_2, shared_ab_1, a_1]
        model_b.uncertainties = [shared_abc_1, shared_abc_2, shared_ab_1, shared_bc_1, b_1]
        model_c.uncertainties = [shared_abc_1, shared_abc_2, shared_bc_1]
        
        ensemble = ModelEnsemble()
        ensemble.model_structures = [model_a, model_b, model_c]
        experiments, nr_of_exp, uncertainties = ensemble._generate_experiments(10, UNION )
        
        msg = 'testing UNION'
        
        self.assertIn(shared_abc_1, uncertainties, msg)
        self.assertIn(shared_abc_2, uncertainties, msg)
        self.assertIn(shared_ab_1, uncertainties, msg)
        self.assertIn(shared_bc_1, uncertainties, msg)
        self.assertIn(a_1, uncertainties, msg)
        self.assertIn(b_1, uncertainties, msg)        
        self.assertEqual(nr_of_exp, 10* len(ensemble.model_structures), msg)
        
        for experiment in experiments:
            self.assertIn('policy', experiment.keys(), msg)
            self.assertIn('model', experiment.keys(), msg)
            self.assertIn('experiment id', experiment.keys(), msg)
            
            model = ensemble._msis[experiment['model']]
            for unc in model.uncertainties:
                self.assertIn(unc.name, experiment.keys())
            self.assertEqual(len(experiment.keys()), len(model.uncertainties)+3)
            

        experiments, nr_of_exp, uncertainties = ensemble._generate_experiments(10, INTERSECTION )
         
        msg = 'testing INTERSECTION'
        
        self.assertIn(shared_abc_1, uncertainties, msg)
        self.assertIn(shared_abc_2, uncertainties, msg)
        self.assertNotIn(shared_ab_1, uncertainties, msg)
        self.assertNotIn(shared_bc_1, uncertainties, msg)
        self.assertNotIn(a_1, uncertainties, msg)
        self.assertNotIn(b_1, uncertainties, msg)          
        
        self.assertEqual(nr_of_exp, 10* len(ensemble.model_structures), msg)
        experiment = six.next(experiments)
        self.assertIn('policy', experiment.keys(), msg)
        self.assertIn('model', experiment.keys(), msg)
        self.assertIn('experiment id', experiment.keys(), msg)


        for experiment in experiments:
            self.assertIn('policy', experiment.keys(), msg)
            self.assertIn('model', experiment.keys(), msg)
            self.assertIn('experiment id', experiment.keys(), msg)
            
            model = ensemble._msis[experiment['model']]
            for unc in [shared_abc_1, shared_abc_2]:
                self.assertIn(unc.name, experiment.keys())
            self.assertNotEqual(len(experiment.keys()), len(model.uncertainties)+3)
            self.assertEqual(len(experiment.keys()), 5)
            
            
        # predefined experiments
        model_a = DummyInterface(None, "A")
        
        # let's add some uncertainties to this
        shared_abc_1 = ParameterUncertainty((0,1), "shared abc 1")
        shared_abc_2 = ParameterUncertainty((0,1), "shared abc 2")
        shared_ab_1 = ParameterUncertainty((0,1), "shared ab 1")
        a_1 = ParameterUncertainty((0,1), "a 1")
        model_a.uncertainties = [shared_abc_1, shared_abc_2, shared_ab_1, a_1]
        ensemble = ModelEnsemble()
        ensemble.model_structure = model_a
        
        cases = [{"shared abc 1":1, "shared abc 2":2, "shared ab 1":3, "a 1": 4}]
        
        experiments, nr_of_exp, uncertainties = ensemble._generate_experiments(cases, UNION)
        
        self.assertEqual(nr_of_exp, 1)
        self.assertIn(shared_abc_1, uncertainties)
        self.assertIn(shared_abc_2, uncertainties)
        self.assertIn(shared_ab_1, uncertainties)
        self.assertIn(a_1, uncertainties)
        
        # test raises EMAError
        self.assertRaises(EMAError, ensemble._generate_experiments, 'a string', UNION)
    def test_generate_experiments(self):
        # everything shared
        model_a = DummyInterface(None, "A")
        model_b = DummyInterface(None, "B")
        model_c = DummyInterface(None, "C")

        # let's add some uncertainties to this
        shared_abc_1 = ParameterUncertainty((0, 1), "shared abc 1")
        shared_abc_2 = ParameterUncertainty((0, 1), "shared abc 2")
        shared_ab_1 = ParameterUncertainty((0, 1), "shared ab 1")
        shared_bc_1 = ParameterUncertainty((0, 1), "shared bc 1")
        a_1 = ParameterUncertainty((0, 1), "a 1")
        b_1 = ParameterUncertainty((0, 1), "b 1")
        model_a.uncertainties = [shared_abc_1, shared_abc_2, shared_ab_1, a_1]
        model_b.uncertainties = [
            shared_abc_1, shared_abc_2, shared_ab_1, shared_bc_1, b_1
        ]
        model_c.uncertainties = [shared_abc_1, shared_abc_2, shared_bc_1]

        ensemble = ModelEnsemble()
        ensemble.model_structures = [model_a, model_b, model_c]
        experiments, nr_of_exp, uncertainties = ensemble._generate_experiments(
            10, UNION)

        msg = 'testing UNION'

        self.assertIn(shared_abc_1, uncertainties, msg)
        self.assertIn(shared_abc_2, uncertainties, msg)
        self.assertIn(shared_ab_1, uncertainties, msg)
        self.assertIn(shared_bc_1, uncertainties, msg)
        self.assertIn(a_1, uncertainties, msg)
        self.assertIn(b_1, uncertainties, msg)
        self.assertEqual(nr_of_exp, 10 * len(ensemble.model_structures), msg)

        for experiment in experiments:
            self.assertIn('policy', experiment.keys(), msg)
            self.assertIn('model', experiment.keys(), msg)
            self.assertIn('experiment id', experiment.keys(), msg)

            model = ensemble._msis[experiment['model']]
            for unc in model.uncertainties:
                self.assertIn(unc.name, experiment.keys())
            self.assertEqual(len(experiment.keys()),
                             len(model.uncertainties) + 3)

        experiments, nr_of_exp, uncertainties = ensemble._generate_experiments(
            10, INTERSECTION)

        msg = 'testing INTERSECTION'

        self.assertIn(shared_abc_1, uncertainties, msg)
        self.assertIn(shared_abc_2, uncertainties, msg)
        self.assertNotIn(shared_ab_1, uncertainties, msg)
        self.assertNotIn(shared_bc_1, uncertainties, msg)
        self.assertNotIn(a_1, uncertainties, msg)
        self.assertNotIn(b_1, uncertainties, msg)

        self.assertEqual(nr_of_exp, 10 * len(ensemble.model_structures), msg)
        experiment = six.next(experiments)
        self.assertIn('policy', experiment.keys(), msg)
        self.assertIn('model', experiment.keys(), msg)
        self.assertIn('experiment id', experiment.keys(), msg)

        for experiment in experiments:
            self.assertIn('policy', experiment.keys(), msg)
            self.assertIn('model', experiment.keys(), msg)
            self.assertIn('experiment id', experiment.keys(), msg)

            model = ensemble._msis[experiment['model']]
            for unc in [shared_abc_1, shared_abc_2]:
                self.assertIn(unc.name, experiment.keys())
            self.assertNotEqual(len(experiment.keys()),
                                len(model.uncertainties) + 3)
            self.assertEqual(len(experiment.keys()), 5)

        # predefined experiments
        model_a = DummyInterface(None, "A")

        # let's add some uncertainties to this
        shared_abc_1 = ParameterUncertainty((0, 1), "shared abc 1")
        shared_abc_2 = ParameterUncertainty((0, 1), "shared abc 2")
        shared_ab_1 = ParameterUncertainty((0, 1), "shared ab 1")
        a_1 = ParameterUncertainty((0, 1), "a 1")
        model_a.uncertainties = [shared_abc_1, shared_abc_2, shared_ab_1, a_1]
        ensemble = ModelEnsemble()
        ensemble.model_structure = model_a

        cases = [{
            "shared abc 1": 1,
            "shared abc 2": 2,
            "shared ab 1": 3,
            "a 1": 4
        }]

        experiments, nr_of_exp, uncertainties = ensemble._generate_experiments(
            cases, UNION)

        self.assertEqual(nr_of_exp, 1)
        self.assertIn(shared_abc_1, uncertainties)
        self.assertIn(shared_abc_2, uncertainties)
        self.assertIn(shared_ab_1, uncertainties)
        self.assertIn(a_1, uncertainties)

        # test raises EMAError
        self.assertRaises(EMAError, ensemble._generate_experiments, 'a string',
                          UNION)