Example #1
0
    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)
Example #2
0
    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()
Example #3
0
    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)
Example #4
0
    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)
Example #5
0
    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')
Example #6
0
    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')
Example #7
0
 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.)
Example #8
0
    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.)
Example #9
0
 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.)
Example #10
0
 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.)
Example #11
0
    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()
Example #12
0
 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)
Example #13
0
    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)
Example #14
0
    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()
Example #15
0
    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.)
Example #16
0
    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()
Example #17
0
    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)
Example #18
0
 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.)
Example #19
0
 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.)
Example #20
0
 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.)
Example #21
0
    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)
Example #22
0
    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)
Example #23
0
    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'])
Example #24
0
    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)
Example #25
0
    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'])