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_integration_y1(self): main_setting = setting.MainSetting.read_settings_yaml( Path('tests/data/ode/integration_y1.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, 5e-2) ir = inferer.Inferer.read_settings( main_setting.trainer.output_directory / 'settings.yml', 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']['y1'][:, 0, 0], ':', color=cmap(i), label=f"y1 answer of data {i}") plt.plot(result['dict_x']['t'][:, 0, 0], result['dict_y']['y1'][:, 0, 0], color=cmap(i), label=f"y1 inferred of data {i}") plt.legend() plt.show()
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_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_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_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_inverse_temperature(self): main_setting = setting.MainSetting.read_settings_yaml( Path('tests/data/heat_time_series/iso_gcn_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.)
def test_train_data_parallel_general_block(self): main_setting = setting.MainSetting.read_settings_yaml( Path('tests/data/deform/general_block.yml')) main_setting.trainer.num_workers = 0 # Serial main_setting.trainer.gpu_id = 0 tr_wo_parallel = trainer.Trainer(main_setting) if main_setting.trainer.output_directory.exists(): shutil.rmtree(main_setting.trainer.output_directory) loss_wo_parallel = tr_wo_parallel.train() main_setting.trainer.data_parallel = True tr_w_parallel = trainer.Trainer(main_setting) if main_setting.trainer.output_directory.exists(): shutil.rmtree(main_setting.trainer.output_directory) loss_w_parallel = tr_w_parallel.train() np.testing.assert_almost_equal(loss_w_parallel / loss_wo_parallel, 1.)
def test_cluster_gcn(self): main_setting = setting.MainSetting.read_settings_yaml( Path('tests/data/deform/cluster_gcn.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.)
def test_train_model_parallel_general_block(self): main_setting = setting.MainSetting.read_settings_yaml( Path('tests/data/deform/general_block_model_parallel.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, 2.)
def test_raise_valueerror_when_network_is_not_dag(self): main_setting = setting.MainSetting.read_settings_yaml( Path('tests/data/deform/not_dag.yml')) if main_setting.trainer.output_directory.exists(): shutil.rmtree(main_setting.trainer.output_directory) tr = trainer.Trainer(main_setting) with self.assertRaisesRegex(ValueError, 'Cycle found in the network'): tr.train()
def test_train_res_gcn(self): main_setting = setting.MainSetting.read_settings_yaml( Path('tests/data/deform/res_gcn_long.yml')) main_setting.trainer.num_workers = 0 # Serial 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, 1e-2)
def test_node_number_inference(self): main_setting = setting.MainSetting.read_settings_yaml( Path('tests/data/deform/node_number_inference.yml')) 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-1)
def test_raise_valueerror_when_block_has_missing_destinations(self): main_setting = setting.MainSetting.read_settings_yaml( Path('tests/data/deform/missing_destinations.yml')) if main_setting.trainer.output_directory.exists(): shutil.rmtree(main_setting.trainer.output_directory) tr = trainer.Trainer(main_setting) with self.assertRaisesRegex(ValueError, 'NOT_EXISTING_BLOCK does not exist'): tr.train()
def test_dict_output(self): main_setting = setting.MainSetting.read_settings_yaml( Path('tests/data/rotation_thermal_stress/' 'iso_gcn_dict_input_dict_output.yml')) 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, 1.)
def test_raise_valueerror_when_block_has_no_successors(self): main_setting = setting.MainSetting.read_settings_yaml( Path('tests/data/deform/no_successors.yml')) if main_setting.trainer.output_directory.exists(): shutil.rmtree(main_setting.trainer.output_directory) tr = trainer.Trainer(main_setting) with self.assertRaisesRegex(ValueError, 'NO_SUCCESSORS has no successors'): tr.train()
def test_train_data_parallel_linear(self): main_setting = setting.MainSetting.read_settings_yaml( Path('tests/data/linear/linear.yml')) main_setting.data.train = [Path('tests/data/linear/preprocessed')] main_setting.trainer.gpu_id = 0 main_setting.trainer.log_trigger_epoch = 100 main_setting.trainer.n_epoch = 500 tr_wo_parallel = trainer.Trainer(main_setting) if main_setting.trainer.output_directory.exists(): shutil.rmtree(main_setting.trainer.output_directory) loss_wo_parallel = tr_wo_parallel.train() main_setting.trainer.data_parallel = True main_setting.trainer.num_workers = 0 # Serial tr_w_parallel = trainer.Trainer(main_setting) if main_setting.trainer.output_directory.exists(): shutil.rmtree(main_setting.trainer.output_directory) loss_w_parallel = tr_w_parallel.train() np.testing.assert_almost_equal(loss_w_parallel, loss_wo_parallel)
def test_message_passing_gpu(self): main_setting = setting.MainSetting.read_settings_yaml( Path('tests/data/deform/message_passing.yml')) main_setting.trainer.gpu_id = 1 main_setting.trainer.num_workers = 0 # Serial 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.)
def test_iso_gcn_gpu(self): main_setting = setting.MainSetting.read_settings_yaml( Path('tests/data/rotation_thermal_stress/' 'iso_gcn_dict_input_dict_output.yml')) main_setting.trainer.gpu_id = 1 main_setting.trainer.num_workers = 0 # Serial 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.)
def test_iso_gcn_diag(self): main_setting = setting.MainSetting.read_settings_yaml( Path( 'tests/data/rotation_thermal_stress/iso_gcn_rank0_rank2_diag.yml' )) main_setting.trainer.gpu_id = 1 tr = trainer.Trainer(main_setting) if tr.setting.trainer.output_directory.exists(): shutil.rmtree(tr.setting.trainer.output_directory) loss = tr.train() self.assertLess(loss, 10.)
def test_train_data_parallel_dict_input_list_output(self): main_setting = setting.MainSetting.read_settings_yaml( Path('tests/data/rotation_thermal_stress/iso_gcn_dict_input.yml')) main_setting.trainer.num_workers = 0 # Serial main_setting.trainer.n_epoch = 10 main_setting.trainer.batch_size = 6 main_setting.trainer.gpu_id = 0 tr_wo_parallel = trainer.Trainer(main_setting) if main_setting.trainer.output_directory.exists(): shutil.rmtree(main_setting.trainer.output_directory) loss_wo_parallel = tr_wo_parallel.train() main_setting.trainer.data_parallel = True tr_w_parallel = trainer.Trainer(main_setting) if main_setting.trainer.output_directory.exists(): shutil.rmtree(main_setting.trainer.output_directory) loss_w_parallel = tr_w_parallel.train() np.testing.assert_almost_equal(loss_w_parallel / loss_wo_parallel, 1., decimal=5)
def test_train_concatenated_data(self): preprocessed_base_directory = Path( 'tests/data/linear/preprocessed/train') concatenated_directory = Path('tests/data/linear/concatenated') shutil.rmtree(concatenated_directory, ignore_errors=True) pre.concatenate_preprocessed_data( preprocessed_base_directory, concatenated_directory, variable_names=['x1', 'x2', 'y'], ratios=(.9, 0.1, 0.)) main_setting = setting.MainSetting.read_settings_yaml( Path('tests/data/linear/linear_concatenated.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, 1e-5)
def test_user_defined_block(self): class CutOffBlock(networks.SimlModule): def __init__(self, block_setting): super().__init__(block_setting) self.upper = block_setting.optional.get('upper', .1) self.lower = block_setting.optional.get('lower', 0.) def _forward_core(self, x, supports=None, original_shapes=None): h = x for linear, dropout_ratio, activation in zip( self.linears, self.dropout_ratios, self.activations): h = linear(h) h = activation(h) h[h > self.upper] = self.upper h[h < self.lower] = self.lower return h networks.add_block(name='cutoff', block=CutOffBlock, trainable=True) main_setting = setting.MainSetting.read_settings_yaml( Path('tests/data/deform/cutoff.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.) x = torch.from_numpy(np.random.rand(2000, 100).astype(np.float32)) out_cutoff1 = tr.model.dict_block['CUTOFF1'](x).detach().numpy() np.testing.assert_almost_equal( np.max(out_cutoff1), main_setting.model.blocks[1].optional['upper']) np.testing.assert_almost_equal( np.min(out_cutoff1), main_setting.model.blocks[1].optional['lower']) out_cutoff2 = tr.model.dict_block['CUTOFF2'](x).detach().numpy() np.testing.assert_almost_equal( np.max(out_cutoff2), main_setting.model.blocks[2].optional['upper']) np.testing.assert_almost_equal( np.min(out_cutoff2), main_setting.model.blocks[2].optional['lower'])
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_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'])