def test_integration_y0(self): main_setting = setting.MainSetting.read_settings_yaml( Path('tests/data/ode/integration_y0.yml')) main_setting.trainer.gpu_id = 1 if main_setting.trainer.output_directory.exists(): shutil.rmtree(main_setting.trainer.output_directory) tr = trainer.Trainer(main_setting) loss = tr.train() self.assertLess(loss, 1e-2) ir = inferer.Inferer( main_setting, converter_parameters_pkl=main_setting.data.preprocessed_root / 'preprocessors.pkl') results = ir.infer( model=main_setting.trainer.output_directory, data_directories=main_setting.data.preprocessed_root / 'test') self.assertLess(results[0]['loss'], 1e-1) if PLOT: cmap = plt.get_cmap('tab10') for i, result in enumerate(results): plt.plot(result['dict_x']['t'][:, 0, 0], result['dict_x']['y0'][:, 0, 0], ':', color=cmap(i), label=f"y0 answer of data {i}") plt.plot(result['dict_x']['t'][:, 0, 0], result['dict_y']['y0'][:, 0, 0], color=cmap(i), label=f"y0 inferred of data {i}") plt.legend() plt.show()
def test_iso_gcn_rotation_thermal_stress_dict_input_dict_output(self): main_setting = setting.MainSetting.read_settings_yaml( Path('tests/data/rotation_thermal_stress' '/iso_gcn_dict_input_dict_output.yml')) tr = trainer.Trainer(main_setting) if tr.setting.trainer.output_directory.exists(): shutil.rmtree(tr.setting.trainer.output_directory) tr.train() # Confirm inference result has isometric equivariance original_path = Path( 'tests/data/rotation_thermal_stress/preprocessed/cube/original') transformed_paths = self.collect_transformed_paths( 'tests/data/rotation_thermal_stress/preprocessed/cube' '/*_transformed_*') ir = inferer.Inferer( main_setting, save=False, converter_parameters_pkl=Path( 'tests/data/rotation_thermal_stress/preprocessed' '/preprocessors.pkl')) model_directory = str(main_setting.trainer.output_directory) original_results = ir.infer(model=model_directory, data_directories=[original_path]) transformed_results = ir.infer(model=model_directory, data_directories=transformed_paths) self.validate_results(original_results, transformed_results, rank0='cnt_temperature', rank2='global_lte_mat')
def test_iso_gcn_rotation_thermal_stress_frame_rank2(self): main_setting = setting.MainSetting.read_settings_yaml( Path('tests/data/rotation_thermal_stress/iso_gcn_frame_rank2.yml')) tr = trainer.Trainer(main_setting) if tr.setting.trainer.output_directory.exists(): shutil.rmtree(tr.setting.trainer.output_directory) tr.train() # Confirm inference result has isometric invariance and equivariance original_path = Path( 'tests/data/rotation_thermal_stress/preprocessed/cube/original') transformed_paths = self.collect_transformed_paths( 'tests/data/rotation_thermal_stress/preprocessed/cube' '/*_transformed_*') ir = inferer.Inferer( main_setting, save=False, converter_parameters_pkl=Path( 'tests/data/rotation_thermal_stress/preprocessed' '/preprocessors.pkl')) model_directory = str(main_setting.trainer.output_directory) inference_outpout_directory = \ main_setting.trainer.output_directory / 'inferred' if inference_outpout_directory.exists(): shutil.rmtree(inference_outpout_directory) original_results = ir.infer(model=model_directory, data_directories=[original_path]) transformed_results = ir.infer(model=model_directory, data_directories=transformed_paths) self.validate_results(original_results, transformed_results, rank2='nodal_strain_mat', threshold_percent=.002)
def test_iso_gcn_rank0_rank0(self): main_setting = setting.MainSetting.read_settings_yaml( Path('tests/data/rotation/iso_gcn_rank0_rank0.yml')) tr = trainer.Trainer(main_setting) if tr.setting.trainer.output_directory.exists(): shutil.rmtree(tr.setting.trainer.output_directory) loss = tr.train() np.testing.assert_array_less(loss, 1.) self.assertEqual(len(tr.model.dict_block['ISO_GCN1'].subchains), 1) self.assertEqual(len(tr.model.dict_block['ISO_GCN2'].subchains), 1) # Confirm results does not change under rigid body transformation original_path = Path( 'tests/data/rotation/preprocessed/cube/clscale1.0/original') transformed_paths = self.collect_transformed_paths( 'tests/data/rotation/preprocessed/cube/clscale1.0/rotated') ir = inferer.Inferer( main_setting, save=False, converter_parameters_pkl=Path( 'tests/data/rotation/preprocessed/preprocessors.pkl')) model_directory = str(main_setting.trainer.output_directory) original_results = ir.infer(model=model_directory, data_directories=[original_path]) transformed_results = ir.infer(model=model_directory, data_directories=transformed_paths) self.validate_results(original_results, transformed_results, rank0='t_100')
def test_iso_gcn_rotation_thermal_stress_dict_input_list_output(self): main_setting = setting.MainSetting.read_settings_yaml( Path('tests/data/rotation_thermal_stress/iso_gcn_dict_input.yml')) tr = trainer.Trainer(main_setting) if tr.setting.trainer.output_directory.exists(): shutil.rmtree(tr.setting.trainer.output_directory) loss = tr.train() np.testing.assert_array_less(loss, 5.) # Confirm inference result has isometric equivariance original_path = Path( 'tests/data/rotation_thermal_stress/preprocessed/cube/original') transformed_paths = self.collect_transformed_paths( 'tests/data/rotation_thermal_stress/preprocessed/cube' '/*_transformed_*') ir = inferer.Inferer( main_setting, save=False, converter_parameters_pkl=Path( 'tests/data/rotation_thermal_stress/preprocessed' '/preprocessors.pkl')) model_directory = str(main_setting.trainer.output_directory) original_results = ir.infer(model=model_directory, data_directories=[original_path]) transformed_results = ir.infer(model=model_directory, data_directories=transformed_paths) self.validate_results(original_results, transformed_results, rank2='nodal_strain_mat', threshold_percent=2., decimal=1)
def test_iso_gcn_rotation_thermal_stress_rank2_rank0(self): main_setting = setting.MainSetting.read_settings_yaml( Path('tests/data/rotation_thermal_stress/iso_gcn_rank2_rank0.yml')) tr = trainer.Trainer(main_setting) if tr.setting.trainer.output_directory.exists(): shutil.rmtree(tr.setting.trainer.output_directory) loss = tr.train() np.testing.assert_array_less(loss, .5) # Confirm inference result has isometric invariance original_path = Path( 'tests/data/rotation_thermal_stress/preprocessed/cube/original') transformed_paths = self.collect_transformed_paths( 'tests/data/rotation_thermal_stress/preprocessed/cube' '/*_transformed_*') ir = inferer.Inferer( main_setting, save=False, converter_parameters_pkl=Path( 'tests/data/rotation_thermal_stress/preprocessed/' 'preprocessors.pkl')) model_directory = str(main_setting.trainer.output_directory) inference_outpout_directory = \ main_setting.trainer.output_directory / 'inferred' if inference_outpout_directory.exists(): shutil.rmtree(inference_outpout_directory) original_results = ir.infer(model=model_directory, data_directories=[original_path]) transformed_results = ir.infer(model=model_directory, data_directories=transformed_paths) self.validate_results(original_results, transformed_results, rank0='initial_temperature', decimal=5)
def test_infer_with_raw_data_wo_answer_w_model_directory(self): main_setting = setting.MainSetting.read_settings_yaml( Path('tests/data/deform/pretrained/settings.yml')) def conversion_function(fem_data, raw_directory=None): adj = fem_data.calculate_adjacency_matrix_element() nadj = prepost.normalize_adjacency_matrix(adj) return {'adj': adj, 'nadj': nadj} ir = inferer.Inferer( main_setting, conversion_function=conversion_function) ir.setting.inferer.converter_parameters_pkl = Path( 'tests/data/deform/preprocessed/preprocessors.pkl') ir.setting.inferer.save = False ir.setting.inferer.perform_preprocess = True if ir.setting.trainer.output_directory.exists(): shutil.rmtree(ir.setting.trainer.output_directory) res_from_raw = ir.infer( model=Path('tests/data/deform/pretrained'), data_directories=Path( 'tests/data/deform/external/tet2_4_modulusx0.9500')) ir.setting.inferer.perform_preprocess = False res_from_preprocessed = ir.infer( model=Path('tests/data/deform/pretrained'), data_directories=Path( 'tests/data/deform/preprocessed/test/tet2_4_modulusx0.9500')) np.testing.assert_almost_equal( res_from_raw[0]['dict_y']['elemental_stress'], res_from_preprocessed[0]['dict_y']['elemental_stress'], decimal=3)
def test_infer_to_write_simulation_file(self): main_setting = setting.MainSetting.read_settings_yaml( Path('tests/data/deform/incomplete_pretrained/settings.yml')) output_directory = Path('tests/data/deform/write_simulation') ir = inferer.Inferer(main_setting) if output_directory.exists(): shutil.rmtree(output_directory) ir.setting.inferer.converter_parameters_pkl = Path( 'tests/data/deform/preprocessed/preprocessors.pkl') ir.setting.inferer.output_directory = output_directory ir.setting.inferer.write_simulation_base = Path( 'tests/data/deform/raw') ir.setting.inferer.write_simulation = True ir.setting.inferer.write_simulation_type = 'ucd' res_from_preprocessed = ir.infer( model=Path('tests/data/deform/pretrained'), data_directories=Path( 'tests/data/deform/preprocessed/test/' 'tet2_4_modulusx0.9500')) fem_data = femio.FEMData.read_files( 'ucd', [output_directory / 'mesh.inp']) np.testing.assert_almost_equal( fem_data.elemental_data.get_attribute_data( 'inferred_elemental_stress'), res_from_preprocessed[0]['dict_y']['elemental_stress'], decimal=7) np.testing.assert_almost_equal( fem_data.elemental_data.get_attribute_data( 'difference_elemental_stress'), res_from_preprocessed[0]['dict_y']['elemental_stress'] - res_from_preprocessed[0]['dict_x']['elemental_stress'])
def test_infer_multiple_data(self): main_setting = setting.MainSetting.read_settings_yaml( Path('tests/data/deform/pretrained/settings.yml')) def conversion_function(fem_data, raw_directory=None): adj = fem_data.calculate_adjacency_matrix_element() nadj = prepost.normalize_adjacency_matrix(adj) return {'adj': adj, 'nadj': nadj} ir = inferer.Inferer( main_setting, conversion_function=conversion_function, converter_parameters_pkl=Path( 'tests/data/deform/preprocessed/preprocessors.pkl')) ir.setting.inferer.save = True ir.setting.inferer.perform_preprocess = False ir.setting.inferer.write_simulation = True ir.setting.inferer.write_simulation_base = Path( 'tests/data/deform/raw') ir.setting.inferer.write_simulation_type = 'ucd' output_directory_base = Path('tests/data/deform/inferred/multiple') if output_directory_base.exists(): shutil.rmtree(output_directory_base) res_from_raw = ir.infer( model=Path('tests/data/deform/pretrained'), data_directories=Path('tests/data/deform/preprocessed/test'), output_directory_base=output_directory_base) raw_directory_base = Path('tests/data/deform/raw/test') for i_data, data_basename in enumerate([ 'tet2_3_modulusx1.0500', 'tet2_4_modulusx0.9500']): raw_directory = glob.glob( str(raw_directory_base / f"**/{data_basename}"), recursive=True)[0] raw_fem_data = femio.FEMData.read_directory( 'fistr', raw_directory) inferred_directory = glob.glob( str(output_directory_base / f"**/{data_basename}"), recursive=True)[0] inferred_fem_data = femio.FEMData.read_directory( 'ucd', inferred_directory) np.testing.assert_almost_equal( inferred_fem_data.elemental_data.get_attribute_data( 'inferred_elemental_stress'), res_from_raw[i_data]['dict_y']['elemental_stress']) np.testing.assert_almost_equal( res_from_raw[i_data]['dict_x']['elemental_stress'], raw_fem_data.elemental_data.get_attribute_data( 'ElementalSTRESS'), decimal=2) np.testing.assert_almost_equal( inferred_fem_data.elemental_data.get_attribute_data( 'inferred_elemental_stress'), raw_fem_data.elemental_data.get_attribute_data( 'ElementalSTRESS'), decimal=-1) return
def test_infer_with_preprocessed_data(self): main_setting = setting.MainSetting.read_settings_yaml( Path('tests/data/linear/pretrained/settings.yml')) main_setting.inferer.converter_parameters_pkl = Path( 'tests/data/linear/preprocessed/preprocessors.pkl') main_setting.inferer.output_directory_root = Path( 'tests/data/linear/inferred') ir = inferer.Inferer(main_setting) if ir.setting.trainer.output_directory.exists(): shutil.rmtree(ir.setting.trainer.output_directory) res = ir.infer( model=Path('tests/data/linear/pretrained'), data_directories=Path('tests/data/linear/preprocessed/validation')) np.testing.assert_almost_equal( res[0]['dict_y']['y'], np.load('tests/data/linear/interim/validation/0/y.npy'), decimal=3) np.testing.assert_array_less(res[0]['loss'], 1e-7)
def test_infer_res_gcn(self): main_setting = setting.MainSetting.read_settings_yaml( Path('tests/data/deform/pretrained_res_gcn/settings.yml')) ir = inferer.Inferer(main_setting) if ir.setting.trainer.output_directory.exists(): shutil.rmtree(ir.setting.trainer.output_directory) ir.setting.inferer.converter_parameters_pkl = Path( 'tests/data/deform/preprocessed/preprocessors.pkl') preprocessed_data_directory = Path( 'tests/data/deform/preprocessed/train/tet2_3_modulusx1.0000') res = ir.infer( model=Path('tests/data/deform/pretrained_res_gcn'), data_directories=preprocessed_data_directory) np.testing.assert_almost_equal( res[0]['dict_y']['elemental_stress'] * 1e-5, np.load( 'tests/data/deform/interim/train' '/tet2_3_modulusx1.0000/elemental_stress.npy') * 1e-5, decimal=3) np.testing.assert_array_less(res[0]['loss'], 1e-3)
def test_iso_gcn_inverse_invariant(self): main_setting = setting.MainSetting.read_settings_yaml( Path('tests/data/rotation_thermal_stress' '/iso_gcn_rank0_rank0_inverse.yml')) tr = trainer.Trainer(main_setting) if tr.setting.trainer.output_directory.exists(): shutil.rmtree(tr.setting.trainer.output_directory) loss = tr.train() np.testing.assert_array_less(loss, 5.) # Confirm inference result has isometric invariance original_path = Path( 'tests/data/rotation_thermal_stress/preprocessed/cube/original') transformed_paths = self.collect_transformed_paths( 'tests/data/rotation_thermal_stress/preprocessed/cube' '/*_transformed_*') ir = inferer.Inferer( main_setting, save=False, converter_parameters_pkl=Path( 'tests/data/rotation_thermal_stress/preprocessed' '/preprocessors.pkl')) model_directory = str(main_setting.trainer.output_directory) inference_outpout_directory = \ main_setting.trainer.output_directory / 'inferred' if inference_outpout_directory.exists(): shutil.rmtree(inference_outpout_directory) original_results = ir.infer(model=model_directory, data_directories=[original_path]) transformed_results = ir.infer(model=model_directory, data_directories=transformed_paths) # NOTE: LTE is not invariant, but just to validate IsoGCN invariance, # we use it. self.validate_results(original_results, transformed_results, rank0='global_lte_array', validate_x=False)
def test_infer_encrypted_data(self): encrypt_key = Random.get_random_bytes(16) deploy_wo_encrypt_directory = Path( 'tests/data/linear/deploy_wo_encrypt') deploy_w_encrypt_directory = Path('tests/data/linear/deploy_w_encrypt') main_setting = setting.MainSetting.read_settings_yaml( Path('tests/data/linear/pretrained/settings.yml')) main_setting.inferer.converter_parameters_pkl = Path( 'tests/data/linear/preprocessed/preprocessors.pkl') ir = inferer.Inferer(main_setting) if deploy_wo_encrypt_directory.exists(): shutil.rmtree(deploy_wo_encrypt_directory) ir.deploy( output_directory=deploy_wo_encrypt_directory, model=Path('tests/data/linear/pretrained')) if deploy_w_encrypt_directory.exists(): shutil.rmtree(deploy_w_encrypt_directory) ir.deploy( output_directory=deploy_w_encrypt_directory, model=Path('tests/data/linear/pretrained'), encrypt_key=encrypt_key) ir_wo_encrypt = inferer.Inferer.from_model_directory( deploy_wo_encrypt_directory) res_wo_encrypt = ir_wo_encrypt.infer( data_directories=Path('tests/data/linear/preprocessed/validation')) ir_w_encrypt = inferer.Inferer.from_model_directory( deploy_w_encrypt_directory, decrypt_key=encrypt_key) res_w_encrypt = ir_w_encrypt.infer( data_directories=Path('tests/data/linear/preprocessed/validation')) np.testing.assert_almost_equal( res_wo_encrypt[0]['dict_y']['y'], res_w_encrypt[0]['dict_y']['y'])
def test_grad_grad_vs_laplacian(self): preprocess_setting = setting.MainSetting.read_settings_yaml( Path('tests/data/precalculated/convert.yml')) shutil.rmtree(preprocess_setting.data.interim, ignore_errors=True) shutil.rmtree(preprocess_setting.data.preprocessed, ignore_errors=True) raw_converter = pre.RawConverter( preprocess_setting, conversion_function=convert.HeatConversionFuncionCreator( create_elemental=False), filter_function=convert.filter_function_heat, force_renew=True, recursive=True, to_first_order=True, write_ucd=False, read_npy=False, read_res=True) raw_converter.convert() preprocessor = pre.Preprocessor( preprocess_setting, force_renew=True) preprocessor.preprocess_interim_data() # Confirm results does not change under rigid body transformation grad_grad_setting = setting.MainSetting.read_settings_yaml( Path('tests/data/precalculated/grad_grad.yml')) grad_grad_tr = trainer.Trainer(grad_grad_setting) if grad_grad_tr.setting.trainer.output_directory.exists(): shutil.rmtree(grad_grad_tr.setting.trainer.output_directory) grad_grad_tr.train() grad_grad_ir = inferer.Inferer(grad_grad_setting) inference_outpout_directory = \ grad_grad_setting.trainer.output_directory / 'inferred' if inference_outpout_directory.exists(): shutil.rmtree(inference_outpout_directory) results = grad_grad_ir.infer( model=Path('tests/data/precalculated/models/grad_grad'), preprocessed_data_directory=[ Path( 'tests/data/precalculated/preprocessed/cube/clscale1.0/' 'original'), Path( 'tests/data/precalculated/preprocessed/cube/clscale1.0/' 'rotated')], converter_parameters_pkl=Path( 'tests/data/precalculated/preprocessed/preprocessors.pkl'), output_directory=inference_outpout_directory, overwrite=True) np.testing.assert_almost_equal( results[0]['dict_y']['nodal_t_100'], results[1]['dict_y']['nodal_t_100']) laplacian_setting = setting.MainSetting.read_settings_yaml( Path('tests/data/precalculated/laplacian.yml')) laplacian_tr = trainer.Trainer(laplacian_setting) if laplacian_tr.setting.trainer.output_directory.exists(): shutil.rmtree(laplacian_tr.setting.trainer.output_directory) laplacian_tr.train() laplacian_ir = inferer.Inferer(laplacian_setting) inference_outpout_directory = \ laplacian_setting.trainer.output_directory / 'inferred' if inference_outpout_directory.exists(): shutil.rmtree(inference_outpout_directory) results = laplacian_ir.infer( model=Path('tests/data/precalculated/models/laplacian'), preprocessed_data_directory=[ Path( 'tests/data/precalculated/preprocessed/cube/clscale1.0/' 'original'), Path( 'tests/data/precalculated/preprocessed/cube/clscale1.0/' 'rotated')], converter_parameters_pkl=Path( 'tests/data/precalculated/preprocessed/preprocessors.pkl'), output_directory=inference_outpout_directory, overwrite=True) np.testing.assert_almost_equal( results[0]['dict_y']['nodal_t_100'], results[1]['dict_y']['nodal_t_100'])