def it_can_add_observations_to_existing_profiles(self):
     matrix = ObservationMatrix([{'All': [PayoffData('A', 2, [12, 11])]},
                                 {'All': [PayoffData('A', 1, [23]), PayoffData('B', 1, [11])]},
                                 {'All': [PayoffData('B', 2, [13.3])]}])
     matrix.addObservations(Profile({'All': {'A': 1, 'B': 1}}),
                            {'All': [PayoffData('A', 1, [12, 11]), PayoffData('B', 1, [21, 17])]})
     assert matrix.getPayoffData(Profile({'All': {'A': 1, 'B': 1}}), 'All', 'B') == [11, 21, 17]
 def it_does_not_request_sampling_when_only_profiles_outside_target_set_have_too_much_variation_in_payoffs(self):
     matrix = ObservationMatrix()
     target_profile = Profile({'All': {'A': 2}})
     non_target_profile = Profile({'All': {'B': 2}})
     matrix.addObservations(target_profile, {'All': [PayoffData('A', 2, [10, 10.1, 10.2])]})
     matrix.addObservations(non_target_profile, {'All': [PayoffData('B', 2, [10, 20, 45])]})
     evaluator = StandardErrorEvaluator(1, [target_profile])
     assert evaluator.continue_sampling(matrix) == False
 def it_can_be_transformed_into_a_game(self):
     matrix = ObservationMatrix([{'R1': [PayoffData('A', 1, [12, 11])],
                                  'R2': [PayoffData('C', 2, [15, 16])]},
                                 {'R1': [PayoffData('B', 1, [11])],
                                  'R2': [PayoffData('C', 1, [23]), PayoffData('D', 1, [17])]}])
     game = matrix.toGame()
     assert game.getPayoff(Profile({'R1': {'B': 1}, 'R2': {'C': 1, 'D': 1}}), 'R2', 'D') == 17
     assert game.getPayoff(Profile({'R1': {'A': 1}, 'R2': {'C': 2}}), 'R2', 'C') == 15.5
     assert len(game.knownProfiles()) == 2
     assert game.roles == ['R1', 'R2']
     assert game.players == {'R1': 1, 'R2': 2}
     assert game.strategies == {'R1': ('A', 'B'), 'R2': ('C', 'D')}
def add_noise_sequentially(game, model, evaluator, samples_per_step):
    """
    Generate ObservationMatrix sequentially with bimodal gaussian noise added to each payoff.
    
    game: a RSG.Game or RSG.SampleGame
    model: noise model
    samples_per_step: the parameters passed to the noise function
    evaluator: the method used to determine when to stop sampling
    """
    matrix = ObservationMatrix()
    count = 0
    while evaluator.continue_sampling(matrix) and count < 1000:
        for prof in game.knownProfiles():
            matrix.addObservations(prof, model.generate_samples(game, prof, samples_per_step))
        count += samples_per_step
        print count
    return [matrix, evaluator.equilibria()]
 def it_can_return_requested_profile_observations(self):
     matrix = ObservationMatrix([{'All': [PayoffData('A', 2, [12, 11])]},
                                 {'All': [PayoffData('A', 1, [23]), PayoffData('B', 1, [11])]},
                                 {'All': [PayoffData('B', 2, [13.3])]}])
     assert matrix.getPayoffData(Profile({'All': {'A': 2}}), 'All', 'A') == [12, 11]
     assert matrix.getPayoffData(Profile({'All': {'A': 1, 'B': 1}}), 'All', 'B') == [11]
 def it_can_add_observations_for_previously_unobserved_profiles(self):
     matrix = ObservationMatrix()
     matrix.addObservations(Profile({'All': {'A': 1, 'B': 1}}),
                            {'All': [PayoffData('A', 1, [12, 11]), PayoffData('B', 1, [21, 17])]})
     assert matrix.getPayoffData(Profile({'All': {'A': 1, 'B': 1}}), 'All', 'B') == [21, 17]