def test_get_running_job(self): self.job.status = 'pending' self.job.save() # No 'JobCompletedError' should be raised. job_ctxt = tasks.get_running_job(self.job.id) self.assertEqual(self.params, job_ctxt.params) self.assertTrue(model_equals( self.job_profile, job_ctxt.oq_job_profile, ignore=('_owner_cache',))) self.assertTrue(model_equals( self.job, job_ctxt.oq_job, ignore=('_owner_cache',)))
def test_get_running_job(self): self.job.status = 'pending' self.job.save() # No 'JobCompletedError' should be raised. job_ctxt = tasks.get_running_job(self.job.id) self.assertEqual(self.params, job_ctxt.params) self.assertTrue( model_equals(self.job_profile, job_ctxt.oq_job_profile, ignore=('_owner_cache', ))) self.assertTrue( model_equals(self.job, job_ctxt.oq_job, ignore=('_owner_cache', )))
def test_get_running_calculation(self): self.calculation.status = 'pending' self.calculation.save() # No 'JobCompletedError' should be raised. calc_proxy = tasks.get_running_calculation(self.calculation.id) self.assertEqual(self.params, calc_proxy.params) self.assertTrue(model_equals( self.job_profile, calc_proxy.oq_job_profile, ignore=('_owner_cache',))) self.assertTrue(model_equals( self.calculation, calc_proxy.oq_calculation, ignore=('_owner_cache',)))
def test_model_equals_with_geometry(self): gmf_data_1 = models.GmfData(ground_motion=5.0, location=GEOSGeometry("POINT (30.0 10.0)")) gmf_data_2 = models.GmfData(ground_motion=5.0, location=GEOSGeometry("POINT (30.0 10.0)")) self.assertTrue(models.model_equals(gmf_data_1, gmf_data_2))
def test_model_equals_with_geometry(self): gmf_data_1 = GmfData( ground_motion=5.0, location=GEOSGeometry("POINT (30.0 10.0)")) gmf_data_2 = GmfData( ground_motion=5.0, location=GEOSGeometry("POINT (30.0 10.0)")) self.assertTrue(model_equals(gmf_data_1, gmf_data_2))
def test_model_equals_with_different_geometry(self): gmf_data_1 = models.GmfData( ground_motion=5.0, location=GEOSGeometry("POINT (30.0 10.0)")) gmf_data_2 = models.GmfData( ground_motion=5.0, location=GEOSGeometry("POINT (30.0 10.1)")) self.assertFalse(models.model_equals(gmf_data_1, gmf_data_2))
def test_model_equals_ignore_id(self): """Comparing two models with different ids is a special case, thus a separate test. This is a special case because it is very likely that we could have multiple records with the same contents but different ids. An example of this would be two :class:`openquake.db.models.OqJobProfile` records that contain the exact same config parameters, just different database ids. """ self.o1.id = 1 self.o2.id = 2 self.assertTrue(models.model_equals(self.o1, self.o2, ignore=('id',)))
def test_model_equals_ignore_id(self): """Comparing two models with different ids is a special case, thus a separate test. This is a special case because it is very likely that we could have multiple records with the same contents but different ids. An example of this would be two :class:`openquake.db.models.OqJobProfile` records that contain the exact same config parameters, just different database ids. """ self.o1.id = 1 self.o2.id = 2 self.assertTrue(models.model_equals(self.o1, self.o2, ignore=('id', )))
def test__state_is_always_ignored(self): # Set some fake _state values on the model objects: self.o1._state = 'fake_state' self.o2._state = 'other_fake_state' # Sanity check: make sure _state is in the object dict. self.assertTrue('_state' in self.o1.__dict__) self.assertTrue('_state' in self.o2.__dict__) # Sanity check 2: Make sure the object dict _state is correctly set. self.assertEquals('fake_state', self.o1.__dict__['_state']) self.assertEquals('other_fake_state', self.o2.__dict__['_state']) # Now finally compare the two objects: self.assertTrue(models.model_equals(self.o1, self.o2))
def test_model_equals_with_many_ignores(self): self.o1.name = 'something different' self.o1.url = 'http://www.somethingdiff.com' self.assertTrue( models.model_equals(self.o1, self.o2, ignore=('name', 'url')))
def test_model_equals_with_ignore(self): self.o1.name = 'something different' self.assertTrue( models.model_equals(self.o1, self.o2, ignore=('name',)))
def test_model_equals_with_different_values(self): self.o1.name = 'something different' self.assertFalse(models.model_equals(self.o1, self.o2))
def test_model_equals(self): self.assertTrue(models.model_equals(self.o1, self.o2))
def test_model_equals_with_ignore(self): self.o1.name = 'something different' self.assertTrue( models.model_equals(self.o1, self.o2, ignore=('name', )))
def test_model_equals_different_classes(self): gmf = models.GmfData(ground_motion=1.0) self.assertFalse(models.model_equals(self.o1, gmf))
def test_model_equals_with_invalid_ignores(self): self.assertTrue( models.model_equals(self.o1, self.o2, ignore=('not_an_attr', )))
def test_model_equals_with_invalid_ignores(self): self.assertTrue(models.model_equals( self.o1, self.o2, ignore=('not_an_attr',)))
def test_import_job_profile(self): # Given a path to a demo config file, ensure that the appropriate # database record for OqJobProfile is created. # At the moment, the api function used to import the job profile also # returns a dict of the config params and a list of config file # sections. cfg_path = helpers.demo_file('HazardMapTest/config.gem') # Default 'openquake' user: owner = helpers.default_user() smlt_input = models.Input( owner=helpers.default_user(), path=os.path.abspath(helpers.demo_file( 'HazardMapTest/source_model_logic_tree.xml')), input_type='lt_source', size=671) gmpelt_input = models.Input( owner=helpers.default_user(), path=os.path.abspath(helpers.demo_file( 'HazardMapTest/gmpe_logic_tree.xml')), input_type='lt_gmpe', size=709) src_model_input = models.Input( owner=helpers.default_user(), path=os.path.abspath(helpers.demo_file( 'HazardMapTest/source_model.xml')), input_type='source', size=1644) expected_inputs_map = dict( lt_source=smlt_input, lt_gmpe=gmpelt_input, source=src_model_input) expected_jp = models.OqJobProfile( owner=owner, calc_mode='classical', job_type=['hazard'], region=GEOSGeometry( 'POLYGON((-122.2 37.6, -122.2 38.2, ' '-121.5 38.2, -121.5 37.6, -122.2 37.6))'), region_grid_spacing=0.01, min_magnitude=5.0, investigation_time=50.0, maximum_distance=200.0, component='gmroti50', imt='pga', period=None, damping=None, truncation_type='twosided', truncation_level=3.0, imls=[ 0.005, 0.007, 0.0098, 0.0137, 0.0192, 0.0269, 0.0376, 0.0527, 0.0738, 0.103, 0.145, 0.203, 0.284, 0.397, 0.556, 0.778, 1.09], poes=[0.1], realizations=1, depth_to_1pt_0km_per_sec=100.0, vs30_type='measured', source_model_lt_random_seed=23, gmpe_lt_random_seed=5, width_of_mfd_bin=0.1, standard_deviation_type='total', reference_vs30_value=760.0, reference_depth_to_2pt5km_per_sec_param=5.0, sadigh_site_type='rock', # area sources: include_area_sources=True, treat_area_source_as='pointsources', area_source_discretization=0.1, area_source_magnitude_scaling_relationship=( 'W&C 1994 Mag-Length Rel.'), # point sources: include_grid_sources=False, treat_grid_source_as='pointsources', grid_source_magnitude_scaling_relationship=( 'W&C 1994 Mag-Length Rel.'), # simple faults: include_fault_source=True, fault_rupture_offset=1.0, fault_surface_discretization=1.0, fault_magnitude_scaling_relationship='Wells & Coppersmith (1994)', fault_magnitude_scaling_sigma=0.0, rupture_aspect_ratio=2.0, rupture_floating_type='downdip', # complex faults: include_subduction_fault_source=False, subduction_fault_rupture_offset=10.0, subduction_fault_surface_discretization=10.0, subduction_fault_magnitude_scaling_relationship=( 'W&C 1994 Mag-Length Rel.'), subduction_fault_magnitude_scaling_sigma=0.0, subduction_rupture_aspect_ratio=1.5, subduction_rupture_floating_type='downdip', quantile_levels=[], compute_mean_hazard_curve=True) expected_sections = ['HAZARD', 'general'] expected_params = { 'AREA_SOURCE_DISCRETIZATION': '0.1', 'AREA_SOURCE_MAGNITUDE_SCALING_RELATIONSHIP': 'W&C 1994 Mag-Length Rel.', 'BASE_PATH': os.path.abspath(helpers.demo_file('HazardMapTest')), 'CALCULATION_MODE': 'Classical', 'COMPONENT': 'Average Horizontal (GMRotI50)', 'COMPUTE_MEAN_HAZARD_CURVE': 'true', 'DAMPING': '5.0', 'DEPTHTO1PT0KMPERSEC': '100.0', 'FAULT_MAGNITUDE_SCALING_RELATIONSHIP': 'Wells & Coppersmith (1994)', 'FAULT_MAGNITUDE_SCALING_SIGMA': '0.0', 'FAULT_RUPTURE_OFFSET': '1.0', 'FAULT_SURFACE_DISCRETIZATION': '1.0', 'GMPE_LOGIC_TREE_FILE': os.path.abspath( helpers.demo_file('HazardMapTest/gmpe_logic_tree.xml')), 'GMPE_LT_RANDOM_SEED': '5', 'GMPE_TRUNCATION_TYPE': '2 Sided', 'GRID_SOURCE_MAGNITUDE_SCALING_RELATIONSHIP': 'W&C 1994 Mag-Length Rel.', 'INCLUDE_AREA_SOURCES': 'true', 'INCLUDE_FAULT_SOURCE': 'true', 'INCLUDE_GRID_SOURCES': 'false', 'INCLUDE_SUBDUCTION_FAULT_SOURCE': 'false', 'INTENSITY_MEASURE_LEVELS': ( '0.005, 0.007, 0.0098, 0.0137, 0.0192, 0.0269, 0.0376, 0.0527,' ' 0.0738, 0.103, 0.145, 0.203, 0.284, 0.397, 0.556, 0.778,' ' 1.09'), 'INTENSITY_MEASURE_TYPE': 'PGA', 'INVESTIGATION_TIME': '50.0', 'MAXIMUM_DISTANCE': '200.0', 'MINIMUM_MAGNITUDE': '5.0', 'NUMBER_OF_LOGIC_TREE_SAMPLES': '1', 'OUTPUT_DIR': 'computed_output', 'PERIOD': '0.0', 'POES': '0.1', 'QUANTILE_LEVELS': '', 'REFERENCE_DEPTH_TO_2PT5KM_PER_SEC_PARAM': '5.0', 'REFERENCE_VS30_VALUE': '760.0', 'REGION_GRID_SPACING': '0.01', 'REGION_VERTEX': '37.6, -122.2, 38.2, -122.2, 38.2, -121.5, 37.6, -121.5', 'RUPTURE_ASPECT_RATIO': '2.0', 'RUPTURE_FLOATING_TYPE': 'Along strike and down dip', 'SADIGH_SITE_TYPE': 'Rock', 'SOURCE_MODEL_LOGIC_TREE_FILE': os.path.abspath( helpers.demo_file( 'HazardMapTest/source_model_logic_tree.xml')), 'SOURCE_MODEL_LT_RANDOM_SEED': '23', 'STANDARD_DEVIATION_TYPE': 'Total', 'SUBDUCTION_FAULT_MAGNITUDE_SCALING_RELATIONSHIP': 'W&C 1994 Mag-Length Rel.', 'SUBDUCTION_FAULT_MAGNITUDE_SCALING_SIGMA': '0.0', 'SUBDUCTION_FAULT_RUPTURE_OFFSET': '10.0', 'SUBDUCTION_FAULT_SURFACE_DISCRETIZATION': '10.0', 'SUBDUCTION_RUPTURE_ASPECT_RATIO': '1.5', 'SUBDUCTION_RUPTURE_FLOATING_TYPE': 'Along strike and down dip', 'TREAT_AREA_SOURCE_AS': 'Point Sources', 'TREAT_GRID_SOURCE_AS': 'Point Sources', 'TRUNCATION_LEVEL': '3', 'VS30_TYPE': 'measured', 'WIDTH_OF_MFD_BIN': '0.1'} actual_jp, params, sections = engine.import_job_profile( cfg_path, self.job) self.assertEquals(expected_params, params) self.assertEquals(expected_sections, sections) # Test the OqJobProfile: self.assertTrue( models.model_equals(expected_jp, actual_jp, ignore=( 'id', 'last_update', '_owner_cache'))) # Test the Inputs: actual_inputs = models.inputs4job(self.job.id) self.assertEquals(3, len(actual_inputs)) for act_inp in actual_inputs: exp_inp = expected_inputs_map[act_inp.input_type] self.assertTrue( models.model_equals(exp_inp, act_inp, ignore=('id', 'last_update', '_owner_cache')))
def test_import_job_profile(self): # Given a path to a demo config file, ensure that the appropriate # database record for OqJobProfile is created. # At the moment, the api function used to import the job profile also # returns a dict of the config params and a list of config file # sections. cfg_path = helpers.demo_file('HazardMapTest/config.gem') # Default 'openquake' user: owner = helpers.default_user() smlt_input = models.Input( owner=helpers.default_user(), path=os.path.abspath(helpers.demo_file( 'HazardMapTest/source_model_logic_tree.xml')), input_type='lt_source', size=671, digest="4372d13cec89f2a1072a2c7c694656d0") gmpelt_input = models.Input( owner=helpers.default_user(), path=os.path.abspath(helpers.demo_file( 'HazardMapTest/gmpe_logic_tree.xml')), input_type='lt_gmpe', size=709, digest="d9ece248a1e73ee25bd5964670282012") src_model_input = models.Input( owner=helpers.default_user(), path=os.path.abspath(helpers.demo_file( 'HazardMapTest/source_model.xml')), input_type='source', size=1644, digest="3118538b30b69289e6ea47967e9f51aa") expected_inputs_map = dict( lt_source=smlt_input, lt_gmpe=gmpelt_input, source=src_model_input) expected_jp = models.OqJobProfile( owner=owner, calc_mode='classical', job_type=['hazard'], region=GEOSGeometry( 'POLYGON((-122.2 37.6, -122.2 38.2, ' '-121.5 38.2, -121.5 37.6, -122.2 37.6))'), region_grid_spacing=0.01, min_magnitude=5.0, investigation_time=50.0, maximum_distance=200.0, component='gmroti50', imt='pga', period=None, damping=None, truncation_type='twosided', truncation_level=3.0, imls=[ 0.005, 0.007, 0.0098, 0.0137, 0.0192, 0.0269, 0.0376, 0.0527, 0.0738, 0.103, 0.145, 0.203, 0.284, 0.397, 0.556, 0.778, 1.09], poes=[0.1], realizations=1, depth_to_1pt_0km_per_sec=100.0, vs30_type='measured', source_model_lt_random_seed=23, gmpe_lt_random_seed=5, width_of_mfd_bin=0.1, standard_deviation_type='total', reference_vs30_value=760.0, reference_depth_to_2pt5km_per_sec_param=5.0, sadigh_site_type='rock', # area sources: include_area_sources=True, treat_area_source_as='pointsources', area_source_discretization=0.1, area_source_magnitude_scaling_relationship=( 'W&C 1994 Mag-Length Rel.'), # point sources: include_grid_sources=False, treat_grid_source_as='pointsources', grid_source_magnitude_scaling_relationship=( 'W&C 1994 Mag-Length Rel.'), # simple faults: include_fault_source=True, fault_rupture_offset=1.0, fault_surface_discretization=1.0, fault_magnitude_scaling_relationship='Wells & Coppersmith (1994)', fault_magnitude_scaling_sigma=0.0, rupture_aspect_ratio=2.0, rupture_floating_type='downdip', # complex faults: include_subduction_fault_source=False, subduction_fault_rupture_offset=10.0, subduction_fault_surface_discretization=10.0, subduction_fault_magnitude_scaling_relationship=( 'W&C 1994 Mag-Length Rel.'), subduction_fault_magnitude_scaling_sigma=0.0, subduction_rupture_aspect_ratio=1.5, subduction_rupture_floating_type='downdip', quantile_levels=[], compute_mean_hazard_curve=True) expected_sections = ['HAZARD', 'general'] expected_params = { 'AREA_SOURCE_DISCRETIZATION': '0.1', 'AREA_SOURCE_MAGNITUDE_SCALING_RELATIONSHIP': 'W&C 1994 Mag-Length Rel.', 'BASE_PATH': os.path.abspath(helpers.demo_file('HazardMapTest')), 'CALCULATION_MODE': 'Classical', 'COMPONENT': 'Average Horizontal (GMRotI50)', 'COMPUTE_MEAN_HAZARD_CURVE': 'true', 'DAMPING': '5.0', 'DEPTHTO1PT0KMPERSEC': '100.0', 'FAULT_MAGNITUDE_SCALING_RELATIONSHIP': 'Wells & Coppersmith (1994)', 'FAULT_MAGNITUDE_SCALING_SIGMA': '0.0', 'FAULT_RUPTURE_OFFSET': '1.0', 'FAULT_SURFACE_DISCRETIZATION': '1.0', 'GMPE_LOGIC_TREE_FILE': os.path.abspath( helpers.demo_file('HazardMapTest/gmpe_logic_tree.xml')), 'GMPE_LT_RANDOM_SEED': '5', 'GMPE_TRUNCATION_TYPE': '2 Sided', 'GRID_SOURCE_MAGNITUDE_SCALING_RELATIONSHIP': 'W&C 1994 Mag-Length Rel.', 'INCLUDE_AREA_SOURCES': 'true', 'INCLUDE_FAULT_SOURCE': 'true', 'INCLUDE_GRID_SOURCES': 'false', 'INCLUDE_SUBDUCTION_FAULT_SOURCE': 'false', 'INTENSITY_MEASURE_LEVELS': ( '0.005, 0.007, 0.0098, 0.0137, 0.0192, 0.0269, 0.0376, 0.0527,' ' 0.0738, 0.103, 0.145, 0.203, 0.284, 0.397, 0.556, 0.778,' ' 1.09'), 'INTENSITY_MEASURE_TYPE': 'PGA', 'INVESTIGATION_TIME': '50.0', 'MAXIMUM_DISTANCE': '200.0', 'MINIMUM_MAGNITUDE': '5.0', 'NUMBER_OF_LOGIC_TREE_SAMPLES': '1', 'OUTPUT_DIR': 'computed_output', 'PERIOD': '0.0', 'POES': '0.1', 'QUANTILE_LEVELS': '', 'REFERENCE_DEPTH_TO_2PT5KM_PER_SEC_PARAM': '5.0', 'REFERENCE_VS30_VALUE': '760.0', 'REGION_GRID_SPACING': '0.01', 'REGION_VERTEX': '37.6, -122.2, 38.2, -122.2, 38.2, -121.5, 37.6, -121.5', 'RUPTURE_ASPECT_RATIO': '2.0', 'RUPTURE_FLOATING_TYPE': 'Along strike and down dip', 'SADIGH_SITE_TYPE': 'Rock', 'SOURCE_MODEL_LOGIC_TREE_FILE': os.path.abspath( helpers.demo_file( 'HazardMapTest/source_model_logic_tree.xml')), 'SOURCE_MODEL_LT_RANDOM_SEED': '23', 'STANDARD_DEVIATION_TYPE': 'Total', 'SUBDUCTION_FAULT_MAGNITUDE_SCALING_RELATIONSHIP': 'W&C 1994 Mag-Length Rel.', 'SUBDUCTION_FAULT_MAGNITUDE_SCALING_SIGMA': '0.0', 'SUBDUCTION_FAULT_RUPTURE_OFFSET': '10.0', 'SUBDUCTION_FAULT_SURFACE_DISCRETIZATION': '10.0', 'SUBDUCTION_RUPTURE_ASPECT_RATIO': '1.5', 'SUBDUCTION_RUPTURE_FLOATING_TYPE': 'Along strike and down dip', 'TREAT_AREA_SOURCE_AS': 'Point Sources', 'TREAT_GRID_SOURCE_AS': 'Point Sources', 'TRUNCATION_LEVEL': '3', 'VS30_TYPE': 'measured', 'WIDTH_OF_MFD_BIN': '0.1'} actual_jp, params, sections = engine.import_job_profile( cfg_path, self.job) self.assertEqual(expected_params, params) self.assertEqual(expected_sections, sections) # Test the OqJobProfile: self.assertTrue( models.model_equals(expected_jp, actual_jp, ignore=( 'id', 'last_update', '_owner_cache'))) # Test the Inputs: actual_inputs = models.inputs4job(self.job.id) self.assertEqual(3, len(actual_inputs)) for act_inp in actual_inputs: exp_inp = expected_inputs_map[act_inp.input_type] self.assertTrue( models.model_equals( exp_inp, act_inp, ignore=( "id", "last_update", "path", "model", "_owner_cache", "owner_id", "model_content_id")))