class SamplesFromConfigTestCase(unittest.TestCase):
    """Tests for the functionality that reads the number of samples
    for the probabilistic scenario from the configuration file."""
    def setUp(self):
        self.mixin = ProbabilisticEventMixin()

    def test_without_parameter_we_use_the_default_value(self):
        self.assertEqual(None, self.mixin._get_number_of_samples())

    def test_with_empty_parameter_we_use_the_default_value(self):
        self.mixin.__dict__["PROB_NUM_OF_SAMPLES"] = ""
        self.assertEqual(None, self.mixin._get_number_of_samples())

    def test_we_use_the_parameter_when_specified(self):
        self.mixin.__dict__["PROB_NUM_OF_SAMPLES"] = \
                NUMBER_OF_SAMPLES_FROM_CONFIG

        self.assertEqual(int(NUMBER_OF_SAMPLES_FROM_CONFIG),
                         self.mixin._get_number_of_samples())

    def test_default_value_with_wrong_parameter(self):
        self.mixin.__dict__["PROB_NUM_OF_SAMPLES"] = "this-is-wrong"
        self.assertEqual(None, self.mixin._get_number_of_samples())
 def setUp(self):
     self.mixin = ProbabilisticEventMixin()
     self.mixin.params = {
         'NUMBER_OF_SEISMICITY_HISTORIES': 0,
         'NUMBER_OF_LOGIC_TREE_SAMPLES': 0,
         'INVESTIGATION_TIME': 0.0,
         'OUTPUT_DIR': 'foo',
     }
     self.mixin.serialize_results_to = ['db', 'xml']
     self.mixin.job_id = -1
     self.mixin.base_path = '/tmp'
     self.mixin.blocks_keys = []
     self.mixin.store_exposure_assets = lambda: None
     self.mixin.store_vulnerability_model = lambda: None
     self.mixin.partition = lambda: None
class LossMapCurveSerialization(unittest.TestCase):
    def setUp(self):
        self.mixin = ProbabilisticEventMixin()
        self.mixin.params = {
            'NUMBER_OF_SEISMICITY_HISTORIES': 0,
            'NUMBER_OF_LOGIC_TREE_SAMPLES': 0,
            'INVESTIGATION_TIME': 0.0,
            'OUTPUT_DIR': 'foo',
        }
        self.mixin.serialize_results_to = ['db', 'xml']
        self.mixin.job_id = -1
        self.mixin.base_path = '/tmp'
        self.mixin.blocks_keys = []
        self.mixin.store_exposure_assets = lambda: None
        self.mixin.store_vulnerability_model = lambda: None
        self.mixin.partition = lambda: None

    def test_loss_map_serialized_if_conditional_loss_poes(self):
        self.mixin.params['CONDITIONAL_LOSS_POE'] = '0.01 0.02'

        with patch('openquake.risk.job.probabilistic'
                   '.aggregate_loss_curve.plot_aggregate_curve'):
            with patch('openquake.output.risk.create_loss_map_writer') as clw:
                clw.return_value = None

                self.mixin.execute()
                self.assertTrue(clw.called)

    def test_loss_map_not_serialized_unless_conditional_loss_poes(self):
        with patch('openquake.risk.job.probabilistic'
                   '.aggregate_loss_curve.plot_aggregate_curve'):
            with patch('openquake.output.risk.create_loss_map_writer') as clw:
                clw.return_value = None

                self.mixin.execute()
                self.assertFalse(clw.called)
class SamplesFromConfigTestCase(unittest.TestCase):
    """Tests for the functionality that reads the number of samples
    for the probabilistic scenario from the configuration file."""

    def setUp(self):
        self.mixin = ProbabilisticEventMixin()

    def test_without_parameter_we_use_the_default_value(self):
        self.assertEqual(None, self.mixin._get_number_of_samples())

    def test_with_empty_parameter_we_use_the_default_value(self):
        self.mixin.__dict__["PROB_NUM_OF_SAMPLES"] = ""
        self.assertEqual(None, self.mixin._get_number_of_samples())

    def test_we_use_the_parameter_when_specified(self):
        self.mixin.__dict__["PROB_NUM_OF_SAMPLES"] = \
                NUMBER_OF_SAMPLES_FROM_CONFIG

        self.assertEqual(int(NUMBER_OF_SAMPLES_FROM_CONFIG),
                         self.mixin._get_number_of_samples())

    def test_default_value_with_wrong_parameter(self):
        self.mixin.__dict__["PROB_NUM_OF_SAMPLES"] = "this-is-wrong"
        self.assertEqual(None, self.mixin._get_number_of_samples())
 def setUp(self):
     self.mixin = ProbabilisticEventMixin()
 def setUp(self):
     self.mixin = ProbabilisticEventMixin()
 def setUp(self):
     self.exposure_parser = exposure.ExposurePortfolioFile(
         os.path.join(test.SCHEMA_EXAMPLES_DIR, TEST_FILE))
     self.mixin = ProbabilisticEventMixin()
class EpsilonTestCase(unittest.TestCase):
    """Tests the `epsilon` method in class `ProbabilisticEventMixin`"""

    def setUp(self):
        self.exposure_parser = exposure.ExposurePortfolioFile(
            os.path.join(test.SCHEMA_EXAMPLES_DIR, TEST_FILE))
        self.mixin = ProbabilisticEventMixin()

    def test_uncorrelated(self):
        """For uncorrelated jobs we sample epsilon values per asset.

        A new sample should be drawn for each asset irrespective of any
        building typology similarities.
        """
        samples = []
        for _, asset in self.exposure_parser:
            sample = self.mixin.epsilon(asset)
            self.assertTrue(
                sample not in samples,
                "%s is already in %s" % (sample, samples))
            self.assertTrue(
                isinstance(sample, float), "Invalid sample (%s)" % sample)
            samples.append(sample)

    def test_correlated(self):
        """For correlated jobs we sample epsilon values per building typology.

        A sample should be drawn whenever an asset with a new building typology
        is encountered. Assets of the same typology should share sample values.
        Please not that building typologies and structure categories are
        roughly equivalent.
        """
        samples = dict()
        self.mixin.__dict__["ASSET_CORRELATION"] = "perfect"
        for _, asset in self.exposure_parser:
            sample = self.mixin.epsilon(asset)
            category = asset["structureCategory"]
            # This is either the first time we see this structure category or
            # the sample is identical to the one originally drawn for this
            # structure category.
            if category not in samples:
                samples[category] = sample
            else:
                self.assertTrue(sample == samples[category])
        # Make sure we used at least two structure categories in this test.
        self.assertTrue(len(samples.keys()) > 1)
        # Are all samples valid values?
        for category, sample in samples.iteritems():
            self.assertTrue(
                isinstance(sample, float),
                "Invalid sample (%s) for category %s" % (sample, category))

    def test_incorrect_configuration_setting(self):
        """The correctness of the asset correlation configuration is enforced.

        If the `ASSET_CORRELATION` parameter is set in the job configuration
        file it should have a correct value ("perfect").
        """
        self.mixin.__dict__["ASSET_CORRELATION"] = "this-is-wrong"
        for _, asset in self.exposure_parser:
            self.assertRaises(ValueError, self.mixin.epsilon, asset)
            break

    def test_correlated_with_no_structure_category(self):
        """For correlated jobs assets require a structure category property."""
        self.mixin.__dict__["ASSET_CORRELATION"] = "perfect"
        for _, asset in self.exposure_parser:
            del asset["structureCategory"]
            e = self.assertRaises(ValueError, self.mixin.epsilon, asset)
            break
 def setUp(self):
     self.exposure_parser = exposure.ExposurePortfolioFile(
         os.path.join(test.SCHEMA_EXAMPLES_DIR, TEST_FILE))
     self.mixin = ProbabilisticEventMixin()
class EpsilonTestCase(unittest.TestCase):
    """Tests the `epsilon` method in class `ProbabilisticEventMixin`"""
    def setUp(self):
        self.exposure_parser = exposure.ExposurePortfolioFile(
            os.path.join(test.SCHEMA_EXAMPLES_DIR, TEST_FILE))
        self.mixin = ProbabilisticEventMixin()

    def test_uncorrelated(self):
        """For uncorrelated jobs we sample epsilon values per asset.

        A new sample should be drawn for each asset irrespective of any
        building typology similarities.
        """
        samples = []
        for _, asset in self.exposure_parser:
            sample = self.mixin.epsilon(asset)
            self.assertTrue(sample not in samples,
                            "%s is already in %s" % (sample, samples))
            self.assertTrue(isinstance(sample, float),
                            "Invalid sample (%s)" % sample)
            samples.append(sample)

    def test_correlated(self):
        """For correlated jobs we sample epsilon values per building typology.

        A sample should be drawn whenever an asset with a new building typology
        is encountered. Assets of the same typology should share sample values.
        Please not that building typologies and structure categories are
        roughly equivalent.
        """
        samples = dict()
        self.mixin.__dict__["ASSET_CORRELATION"] = "perfect"
        for _, asset in self.exposure_parser:
            sample = self.mixin.epsilon(asset)
            category = asset["structureCategory"]
            # This is either the first time we see this structure category or
            # the sample is identical to the one originally drawn for this
            # structure category.
            if category not in samples:
                samples[category] = sample
            else:
                self.assertTrue(sample == samples[category])
        # Make sure we used at least two structure categories in this test.
        self.assertTrue(len(samples.keys()) > 1)
        # Are all samples valid values?
        for category, sample in samples.iteritems():
            self.assertTrue(
                isinstance(sample, float),
                "Invalid sample (%s) for category %s" % (sample, category))

    def test_incorrect_configuration_setting(self):
        """The correctness of the asset correlation configuration is enforced.

        If the `ASSET_CORRELATION` parameter is set in the job configuration
        file it should have a correct value ("perfect").
        """
        self.mixin.__dict__["ASSET_CORRELATION"] = "this-is-wrong"
        for _, asset in self.exposure_parser:
            self.assertRaises(ValueError, self.mixin.epsilon, asset)
            break

    def test_correlated_with_no_structure_category(self):
        """For correlated jobs assets require a structure category property."""
        self.mixin.__dict__["ASSET_CORRELATION"] = "perfect"
        for _, asset in self.exposure_parser:
            del asset["structureCategory"]
            e = self.assertRaises(ValueError, self.mixin.epsilon, asset)
            break