def test_no_match(self): """ Test limit situations where no harmonization should happen """ # conversion provided applies to a different domain h = Harmoniser(target_scale=self.target_scale) self.a_conversion.update({'domain': []}) h.add_conversion_formula(**self.a_conversion) converted, unconverted = h.harmonise(self.measures) # 1/3 of the measures are already in the target_scale self.assertEqual(self.number_of_measures / 3, len(converted)) self.assertEqual(self.number_of_measures * 2 / 3, len(unconverted)) # no conversion are provided h = Harmoniser(target_scale=self.target_scale) converted, unconverted = h.harmonise(self.measures) self.assertEqual(self.number_of_measures / 3, len(converted)) self.assertEqual(self.number_of_measures * 2 / 3, len(unconverted)) # no conversion matches the target scale h = Harmoniser(target_scale="wrong scale") h.add_conversion_formula(**self.a_conversion) converted, unconverted = h.harmonise(self.measures) self.assertEqual(0, len(converted)) self.assertEqual(self.number_of_measures, len(unconverted))
def test_no_match(self): """ Test limit situations where no harmonization should happen """ # model provided does not convert from the native magnitude scale for measure in self.measures: measure.scale = "fake scale" h = Harmoniser(target_scale=self.target_scale) h.add_conversion_formula_from_model(self.a_model) converted, unconverted = h.harmonise(self.measures) self.assertEqual(0, len(converted)) self.assertEqual(self.number_of_measures, len(unconverted)) # no model are provided h = Harmoniser(target_scale=self.target_scale) converted, unconverted = h.harmonise(self.measures) self.assertEqual(0, len(converted)) self.assertEqual(self.number_of_measures, len(unconverted)) # no model matches the target scale h = Harmoniser(target_scale="wrong scale") h.add_conversion_formula_from_model(self.a_model) converted, unconverted = h.harmonise(self.measures) self.assertEqual(0, len(converted)) self.assertEqual(self.number_of_measures, len(unconverted))
def test_conversion(self): h = Harmoniser(target_scale=self.target_scale) h.add_conversion_formula(formula=lambda x: x * 2, module_error=0.2, domain=C(agency__in=['LDG', 'NEIC']), target_scale=self.target_scale) converted, unconverted = h.harmonise(self.measures) self.assertConversion(converted, 6, unconverted, 24)
def test_conversion_not_trivial_same_native_and_target_scale(self): h = Harmoniser(target_scale=self.target_scale) my_measure = self.measures[20] h.add_conversion_formula( lambda x: x * 2, 0.1, domain=C(scale="Mw"), target_scale="Mw") result = h.harmonise([my_measure], allow_trivial_conversion=False) self.assertEqual(1, len(result.converted)) self.assertEqual(0, len(result.unconverted)) self.assertAlmostEqual(my_measure.value * 2, result.converted[my_measure].value)
def test_one_conversion(self): """ Test with one conversion. Given a target scale, a list of measures (in a single magnitude scales), and an empirical magnitude scaling relationship (between a native scale mb and the considered target scale), an Harmoniser should convert to the target scale only the measure in that native scale """ mismatches = self.number_of_measures / 3 h = Harmoniser(target_scale=self.target_scale) h.add_conversion_formula(**self.a_conversion) converted, unconverted = h.harmonise(self.measures) self.assertConversion(converted, self.number_of_measures - mismatches, unconverted, mismatches)
def test_disallow_trivial_conversion(self): h = Harmoniser(target_scale=self.target_scale) h.add_conversion_formula_from_model(self.a_model) h.add_conversion_formula_from_model(self.ya_model) converted, unconverted = h.harmonise(self.measures, allow_trivial_conversion=False) self.assertConversion(converted, 20, unconverted, 10)
def test_more_model(self): h = Harmoniser(target_scale=self.target_scale) h.add_conversion_formula_from_model(self.a_model) h.add_conversion_formula_from_model(self.ya_model) converted, unconverted = h.harmonise(self.measures) self.assertConversion(converted, self.number_of_measures, unconverted, 0)
def test_disallow_trivial_conversion(self): h = Harmoniser(target_scale=self.target_scale) h.add_conversion_formula_from_model(self.a_model, C(scale=self.a_native_scale)) h.add_conversion_formula_from_model(self.ya_model, C(scale=self.ya_native_scale)) result = h.harmonise(self.measures, allow_trivial_conversion=False) self.assertConversion(result, 20, 10)
def test_more_conversion(self): """ Test with several conversions """ h = Harmoniser(target_scale=self.target_scale) h.add_conversion_formula(**self.a_conversion) h.add_conversion_formula(**self.ya_conversion) result = h.harmonise(self.measures) self.assertConversion(result, self.number_of_measures, 0)
def test_more_model(self): h = Harmoniser(target_scale=self.target_scale) h.add_conversion_formula_from_model(self.a_model, C(scale=self.a_native_scale)) h.add_conversion_formula_from_model(self.ya_model, C(scale=self.ya_native_scale)) result = h.harmonise(self.measures) self.assertConversion(result, self.number_of_measures, 0)
def test_conversion(self): h = Harmoniser(target_scale=self.target_scale) h.add_conversion_formula(formula=lambda x: x * 2., module_error=0.2, domain=C(scale=self.a_native_scale), target_scale="M2") h.add_conversion_formula(formula=lambda x: x * 3., module_error=0.1, domain=C(scale=self.ya_native_scale), target_scale="M3") h.add_conversion_formula(formula=lambda x: x * 3., module_error=0.2, domain=C(scale="M3"), target_scale="M2") h.add_conversion_formula(formula=lambda x: x * 4., module_error=0.3, domain=C(scale="M2"), target_scale=self.target_scale) h.add_conversion_formula(formula=lambda x: x * 4., module_error=0.4, domain=C(scale="M2"), target_scale="M4") h.add_conversion_formula(formula=lambda x: x * 4., module_error=0.2, domain=C(scale="M2"), target_scale="M5") converted, unconverted = h.harmonise(self.measures) self.assertEqual(30, len(converted)) self.assertEqual(0, len(unconverted)) for measure in self.measures: self.assertTrue(measure in converted) converted_measure = converted[measure] if measure.scale == self.a_native_scale: self.assertEqual(2, len(converted_measure['formulas'])) self.assertAlmostEqual(converted_measure['measure'].value, measure.value * 8) elif measure.scale == self.target_scale: self.assertEqual(converted_measure['formulas'], []) self.assertAlmostEqual(converted_measure['measure'].value, measure.value) elif measure.scale == self.ya_native_scale: self.assertEqual(3, len(converted_measure['formulas'])) self.assertAlmostEqual(converted_measure['measure'].value, measure.value * 36)
def test_conversion(self): h = Harmoniser(target_scale=self.target_scale) h.add_conversion_formula(formula=lambda x: x * 2., model_error=0.2, domain=C(scale=self.a_native_scale), target_scale="M2") h.add_conversion_formula(formula=lambda x: x * 3., model_error=0.1, domain=C(scale=self.ya_native_scale), target_scale="M3") h.add_conversion_formula(formula=lambda x: x * 3., model_error=0.2, domain=C(scale="M3"), target_scale="M2") h.add_conversion_formula(formula=lambda x: x * 4., model_error=0.3, domain=C(scale="M2"), target_scale=self.target_scale) h.add_conversion_formula(formula=lambda x: x * 4., model_error=0.4, domain=C(scale="M2"), target_scale="M4") h.add_conversion_formula(formula=lambda x: x * 4., model_error=0.2, domain=C(scale="M2"), target_scale="M5") result = h.harmonise(self.measures) self.assertEqual(30, len(result.converted)) self.assertEqual(0, len(result.unconverted)) for measure in self.measures: converted_measure = result.converted[measure] if measure.scale == self.a_native_scale: self.assertAlmostEqual(converted_measure.value, measure.value * 8) elif measure.scale == self.target_scale: self.assertAlmostEqual(converted_measure.value, measure.value) elif measure.scale == self.ya_native_scale: self.assertEqual(3, len(converted_measure.formulas)) self.assertAlmostEqual( converted_measure.value, measure.value * 36)