Exemplo n.º 1
0
    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()
Exemplo n.º 2
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')
Exemplo n.º 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)
Exemplo n.º 4
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')
Exemplo n.º 5
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)
Exemplo n.º 6
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)
Exemplo n.º 7
0
    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)
Exemplo n.º 8
0
    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'])
Exemplo n.º 9
0
    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
Exemplo n.º 10
0
 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)
Exemplo n.º 11
0
 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)
Exemplo n.º 12
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)
Exemplo n.º 13
0
    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'])
Exemplo n.º 14
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'])