[
  {
    "path": "LICENSE",
    "content": "BSD 3-Clause License\n\nCopyright (c) 2022, Los Alamos National Laboratory\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n1. Redistributions of source code must retain the above copyright notice, this\n   list of conditions and the following disclaimer.\n\n2. Redistributions in binary form must reproduce the above copyright notice,\n   this list of conditions and the following disclaimer in the documentation\n   and/or other materials provided with the distribution.\n\n3. Neither the name of the copyright holder nor the names of its\n   contributors may be used to endorse or promote products derived from\n   this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
  },
  {
    "path": "README.md",
    "content": "This program is open source under the BSD-3 License.\nRedistribution and use in source and binary forms, with or without modification, are permitted\nprovided that the following conditions are met:\n\n1. Redistributions of source code must retain the above copyright notice, this list of conditions and\nthe following disclaimer.\n \n2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions\nand the following disclaimer in the documentation and/or other materials provided with the\ndistribution.\n \n3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse\nor promote products derived from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS\nIS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\nCONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\nEXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\nPROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\nOR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\nWHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\nOTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\nADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n[![License](https://img.shields.io/badge/License-BSD_3--Clause-blue.svg)](https://opensource.org/licenses/BSD-3-Clause)\n\n# OpenFWI Benchmarks\n> Pytorch Implementation on OpenFWI 2D datasets\n\n\n## About\n\nThis repository officially supports the reproducibility of OpenFWI Benchmarks[[1]](#ref1). The mateirals will evolve with the further development of OpenFWI.\n\nFor the time being, it contains the codes for training and testing InversionNet[[2]](#ref2) and VelocityGAN[[3]](#ref3), and covers 10 datasets in __Vel family__, __Fault family__, and __Style family__.\n\n## Prepare Data\nFirst download any dataset from our [website](https://openfwi-lanl.github.io/docs/data.html#vel) and unzip it into your local directory.\n\n### Load a pair of velocity map and seismic data\nFor any dataset in _Vel, Fault, Style_  family, the data is saved as `.npy` files, each file contains a batch of 500 samples. `datai.npy` refers to the `i-th` sample of seismic data. To load data and check:\n```bash\nimport numpy as np\n# load seismic data\nseismic_data = np.load('data1.npy')\nprint(seismic_data.shape) #(500,5,1000,70)\n# load velocity map\nvelocity_map = np.load('model1.npy')\nprint(velocity_map.shape) #(500,1,70,70)\n```\n\n### Prepare training and testing set\nNote that there are many ways of organizing training and testing dataset, as long as it is compatible with the [DataLoader module](https://pytorch.org/docs/stable/data.html) in pytorch. Whichever way you choose, please refer to the following table for the train/test split.\n\n| Dataset      | Train / test Split | Corresponding `.npy` files |\n| ----------- | ----------- | ------------ |\n| Vel Family     | 24k / 6k     | data(model)1-48.npy / data(model)49-60.npy |\n| Fault Family   | 48k / 6k     | data(model)1-96.npy / data(model)97-108.npy |\n| Style Family   | 60k / 7k     | data(model)1-120.npy / data(model)121-134.npy |\n\n\nA convenient way of loading the data is to use a `.txt` file containing the _location+filename_ of all `.npy` files, parse each line of the `.txt` file and push to the dataloader. Take **flatvel-A** as an exmaple, we create `flatvel-a-train.txt`, organized as the follows, and same for `flatvel-a-test.txt`. \n```bash\nDataset_directory/data1.npy\nDataset_directory/data2.npy\n...\nDataset_directory/data48.npy\n```\n\n**To save time, you can download all the text files from the `splitting_files` folder and change to your own directory.**\n\n## Reproduce the OpenFWI Benchmarks\n> For InversionNet and VelocityGAN, the current version supports training with a single GPU. For UPFWI and InversionNet3D, multiple-GPU is necessary due to the computation cost. \n\n\n### Environment setup\nThe following packages are required:\n- pytorch v1.7.1\n- torchvision v0.8.2\n- scikit learn\n- numpy\n- matplotlib (for visualization)\n\nIf you other versions of pytorch and torchvision, please make sure they align.\n\n### InversionNet\nTo train from scratch on Flatvel-A dataset with $\\ell_1$ loss,  run the following codes:\n```\npython train.py -ds flatvel-a -n YOUR_DIRECTORY -m InversionNet -g2v 0 --tensorboard -t flatvel_a_train.txt -v flatvel_a_val.txt\n```\n\n`-ds` specifies the dataset, `-n` creates the folder containing the saved model other log files, `-g2v` sets the coefficient of $\\ell_2$ loss to be zero, `-t` and `-v` assign the training data and test data loading files.\n\nTo continue training from a saved checkpoint, run the following codes:\n```\npython train.py -ds flatvel-a -n YOUR_DIRECTORY -r CHECKPOINT.PTH -m InversionNet -g2v 0 --tensorboard -t flatvel_a_train.txt -v flatvel_a_val.txt\n```\n\nPlease refer to the details of the codes if you would like to change other parameters (*learning rate,* etc.). These commands suffice to reproduce the OpenFWI benchmarks.\n\nThe last step would be testing, where we include the visualization. Also we borrow the implementation of SSIM metric from [pytorch-ssim](https://github.com/Po-Hsun-Su/pytorch-ssim). Please make sure that `pytorch-ssim.py` and `rainbow256.npy` are placed together with others.\n\n```\npython test.py -ds flatvel-a -n YOUR_DIRECTORY -m InversionNet -v flatvel_a_val.txt -r CHECKPOINT.PTH --vis -vb 2 -vsa 3\n```\n\n`--vis` enables the visualization and creates a folder with the figures, you may also change the amount of velocity maps by playing with `-vb` and `-vsa`.\n\n### VelocityGAN\nThe code logic of VelocityGAN is almost identical the that of InversionNet.\n\nTo train from scratch on Flatvel-A dataset with $\\ell_1$ loss, run the following codes:\n```\npython gan_train.py -ds flatvel-a -n YOUR_DIRECTORY -m InversionNet -g2v 0 --tensorboard -t flatvel_a_train.txt -v flatvel_a_val.txt\n```\nTo continue training from a saved checkpoint, run the following codes:\n```\npython gan_train.py -ds flatvel-a -n YOUR_DIRECTORY -r CHECKPOINT.PTH -m InversionNet -g2v 0 --tensorboard -t flatvel_a_train.txt -v flatvel_a_val.txt\n```\nThe command for testing is the same with InversionNet\n\n\n## Future Updates\n- We will release the training configuration of Kimberlina-CO2 dataset very soon.\n- We will improve the instruction with illustrations and other necessary details\n- The codes of UPFWI and InversionNet3D is pending approval, they will be added to this repo once approved.\n\n## References\n<a id=\"ref1\">[1]</a> \nDeng, Chengyuan, et al. \"OpenFWI: Benchmark Seismic Datasets for Machine Learning-Based Full Waveform Inversion.\" arXiv preprint arXiv:2111.02926 (2021).\n\n<a id=\"ref2\">[1]</a> \nWu, Yue, and Youzuo Lin. \"InversionNet: An efficient and accurate data-driven full waveform inversion.\" IEEE Transactions on Computational Imaging 6 (2019): 419-433.\n\n<a id=\"ref3\">[1]</a> \nZhang, Zhongping, and Youzuo Lin. \"Data-driven seismic waveform inversion: A study on the robustness and generalization.\" IEEE Transactions on Geoscience and Remote sensing 58.10 (2020): 6900-6913.\n"
  },
  {
    "path": "dataset.py",
    "content": "# © 2022. Triad National Security, LLC. All rights reserved.\n\n# This program was produced under U.S. Government contract 89233218CNA000001 for Los Alamos\n\n# National Laboratory (LANL), which is operated by Triad National Security, LLC for the U.S.\n\n# Department of Energy/National Nuclear Security Administration. All rights in the program are\n\n# reserved by Triad National Security, LLC, and the U.S. Department of Energy/National Nuclear\n\n# Security Administration. The Government is granted for itself and others acting on its behalf a\n\n# nonexclusive, paid-up, irrevocable worldwide license in this material to reproduce, prepare\n\n# derivative works, distribute copies to the public, perform publicly and display publicly, and to permit\n\n# others to do so.\n\nimport os\nimport numpy as np\nfrom torch.utils.data import Dataset\nfrom torchvision.transforms import Compose\nimport transforms as T\n\nclass FWIDataset(Dataset):\n    ''' FWI dataset\n    For convenience, in this class, a batch refers to a npy file \n    instead of the batch used during training.\n\n    Args:\n        anno: path to annotation file\n        preload: whether to load the whole dataset into memory\n        sample_ratio: downsample ratio for seismic data\n        file_size: # of samples in each npy file\n        transform_data|label: transformation applied to data or label\n    '''\n    def __init__(self, anno, preload=True, sample_ratio=1, file_size=500,\n                    transform_data=None, transform_label=None):\n        if not os.path.exists(anno):\n            print(f'Annotation file {anno} does not exists')\n        self.preload = preload\n        self.sample_ratio = sample_ratio\n        self.file_size = file_size\n        self.transform_data = transform_data\n        self.transform_label = transform_label\n        with open(anno, 'r') as f:\n            self.batches = f.readlines()\n        if preload: \n            self.data_list, self.label_list = [], []\n            for batch in self.batches: \n                data, label = self.load_every(batch)\n                self.data_list.append(data)\n                if label is not None:\n                    self.label_list.append(label)\n\n    # Load from one line\n    def load_every(self, batch):\n        batch = batch.split('\\t')\n        data_path = batch[0] if len(batch) > 1 else batch[0][:-1]\n        data = np.load(data_path)[:, :, ::self.sample_ratio, :]\n        data = data.astype('float32')\n        if len(batch) > 1:\n            label_path = batch[1][:-1]    \n            label = np.load(label_path)\n            label = label.astype('float32')\n        else:\n            label = None\n        \n        return data, label\n        \n    def __getitem__(self, idx):\n        batch_idx, sample_idx = idx // self.file_size, idx % self.file_size\n        if self.preload:\n            data = self.data_list[batch_idx][sample_idx]\n            label = self.label_list[batch_idx][sample_idx] if len(self.label_list) != 0 else None\n        else:\n            data, label = self.load_every(self.batches[batch_idx])\n            data = data[sample_idx]\n            label = label[sample_idx] if label is not None else None\n        if self.transform_data:\n            data = self.transform_data(data)\n        if self.transform_label and label is not None:\n            label = self.transform_label(label)\n        return data, label if label is not None else np.array([])\n        \n    def __len__(self):\n        return len(self.batches) * self.file_size\n\n\nif __name__ == '__main__':\n    transform_data = Compose([\n        T.LogTransform(k=1),\n        T.MinMaxNormalize(T.log_transform(-61, k=1), T.log_transform(120, k=1))\n    ])\n    transform_label = Compose([\n        T.MinMaxNormalize(2000, 6000)\n    ])\n    dataset = FWIDataset(f'relevant_files/temp.txt', transform_data=transform_data, transform_label=transform_label, file_size=1)\n    data, label = dataset[0]\n    print(data.shape)\n    print(label is None)\n"
  },
  {
    "path": "dataset_config.json",
    "content": "{\n    \"flatvel-a\": {\n        \"data_min\": -26.95,\n        \"data_max\": 52.77,\n        \"label_min\": 1500,\n        \"label_max\": 4500,\n        \"file_size\": 500,\n        \"nbc\": 120,\n        \"dx\": 10,\n        \"nt\": 1000,\n        \"dt\": 1e-3,\n        \"f\": 15,\n        \"n_grid\": 70,\n        \"ns\": 5,\n        \"ng\": 70,\n        \"sz\": 10,\n        \"gz\": 10\n    },\n    \"curvevel-a\": {\n        \"data_min\": -27.11,\n        \"data_max\": 55.10,\n        \"label_min\": 1500,\n        \"label_max\": 4500,\n        \"file_size\": 500,\n        \"nbc\": 120,\n        \"dx\": 10,\n        \"nt\": 1000,\n        \"dt\": 1e-3,\n        \"f\": 15,\n        \"n_grid\": 70,\n        \"ns\": 5,\n        \"ng\": 70,\n        \"sz\": 10,\n        \"gz\": 10\n    },\n    \"flatvel-b\": {\n        \"data_min\": -27.17,\n        \"data_max\": 56.05,\n        \"label_min\": 1500,\n        \"label_max\": 4500,\n        \"file_size\": 500,\n        \"nbc\": 120,\n        \"dx\": 10,\n        \"nt\": 1000,\n        \"dt\": 1e-3,\n        \"f\": 15,\n        \"n_grid\": 70,\n        \"ns\": 5,\n        \"ng\": 70,\n        \"sz\": 10,\n        \"gz\": 10\n    },\n    \"curvevel-b\": {\n        \"data_min\": -29.04,\n        \"data_max\": 57.03,\n        \"label_min\": 1500,\n        \"label_max\": 4500,\n        \"file_size\": 500,\n        \"nbc\": 120,\n        \"dx\": 10,\n        \"nt\": 1000,\n        \"dt\": 1e-3,\n        \"f\": 15,\n        \"n_grid\": 70,\n        \"ns\": 5,\n        \"ng\": 70,\n        \"sz\": 10,\n        \"gz\": 10\n    },\n\t\"flatfault-a\": {\n        \"data_min\": -26.10,\n        \"data_max\": 50.86,\n        \"label_min\": 1500,\n        \"label_max\": 4500,\n        \"file_size\": 500,\n        \"nbc\": 120,\n        \"dx\": 10,\n        \"nt\": 1000,\n        \"dt\": 1e-3,\n        \"f\": 15,\n        \"n_grid\": 70,\n        \"ns\": 5,\n        \"ng\": 70,\n        \"sz\": 10,\n        \"gz\": 10\n    },\n    \"curvefault-a\": {\n        \"data_min\": -26.48,\n        \"data_max\": 52.32,\n        \"label_min\": 1500,\n        \"label_max\": 4500,\n        \"file_size\": 500,\n        \"nbc\": 120,\n        \"dx\": 10,\n        \"nt\": 1000,\n        \"dt\": 1e-3,\n        \"f\": 15,\n        \"n_grid\": 70,\n        \"ns\": 5,\n        \"ng\": 70,\n        \"sz\": 10,\n        \"gz\": 10\n    },\n    \"flatfault-b\": {\n        \"data_min\": -24.86,\n        \"data_max\": 50.28,\n        \"label_min\": 1500,\n        \"label_max\": 4500,\n        \"file_size\": 500,\n        \"nbc\": 120,\n        \"dx\": 10,\n        \"nt\": 1000,\n        \"dt\": 1e-3,\n        \"f\": 15,\n        \"n_grid\": 70,\n        \"ns\": 5,\n        \"ng\": 70,\n        \"sz\": 10,\n        \"gz\": 10\n    },\n    \"curvefault-b\": {\n        \"data_min\": -24.93,\n        \"data_max\": 50.98,\n        \"label_min\": 1500,\n        \"label_max\": 4500,\n        \"file_size\": 500,\n        \"nbc\": 120,\n        \"dx\": 10,\n        \"nt\": 1000,\n        \"dt\": 1e-3,\n        \"f\": 15,\n        \"n_grid\": 70,\n        \"ns\": 5,\n        \"ng\": 70,\n        \"sz\": 10,\n        \"gz\": 10\n    },\n    \"style-a\": {\n        \"data_min\": -24.96,\n        \"data_max\": 48.93,\n        \"label_min\": 1500,\n        \"label_max\": 4500,\n        \"file_size\": 500,\n        \"nbc\": 120,\n        \"dx\": 10,\n        \"nt\": 1000,\n        \"dt\": 1e-3,\n        \"f\": 15,\n        \"n_grid\": 70,\n        \"ns\": 5,\n        \"ng\": 70,\n        \"sz\": 10,\n        \"gz\": 10\n    },\n    \"style-b\": {\n        \"data_min\": -23.76,\n        \"data_max\": 46.01,\n        \"label_min\": 1500,\n        \"label_max\": 4500,\n        \"file_size\": 500,\n        \"nbc\": 120,\n        \"dx\": 10,\n        \"nt\": 1000,\n        \"dt\": 1e-3,\n        \"f\": 15,\n        \"n_grid\": 70,\n        \"ns\": 5,\n        \"ng\": 70,\n        \"sz\": 10,\n        \"gz\": 10\n    },\n    \"flatvel-tutorial\": {\n        \"data_min\": -26.95,\n        \"data_max\": 52.77,\n        \"label_min\": 1500,\n        \"label_max\": 4500,\n        \"file_size\": 120,\n        \"nbc\": 120,\n        \"dx\": 10,\n        \"nt\": 1000,\n        \"dt\": 1e-3,\n        \"f\": 15,\n        \"n_grid\": 70,\n        \"ns\": 5,\n        \"ng\": 70,\n        \"sz\": 10,\n        \"gz\": 10\n    }\n}\n"
  },
  {
    "path": "gan_train.py",
    "content": "# © 2022. Triad National Security, LLC. All rights reserved.\n\n# This program was produced under U.S. Government contract 89233218CNA000001 for Los Alamos\n\n# National Laboratory (LANL), which is operated by Triad National Security, LLC for the U.S.\n\n# Department of Energy/National Nuclear Security Administration. All rights in the program are\n\n# reserved by Triad National Security, LLC, and the U.S. Department of Energy/National Nuclear\n\n# Security Administration. The Government is granted for itself and others acting on its behalf a\n\n# nonexclusive, paid-up, irrevocable worldwide license in this material to reproduce, prepare\n\n# derivative works, distribute copies to the public, perform publicly and display publicly, and to permit\n\n# others to do so.\n\nimport os\nimport sys\nimport time\nimport datetime\nimport json\n\nimport torch\nfrom torch import nn\nfrom torch.utils.data import RandomSampler, DataLoader\nfrom torch.utils.data.dataloader import default_collate\nfrom torch.utils.data.distributed import DistributedSampler\nfrom torch.utils.tensorboard import SummaryWriter\nimport torchvision\nfrom torchvision.transforms import Compose\n\nimport utils\nimport network\nfrom dataset import FWIDataset\nfrom scheduler import WarmupMultiStepLR\nimport transforms as T\n\n# Need to use parallel in apex, torch ddp can cause bugs when computing gradient penalty\nimport apex.parallel as parallel\n\nstep = 0\n\ndef train_one_epoch(model, model_d, criterion_g, criterion_d, optimizer_g, optimizer_d, \n                    lr_schedulers, dataloader, device, epoch, print_freq, writer, n_critic=5):\n    global step\n    model.train()\n    model_d.train()\n\n    # Logger setup\n    metric_logger = utils.MetricLogger(delimiter='  ')\n    metric_logger.add_meter('lr_g', utils.SmoothedValue(window_size=1, fmt='{value}'))\n    metric_logger.add_meter('lr_d', utils.SmoothedValue(window_size=1, fmt='{value}'))\n    metric_logger.add_meter('samples/s', utils.SmoothedValue(window_size=10, fmt='{value:.3f}'))\n    header = 'Epoch: [{}]'.format(epoch)\n    \n    itr = 0 # step in this epoch\n    max_itr = len(dataloader)\n    for data, label in metric_logger.log_every(dataloader, print_freq, header):\n        start_time = time.time()\n        data, label = data.to(device), label.to(device)\n\n        # Update discribminator first\n        optimizer_d.zero_grad()\n        with torch.no_grad():\n            pred = model(data)\n        loss_d, loss_diff, loss_gp = criterion_d(label, pred, model_d)\n        loss_d.backward()\n        optimizer_d.step()\n        metric_logger.update(loss_diff=loss_diff, loss_gp=loss_gp)\n\n        # Update generator occasionally \n        if ((itr + 1) % n_critic == 0) or (itr == max_itr - 1):\n            optimizer_g.zero_grad()\n            pred = model(data)\n            loss_g, loss_g1v, loss_g2v = criterion_g(pred, label, model_d)\n            loss_g.backward()\n            optimizer_g.step()\n            metric_logger.update(loss_g1v=loss_g1v, loss_g2v=loss_g2v)\n\n        batch_size = data.shape[0]\n        metric_logger.update(lr_g=optimizer_g.param_groups[0]['lr'],\n                            lr_d=optimizer_d.param_groups[0]['lr'])\n        metric_logger.meters['samples/s'].update(batch_size / (time.time() - start_time))\n        if writer:\n            writer.add_scalar('loss_diff', loss_diff, step)\n            writer.add_scalar('loss_gp', loss_gp, step)\n            if ((itr + 1) % n_critic == 0) or (itr == max_itr - 1):\n                writer.add_scalar('loss_g1v', loss_g1v, step)\n                writer.add_scalar('loss_g2v', loss_g2v, step)\n        step += 1\n        itr += 1\n        for lr_scheduler in lr_schedulers:\n            lr_scheduler.step()\n\n\ndef evaluate(model, criterion, dataloader, device, writer):\n    model.eval()\n    metric_logger = utils.MetricLogger(delimiter='  ')\n    header = 'Test:'\n    with torch.no_grad():\n        for data, label in metric_logger.log_every(dataloader, 20, header):\n            data = data.to(device, non_blocking=True)\n            label = label.to(device, non_blocking=True)\n            pred = model(data)\n            loss, loss_g1v, loss_g2v = criterion(pred, label)\n            metric_logger.update(loss=loss.item(), \n                                 loss_g1v=loss_g1v.item(), loss_g2v=loss_g2v.item())\n\n    # Gather the stats from all processes\n    metric_logger.synchronize_between_processes()\n    print(' * Loss {loss.global_avg:.8f}\\n'.format(loss=metric_logger.loss))\n    if writer:\n        writer.add_scalar('loss', metric_logger.loss.global_avg, step)\n        writer.add_scalar('loss_g1v', metric_logger.loss_g1v.global_avg, step)\n        writer.add_scalar('loss_g2v', metric_logger.loss_g2v.global_avg, step)\n    return metric_logger.loss.global_avg\n\n\ndef main(args):\n    global step\n\n    print(args)\n    print('torch version: ', torch.__version__)\n    print('torchvision version: ', torchvision.__version__)\n\n    utils.mkdir(args.output_path) # create folder to store checkpoints\n    utils.init_distributed_mode(args) # distributed mode initialization\n\n    # Set up tensorboard summary writer\n    train_writer, val_writer = None, None\n    if args.tensorboard:\n        utils.mkdir(args.log_path) # create folder to store tensorboard logs\n        if not args.distributed or (args.rank == 0) and (args.local_rank == 0):\n            train_writer = SummaryWriter(os.path.join(args.output_path, 'logs', 'train'))\n            val_writer = SummaryWriter(os.path.join(args.output_path, 'logs', 'val'))\n\n    device = torch.device(args.device)\n    torch.backends.cudnn.benchmark = True\n\n    with open('dataset_config.json') as f:\n        try:\n            ctx = json.load(f)[args.dataset]\n        except KeyError:\n            print('Unsupported dataset.')\n            sys.exit()\n\n    if args.file_size is not None:\n        ctx['file_size'] = args.file_size\n\n\n    # Create dataset and dataloader\n    print('Loading data')\n    print('Loading training data')\n    log_data_min = T.log_transform(ctx['data_min'], k=args.k)\n    log_data_max = T.log_transform(ctx['data_max'], k=args.k)\n    transform_data = Compose([\n        T.LogTransform(k=args.k),\n        T.MinMaxNormalize(log_data_min, log_data_max)\n    ])\n    transform_label = Compose([\n        T.MinMaxNormalize(ctx['label_min'], ctx['label_max'])\n    ])\n    if args.train_anno[-3:] == 'txt':\n        dataset_train = FWIDataset(\n            args.train_anno,\n            preload=True,\n            sample_ratio=args.sample_temporal,\n            file_size=ctx['file_size'],\n            transform_data=transform_data,\n            transform_label=transform_label\n        )\n    else:\n        dataset_train = torch.load(args.train_anno)\n\n    print('Loading validation data')\n    if args.val_anno[-3:] == 'txt':\n        dataset_valid = FWIDataset(\n            args.val_anno,\n            preload=True,\n            sample_ratio=args.sample_temporal,\n            file_size=ctx['file_size'],\n            transform_data=transform_data,\n            transform_label=transform_label\n        )\n    else:\n        dataset_valid = torch.load(args.val_anno)\n\n    print('Creating data loaders')\n    if args.distributed:\n        train_sampler = DistributedSampler(dataset_train, shuffle=True)\n        valid_sampler = DistributedSampler(dataset_valid, shuffle=True)\n    else:\n        train_sampler = RandomSampler(dataset_train)\n        valid_sampler = RandomSampler(dataset_valid)\n\n    dataloader_train = DataLoader(\n        dataset_train, batch_size=args.batch_size,\n        sampler=train_sampler, num_workers=args.workers,\n        pin_memory=True, drop_last=True, collate_fn=default_collate)\n\n    dataloader_valid = DataLoader(\n        dataset_valid, batch_size=args.batch_size,\n        sampler=valid_sampler, num_workers=args.workers,\n        pin_memory=True, collate_fn=default_collate)\n\n    print('Creating model')\n    if args.model not in network.model_dict or args.model_d not in network.model_dict:\n        print('Unsupported model.')\n        sys.exit()\n         \n    model = network.model_dict[args.model](upsample_mode=args.up_mode, \n        sample_spatial=args.sample_spatial, sample_temporal=args.sample_temporal).to(device)\n    model_d = network.model_dict[args.model_d]().to(device)\n\n    if args.distributed and args.sync_bn:\n        model = parallel.convert_syncbn_model(model)\n        model_d = parallel.convert_syncbn_model(model_d)\n\n    # Define loss function\n    l1loss = nn.L1Loss()\n    l2loss = nn.MSELoss()\n    def criterion_g(pred, gt, model_d=None):\n        loss_g1v = l1loss(pred, gt)\n        loss_g2v = l2loss(pred, gt)\n        loss = args.lambda_g1v * loss_g1v + args.lambda_g2v * loss_g2v\n        if model_d is not None:\n            loss_adv = -torch.mean(model_d(pred))\n            loss += args.lambda_adv * loss_adv\n        return loss, loss_g1v, loss_g2v\n    criterion_d = utils.Wasserstein_GP(device, args.lambda_gp)\n\n    # Scale lr according to effective batch size\n    lr_g = args.lr_g * args.world_size\n    lr_d = args.lr_d * args.world_size\n    optimizer_g = torch.optim.AdamW(model.parameters(), lr=lr_g, betas=(0, 0.9), weight_decay=args.weight_decay)\n    optimizer_d = torch.optim.AdamW(model_d.parameters(), lr=lr_d, betas=(0, 0.9), weight_decay=args.weight_decay)\n\n    # Convert scheduler to be per iteration instead of per epoch\n    warmup_iters = args.lr_warmup_epochs * len(dataloader_train)\n    lr_milestones = [len(dataloader_train) * m for m in args.lr_milestones]\n    lr_schedulers = [WarmupMultiStepLR(\n        optimizer, milestones=lr_milestones, gamma=args.lr_gamma,\n        warmup_iters=warmup_iters, warmup_factor=1e-5) for optimizer in [optimizer_g, optimizer_d]]\n\n    model_without_ddp = model\n    model_d_without_ddp = model_d\n    if args.distributed:\n        model = parallel.DistributedDataParallel(model)\n        model_d = parallel.DistributedDataParallel(model_d)\n        model_without_ddp = model.module\n        model_d_without_ddp = model_d.module\n\n    if args.resume:\n        checkpoint = torch.load(args.resume, map_location='cpu')\n        model_without_ddp.load_state_dict(network.replace_legacy(checkpoint['model']))\n        model_d_without_ddp.load_state_dict(network.replace_legacy(checkpoint['model_d']))\n        optimizer_g.load_state_dict(checkpoint['optimizer_g'])\n        optimizer_d.load_state_dict(checkpoint['optimizer_d'])\n        args.start_epoch = checkpoint['epoch'] + 1\n        step = checkpoint['step']\n        for i in range(len(lr_schedulers)):\n            lr_schedulers[i].load_state_dict(checkpoint['lr_schedulers'][i])\n        for lr_scheduler in lr_schedulers:\n            lr_scheduler.milestones = lr_milestones\n\n    print('Start training')\n    start_time = time.time()\n    for epoch in range(args.start_epoch, args.epochs):\n        if args.distributed:\n            train_sampler.set_epoch(epoch)\n        train_one_epoch(model, model_d, criterion_g, criterion_d, optimizer_g, optimizer_d,\n                        lr_schedulers, dataloader_train, device, epoch, \n                        args.print_freq, train_writer, args.n_critic)\n        evaluate(model, criterion_g, dataloader_valid, device, val_writer)\n        checkpoint = {\n            'model': model_without_ddp.state_dict(),\n            'model_d': model_d_without_ddp.state_dict(),\n            'optimizer_g': optimizer_g.state_dict(),\n            'optimizer_d': optimizer_d.state_dict(),\n            'lr_schedulers': [scheduler.state_dict() for scheduler in lr_schedulers],\n            'epoch': epoch,\n            'step': step,\n            'args': args}\n        # Save checkpoint per epoch\n        utils.save_on_master(\n            checkpoint,\n            os.path.join(args.output_path, 'checkpoint.pth'))\n        # Save checkpoint every epoch block\n        if args.output_path and (epoch + 1) % args.epoch_block == 0:\n            utils.save_on_master(\n                checkpoint,\n                os.path.join(args.output_path, 'model_{}.pth'.format(epoch + 1)))\n\n    total_time = time.time() - start_time\n    total_time_str = str(datetime.timedelta(seconds=int(total_time)))\n    print('Training time {}'.format(total_time_str))\n\n\ndef parse_args():\n    import argparse\n    parser = argparse.ArgumentParser(description='GAN Training')\n    parser.add_argument('-d', '--device', default='cuda', help='device')\n    parser.add_argument('-ds', '--dataset', default='flat', type=str, help='dataset name')\n    parser.add_argument('-fs', '--file-size', default=None, type=str, help='number of samples in each npy file')\n\n    # Path related\n    parser.add_argument('-ap', '--anno-path', default='/vast/home/aicyd/Desktop/OpenFWI/src/', help='annotation files location')\n    parser.add_argument('-t', '--train-anno', default='train_flatvel.json', help='name of train anno')\n    parser.add_argument('-v', '--val-anno', default='val_flatvel.json', help='name of val anno')\n    parser.add_argument('-o', '--output-path', default='models', help='path to parent folder to save checkpoints')\n    parser.add_argument('-l', '--log-path', default='models', help='path to parent folder to save logs')\n    parser.add_argument('-n', '--save-name', default='gan', help='folder name for this experiment')\n    parser.add_argument('-s', '--suffix', type=str, default=None, help='subfolder name for this run')\n\n    # Model related\n    parser.add_argument('-m', '--model', type=str, help='generator name')\n    parser.add_argument('-md', '--model-d', default='Discriminator', help='discriminator name')\n    parser.add_argument('-um', '--up-mode', default=None, help='upsampling layer mode such as \"nearest\", \"bicubic\", etc.')\n    parser.add_argument('-ss', '--sample-spatial', type=float, default=1.0, help='spatial sampling ratio')\n    parser.add_argument('-st', '--sample-temporal', type=int, default=1, help='temporal sampling ratio')\n\n    # Training related\n    parser.add_argument('-nc', '--n_critic', default=5, type=int, help='generator & discriminator update ratio')\n    parser.add_argument('-b', '--batch-size', default=64, type=int)\n    parser.add_argument('--lr_g', default=0.0001, type=float, help='initial learning rate of generator')\n    parser.add_argument('--lr_d', default=0.0001, type=float, help='initial learning rate of discriminator')\n    parser.add_argument('-lm', '--lr-milestones', nargs='+', default=[], type=int, help='decrease lr on milestones')\n    parser.add_argument('--momentum', default=0.9, type=float, help='momentum')\n    parser.add_argument('--weight-decay', default=1e-4 , type=float, help='weight decay (default: 1e-4)')\n    parser.add_argument('--lr-gamma', default=0.1, type=float, help='decrease lr by a factor of lr-gamma')\n    parser.add_argument('--lr-warmup-epochs', default=0, type=int, help='number of warmup epochs')   \n    parser.add_argument('-eb', '--epoch_block', type=int, default=20, help='epochs in a saved block')\n    parser.add_argument('-nb', '--num_block', type=int, default=25, help='number of saved block')\n    parser.add_argument('-j', '--workers', default=16, type=int, help='number of data loading workers (default: 16)')\n    parser.add_argument('--k', default=1, type=float, help='k in log transformation')\n    parser.add_argument('--print-freq', default=20, type=int, help='print frequency')\n    parser.add_argument('-r', '--resume', default=None, help='resume from checkpoint')\n    parser.add_argument('--start-epoch', default=0, type=int, help='start epoch')\n\n    # Loss related\n    parser.add_argument('-g1v', '--lambda_g1v', type=float, default=100.0)\n    parser.add_argument('-g2v', '--lambda_g2v', type=float, default=100.0)\n    parser.add_argument('-adv', '--lambda_adv', type=float, default=1.0)\n    parser.add_argument('-gp', '--lambda_gp', type=float, default=10.0)\n\n    # Distributed training related\n    parser.add_argument('--sync-bn', action='store_true', help='Use sync batch norm')\n    parser.add_argument('--world-size', default=1, type=int, help='number of distributed processes')\n    parser.add_argument('--dist-url', default='env://', help='url used to set up distributed training')\n\n    # Tensorboard related\n    parser.add_argument('--tensorboard', action='store_true', help='Use tensorboard for logging.')\n\n    args = parser.parse_args()\n\n    args.output_path = os.path.join(args.output_path, args.save_name, args.suffix or '')\n    args.log_path = os.path.join(args.log_path, args.save_name, args.suffix or '')\n    args.train_anno = os.path.join(args.anno_path, args.train_anno)\n    args.val_anno = os.path.join(args.anno_path, args.val_anno)\n    \n    args.epochs = args.epoch_block * args.num_block\n\n    if args.resume:\n        args.resume = os.path.join(args.output_path, args.resume)\n\n    return args\n\n\nif __name__ == '__main__':\n    args = parse_args()\n    main(args)\n"
  },
  {
    "path": "network.py",
    "content": "# © 2022. Triad National Security, LLC. All rights reserved.\n\n# This program was produced under U.S. Government contract 89233218CNA000001 for Los Alamos\n\n# National Laboratory (LANL), which is operated by Triad National Security, LLC for the U.S.\n\n# Department of Energy/National Nuclear Security Administration. All rights in the program are\n\n# reserved by Triad National Security, LLC, and the U.S. Department of Energy/National Nuclear\n\n# Security Administration. The Government is granted for itself and others acting on its behalf a\n\n# nonexclusive, paid-up, irrevocable worldwide license in this material to reproduce, prepare\n\n# derivative works, distribute copies to the public, perform publicly and display publicly, and to permit\n\n# others to do so.\n\nimport torch\nimport torch.nn as nn\nimport torch.nn.functional as F\nfrom math import ceil\nfrom collections import OrderedDict\n\nNORM_LAYERS = { 'bn': nn.BatchNorm2d, 'in': nn.InstanceNorm2d, 'ln': nn.LayerNorm }\n\n# Replace the key names in the checkpoint in which legacy network building blocks are used \ndef replace_legacy(old_dict):\n    li = []\n    for k, v in old_dict.items():\n        k = (k.replace('Conv2DwithBN', 'layers')\n              .replace('Conv2DwithBN_Tanh', 'layers')\n              .replace('Deconv2DwithBN', 'layers')\n              .replace('ResizeConv2DwithBN', 'layers'))\n        li.append((k, v))\n    return OrderedDict(li)\n\nclass Conv2DwithBN(nn.Module):\n    def __init__(self, in_fea, out_fea, \n                kernel_size=3, stride=1, padding=1,\n                bn=True, relu_slop=0.2, dropout=None):\n        super(Conv2DwithBN,self).__init__()\n        layers = [nn.Conv2d(in_channels=in_fea, out_channels=out_fea, kernel_size=kernel_size, stride=stride, padding=padding)]\n        if bn:\n            layers.append(nn.BatchNorm2d(num_features=out_fea))\n        layers.append(nn.LeakyReLU(relu_slop, inplace=True))\n        if dropout:\n            layers.append(nn.Dropout2d(0.8))\n        self.Conv2DwithBN = nn.Sequential(*layers)\n\n    def forward(self, x):\n        return self.Conv2DwithBN(x)\n\nclass ResizeConv2DwithBN(nn.Module):\n    def __init__(self, in_fea, out_fea, scale_factor=2, mode='nearest'):\n        super(ResizeConv2DwithBN, self).__init__()\n        layers = [nn.Upsample(scale_factor=scale_factor, mode=mode)]\n        layers.append(nn.Conv2d(in_channels=in_fea, out_channels=out_fea, kernel_size=3, stride=1, padding=1))\n        layers.append(nn.BatchNorm2d(num_features=out_fea))\n        layers.append(nn.LeakyReLU(0.2, inplace=True))\n        self.ResizeConv2DwithBN = nn.Sequential(*layers)\n\n    def forward(self, x):\n        return self.ResizeConv2DwithBN(x)\n \nclass Conv2DwithBN_Tanh(nn.Module):\n    def __init__(self, in_fea, out_fea, kernel_size=3, stride=1, padding=1):\n        super(Conv2DwithBN_Tanh, self).__init__()\n        layers = [nn.Conv2d(in_channels=in_fea, out_channels=out_fea, kernel_size=kernel_size, stride=stride, padding=padding)]\n        layers.append(nn.BatchNorm2d(num_features=out_fea))\n        layers.append(nn.Tanh())\n        self.Conv2DwithBN = nn.Sequential(*layers)\n\n    def forward(self, x):\n        return self.Conv2DwithBN(x)\n\nclass ConvBlock(nn.Module):\n    def __init__(self, in_fea, out_fea, kernel_size=3, stride=1, padding=1, norm='bn', relu_slop=0.2, dropout=None):\n        super(ConvBlock,self).__init__()\n        layers = [nn.Conv2d(in_channels=in_fea, out_channels=out_fea, kernel_size=kernel_size, stride=stride, padding=padding)]\n        if norm in NORM_LAYERS:\n            layers.append(NORM_LAYERS[norm](out_fea))\n        layers.append(nn.LeakyReLU(relu_slop, inplace=True))\n        if dropout:\n            layers.append(nn.Dropout2d(0.8))\n        self.layers = nn.Sequential(*layers)\n\n    def forward(self, x):\n        return self.layers(x)\n\n\nclass ConvBlock_Tanh(nn.Module):\n    def __init__(self, in_fea, out_fea, kernel_size=3, stride=1, padding=1, norm='bn'):\n        super(ConvBlock_Tanh, self).__init__()\n        layers = [nn.Conv2d(in_channels=in_fea, out_channels=out_fea, kernel_size=kernel_size, stride=stride, padding=padding)]\n        if norm in NORM_LAYERS:\n            layers.append(NORM_LAYERS[norm](out_fea))\n        layers.append(nn.Tanh())\n        self.layers = nn.Sequential(*layers)\n\n    def forward(self, x):\n        return self.layers(x)\n\n\nclass DeconvBlock(nn.Module):\n    def __init__(self, in_fea, out_fea, kernel_size=2, stride=2, padding=0, output_padding=0, norm='bn'):\n        super(DeconvBlock, self).__init__()\n        layers = [nn.ConvTranspose2d(in_channels=in_fea, out_channels=out_fea, kernel_size=kernel_size, stride=stride, padding=padding, output_padding=output_padding)]\n        if norm in NORM_LAYERS:\n            layers.append(NORM_LAYERS[norm](out_fea))\n        layers.append(nn.LeakyReLU(0.2, inplace=True))\n        self.layers = nn.Sequential(*layers)\n\n    def forward(self, x):\n        return self.layers(x)\n\n\nclass ResizeBlock(nn.Module):\n    def __init__(self, in_fea, out_fea, scale_factor=2, mode='nearest', norm='bn'):\n        super(ResizeBlock, self).__init__()\n        layers = [nn.Upsample(scale_factor=scale_factor, mode=mode)]\n        layers.append(nn.Conv2d(in_channels=in_fea, out_channels=out_fea, kernel_size=3, stride=1, padding=1))\n        if norm in NORM_LAYERS:\n            layers.append(NORM_LAYERS[norm](out_fea))\n        layers.append(nn.LeakyReLU(0.2, inplace=True))\n        self.layers = nn.Sequential(*layers)\n\n    def forward(self, x):\n        return self.layers(x)\n\n\n\n# FlatFault/CurveFault\n# 1000, 70 -> 70, 70\nclass InversionNet(nn.Module):\n    def __init__(self, dim1=32, dim2=64, dim3=128, dim4=256, dim5=512, sample_spatial=1.0, **kwargs):\n        super(InversionNet, self).__init__()\n        self.convblock1 = ConvBlock(5, dim1, kernel_size=(7, 1), stride=(2, 1), padding=(3, 0))\n        self.convblock2_1 = ConvBlock(dim1, dim2, kernel_size=(3, 1), stride=(2, 1), padding=(1, 0))\n        self.convblock2_2 = ConvBlock(dim2, dim2, kernel_size=(3, 1), padding=(1, 0))\n        self.convblock3_1 = ConvBlock(dim2, dim2, kernel_size=(3, 1), stride=(2, 1), padding=(1, 0))\n        self.convblock3_2 = ConvBlock(dim2, dim2, kernel_size=(3, 1), padding=(1, 0))\n        self.convblock4_1 = ConvBlock(dim2, dim3, kernel_size=(3, 1), stride=(2, 1), padding=(1, 0))\n        self.convblock4_2 = ConvBlock(dim3, dim3, kernel_size=(3, 1), padding=(1, 0))\n        self.convblock5_1 = ConvBlock(dim3, dim3, stride=2)\n        self.convblock5_2 = ConvBlock(dim3, dim3)\n        self.convblock6_1 = ConvBlock(dim3, dim4, stride=2)\n        self.convblock6_2 = ConvBlock(dim4, dim4)\n        self.convblock7_1 = ConvBlock(dim4, dim4, stride=2)\n        self.convblock7_2 = ConvBlock(dim4, dim4)\n        self.convblock8 = ConvBlock(dim4, dim5, kernel_size=(8, ceil(70 * sample_spatial / 8)), padding=0)\n        \n        self.deconv1_1 = DeconvBlock(dim5, dim5, kernel_size=5)\n        self.deconv1_2 = ConvBlock(dim5, dim5)\n        self.deconv2_1 = DeconvBlock(dim5, dim4, kernel_size=4, stride=2, padding=1)\n        self.deconv2_2 = ConvBlock(dim4, dim4)\n        self.deconv3_1 = DeconvBlock(dim4, dim3, kernel_size=4, stride=2, padding=1)\n        self.deconv3_2 = ConvBlock(dim3, dim3)\n        self.deconv4_1 = DeconvBlock(dim3, dim2, kernel_size=4, stride=2, padding=1)\n        self.deconv4_2 = ConvBlock(dim2, dim2)\n        self.deconv5_1 = DeconvBlock(dim2, dim1, kernel_size=4, stride=2, padding=1)\n        self.deconv5_2 = ConvBlock(dim1, dim1)\n        self.deconv6 = ConvBlock_Tanh(dim1, 1)\n        \n    def forward(self,x):\n        # Encoder Part\n        x = self.convblock1(x) # (None, 32, 500, 70)\n        x = self.convblock2_1(x) # (None, 64, 250, 70)\n        x = self.convblock2_2(x) # (None, 64, 250, 70)\n        x = self.convblock3_1(x) # (None, 64, 125, 70)\n        x = self.convblock3_2(x) # (None, 64, 125, 70)\n        x = self.convblock4_1(x) # (None, 128, 63, 70) \n        x = self.convblock4_2(x) # (None, 128, 63, 70)\n        x = self.convblock5_1(x) # (None, 128, 32, 35) \n        x = self.convblock5_2(x) # (None, 128, 32, 35)\n        x = self.convblock6_1(x) # (None, 256, 16, 18) \n        x = self.convblock6_2(x) # (None, 256, 16, 18)\n        x = self.convblock7_1(x) # (None, 256, 8, 9) \n        x = self.convblock7_2(x) # (None, 256, 8, 9)\n        x = self.convblock8(x) # (None, 512, 1, 1)\n        \n        # Decoder Part \n        x = self.deconv1_1(x) # (None, 512, 5, 5)\n        x = self.deconv1_2(x) # (None, 512, 5, 5)\n        x = self.deconv2_1(x) # (None, 256, 10, 10) \n        x = self.deconv2_2(x) # (None, 256, 10, 10)\n        x = self.deconv3_1(x) # (None, 128, 20, 20) \n        x = self.deconv3_2(x) # (None, 128, 20, 20)\n        x = self.deconv4_1(x) # (None, 64, 40, 40) \n        x = self.deconv4_2(x) # (None, 64, 40, 40)\n        x = self.deconv5_1(x) # (None, 32, 80, 80)\n        x = self.deconv5_2(x) # (None, 32, 80, 80)\n        x = F.pad(x, [-5, -5, -5, -5], mode=\"constant\", value=0) # (None, 32, 70, 70) 125, 100\n        x = self.deconv6(x) # (None, 1, 70, 70)\n        return x\n\nclass FCN4_Deep_Resize_2(nn.Module):\n    def __init__(self, dim1=32, dim2=64, dim3=128, dim4=256, dim5=512, ratio=1.0, upsample_mode='nearest'):\n        super(FCN4_Deep_Resize_2, self).__init__()\n        self.convblock1 = Conv2DwithBN(5, dim1, kernel_size=(7, 1), stride=(2, 1), padding=(3, 0))\n        self.convblock2_1 = Conv2DwithBN(dim1, dim2, kernel_size=(3, 1), stride=(2, 1), padding=(1, 0))\n        self.convblock2_2 = Conv2DwithBN(dim2, dim2, kernel_size=(3, 1), padding=(1, 0))\n        self.convblock3_1 = Conv2DwithBN(dim2, dim2, kernel_size=(3, 1), stride=(2, 1), padding=(1, 0))\n        self.convblock3_2 = Conv2DwithBN(dim2, dim2, kernel_size=(3, 1), padding=(1, 0))\n        self.convblock4_1 = Conv2DwithBN(dim2, dim3, kernel_size=(3, 1), stride=(2, 1), padding=(1, 0))\n        self.convblock4_2 = Conv2DwithBN(dim3, dim3, kernel_size=(3, 1), padding=(1, 0))\n        self.convblock5_1 = Conv2DwithBN(dim3, dim3, stride=2)\n        self.convblock5_2 = Conv2DwithBN(dim3, dim3)\n        self.convblock6_1 = Conv2DwithBN(dim3, dim4, stride=2)\n        self.convblock6_2 = Conv2DwithBN(dim4, dim4)\n        self.convblock7_1 = Conv2DwithBN(dim4, dim4, stride=2)\n        self.convblock7_2 = Conv2DwithBN(dim4, dim4)\n        self.convblock8 = Conv2DwithBN(dim4, dim5, kernel_size=(8, ceil(70 * ratio / 8)), padding=0)\n        \n        self.deconv1_1 = ResizeConv2DwithBN(dim5, dim5, scale_factor=5, mode=upsample_mode)\n        self.deconv1_2 = Conv2DwithBN(dim5, dim5)\n        self.deconv2_1 = ResizeConv2DwithBN(dim5, dim4, scale_factor=2, mode=upsample_mode)\n        self.deconv2_2 = Conv2DwithBN(dim4, dim4)\n        self.deconv3_1 = ResizeConv2DwithBN(dim4, dim3, scale_factor=2, mode=upsample_mode)\n        self.deconv3_2 = Conv2DwithBN(dim3, dim3)\n        self.deconv4_1 = ResizeConv2DwithBN(dim3, dim2, scale_factor=2, mode=upsample_mode)\n        self.deconv4_2 = Conv2DwithBN(dim2, dim2)\n        self.deconv5_1 = ResizeConv2DwithBN(dim2, dim1, scale_factor=2, mode=upsample_mode)\n        self.deconv5_2 = Conv2DwithBN(dim1, dim1)\n        self.deconv6 = Conv2DwithBN_Tanh(dim1, 1)\n        \n    def forward(self,x):\n        # Encoder Part\n        x = self.convblock1(x) # (None, 32, 500, 70)\n        x = self.convblock2_1(x) # (None, 64, 250, 70)\n        x = self.convblock2_2(x) # (None, 64, 250, 70)\n        x = self.convblock3_1(x) # (None, 64, 125, 70)\n        x = self.convblock3_2(x) # (None, 64, 125, 70)\n        x = self.convblock4_1(x) # (None, 128, 63, 70)\n        x = self.convblock4_2(x) # (None, 128, 63, 70)\n        x = self.convblock5_1(x) # (None, 128, 32, 35)\n        x = self.convblock5_2(x) # (None, 128, 32, 35)\n        x = self.convblock6_1(x) # (None, 256, 16, 18)\n        x = self.convblock6_2(x) # (None, 256, 16, 18)\n        x = self.convblock7_1(x) # (None, 256, 8, 9)\n        x = self.convblock7_2(x) # (None, 256, 8, 9)\n        x = self.convblock8(x) # (None, 512, 1, 1)\n        \n        # Decoder Part \n        x = self.deconv1_1(x) # (None, 512, 5, 5)\n        x = self.deconv1_2(x) # (None, 512, 5, 5)\n        x = self.deconv2_1(x) # (None, 256, 10, 10)\n        x = self.deconv2_2(x) # (None, 256, 10, 10)\n        x = self.deconv3_1(x) # (None, 128, 20, 20)\n        x = self.deconv3_2(x) # (None, 128, 20, 20)\n        x = self.deconv4_1(x) # (None, 64, 40, 40)\n        x = self.deconv4_2(x) # (None, 64, 40, 40)\n        x = self.deconv5_1(x) # (None, 32, 80, 80)\n        x = self.deconv5_2(x) # (None, 32, 80, 80)\n        x = F.pad(x, [-5, -5, -5, -5], mode=\"constant\", value=0) # (None, 32, 70, 70)\n        x = self.deconv6(x) # (None, 1, 70, 70)\n        return x\n\n\nclass Discriminator(nn.Module):\n    def __init__(self, dim1=32, dim2=64, dim3=128, dim4=256, **kwargs):\n        super(Discriminator, self).__init__()\n        self.convblock1_1 = ConvBlock(1, dim1, stride=2)\n        self.convblock1_2 = ConvBlock(dim1, dim1)\n        self.convblock2_1 = ConvBlock(dim1, dim2, stride=2)\n        self.convblock2_2 = ConvBlock(dim2, dim2)\n        self.convblock3_1 = ConvBlock(dim2, dim3, stride=2)\n        self.convblock3_2 = ConvBlock(dim3, dim3)\n        self.convblock4_1 = ConvBlock(dim3, dim4, stride=2)\n        self.convblock4_2 = ConvBlock(dim4, dim4)\n        self.convblock5 = ConvBlock(dim4, 1, kernel_size=5, padding=0)\n\n    def forward(self, x):\n        x = self.convblock1_1(x)\n        x = self.convblock1_2(x)\n        x = self.convblock2_1(x)\n        x = self.convblock2_2(x)\n        x = self.convblock3_1(x)\n        x = self.convblock3_2(x)\n        x = self.convblock4_1(x)\n        x = self.convblock4_2(x)\n        x = self.convblock5(x)\n        x = x.view(x.shape[0], -1)\n        return x\n\n\nclass Conv_HPGNN(nn.Module):\n    def __init__(self, in_fea, out_fea, kernel_size=None, stride=None, padding=None, **kwargs):\n        super(Conv_HPGNN, self).__init__()\n        layers = [\n            ConvBlock(in_fea, out_fea, relu_slop=0.1, dropout=0.8),\n            ConvBlock(out_fea, out_fea, relu_slop=0.1, dropout=0.8),\n        ]\n        if kernel_size is not None:\n            layers.append(nn.MaxPool2d(kernel_size=kernel_size, stride=stride, padding=padding))\n        self.layers = nn.Sequential(*layers)\n\n    def forward(self, x):\n        return self.layers(x)\n\n\nclass Deconv_HPGNN(nn.Module):\n    def __init__(self, in_fea, out_fea, kernel_size, **kwargs):\n        super(Deconv_HPGNN, self).__init__()\n        layers = [\n            nn.ConvTranspose2d(in_fea, in_fea, kernel_size=kernel_size, stride=2, padding=0),\n            ConvBlock(in_fea, out_fea, relu_slop=0.1, dropout=0.8),\n            ConvBlock(out_fea, out_fea, relu_slop=0.1, dropout=0.8)\n        ]\n        self.layers = nn.Sequential(*layers)\n\n    def forward(self, x):\n        return self.layers(x)\n\n\nmodel_dict = {\n    'InversionNet': InversionNet,\n    'Discriminator': Discriminator,\n    'UPFWI': FCN4_Deep_Resize_2\n}\n\n"
  },
  {
    "path": "pytorch_ssim.py",
    "content": "# From https://github.com/Po-Hsun-Su/pytorch-ssim/blob/master/pytorch_ssim/__init__.py\n\nimport torch\nimport torch.nn.functional as F\nfrom torch.autograd import Variable\nimport numpy as np\nfrom math import exp\n\ndef gaussian(window_size, sigma):\n    gauss = torch.Tensor([exp(-(x - window_size//2)**2/float(2*sigma**2)) for x in range(window_size)])\n    return gauss/gauss.sum()\n\ndef create_window(window_size, channel):\n    _1D_window = gaussian(window_size, 1.5).unsqueeze(1)\n    _2D_window = _1D_window.mm(_1D_window.t()).float().unsqueeze(0).unsqueeze(0)\n    window = Variable(_2D_window.expand(channel, 1, window_size, window_size).contiguous())\n    return window\n\ndef _ssim(img1, img2, window, window_size, channel, size_average = True):\n    mu1 = F.conv2d(img1, window, padding = window_size//2, groups = channel)\n    mu2 = F.conv2d(img2, window, padding = window_size//2, groups = channel)\n\n    mu1_sq = mu1.pow(2)\n    mu2_sq = mu2.pow(2)\n    mu1_mu2 = mu1*mu2\n\n    sigma1_sq = F.conv2d(img1*img1, window, padding = window_size//2, groups = channel) - mu1_sq\n    sigma2_sq = F.conv2d(img2*img2, window, padding = window_size//2, groups = channel) - mu2_sq\n    sigma12 = F.conv2d(img1*img2, window, padding = window_size//2, groups = channel) - mu1_mu2\n\n    C1 = 0.01**2\n    C2 = 0.03**2\n\n    ssim_map = ((2*mu1_mu2 + C1)*(2*sigma12 + C2))/((mu1_sq + mu2_sq + C1)*(sigma1_sq + sigma2_sq + C2))\n\n    if size_average:\n        return ssim_map.mean()\n    else:\n        return ssim_map.mean(1).mean(1).mean(1)\n\nclass SSIM(torch.nn.Module):\n    def __init__(self, window_size = 11, size_average = True):\n        super(SSIM, self).__init__()\n        self.window_size = window_size\n        self.size_average = size_average\n        self.channel = 1\n        self.window = create_window(window_size, self.channel)\n\n    def forward(self, img1, img2):\n        (_, channel, _, _) = img1.size()\n\n        if channel == self.channel and self.window.data.type() == img1.data.type():\n            window = self.window\n        else:\n            window = create_window(self.window_size, channel)\n            \n            if img1.is_cuda:\n                window = window.cuda(img1.get_device())\n            window = window.type_as(img1)\n            \n            self.window = window\n            self.channel = channel\n\n\n        return _ssim(img1, img2, window, self.window_size, channel, self.size_average)\n\ndef ssim(img1, img2, window_size = 11, size_average = True):\n    (_, channel, _, _) = img1.size()\n    window = create_window(window_size, channel)\n    \n    if img1.is_cuda:\n        window = window.cuda(img1.get_device())\n    window = window.type_as(img1)\n    \n    return _ssim(img1, img2, window, window_size, channel, size_average)"
  },
  {
    "path": "scheduler.py",
    "content": "# © 2022. Triad National Security, LLC. All rights reserved.\n\n# This program was produced under U.S. Government contract 89233218CNA000001 for Los Alamos\n\n# National Laboratory (LANL), which is operated by Triad National Security, LLC for the U.S.\n\n# Department of Energy/National Nuclear Security Administration. All rights in the program are\n\n# reserved by Triad National Security, LLC, and the U.S. Department of Energy/National Nuclear\n\n# Security Administration. The Government is granted for itself and others acting on its behalf a\n\n# nonexclusive, paid-up, irrevocable worldwide license in this material to reproduce, prepare\n\n# derivative works, distribute copies to the public, perform publicly and display publicly, and to permit\n\n# others to do so.\n\nimport torch\nfrom bisect import bisect_right\n\n# Scheduler adopted from the original repo\nclass WarmupMultiStepLR(torch.optim.lr_scheduler._LRScheduler):\n    def __init__(\n        self,\n        optimizer,\n        milestones,\n        gamma=0.1,\n        warmup_factor=1.0 / 3,\n        warmup_iters=5,\n        warmup_method=\"linear\",\n        last_epoch=-1,\n    ):\n        if not milestones == sorted(milestones):\n            raise ValueError(\n                \"Milestones should be a list of\" \" increasing integers. Got {}\",\n                milestones,\n            )\n\n        if warmup_method not in (\"constant\", \"linear\"):\n            raise ValueError(\n                \"Only 'constant' or 'linear' warmup_method accepted\"\n                \"got {}\".format(warmup_method)\n            )\n        self.milestones = milestones\n        self.gamma = gamma\n        self.warmup_factor = warmup_factor\n        self.warmup_iters = warmup_iters\n        self.warmup_method = warmup_method\n        super(WarmupMultiStepLR, self).__init__(optimizer, last_epoch)\n\n    def get_lr(self):\n        warmup_factor = 1\n        if self.last_epoch < self.warmup_iters:\n            if self.warmup_method == \"constant\":\n                warmup_factor = self.warmup_factor\n            elif self.warmup_method == \"linear\":\n                alpha = float(self.last_epoch) / self.warmup_iters\n                warmup_factor = self.warmup_factor * (1 - alpha) + alpha\n        return [\n            base_lr *\n            warmup_factor *\n            self.gamma ** bisect_right(self.milestones, self.last_epoch)\n            for base_lr in self.base_lrs\n        ]\n"
  },
  {
    "path": "split_files/curvefault_a_train.txt",
    "content": "/projects/piml_inversion/FWIOpenData/CurveFault_A/seis2_1_0.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_A/vel2_1_0.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_A/seis2_1_1.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_A/vel2_1_1.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_A/seis2_1_2.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_A/vel2_1_2.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_A/seis2_1_3.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_A/vel2_1_3.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_A/seis2_1_4.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_A/vel2_1_4.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_A/seis2_1_5.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_A/vel2_1_5.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_A/seis2_1_6.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_A/vel2_1_6.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_A/seis2_1_7.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_A/vel2_1_7.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_A/seis2_1_8.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_A/vel2_1_8.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_A/seis2_1_9.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_A/vel2_1_9.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_A/seis2_1_10.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_A/vel2_1_10.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_A/seis2_1_11.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_A/vel2_1_11.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_A/seis2_1_12.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_A/vel2_1_12.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_A/seis2_1_13.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_A/vel2_1_13.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_A/seis2_1_14.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_A/vel2_1_14.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_A/seis2_1_15.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_A/vel2_1_15.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_A/seis2_1_16.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_A/vel2_1_16.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_A/seis2_1_17.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_A/vel2_1_17.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_A/seis2_1_18.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_A/vel2_1_18.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_A/seis2_1_19.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_A/vel2_1_19.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_A/seis2_1_20.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_A/vel2_1_20.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_A/seis2_1_21.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_A/vel2_1_21.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_A/seis2_1_22.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_A/vel2_1_22.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_A/seis2_1_23.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_A/vel2_1_23.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_A/seis2_1_24.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_A/vel2_1_24.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_A/seis2_1_25.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_A/vel2_1_25.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_A/seis2_1_26.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_A/vel2_1_26.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_A/seis2_1_27.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_A/vel2_1_27.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_A/seis2_1_28.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_A/vel2_1_28.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_A/seis2_1_29.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_A/vel2_1_29.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_A/seis2_1_30.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_A/vel2_1_30.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_A/seis2_1_31.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_A/vel2_1_31.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_A/seis3_1_0.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_A/vel3_1_0.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_A/seis3_1_1.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_A/vel3_1_1.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_A/seis3_1_2.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_A/vel3_1_2.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_A/seis3_1_3.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_A/vel3_1_3.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_A/seis3_1_4.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_A/vel3_1_4.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_A/seis3_1_5.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_A/vel3_1_5.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_A/seis3_1_6.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_A/vel3_1_6.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_A/seis3_1_7.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_A/vel3_1_7.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_A/seis3_1_8.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_A/vel3_1_8.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_A/seis3_1_9.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_A/vel3_1_9.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_A/seis3_1_10.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_A/vel3_1_10.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_A/seis3_1_11.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_A/vel3_1_11.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_A/seis3_1_12.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_A/vel3_1_12.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_A/seis3_1_13.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_A/vel3_1_13.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_A/seis3_1_14.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_A/vel3_1_14.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_A/seis3_1_15.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_A/vel3_1_15.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_A/seis3_1_16.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_A/vel3_1_16.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_A/seis3_1_17.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_A/vel3_1_17.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_A/seis3_1_18.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_A/vel3_1_18.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_A/seis3_1_19.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_A/vel3_1_19.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_A/seis3_1_20.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_A/vel3_1_20.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_A/seis3_1_21.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_A/vel3_1_21.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_A/seis3_1_22.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_A/vel3_1_22.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_A/seis3_1_23.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_A/vel3_1_23.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_A/seis3_1_24.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_A/vel3_1_24.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_A/seis3_1_25.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_A/vel3_1_25.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_A/seis3_1_26.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_A/vel3_1_26.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_A/seis3_1_27.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_A/vel3_1_27.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_A/seis3_1_28.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_A/vel3_1_28.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_A/seis3_1_29.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_A/vel3_1_29.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_A/seis3_1_30.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_A/vel3_1_30.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_A/seis3_1_31.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_A/vel3_1_31.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_A/seis4_1_0.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_A/vel4_1_0.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_A/seis4_1_1.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_A/vel4_1_1.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_A/seis4_1_2.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_A/vel4_1_2.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_A/seis4_1_3.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_A/vel4_1_3.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_A/seis4_1_4.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_A/vel4_1_4.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_A/seis4_1_5.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_A/vel4_1_5.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_A/seis4_1_6.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_A/vel4_1_6.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_A/seis4_1_7.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_A/vel4_1_7.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_A/seis4_1_8.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_A/vel4_1_8.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_A/seis4_1_9.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_A/vel4_1_9.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_A/seis4_1_10.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_A/vel4_1_10.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_A/seis4_1_11.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_A/vel4_1_11.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_A/seis4_1_12.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_A/vel4_1_12.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_A/seis4_1_13.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_A/vel4_1_13.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_A/seis4_1_14.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_A/vel4_1_14.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_A/seis4_1_15.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_A/vel4_1_15.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_A/seis4_1_16.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_A/vel4_1_16.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_A/seis4_1_17.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_A/vel4_1_17.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_A/seis4_1_18.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_A/vel4_1_18.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_A/seis4_1_19.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_A/vel4_1_19.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_A/seis4_1_20.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_A/vel4_1_20.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_A/seis4_1_21.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_A/vel4_1_21.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_A/seis4_1_22.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_A/vel4_1_22.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_A/seis4_1_23.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_A/vel4_1_23.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_A/seis4_1_24.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_A/vel4_1_24.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_A/seis4_1_25.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_A/vel4_1_25.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_A/seis4_1_26.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_A/vel4_1_26.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_A/seis4_1_27.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_A/vel4_1_27.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_A/seis4_1_28.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_A/vel4_1_28.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_A/seis4_1_29.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_A/vel4_1_29.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_A/seis4_1_30.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_A/vel4_1_30.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_A/seis4_1_31.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_A/vel4_1_31.npy\n"
  },
  {
    "path": "split_files/curvefault_a_val.txt",
    "content": "/projects/piml_inversion/FWIOpenData/CurveFault_A/seis2_1_32.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_A/vel2_1_32.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_A/seis2_1_33.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_A/vel2_1_33.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_A/seis2_1_34.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_A/vel2_1_34.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_A/seis2_1_35.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_A/vel2_1_35.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_A/seis3_1_32.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_A/vel3_1_32.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_A/seis3_1_33.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_A/vel3_1_33.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_A/seis3_1_34.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_A/vel3_1_34.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_A/seis3_1_35.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_A/vel3_1_35.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_A/seis4_1_32.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_A/vel4_1_32.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_A/seis4_1_33.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_A/vel4_1_33.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_A/seis4_1_34.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_A/vel4_1_34.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_A/seis4_1_35.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_A/vel4_1_35.npy\n"
  },
  {
    "path": "split_files/curvefault_b_train.txt",
    "content": "/projects/piml_inversion/FWIOpenData/CurveFault_B/seis6_1_0.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_B/vel6_1_0.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_B/seis6_1_1.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_B/vel6_1_1.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_B/seis6_1_2.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_B/vel6_1_2.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_B/seis6_1_3.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_B/vel6_1_3.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_B/seis6_1_4.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_B/vel6_1_4.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_B/seis6_1_5.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_B/vel6_1_5.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_B/seis6_1_6.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_B/vel6_1_6.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_B/seis6_1_7.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_B/vel6_1_7.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_B/seis6_1_8.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_B/vel6_1_8.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_B/seis6_1_9.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_B/vel6_1_9.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_B/seis6_1_10.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_B/vel6_1_10.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_B/seis6_1_11.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_B/vel6_1_11.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_B/seis6_1_12.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_B/vel6_1_12.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_B/seis6_1_13.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_B/vel6_1_13.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_B/seis6_1_14.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_B/vel6_1_14.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_B/seis6_1_15.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_B/vel6_1_15.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_B/seis6_1_16.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_B/vel6_1_16.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_B/seis6_1_17.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_B/vel6_1_17.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_B/seis6_1_18.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_B/vel6_1_18.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_B/seis6_1_19.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_B/vel6_1_19.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_B/seis6_1_20.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_B/vel6_1_20.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_B/seis6_1_21.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_B/vel6_1_21.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_B/seis6_1_22.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_B/vel6_1_22.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_B/seis6_1_23.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_B/vel6_1_23.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_B/seis6_1_24.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_B/vel6_1_24.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_B/seis6_1_25.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_B/vel6_1_25.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_B/seis6_1_26.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_B/vel6_1_26.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_B/seis6_1_27.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_B/vel6_1_27.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_B/seis6_1_28.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_B/vel6_1_28.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_B/seis6_1_29.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_B/vel6_1_29.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_B/seis6_1_30.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_B/vel6_1_30.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_B/seis6_1_31.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_B/vel6_1_31.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_B/seis7_1_0.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_B/vel7_1_0.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_B/seis7_1_1.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_B/vel7_1_1.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_B/seis7_1_2.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_B/vel7_1_2.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_B/seis7_1_3.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_B/vel7_1_3.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_B/seis7_1_4.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_B/vel7_1_4.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_B/seis7_1_5.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_B/vel7_1_5.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_B/seis7_1_6.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_B/vel7_1_6.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_B/seis7_1_7.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_B/vel7_1_7.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_B/seis7_1_8.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_B/vel7_1_8.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_B/seis7_1_9.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_B/vel7_1_9.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_B/seis7_1_10.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_B/vel7_1_10.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_B/seis7_1_11.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_B/vel7_1_11.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_B/seis7_1_12.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_B/vel7_1_12.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_B/seis7_1_13.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_B/vel7_1_13.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_B/seis7_1_14.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_B/vel7_1_14.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_B/seis7_1_15.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_B/vel7_1_15.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_B/seis7_1_16.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_B/vel7_1_16.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_B/seis7_1_17.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_B/vel7_1_17.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_B/seis7_1_18.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_B/vel7_1_18.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_B/seis7_1_19.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_B/vel7_1_19.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_B/seis7_1_20.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_B/vel7_1_20.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_B/seis7_1_21.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_B/vel7_1_21.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_B/seis7_1_22.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_B/vel7_1_22.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_B/seis7_1_23.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_B/vel7_1_23.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_B/seis7_1_24.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_B/vel7_1_24.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_B/seis7_1_25.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_B/vel7_1_25.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_B/seis7_1_26.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_B/vel7_1_26.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_B/seis7_1_27.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_B/vel7_1_27.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_B/seis7_1_28.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_B/vel7_1_28.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_B/seis7_1_29.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_B/vel7_1_29.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_B/seis7_1_30.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_B/vel7_1_30.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_B/seis7_1_31.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_B/vel7_1_31.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_B/seis8_1_0.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_B/vel8_1_0.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_B/seis8_1_1.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_B/vel8_1_1.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_B/seis8_1_2.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_B/vel8_1_2.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_B/seis8_1_3.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_B/vel8_1_3.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_B/seis8_1_4.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_B/vel8_1_4.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_B/seis8_1_5.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_B/vel8_1_5.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_B/seis8_1_6.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_B/vel8_1_6.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_B/seis8_1_7.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_B/vel8_1_7.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_B/seis8_1_8.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_B/vel8_1_8.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_B/seis8_1_9.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_B/vel8_1_9.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_B/seis8_1_10.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_B/vel8_1_10.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_B/seis8_1_11.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_B/vel8_1_11.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_B/seis8_1_12.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_B/vel8_1_12.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_B/seis8_1_13.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_B/vel8_1_13.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_B/seis8_1_14.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_B/vel8_1_14.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_B/seis8_1_15.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_B/vel8_1_15.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_B/seis8_1_16.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_B/vel8_1_16.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_B/seis8_1_17.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_B/vel8_1_17.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_B/seis8_1_18.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_B/vel8_1_18.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_B/seis8_1_19.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_B/vel8_1_19.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_B/seis8_1_20.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_B/vel8_1_20.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_B/seis8_1_21.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_B/vel8_1_21.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_B/seis8_1_22.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_B/vel8_1_22.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_B/seis8_1_23.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_B/vel8_1_23.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_B/seis8_1_24.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_B/vel8_1_24.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_B/seis8_1_25.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_B/vel8_1_25.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_B/seis8_1_26.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_B/vel8_1_26.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_B/seis8_1_27.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_B/vel8_1_27.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_B/seis8_1_28.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_B/vel8_1_28.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_B/seis8_1_29.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_B/vel8_1_29.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_B/seis8_1_30.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_B/vel8_1_30.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_B/seis8_1_31.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_B/vel8_1_31.npy\n"
  },
  {
    "path": "split_files/curvefault_b_val.txt",
    "content": "/projects/piml_inversion/FWIOpenData/CurveFault_B/seis6_1_32.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_B/vel6_1_32.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_B/seis6_1_33.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_B/vel6_1_33.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_B/seis6_1_34.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_B/vel6_1_34.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_B/seis6_1_35.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_B/vel6_1_35.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_B/seis7_1_32.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_B/vel7_1_32.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_B/seis7_1_33.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_B/vel7_1_33.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_B/seis7_1_34.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_B/vel7_1_34.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_B/seis7_1_35.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_B/vel7_1_35.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_B/seis8_1_32.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_B/vel8_1_32.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_B/seis8_1_33.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_B/vel8_1_33.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_B/seis8_1_34.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_B/vel8_1_34.npy\n/projects/piml_inversion/FWIOpenData/CurveFault_B/seis8_1_35.npy\t/projects/piml_inversion/FWIOpenData/CurveFault_B/vel8_1_35.npy\n"
  },
  {
    "path": "split_files/curvevel_a_train.txt",
    "content": "/projects/piml_inversion/FWIOpenData/CurveVel_A/data/data1.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_A/model/model1.npy\n/projects/piml_inversion/FWIOpenData/CurveVel_A/data/data2.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_A/model/model2.npy\n/projects/piml_inversion/FWIOpenData/CurveVel_A/data/data3.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_A/model/model3.npy\n/projects/piml_inversion/FWIOpenData/CurveVel_A/data/data4.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_A/model/model4.npy\n/projects/piml_inversion/FWIOpenData/CurveVel_A/data/data5.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_A/model/model5.npy\n/projects/piml_inversion/FWIOpenData/CurveVel_A/data/data6.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_A/model/model6.npy\n/projects/piml_inversion/FWIOpenData/CurveVel_A/data/data7.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_A/model/model7.npy\n/projects/piml_inversion/FWIOpenData/CurveVel_A/data/data8.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_A/model/model8.npy\n/projects/piml_inversion/FWIOpenData/CurveVel_A/data/data9.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_A/model/model9.npy\n/projects/piml_inversion/FWIOpenData/CurveVel_A/data/data10.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_A/model/model10.npy\n/projects/piml_inversion/FWIOpenData/CurveVel_A/data/data11.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_A/model/model11.npy\n/projects/piml_inversion/FWIOpenData/CurveVel_A/data/data12.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_A/model/model12.npy\n/projects/piml_inversion/FWIOpenData/CurveVel_A/data/data13.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_A/model/model13.npy\n/projects/piml_inversion/FWIOpenData/CurveVel_A/data/data14.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_A/model/model14.npy\n/projects/piml_inversion/FWIOpenData/CurveVel_A/data/data15.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_A/model/model15.npy\n/projects/piml_inversion/FWIOpenData/CurveVel_A/data/data16.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_A/model/model16.npy\n/projects/piml_inversion/FWIOpenData/CurveVel_A/data/data17.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_A/model/model17.npy\n/projects/piml_inversion/FWIOpenData/CurveVel_A/data/data18.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_A/model/model18.npy\n/projects/piml_inversion/FWIOpenData/CurveVel_A/data/data19.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_A/model/model19.npy\n/projects/piml_inversion/FWIOpenData/CurveVel_A/data/data20.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_A/model/model20.npy\n/projects/piml_inversion/FWIOpenData/CurveVel_A/data/data21.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_A/model/model21.npy\n/projects/piml_inversion/FWIOpenData/CurveVel_A/data/data22.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_A/model/model22.npy\n/projects/piml_inversion/FWIOpenData/CurveVel_A/data/data23.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_A/model/model23.npy\n/projects/piml_inversion/FWIOpenData/CurveVel_A/data/data24.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_A/model/model24.npy\n/projects/piml_inversion/FWIOpenData/CurveVel_A/data/data25.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_A/model/model25.npy\n/projects/piml_inversion/FWIOpenData/CurveVel_A/data/data26.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_A/model/model26.npy\n/projects/piml_inversion/FWIOpenData/CurveVel_A/data/data27.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_A/model/model27.npy\n/projects/piml_inversion/FWIOpenData/CurveVel_A/data/data28.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_A/model/model28.npy\n/projects/piml_inversion/FWIOpenData/CurveVel_A/data/data29.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_A/model/model29.npy\n/projects/piml_inversion/FWIOpenData/CurveVel_A/data/data30.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_A/model/model30.npy\n/projects/piml_inversion/FWIOpenData/CurveVel_A/data/data31.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_A/model/model31.npy\n/projects/piml_inversion/FWIOpenData/CurveVel_A/data/data32.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_A/model/model32.npy\n/projects/piml_inversion/FWIOpenData/CurveVel_A/data/data33.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_A/model/model33.npy\n/projects/piml_inversion/FWIOpenData/CurveVel_A/data/data34.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_A/model/model34.npy\n/projects/piml_inversion/FWIOpenData/CurveVel_A/data/data35.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_A/model/model35.npy\n/projects/piml_inversion/FWIOpenData/CurveVel_A/data/data36.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_A/model/model36.npy\n/projects/piml_inversion/FWIOpenData/CurveVel_A/data/data37.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_A/model/model37.npy\n/projects/piml_inversion/FWIOpenData/CurveVel_A/data/data38.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_A/model/model38.npy\n/projects/piml_inversion/FWIOpenData/CurveVel_A/data/data39.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_A/model/model39.npy\n/projects/piml_inversion/FWIOpenData/CurveVel_A/data/data40.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_A/model/model40.npy\n/projects/piml_inversion/FWIOpenData/CurveVel_A/data/data41.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_A/model/model41.npy\n/projects/piml_inversion/FWIOpenData/CurveVel_A/data/data42.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_A/model/model42.npy\n/projects/piml_inversion/FWIOpenData/CurveVel_A/data/data43.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_A/model/model43.npy\n/projects/piml_inversion/FWIOpenData/CurveVel_A/data/data44.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_A/model/model44.npy\n/projects/piml_inversion/FWIOpenData/CurveVel_A/data/data45.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_A/model/model45.npy\n/projects/piml_inversion/FWIOpenData/CurveVel_A/data/data46.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_A/model/model46.npy\n/projects/piml_inversion/FWIOpenData/CurveVel_A/data/data47.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_A/model/model47.npy\n/projects/piml_inversion/FWIOpenData/CurveVel_A/data/data48.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_A/model/model48.npy\n"
  },
  {
    "path": "split_files/curvevel_a_val.txt",
    "content": "/projects/piml_inversion/FWIOpenData/CurveVel_A/data/data49.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_A/model/model49.npy\n/projects/piml_inversion/FWIOpenData/CurveVel_A/data/data50.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_A/model/model50.npy\n/projects/piml_inversion/FWIOpenData/CurveVel_A/data/data51.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_A/model/model51.npy\n/projects/piml_inversion/FWIOpenData/CurveVel_A/data/data52.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_A/model/model52.npy\n/projects/piml_inversion/FWIOpenData/CurveVel_A/data/data53.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_A/model/model53.npy\n/projects/piml_inversion/FWIOpenData/CurveVel_A/data/data54.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_A/model/model54.npy\n/projects/piml_inversion/FWIOpenData/CurveVel_A/data/data55.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_A/model/model55.npy\n/projects/piml_inversion/FWIOpenData/CurveVel_A/data/data56.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_A/model/model56.npy\n/projects/piml_inversion/FWIOpenData/CurveVel_A/data/data57.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_A/model/model57.npy\n/projects/piml_inversion/FWIOpenData/CurveVel_A/data/data58.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_A/model/model58.npy\n/projects/piml_inversion/FWIOpenData/CurveVel_A/data/data59.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_A/model/model59.npy\n/projects/piml_inversion/FWIOpenData/CurveVel_A/data/data60.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_A/model/model60.npy\n"
  },
  {
    "path": "split_files/curvevel_b_train.txt",
    "content": "/projects/piml_inversion/FWIOpenData/CurveVel_B/data/data1.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_B/model/model1.npy\n/projects/piml_inversion/FWIOpenData/CurveVel_B/data/data2.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_B/model/model2.npy\n/projects/piml_inversion/FWIOpenData/CurveVel_B/data/data3.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_B/model/model3.npy\n/projects/piml_inversion/FWIOpenData/CurveVel_B/data/data4.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_B/model/model4.npy\n/projects/piml_inversion/FWIOpenData/CurveVel_B/data/data5.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_B/model/model5.npy\n/projects/piml_inversion/FWIOpenData/CurveVel_B/data/data6.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_B/model/model6.npy\n/projects/piml_inversion/FWIOpenData/CurveVel_B/data/data7.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_B/model/model7.npy\n/projects/piml_inversion/FWIOpenData/CurveVel_B/data/data8.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_B/model/model8.npy\n/projects/piml_inversion/FWIOpenData/CurveVel_B/data/data9.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_B/model/model9.npy\n/projects/piml_inversion/FWIOpenData/CurveVel_B/data/data10.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_B/model/model10.npy\n/projects/piml_inversion/FWIOpenData/CurveVel_B/data/data11.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_B/model/model11.npy\n/projects/piml_inversion/FWIOpenData/CurveVel_B/data/data12.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_B/model/model12.npy\n/projects/piml_inversion/FWIOpenData/CurveVel_B/data/data13.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_B/model/model13.npy\n/projects/piml_inversion/FWIOpenData/CurveVel_B/data/data14.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_B/model/model14.npy\n/projects/piml_inversion/FWIOpenData/CurveVel_B/data/data15.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_B/model/model15.npy\n/projects/piml_inversion/FWIOpenData/CurveVel_B/data/data16.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_B/model/model16.npy\n/projects/piml_inversion/FWIOpenData/CurveVel_B/data/data17.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_B/model/model17.npy\n/projects/piml_inversion/FWIOpenData/CurveVel_B/data/data18.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_B/model/model18.npy\n/projects/piml_inversion/FWIOpenData/CurveVel_B/data/data19.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_B/model/model19.npy\n/projects/piml_inversion/FWIOpenData/CurveVel_B/data/data20.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_B/model/model20.npy\n/projects/piml_inversion/FWIOpenData/CurveVel_B/data/data21.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_B/model/model21.npy\n/projects/piml_inversion/FWIOpenData/CurveVel_B/data/data22.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_B/model/model22.npy\n/projects/piml_inversion/FWIOpenData/CurveVel_B/data/data23.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_B/model/model23.npy\n/projects/piml_inversion/FWIOpenData/CurveVel_B/data/data24.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_B/model/model24.npy\n/projects/piml_inversion/FWIOpenData/CurveVel_B/data/data25.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_B/model/model25.npy\n/projects/piml_inversion/FWIOpenData/CurveVel_B/data/data26.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_B/model/model26.npy\n/projects/piml_inversion/FWIOpenData/CurveVel_B/data/data27.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_B/model/model27.npy\n/projects/piml_inversion/FWIOpenData/CurveVel_B/data/data28.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_B/model/model28.npy\n/projects/piml_inversion/FWIOpenData/CurveVel_B/data/data29.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_B/model/model29.npy\n/projects/piml_inversion/FWIOpenData/CurveVel_B/data/data30.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_B/model/model30.npy\n/projects/piml_inversion/FWIOpenData/CurveVel_B/data/data31.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_B/model/model31.npy\n/projects/piml_inversion/FWIOpenData/CurveVel_B/data/data32.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_B/model/model32.npy\n/projects/piml_inversion/FWIOpenData/CurveVel_B/data/data33.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_B/model/model33.npy\n/projects/piml_inversion/FWIOpenData/CurveVel_B/data/data34.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_B/model/model34.npy\n/projects/piml_inversion/FWIOpenData/CurveVel_B/data/data35.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_B/model/model35.npy\n/projects/piml_inversion/FWIOpenData/CurveVel_B/data/data36.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_B/model/model36.npy\n/projects/piml_inversion/FWIOpenData/CurveVel_B/data/data37.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_B/model/model37.npy\n/projects/piml_inversion/FWIOpenData/CurveVel_B/data/data38.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_B/model/model38.npy\n/projects/piml_inversion/FWIOpenData/CurveVel_B/data/data39.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_B/model/model39.npy\n/projects/piml_inversion/FWIOpenData/CurveVel_B/data/data40.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_B/model/model40.npy\n/projects/piml_inversion/FWIOpenData/CurveVel_B/data/data41.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_B/model/model41.npy\n/projects/piml_inversion/FWIOpenData/CurveVel_B/data/data42.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_B/model/model42.npy\n/projects/piml_inversion/FWIOpenData/CurveVel_B/data/data43.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_B/model/model43.npy\n/projects/piml_inversion/FWIOpenData/CurveVel_B/data/data44.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_B/model/model44.npy\n/projects/piml_inversion/FWIOpenData/CurveVel_B/data/data45.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_B/model/model45.npy\n/projects/piml_inversion/FWIOpenData/CurveVel_B/data/data46.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_B/model/model46.npy\n/projects/piml_inversion/FWIOpenData/CurveVel_B/data/data47.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_B/model/model47.npy\n/projects/piml_inversion/FWIOpenData/CurveVel_B/data/data48.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_B/model/model48.npy\n"
  },
  {
    "path": "split_files/curvevel_b_val.txt",
    "content": "/projects/piml_inversion/FWIOpenData/CurveVel_B/data/data49.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_B/model/model49.npy\n/projects/piml_inversion/FWIOpenData/CurveVel_B/data/data50.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_B/model/model50.npy\n/projects/piml_inversion/FWIOpenData/CurveVel_B/data/data51.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_B/model/model51.npy\n/projects/piml_inversion/FWIOpenData/CurveVel_B/data/data52.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_B/model/model52.npy\n/projects/piml_inversion/FWIOpenData/CurveVel_B/data/data53.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_B/model/model53.npy\n/projects/piml_inversion/FWIOpenData/CurveVel_B/data/data54.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_B/model/model54.npy\n/projects/piml_inversion/FWIOpenData/CurveVel_B/data/data55.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_B/model/model55.npy\n/projects/piml_inversion/FWIOpenData/CurveVel_B/data/data56.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_B/model/model56.npy\n/projects/piml_inversion/FWIOpenData/CurveVel_B/data/data57.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_B/model/model57.npy\n/projects/piml_inversion/FWIOpenData/CurveVel_B/data/data58.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_B/model/model58.npy\n/projects/piml_inversion/FWIOpenData/CurveVel_B/data/data59.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_B/model/model59.npy\n/projects/piml_inversion/FWIOpenData/CurveVel_B/data/data60.npy\t/projects/piml_inversion/FWIOpenData/CurveVel_B/model/model60.npy\n"
  },
  {
    "path": "split_files/flatfault_a_train.txt",
    "content": "/projects/piml_inversion/FWIOpenData/FlatFault_A/seis2_1_0.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_A/vel2_1_0.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_A/seis2_1_1.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_A/vel2_1_1.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_A/seis2_1_2.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_A/vel2_1_2.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_A/seis2_1_3.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_A/vel2_1_3.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_A/seis2_1_4.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_A/vel2_1_4.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_A/seis2_1_5.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_A/vel2_1_5.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_A/seis2_1_6.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_A/vel2_1_6.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_A/seis2_1_7.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_A/vel2_1_7.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_A/seis2_1_8.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_A/vel2_1_8.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_A/seis2_1_9.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_A/vel2_1_9.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_A/seis2_1_10.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_A/vel2_1_10.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_A/seis2_1_11.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_A/vel2_1_11.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_A/seis2_1_12.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_A/vel2_1_12.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_A/seis2_1_13.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_A/vel2_1_13.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_A/seis2_1_14.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_A/vel2_1_14.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_A/seis2_1_15.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_A/vel2_1_15.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_A/seis2_1_16.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_A/vel2_1_16.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_A/seis2_1_17.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_A/vel2_1_17.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_A/seis2_1_18.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_A/vel2_1_18.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_A/seis2_1_19.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_A/vel2_1_19.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_A/seis2_1_20.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_A/vel2_1_20.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_A/seis2_1_21.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_A/vel2_1_21.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_A/seis2_1_22.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_A/vel2_1_22.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_A/seis2_1_23.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_A/vel2_1_23.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_A/seis2_1_24.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_A/vel2_1_24.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_A/seis2_1_25.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_A/vel2_1_25.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_A/seis2_1_26.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_A/vel2_1_26.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_A/seis2_1_27.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_A/vel2_1_27.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_A/seis2_1_28.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_A/vel2_1_28.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_A/seis2_1_29.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_A/vel2_1_29.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_A/seis2_1_30.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_A/vel2_1_30.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_A/seis2_1_31.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_A/vel2_1_31.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_A/seis3_1_0.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_A/vel3_1_0.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_A/seis3_1_1.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_A/vel3_1_1.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_A/seis3_1_2.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_A/vel3_1_2.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_A/seis3_1_3.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_A/vel3_1_3.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_A/seis3_1_4.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_A/vel3_1_4.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_A/seis3_1_5.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_A/vel3_1_5.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_A/seis3_1_6.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_A/vel3_1_6.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_A/seis3_1_7.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_A/vel3_1_7.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_A/seis3_1_8.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_A/vel3_1_8.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_A/seis3_1_9.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_A/vel3_1_9.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_A/seis3_1_10.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_A/vel3_1_10.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_A/seis3_1_11.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_A/vel3_1_11.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_A/seis3_1_12.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_A/vel3_1_12.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_A/seis3_1_13.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_A/vel3_1_13.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_A/seis3_1_14.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_A/vel3_1_14.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_A/seis3_1_15.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_A/vel3_1_15.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_A/seis3_1_16.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_A/vel3_1_16.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_A/seis3_1_17.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_A/vel3_1_17.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_A/seis3_1_18.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_A/vel3_1_18.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_A/seis3_1_19.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_A/vel3_1_19.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_A/seis3_1_20.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_A/vel3_1_20.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_A/seis3_1_21.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_A/vel3_1_21.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_A/seis3_1_22.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_A/vel3_1_22.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_A/seis3_1_23.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_A/vel3_1_23.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_A/seis3_1_24.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_A/vel3_1_24.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_A/seis3_1_25.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_A/vel3_1_25.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_A/seis3_1_26.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_A/vel3_1_26.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_A/seis3_1_27.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_A/vel3_1_27.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_A/seis3_1_28.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_A/vel3_1_28.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_A/seis3_1_29.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_A/vel3_1_29.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_A/seis3_1_30.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_A/vel3_1_30.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_A/seis3_1_31.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_A/vel3_1_31.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_A/seis4_1_0.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_A/vel4_1_0.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_A/seis4_1_1.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_A/vel4_1_1.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_A/seis4_1_2.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_A/vel4_1_2.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_A/seis4_1_3.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_A/vel4_1_3.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_A/seis4_1_4.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_A/vel4_1_4.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_A/seis4_1_5.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_A/vel4_1_5.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_A/seis4_1_6.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_A/vel4_1_6.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_A/seis4_1_7.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_A/vel4_1_7.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_A/seis4_1_8.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_A/vel4_1_8.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_A/seis4_1_9.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_A/vel4_1_9.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_A/seis4_1_10.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_A/vel4_1_10.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_A/seis4_1_11.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_A/vel4_1_11.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_A/seis4_1_12.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_A/vel4_1_12.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_A/seis4_1_13.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_A/vel4_1_13.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_A/seis4_1_14.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_A/vel4_1_14.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_A/seis4_1_15.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_A/vel4_1_15.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_A/seis4_1_16.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_A/vel4_1_16.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_A/seis4_1_17.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_A/vel4_1_17.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_A/seis4_1_18.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_A/vel4_1_18.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_A/seis4_1_19.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_A/vel4_1_19.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_A/seis4_1_20.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_A/vel4_1_20.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_A/seis4_1_21.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_A/vel4_1_21.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_A/seis4_1_22.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_A/vel4_1_22.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_A/seis4_1_23.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_A/vel4_1_23.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_A/seis4_1_24.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_A/vel4_1_24.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_A/seis4_1_25.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_A/vel4_1_25.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_A/seis4_1_26.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_A/vel4_1_26.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_A/seis4_1_27.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_A/vel4_1_27.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_A/seis4_1_28.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_A/vel4_1_28.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_A/seis4_1_29.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_A/vel4_1_29.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_A/seis4_1_30.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_A/vel4_1_30.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_A/seis4_1_31.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_A/vel4_1_31.npy\n"
  },
  {
    "path": "split_files/flatfault_a_val.txt",
    "content": "/projects/piml_inversion/FWIOpenData/FlatFault_A/seis2_1_32.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_A/vel2_1_32.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_A/seis2_1_33.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_A/vel2_1_33.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_A/seis2_1_34.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_A/vel2_1_34.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_A/seis2_1_35.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_A/vel2_1_35.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_A/seis3_1_32.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_A/vel3_1_32.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_A/seis3_1_33.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_A/vel3_1_33.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_A/seis3_1_34.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_A/vel3_1_34.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_A/seis3_1_35.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_A/vel3_1_35.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_A/seis4_1_32.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_A/vel4_1_32.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_A/seis4_1_33.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_A/vel4_1_33.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_A/seis4_1_34.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_A/vel4_1_34.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_A/seis4_1_35.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_A/vel4_1_35.npy\n"
  },
  {
    "path": "split_files/flatfault_b_train.txt",
    "content": "/projects/piml_inversion/FWIOpenData/FlatFault_B/seis6_1_0.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_B/vel6_1_0.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_B/seis6_1_1.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_B/vel6_1_1.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_B/seis6_1_2.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_B/vel6_1_2.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_B/seis6_1_3.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_B/vel6_1_3.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_B/seis6_1_4.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_B/vel6_1_4.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_B/seis6_1_5.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_B/vel6_1_5.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_B/seis6_1_6.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_B/vel6_1_6.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_B/seis6_1_7.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_B/vel6_1_7.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_B/seis6_1_8.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_B/vel6_1_8.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_B/seis6_1_9.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_B/vel6_1_9.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_B/seis6_1_10.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_B/vel6_1_10.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_B/seis6_1_11.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_B/vel6_1_11.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_B/seis6_1_12.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_B/vel6_1_12.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_B/seis6_1_13.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_B/vel6_1_13.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_B/seis6_1_14.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_B/vel6_1_14.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_B/seis6_1_15.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_B/vel6_1_15.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_B/seis6_1_16.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_B/vel6_1_16.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_B/seis6_1_17.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_B/vel6_1_17.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_B/seis6_1_18.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_B/vel6_1_18.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_B/seis6_1_19.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_B/vel6_1_19.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_B/seis6_1_20.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_B/vel6_1_20.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_B/seis6_1_21.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_B/vel6_1_21.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_B/seis6_1_22.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_B/vel6_1_22.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_B/seis6_1_23.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_B/vel6_1_23.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_B/seis6_1_24.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_B/vel6_1_24.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_B/seis6_1_25.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_B/vel6_1_25.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_B/seis6_1_26.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_B/vel6_1_26.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_B/seis6_1_27.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_B/vel6_1_27.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_B/seis6_1_28.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_B/vel6_1_28.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_B/seis6_1_29.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_B/vel6_1_29.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_B/seis6_1_30.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_B/vel6_1_30.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_B/seis6_1_31.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_B/vel6_1_31.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_B/seis7_1_0.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_B/vel7_1_0.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_B/seis7_1_1.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_B/vel7_1_1.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_B/seis7_1_2.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_B/vel7_1_2.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_B/seis7_1_3.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_B/vel7_1_3.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_B/seis7_1_4.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_B/vel7_1_4.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_B/seis7_1_5.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_B/vel7_1_5.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_B/seis7_1_6.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_B/vel7_1_6.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_B/seis7_1_7.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_B/vel7_1_7.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_B/seis7_1_8.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_B/vel7_1_8.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_B/seis7_1_9.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_B/vel7_1_9.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_B/seis7_1_10.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_B/vel7_1_10.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_B/seis7_1_11.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_B/vel7_1_11.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_B/seis7_1_12.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_B/vel7_1_12.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_B/seis7_1_13.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_B/vel7_1_13.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_B/seis7_1_14.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_B/vel7_1_14.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_B/seis7_1_15.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_B/vel7_1_15.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_B/seis7_1_16.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_B/vel7_1_16.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_B/seis7_1_17.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_B/vel7_1_17.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_B/seis7_1_18.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_B/vel7_1_18.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_B/seis7_1_19.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_B/vel7_1_19.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_B/seis7_1_20.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_B/vel7_1_20.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_B/seis7_1_21.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_B/vel7_1_21.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_B/seis7_1_22.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_B/vel7_1_22.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_B/seis7_1_23.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_B/vel7_1_23.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_B/seis7_1_24.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_B/vel7_1_24.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_B/seis7_1_25.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_B/vel7_1_25.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_B/seis7_1_26.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_B/vel7_1_26.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_B/seis7_1_27.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_B/vel7_1_27.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_B/seis7_1_28.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_B/vel7_1_28.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_B/seis7_1_29.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_B/vel7_1_29.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_B/seis7_1_30.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_B/vel7_1_30.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_B/seis7_1_31.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_B/vel7_1_31.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_B/seis8_1_0.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_B/vel8_1_0.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_B/seis8_1_1.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_B/vel8_1_1.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_B/seis8_1_2.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_B/vel8_1_2.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_B/seis8_1_3.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_B/vel8_1_3.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_B/seis8_1_4.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_B/vel8_1_4.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_B/seis8_1_5.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_B/vel8_1_5.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_B/seis8_1_6.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_B/vel8_1_6.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_B/seis8_1_7.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_B/vel8_1_7.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_B/seis8_1_8.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_B/vel8_1_8.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_B/seis8_1_9.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_B/vel8_1_9.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_B/seis8_1_10.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_B/vel8_1_10.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_B/seis8_1_11.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_B/vel8_1_11.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_B/seis8_1_12.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_B/vel8_1_12.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_B/seis8_1_13.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_B/vel8_1_13.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_B/seis8_1_14.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_B/vel8_1_14.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_B/seis8_1_15.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_B/vel8_1_15.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_B/seis8_1_16.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_B/vel8_1_16.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_B/seis8_1_17.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_B/vel8_1_17.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_B/seis8_1_18.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_B/vel8_1_18.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_B/seis8_1_19.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_B/vel8_1_19.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_B/seis8_1_20.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_B/vel8_1_20.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_B/seis8_1_21.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_B/vel8_1_21.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_B/seis8_1_22.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_B/vel8_1_22.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_B/seis8_1_23.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_B/vel8_1_23.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_B/seis8_1_24.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_B/vel8_1_24.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_B/seis8_1_25.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_B/vel8_1_25.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_B/seis8_1_26.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_B/vel8_1_26.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_B/seis8_1_27.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_B/vel8_1_27.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_B/seis8_1_28.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_B/vel8_1_28.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_B/seis8_1_29.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_B/vel8_1_29.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_B/seis8_1_30.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_B/vel8_1_30.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_B/seis8_1_31.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_B/vel8_1_31.npy\n"
  },
  {
    "path": "split_files/flatfault_b_val.txt",
    "content": "/projects/piml_inversion/FWIOpenData/FlatFault_B/seis6_1_32.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_B/vel6_1_32.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_B/seis6_1_33.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_B/vel6_1_33.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_B/seis6_1_34.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_B/vel6_1_34.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_B/seis6_1_35.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_B/vel6_1_35.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_B/seis7_1_32.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_B/vel7_1_32.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_B/seis7_1_33.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_B/vel7_1_33.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_B/seis7_1_34.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_B/vel7_1_34.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_B/seis7_1_35.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_B/vel7_1_35.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_B/seis8_1_32.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_B/vel8_1_32.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_B/seis8_1_33.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_B/vel8_1_33.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_B/seis8_1_34.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_B/vel8_1_34.npy\n/projects/piml_inversion/FWIOpenData/FlatFault_B/seis8_1_35.npy\t/projects/piml_inversion/FWIOpenData/FlatFault_B/vel8_1_35.npy\n"
  },
  {
    "path": "split_files/flatvel_a_train.txt",
    "content": "/projects/piml_inversion/FWIOpenData/FlatVel_A/data/data1.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_A/model/model1.npy\n/projects/piml_inversion/FWIOpenData/FlatVel_A/data/data2.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_A/model/model2.npy\n/projects/piml_inversion/FWIOpenData/FlatVel_A/data/data3.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_A/model/model3.npy\n/projects/piml_inversion/FWIOpenData/FlatVel_A/data/data4.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_A/model/model4.npy\n/projects/piml_inversion/FWIOpenData/FlatVel_A/data/data5.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_A/model/model5.npy\n/projects/piml_inversion/FWIOpenData/FlatVel_A/data/data6.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_A/model/model6.npy\n/projects/piml_inversion/FWIOpenData/FlatVel_A/data/data7.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_A/model/model7.npy\n/projects/piml_inversion/FWIOpenData/FlatVel_A/data/data8.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_A/model/model8.npy\n/projects/piml_inversion/FWIOpenData/FlatVel_A/data/data9.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_A/model/model9.npy\n/projects/piml_inversion/FWIOpenData/FlatVel_A/data/data10.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_A/model/model10.npy\n/projects/piml_inversion/FWIOpenData/FlatVel_A/data/data11.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_A/model/model11.npy\n/projects/piml_inversion/FWIOpenData/FlatVel_A/data/data12.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_A/model/model12.npy\n/projects/piml_inversion/FWIOpenData/FlatVel_A/data/data13.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_A/model/model13.npy\n/projects/piml_inversion/FWIOpenData/FlatVel_A/data/data14.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_A/model/model14.npy\n/projects/piml_inversion/FWIOpenData/FlatVel_A/data/data15.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_A/model/model15.npy\n/projects/piml_inversion/FWIOpenData/FlatVel_A/data/data16.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_A/model/model16.npy\n/projects/piml_inversion/FWIOpenData/FlatVel_A/data/data17.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_A/model/model17.npy\n/projects/piml_inversion/FWIOpenData/FlatVel_A/data/data18.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_A/model/model18.npy\n/projects/piml_inversion/FWIOpenData/FlatVel_A/data/data19.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_A/model/model19.npy\n/projects/piml_inversion/FWIOpenData/FlatVel_A/data/data20.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_A/model/model20.npy\n/projects/piml_inversion/FWIOpenData/FlatVel_A/data/data21.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_A/model/model21.npy\n/projects/piml_inversion/FWIOpenData/FlatVel_A/data/data22.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_A/model/model22.npy\n/projects/piml_inversion/FWIOpenData/FlatVel_A/data/data23.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_A/model/model23.npy\n/projects/piml_inversion/FWIOpenData/FlatVel_A/data/data24.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_A/model/model24.npy\n/projects/piml_inversion/FWIOpenData/FlatVel_A/data/data25.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_A/model/model25.npy\n/projects/piml_inversion/FWIOpenData/FlatVel_A/data/data26.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_A/model/model26.npy\n/projects/piml_inversion/FWIOpenData/FlatVel_A/data/data27.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_A/model/model27.npy\n/projects/piml_inversion/FWIOpenData/FlatVel_A/data/data28.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_A/model/model28.npy\n/projects/piml_inversion/FWIOpenData/FlatVel_A/data/data29.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_A/model/model29.npy\n/projects/piml_inversion/FWIOpenData/FlatVel_A/data/data30.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_A/model/model30.npy\n/projects/piml_inversion/FWIOpenData/FlatVel_A/data/data31.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_A/model/model31.npy\n/projects/piml_inversion/FWIOpenData/FlatVel_A/data/data32.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_A/model/model32.npy\n/projects/piml_inversion/FWIOpenData/FlatVel_A/data/data33.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_A/model/model33.npy\n/projects/piml_inversion/FWIOpenData/FlatVel_A/data/data34.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_A/model/model34.npy\n/projects/piml_inversion/FWIOpenData/FlatVel_A/data/data35.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_A/model/model35.npy\n/projects/piml_inversion/FWIOpenData/FlatVel_A/data/data36.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_A/model/model36.npy\n/projects/piml_inversion/FWIOpenData/FlatVel_A/data/data37.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_A/model/model37.npy\n/projects/piml_inversion/FWIOpenData/FlatVel_A/data/data38.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_A/model/model38.npy\n/projects/piml_inversion/FWIOpenData/FlatVel_A/data/data39.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_A/model/model39.npy\n/projects/piml_inversion/FWIOpenData/FlatVel_A/data/data40.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_A/model/model40.npy\n/projects/piml_inversion/FWIOpenData/FlatVel_A/data/data41.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_A/model/model41.npy\n/projects/piml_inversion/FWIOpenData/FlatVel_A/data/data42.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_A/model/model42.npy\n/projects/piml_inversion/FWIOpenData/FlatVel_A/data/data43.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_A/model/model43.npy\n/projects/piml_inversion/FWIOpenData/FlatVel_A/data/data44.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_A/model/model44.npy\n/projects/piml_inversion/FWIOpenData/FlatVel_A/data/data45.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_A/model/model45.npy\n/projects/piml_inversion/FWIOpenData/FlatVel_A/data/data46.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_A/model/model46.npy\n/projects/piml_inversion/FWIOpenData/FlatVel_A/data/data47.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_A/model/model47.npy\n/projects/piml_inversion/FWIOpenData/FlatVel_A/data/data48.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_A/model/model48.npy\n"
  },
  {
    "path": "split_files/flatvel_a_val.txt",
    "content": "/projects/piml_inversion/FWIOpenData/FlatVel_A/data/data49.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_A/model/model49.npy\n/projects/piml_inversion/FWIOpenData/FlatVel_A/data/data50.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_A/model/model50.npy\n/projects/piml_inversion/FWIOpenData/FlatVel_A/data/data51.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_A/model/model51.npy\n/projects/piml_inversion/FWIOpenData/FlatVel_A/data/data52.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_A/model/model52.npy\n/projects/piml_inversion/FWIOpenData/FlatVel_A/data/data53.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_A/model/model53.npy\n/projects/piml_inversion/FWIOpenData/FlatVel_A/data/data54.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_A/model/model54.npy\n/projects/piml_inversion/FWIOpenData/FlatVel_A/data/data55.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_A/model/model55.npy\n/projects/piml_inversion/FWIOpenData/FlatVel_A/data/data56.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_A/model/model56.npy\n/projects/piml_inversion/FWIOpenData/FlatVel_A/data/data57.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_A/model/model57.npy\n/projects/piml_inversion/FWIOpenData/FlatVel_A/data/data58.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_A/model/model58.npy\n/projects/piml_inversion/FWIOpenData/FlatVel_A/data/data59.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_A/model/model59.npy\n/projects/piml_inversion/FWIOpenData/FlatVel_A/data/data60.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_A/model/model60.npy\n"
  },
  {
    "path": "split_files/flatvel_b_train.txt",
    "content": "/projects/piml_inversion/FWIOpenData/FlatVel_B/data/data1.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_B/model/model1.npy\n/projects/piml_inversion/FWIOpenData/FlatVel_B/data/data2.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_B/model/model2.npy\n/projects/piml_inversion/FWIOpenData/FlatVel_B/data/data3.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_B/model/model3.npy\n/projects/piml_inversion/FWIOpenData/FlatVel_B/data/data4.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_B/model/model4.npy\n/projects/piml_inversion/FWIOpenData/FlatVel_B/data/data5.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_B/model/model5.npy\n/projects/piml_inversion/FWIOpenData/FlatVel_B/data/data6.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_B/model/model6.npy\n/projects/piml_inversion/FWIOpenData/FlatVel_B/data/data7.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_B/model/model7.npy\n/projects/piml_inversion/FWIOpenData/FlatVel_B/data/data8.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_B/model/model8.npy\n/projects/piml_inversion/FWIOpenData/FlatVel_B/data/data9.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_B/model/model9.npy\n/projects/piml_inversion/FWIOpenData/FlatVel_B/data/data10.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_B/model/model10.npy\n/projects/piml_inversion/FWIOpenData/FlatVel_B/data/data11.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_B/model/model11.npy\n/projects/piml_inversion/FWIOpenData/FlatVel_B/data/data12.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_B/model/model12.npy\n/projects/piml_inversion/FWIOpenData/FlatVel_B/data/data13.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_B/model/model13.npy\n/projects/piml_inversion/FWIOpenData/FlatVel_B/data/data14.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_B/model/model14.npy\n/projects/piml_inversion/FWIOpenData/FlatVel_B/data/data15.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_B/model/model15.npy\n/projects/piml_inversion/FWIOpenData/FlatVel_B/data/data16.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_B/model/model16.npy\n/projects/piml_inversion/FWIOpenData/FlatVel_B/data/data17.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_B/model/model17.npy\n/projects/piml_inversion/FWIOpenData/FlatVel_B/data/data18.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_B/model/model18.npy\n/projects/piml_inversion/FWIOpenData/FlatVel_B/data/data19.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_B/model/model19.npy\n/projects/piml_inversion/FWIOpenData/FlatVel_B/data/data20.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_B/model/model20.npy\n/projects/piml_inversion/FWIOpenData/FlatVel_B/data/data21.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_B/model/model21.npy\n/projects/piml_inversion/FWIOpenData/FlatVel_B/data/data22.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_B/model/model22.npy\n/projects/piml_inversion/FWIOpenData/FlatVel_B/data/data23.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_B/model/model23.npy\n/projects/piml_inversion/FWIOpenData/FlatVel_B/data/data24.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_B/model/model24.npy\n/projects/piml_inversion/FWIOpenData/FlatVel_B/data/data25.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_B/model/model25.npy\n/projects/piml_inversion/FWIOpenData/FlatVel_B/data/data26.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_B/model/model26.npy\n/projects/piml_inversion/FWIOpenData/FlatVel_B/data/data27.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_B/model/model27.npy\n/projects/piml_inversion/FWIOpenData/FlatVel_B/data/data28.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_B/model/model28.npy\n/projects/piml_inversion/FWIOpenData/FlatVel_B/data/data29.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_B/model/model29.npy\n/projects/piml_inversion/FWIOpenData/FlatVel_B/data/data30.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_B/model/model30.npy\n/projects/piml_inversion/FWIOpenData/FlatVel_B/data/data31.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_B/model/model31.npy\n/projects/piml_inversion/FWIOpenData/FlatVel_B/data/data32.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_B/model/model32.npy\n/projects/piml_inversion/FWIOpenData/FlatVel_B/data/data33.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_B/model/model33.npy\n/projects/piml_inversion/FWIOpenData/FlatVel_B/data/data34.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_B/model/model34.npy\n/projects/piml_inversion/FWIOpenData/FlatVel_B/data/data35.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_B/model/model35.npy\n/projects/piml_inversion/FWIOpenData/FlatVel_B/data/data36.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_B/model/model36.npy\n/projects/piml_inversion/FWIOpenData/FlatVel_B/data/data37.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_B/model/model37.npy\n/projects/piml_inversion/FWIOpenData/FlatVel_B/data/data38.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_B/model/model38.npy\n/projects/piml_inversion/FWIOpenData/FlatVel_B/data/data39.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_B/model/model39.npy\n/projects/piml_inversion/FWIOpenData/FlatVel_B/data/data40.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_B/model/model40.npy\n/projects/piml_inversion/FWIOpenData/FlatVel_B/data/data41.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_B/model/model41.npy\n/projects/piml_inversion/FWIOpenData/FlatVel_B/data/data42.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_B/model/model42.npy\n/projects/piml_inversion/FWIOpenData/FlatVel_B/data/data43.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_B/model/model43.npy\n/projects/piml_inversion/FWIOpenData/FlatVel_B/data/data44.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_B/model/model44.npy\n/projects/piml_inversion/FWIOpenData/FlatVel_B/data/data45.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_B/model/model45.npy\n/projects/piml_inversion/FWIOpenData/FlatVel_B/data/data46.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_B/model/model46.npy\n/projects/piml_inversion/FWIOpenData/FlatVel_B/data/data47.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_B/model/model47.npy\n/projects/piml_inversion/FWIOpenData/FlatVel_B/data/data48.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_B/model/model48.npy\n"
  },
  {
    "path": "split_files/flatvel_b_val.txt",
    "content": "/projects/piml_inversion/FWIOpenData/FlatVel_B/data/data49.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_B/model/model49.npy\n/projects/piml_inversion/FWIOpenData/FlatVel_B/data/data50.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_B/model/model50.npy\n/projects/piml_inversion/FWIOpenData/FlatVel_B/data/data51.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_B/model/model51.npy\n/projects/piml_inversion/FWIOpenData/FlatVel_B/data/data52.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_B/model/model52.npy\n/projects/piml_inversion/FWIOpenData/FlatVel_B/data/data53.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_B/model/model53.npy\n/projects/piml_inversion/FWIOpenData/FlatVel_B/data/data54.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_B/model/model54.npy\n/projects/piml_inversion/FWIOpenData/FlatVel_B/data/data55.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_B/model/model55.npy\n/projects/piml_inversion/FWIOpenData/FlatVel_B/data/data56.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_B/model/model56.npy\n/projects/piml_inversion/FWIOpenData/FlatVel_B/data/data57.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_B/model/model57.npy\n/projects/piml_inversion/FWIOpenData/FlatVel_B/data/data58.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_B/model/model58.npy\n/projects/piml_inversion/FWIOpenData/FlatVel_B/data/data59.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_B/model/model59.npy\n/projects/piml_inversion/FWIOpenData/FlatVel_B/data/data60.npy\t/projects/piml_inversion/FWIOpenData/FlatVel_B/model/model60.npy\n"
  },
  {
    "path": "split_files/kaggle_tutorial_train.txt",
    "content": "/kaggle/input/waveform-inversion/train_samples/FlatVel_A/data/data1.npy\t/kaggle/input/waveform-inversion/train_samples/FlatVel_A/model/model1.npy\n"
  },
  {
    "path": "split_files/kaggle_tutorial_val.txt",
    "content": "/kaggle/input/waveform-inversion/train_samples/FlatVel_A/data/data2.npy\t/kaggle/input/waveform-inversion/train_samples/FlatVel_A/model/model2.npy\n"
  },
  {
    "path": "split_files/style_a_train.txt",
    "content": "/projects/piml_inversion/FWIOpenData/Style_A/data/data1.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model1.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data2.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model2.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data3.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model3.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data4.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model4.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data5.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model5.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data6.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model6.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data7.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model7.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data8.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model8.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data9.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model9.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data10.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model10.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data11.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model11.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data12.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model12.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data13.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model13.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data14.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model14.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data15.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model15.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data16.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model16.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data17.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model17.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data18.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model18.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data19.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model19.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data20.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model20.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data21.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model21.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data22.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model22.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data23.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model23.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data24.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model24.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data25.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model25.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data26.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model26.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data27.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model27.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data28.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model28.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data29.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model29.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data30.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model30.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data31.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model31.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data32.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model32.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data33.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model33.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data34.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model34.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data35.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model35.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data36.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model36.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data37.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model37.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data38.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model38.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data39.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model39.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data40.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model40.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data41.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model41.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data42.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model42.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data43.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model43.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data44.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model44.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data45.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model45.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data46.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model46.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data47.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model47.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data48.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model48.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data49.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model49.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data50.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model50.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data51.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model51.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data52.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model52.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data53.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model53.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data54.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model54.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data55.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model55.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data56.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model56.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data57.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model57.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data58.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model58.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data59.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model59.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data60.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model60.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data61.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model61.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data62.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model62.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data63.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model63.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data64.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model64.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data65.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model65.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data66.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model66.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data67.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model67.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data68.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model68.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data69.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model69.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data70.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model70.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data71.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model71.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data72.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model72.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data73.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model73.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data74.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model74.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data75.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model75.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data76.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model76.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data77.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model77.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data78.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model78.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data79.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model79.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data80.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model80.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data81.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model81.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data82.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model82.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data83.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model83.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data84.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model84.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data85.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model85.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data86.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model86.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data87.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model87.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data88.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model88.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data89.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model89.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data90.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model90.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data91.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model91.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data92.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model92.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data93.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model93.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data94.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model94.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data95.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model95.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data96.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model96.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data97.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model97.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data98.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model98.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data99.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model99.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data100.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model100.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data101.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model101.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data102.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model102.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data103.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model103.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data104.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model104.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data105.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model105.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data106.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model106.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data107.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model107.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data108.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model108.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data109.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model109.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data110.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model110.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data111.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model111.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data112.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model112.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data113.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model113.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data114.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model114.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data115.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model115.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data116.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model116.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data117.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model117.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data118.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model118.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data119.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model119.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data120.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model120.npy\n"
  },
  {
    "path": "split_files/style_a_val.txt",
    "content": "/projects/piml_inversion/FWIOpenData/Style_A/data/data121.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model121.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data122.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model122.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data123.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model123.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data124.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model124.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data125.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model125.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data126.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model126.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data127.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model127.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data128.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model128.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data129.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model129.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data130.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model130.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data131.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model131.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data132.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model132.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data133.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model133.npy\n/projects/piml_inversion/FWIOpenData/Style_A/data/data134.npy\t/projects/piml_inversion/FWIOpenData/Style_A/model/model134.npy\n"
  },
  {
    "path": "split_files/style_b_train.txt",
    "content": "/projects/piml_inversion/FWIOpenData/Style_B/data/data1.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model1.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data2.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model2.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data3.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model3.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data4.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model4.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data5.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model5.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data6.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model6.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data7.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model7.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data8.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model8.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data9.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model9.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data10.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model10.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data11.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model11.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data12.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model12.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data13.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model13.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data14.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model14.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data15.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model15.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data16.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model16.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data17.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model17.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data18.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model18.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data19.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model19.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data20.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model20.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data21.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model21.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data22.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model22.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data23.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model23.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data24.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model24.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data25.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model25.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data26.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model26.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data27.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model27.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data28.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model28.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data29.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model29.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data30.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model30.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data31.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model31.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data32.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model32.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data33.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model33.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data34.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model34.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data35.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model35.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data36.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model36.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data37.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model37.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data38.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model38.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data39.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model39.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data40.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model40.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data41.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model41.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data42.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model42.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data43.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model43.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data44.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model44.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data45.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model45.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data46.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model46.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data47.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model47.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data48.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model48.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data49.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model49.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data50.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model50.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data51.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model51.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data52.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model52.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data53.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model53.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data54.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model54.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data55.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model55.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data56.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model56.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data57.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model57.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data58.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model58.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data59.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model59.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data60.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model60.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data61.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model61.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data62.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model62.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data63.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model63.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data64.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model64.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data65.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model65.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data66.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model66.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data67.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model67.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data68.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model68.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data69.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model69.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data70.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model70.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data71.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model71.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data72.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model72.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data73.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model73.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data74.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model74.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data75.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model75.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data76.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model76.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data77.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model77.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data78.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model78.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data79.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model79.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data80.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model80.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data81.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model81.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data82.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model82.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data83.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model83.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data84.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model84.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data85.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model85.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data86.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model86.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data87.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model87.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data88.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model88.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data89.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model89.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data90.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model90.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data91.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model91.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data92.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model92.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data93.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model93.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data94.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model94.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data95.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model95.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data96.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model96.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data97.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model97.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data98.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model98.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data99.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model99.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data100.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model100.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data101.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model101.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data102.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model102.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data103.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model103.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data104.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model104.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data105.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model105.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data106.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model106.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data107.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model107.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data108.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model108.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data109.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model109.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data110.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model110.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data111.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model111.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data112.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model112.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data113.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model113.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data114.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model114.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data115.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model115.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data116.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model116.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data117.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model117.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data118.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model118.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data119.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model119.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data120.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model120.npy\n"
  },
  {
    "path": "split_files/style_b_val.txt",
    "content": "/projects/piml_inversion/FWIOpenData/Style_B/data/data121.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model121.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data122.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model122.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data123.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model123.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data124.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model124.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data125.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model125.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data126.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model126.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data127.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model127.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data128.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model128.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data129.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model129.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data130.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model130.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data131.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model131.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data132.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model132.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data133.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model133.npy\n/projects/piml_inversion/FWIOpenData/Style_B/data/data134.npy\t/projects/piml_inversion/FWIOpenData/Style_B/model/model134.npy\n"
  },
  {
    "path": "split_files/tutorial_train.txt",
    "content": "./fva_data1.npy\t./fva_velocity1.npy\n./fva_data2.npy\t./fva_velocity2.npy\n"
  },
  {
    "path": "split_files/tutorial_val.txt",
    "content": "./fva_data3.npy\t./fva_velocity3.npy\n"
  },
  {
    "path": "test.py",
    "content": "# © 2022. Triad National Security, LLC. All rights reserved.\n\n# This program was produced under U.S. Government contract 89233218CNA000001 for Los Alamos\n\n# National Laboratory (LANL), which is operated by Triad National Security, LLC for the U.S.\n\n# Department of Energy/National Nuclear Security Administration. All rights in the program are\n\n# reserved by Triad National Security, LLC, and the U.S. Department of Energy/National Nuclear\n\n# Security Administration. The Government is granted for itself and others acting on its behalf a\n\n# nonexclusive, paid-up, irrevocable worldwide license in this material to reproduce, prepare\n\n# derivative works, distribute copies to the public, perform publicly and display publicly, and to permit\n\n# others to do so.\n\nimport os\nimport sys\nimport time\nimport datetime\nimport json\n\nimport torch\nimport torch.nn as nn\nfrom torch.utils.data import SequentialSampler\nfrom torch.utils.data.dataloader import default_collate\nimport torchvision\nfrom torchvision.transforms import Compose\nimport numpy as np\n\nimport utils\nimport network\nfrom vis import *\nfrom dataset import FWIDataset\nimport transforms as T\nimport pytorch_ssim\n\n\ndef evaluate(model, criterions, dataloader, device, k, ctx,\n                vis_path, vis_batch, vis_sample, missing, std):\n    model.eval()\n    \n    label_list, label_pred_list= [], [] # store denormalized predcition & gt in numpy \n    label_tensor, label_pred_tensor = [], [] # store normalized prediction & gt in tensor\n    if missing or std:\n            data_list, data_noise_list = [], [] # store original data and noisy/muted data\n\n    with torch.no_grad():\n        batch_idx = 0\n        for data, label in dataloader:\n            \n            data = data.type(torch.FloatTensor).to(device, non_blocking=True)\n            label = label.type(torch.FloatTensor).to(device, non_blocking=True)\n            \n            label_np = T.tonumpy_denormalize(label, ctx['label_min'], ctx['label_max'], exp=False)\n            label_list.append(label_np)\n            label_tensor.append(label)\n            \n            if missing or std:\n                # Add gaussian noise\n                data_noise = torch.clip(data + (std ** 0.5) * torch.randn(data.shape).to(device, non_blocking=True), min=-1, max=1)\n\n                # Mute some traces\n                mute_idx = np.random.choice(data.shape[3], size=missing, replace=False) \n                data_noise[:, :, :, mute_idx] = data[0, 0, 0, 0]\n                \n                data_np = T.tonumpy_denormalize(data, ctx['data_min'], ctx['data_max'], k=k)\n                data_noise_np = T.tonumpy_denormalize(data_noise,  ctx['data_min'], ctx['data_max'], k=k)\n                data_list.append(data_np)\n                data_noise_list.append(data_noise_np)\n                pred = model(data_noise)\n            else:\n                pred = model(data)\n\n            label_pred_np = T.tonumpy_denormalize(pred, ctx['label_min'], ctx['label_max'], exp=False)\n            label_pred_list.append(label_pred_np)\n            label_pred_tensor.append(pred)\n\n            # Visualization\n            if vis_path and batch_idx < vis_batch:\n                for i in range(vis_sample):\n                    plot_velocity(label_pred_np[i, 0], label_np[i, 0], f'{vis_path}/V_{batch_idx}_{i}.png') #, vmin=ctx['label_min'], vmax=ctx['label_max'])\n                    if missing or std:\n                        for ch in [2]: # range(data.shape[1]): \n                            plot_seismic(data_np[i, ch], data_noise_np[i, ch], f'{vis_path}/S_{batch_idx}_{i}_{ch}.png', \n                                vmin=ctx['data_min'] * 0.01, vmax=ctx['data_max'] * 0.01)\n            batch_idx += 1\n\n    label, label_pred = np.concatenate(label_list), np.concatenate(label_pred_list)\n    label_t, pred_t = torch.cat(label_tensor), torch.cat(label_pred_tensor)\n    l1 = nn.L1Loss()\n    l2 = nn.MSELoss()\n    print(f'MAE: {l1(label_t, pred_t)}')\n    print(f'MSE: {l2(label_t, pred_t)}')\n    ssim_loss = pytorch_ssim.SSIM(window_size=11)\n    print(f'SSIM: {ssim_loss(label_t / 2 + 0.5, pred_t / 2 + 0.5)}') # (-1, 1) to (0, 1)\n\n    for name, criterion in criterions.items():\n        print(f' * Velocity {name}: {criterion(label, label_pred)}')\n    #     print(f'   | Velocity 2 layers {name}: {criterion(label[:1000], label_pred[:1000])}')\n    #     print(f'   | Velocity 3 layers {name}: {criterion(label[1000:2000], label_pred[1000:2000])}')\n    #     print(f'   | Velocity 4 layers {name}: {criterion(label[2000:], label_pred[2000:])}')\n\n\ndef main(args):\n\n    print(args)\n    print(\"torch version: \", torch.__version__)\n    print(\"torchvision version: \", torchvision.__version__)\n\n    utils.mkdir(args.output_path)\n    device = torch.device(args.device)\n    torch.backends.cudnn.benchmark = True\n\n    with open('dataset_config.json') as f:\n        try:\n            ctx = json.load(f)[args.dataset]\n        except KeyError:\n            print('Unsupported dataset.')\n            sys.exit()\n\n    if args.file_size is not None:\n        ctx['file_size'] = args.file_size\n\n    print(\"Loading data\")\n    print(\"Loading validation data\")\n    log_data_min = T.log_transform(ctx['data_min'], k=args.k)\n    log_data_max = T.log_transform(ctx['data_max'], k=args.k)\n    transform_valid_data = Compose([\n        T.LogTransform(k=args.k),\n        T.MinMaxNormalize(log_data_min, log_data_max),\n    ])\n\n    transform_valid_label = Compose([\n        T.MinMaxNormalize(ctx['label_min'], ctx['label_max'])\n    ])\n    if args.val_anno[-3:] == 'txt':\n        dataset_valid = FWIDataset(\n            args.val_anno,\n            sample_ratio=args.sample_temporal,\n            file_size=ctx['file_size'],\n            transform_data=transform_valid_data,\n            transform_label=transform_valid_label\n        )\n    else:\n        dataset_valid = torch.load(args.val_anno)\n\n    print(\"Creating data loaders\")\n    valid_sampler = SequentialSampler(dataset_valid)\n    dataloader_valid = torch.utils.data.DataLoader(\n        dataset_valid, batch_size=args.batch_size,\n        sampler=valid_sampler, num_workers=args.workers,\n        pin_memory=True, collate_fn=default_collate)\n\n    print(\"Creating model\")\n    if args.model not in network.model_dict:\n        print('Unsupported model.')\n        sys.exit()\n     \n    model = network.model_dict[args.model](upsample_mode=args.up_mode, \n        sample_spatial=args.sample_spatial, sample_temporal=args.sample_temporal, norm=args.norm).to(device)\n\n    criterions = {\n        'MAE': lambda x, y: np.mean(np.abs(x - y)),\n        'MSE': lambda x, y: np.mean((x - y) ** 2)\n    }\n\n    if args.resume:\n        print(args.resume)\n        checkpoint = torch.load(args.resume, map_location='cpu')\n        model.load_state_dict(network.replace_legacy(checkpoint['model']))\n        print('Loaded model checkpoint at Epoch {} / Step {}.'.format(checkpoint['epoch'], checkpoint['step']))\n    \n    if args.vis:\n        # Create folder to store visualization results\n        vis_folder = f'visualization_{args.vis_suffix}' if args.vis_suffix else 'visualization'\n        vis_path = os.path.join(args.output_path, vis_folder)\n        utils.mkdir(vis_path)\n    else:\n        vis_path = None\n    \n    print(\"Start testing\")\n    start_time = time.time()\n    evaluate(model, criterions, dataloader_valid, device, args.k, ctx, \n                vis_path, args.vis_batch, args.vis_sample, args.missing, args.std)\n    total_time = time.time() - start_time\n    total_time_str = str(datetime.timedelta(seconds=int(total_time)))\n    print('Testing time {}'.format(total_time_str))\n\n\ndef parse_args():\n    import argparse\n    parser = argparse.ArgumentParser(description='FCN Testing')\n    parser.add_argument('-d', '--device', default='cuda', help='device')\n    parser.add_argument('-ds', '--dataset', default='flatfault-b', type=str, help='dataset name')\n    parser.add_argument('-fs', '--file-size', default=None, type=int, help='number of samples in each npy file')\n\n    # Path related\n    parser.add_argument('-ap', '--anno-path', default='split_files', help='annotation files location')\n    parser.add_argument('-v', '--val-anno', default='flatfault_b_val_invnet.txt', help='name of val anno')\n    parser.add_argument('-o', '--output-path', default='Invnet_models', help='path to parent folder to save checkpoints')\n    parser.add_argument('-n', '--save-name', default='fcn_l1loss_ffb', help='folder name for this experiment')\n    parser.add_argument('-s', '--suffix', type=str, default=None, help='subfolder name for this run')\n\n    # Model related\n    parser.add_argument('-m', '--model', type=str, help='inverse model name')\n    parser.add_argument('-no', '--norm', default='bn', help='normalization layer type, support bn, in, ln (default: bn)')\n    parser.add_argument('-um', '--up-mode', default=None, help='upsampling layer mode such as \"nearest\", \"bicubic\", etc.')\n    parser.add_argument('-ss', '--sample-spatial', type=float, default=1.0, help='spatial sampling ratio')\n    parser.add_argument('-st', '--sample-temporal', type=int, default=1, help='temporal sampling ratio')\n\n    # Test related\n    parser.add_argument('-b', '--batch-size', default=50, type=int)\n    parser.add_argument('-j', '--workers', default=16, type=int, help='number of data loading workers (default: 16)')\n    parser.add_argument('--k', default=1, type=float, help='k in log transformation')\n    parser.add_argument('-r', '--resume', default=None, help='resume from checkpoint')\n    parser.add_argument('--vis', help='visualization option', action=\"store_true\")\n    parser.add_argument('-vsu','--vis-suffix', default=None, type=str, help='visualization suffix')\n    parser.add_argument('-vb','--vis-batch', help='number of batch to be visualized', default=0, type=int)\n    parser.add_argument('-vsa', '--vis-sample', help='number of samples in a batch to be visualized', default=0, type=int)\n    parser.add_argument('--missing', default=0, type=int, help='number of missing traces')\n    parser.add_argument('--std', default=0, type=float, help='standard deviation of gaussian noise')\n    args = parser.parse_args()\n\n    args.output_path = os.path.join(args.output_path, args.save_name, args.suffix or '')\n    args.val_anno = os.path.join(args.anno_path, args.val_anno)\n    args.resume = os.path.join(args.output_path, args.resume)\n\n    return args\n\n\nif __name__ == '__main__':\n    args = parse_args()\n    main(args)\n"
  },
  {
    "path": "train.py",
    "content": "# © 2022. Triad National Security, LLC. All rights reserved.\n\n# This program was produced under U.S. Government contract 89233218CNA000001 for Los Alamos\n\n# National Laboratory (LANL), which is operated by Triad National Security, LLC for the U.S.\n\n# Department of Energy/National Nuclear Security Administration. All rights in the program are\n\n# reserved by Triad National Security, LLC, and the U.S. Department of Energy/National Nuclear\n\n# Security Administration. The Government is granted for itself and others acting on its behalf a\n\n# nonexclusive, paid-up, irrevocable worldwide license in this material to reproduce, prepare\n\n# derivative works, distribute copies to the public, perform publicly and display publicly, and to permit\n\n# others to do so.\n\nimport os\nimport sys\nimport time\nimport datetime\nimport json\n\nimport torch\nfrom torch import nn\nfrom torch.utils.data import RandomSampler, DataLoader\nfrom torch.utils.data.dataloader import default_collate\nfrom torch.utils.data.distributed import DistributedSampler\nfrom torch.nn.parallel import DistributedDataParallel\nfrom torch.utils.tensorboard import SummaryWriter\nimport torchvision\nfrom torchvision.transforms import Compose\n\nimport utils\nimport network\nfrom dataset import FWIDataset\nfrom scheduler import WarmupMultiStepLR\nimport transforms as T\n\nstep = 0\n\ndef train_one_epoch(model, criterion, optimizer, lr_scheduler, \n                    dataloader, device, epoch, print_freq, writer):\n    global step\n    model.train()\n\n    # Logger setup\n    metric_logger = utils.MetricLogger(delimiter='  ')\n    metric_logger.add_meter('lr', utils.SmoothedValue(window_size=1, fmt='{value}'))\n    metric_logger.add_meter('samples/s', utils.SmoothedValue(window_size=10, fmt='{value:.3f}'))\n    header = 'Epoch: [{}]'.format(epoch)\n\n    for data, label in metric_logger.log_every(dataloader, print_freq, header):\n        start_time = time.time()\n        optimizer.zero_grad()\n        data, label = data.to(device), label.to(device)\n        output = model(data)\n        loss, loss_g1v, loss_g2v = criterion(output, label)\n        loss.backward()\n        optimizer.step()\n\n        loss_val = loss.item()\n        loss_g1v_val = loss_g1v.item()\n        loss_g2v_val = loss_g2v.item()\n        batch_size = data.shape[0]\n        metric_logger.update(loss=loss_val, loss_g1v=loss_g1v_val, \n            loss_g2v=loss_g2v_val, lr=optimizer.param_groups[0]['lr'])\n        metric_logger.meters['samples/s'].update(batch_size / (time.time() - start_time))\n        if writer:\n            writer.add_scalar('loss', loss_val, step)\n            writer.add_scalar('loss_g1v', loss_g1v_val, step)\n            writer.add_scalar('loss_g2v', loss_g2v_val, step)\n        step += 1\n        lr_scheduler.step()\n\n\ndef evaluate(model, criterion, dataloader, device, writer):\n    model.eval()\n    metric_logger = utils.MetricLogger(delimiter='  ')\n    header = 'Test:'\n    with torch.no_grad():\n        for data, label in metric_logger.log_every(dataloader, 20, header):\n            data = data.to(device, non_blocking=True)\n            label = label.to(device, non_blocking=True)\n            output = model(data)\n            loss, loss_g1v, loss_g2v = criterion(output, label)\n            metric_logger.update(loss=loss.item(), \n                loss_g1v=loss_g1v.item(), \n                loss_g2v=loss_g2v.item())\n\n    # Gather the stats from all processes\n    metric_logger.synchronize_between_processes()\n    print(' * Loss {loss.global_avg:.8f}\\n'.format(loss=metric_logger.loss))\n    if writer:\n        writer.add_scalar('loss', metric_logger.loss.global_avg, step)\n        writer.add_scalar('loss_g1v', metric_logger.loss_g1v.global_avg, step)\n        writer.add_scalar('loss_g2v', metric_logger.loss_g2v.global_avg, step)\n    return metric_logger.loss.global_avg\n\n\ndef main(args):\n    global step\n\n    print(args)\n    print('torch version: ', torch.__version__)\n    print('torchvision version: ', torchvision.__version__)\n\n    utils.mkdir(args.output_path) # create folder to store checkpoints\n    utils.init_distributed_mode(args) # distributed mode initialization\n\n    # Set up tensorboard summary writer\n    train_writer, val_writer = None, None\n    if args.tensorboard:\n        utils.mkdir(args.log_path) # create folder to store tensorboard logs\n        if not args.distributed or (args.rank == 0) and (args.local_rank == 0):\n            train_writer = SummaryWriter(os.path.join(args.output_path, 'logs', 'train'))\n            val_writer = SummaryWriter(os.path.join(args.output_path, 'logs', 'val'))\n                                                                 \n\n    device = torch.device(args.device)\n    torch.backends.cudnn.benchmark = True\n\n    with open('dataset_config.json') as f:\n        try:\n            ctx = json.load(f)[args.dataset]\n        except KeyError:\n            print('Unsupported dataset.')\n            sys.exit()\n\n    if args.file_size is not None:\n        ctx['file_size'] = args.file_size\n\n    # Create dataset and dataloader\n    print('Loading data')\n    print('Loading training data')\n        \n    # Normalize data and label to [-1, 1]\n    transform_data = Compose([\n        T.LogTransform(k=args.k),\n        T.MinMaxNormalize(T.log_transform(ctx['data_min'], k=args.k), T.log_transform(ctx['data_max'], k=args.k))\n    ])\n    transform_label = Compose([\n        T.MinMaxNormalize(ctx['label_min'], ctx['label_max'])\n    ])\n    if args.train_anno[-3:] == 'txt':\n        dataset_train = FWIDataset(\n            args.train_anno,\n            preload=True,\n            sample_ratio=args.sample_temporal,\n            file_size=ctx['file_size'],\n            transform_data=transform_data,\n            transform_label=transform_label\n        )\n    else:\n        dataset_train = torch.load(args.train_anno)\n\n    print('Loading validation data')\n    if args.val_anno[-3:] == 'txt':\n        dataset_valid = FWIDataset(\n            args.val_anno,\n            preload=True,\n            sample_ratio=args.sample_temporal,\n            file_size=ctx['file_size'],\n            transform_data=transform_data,\n            transform_label=transform_label\n        )\n    else:\n        dataset_valid = torch.load(args.val_anno)\n\n    print('Creating data loaders')\n    if args.distributed:\n        train_sampler = DistributedSampler(dataset_train, shuffle=True)\n        valid_sampler = DistributedSampler(dataset_valid, shuffle=True)\n    else:\n        train_sampler = RandomSampler(dataset_train)\n        valid_sampler = RandomSampler(dataset_valid)\n\n    dataloader_train = DataLoader(\n        dataset_train, batch_size=args.batch_size,\n        sampler=train_sampler, num_workers=args.workers,\n        pin_memory=True, drop_last=True, collate_fn=default_collate)\n\n    dataloader_valid = DataLoader(\n        dataset_valid, batch_size=args.batch_size,\n        sampler=valid_sampler, num_workers=args.workers,\n        pin_memory=True, collate_fn=default_collate)\n\n    print('Creating model')\n    if args.model not in network.model_dict:\n        print('Unsupported model.')\n        sys.exit()\n    model = network.model_dict[args.model](upsample_mode=args.up_mode, \n        sample_spatial=args.sample_spatial, sample_temporal=args.sample_temporal).to(device)\n\n    if args.distributed and args.sync_bn:\n        model = torch.nn.SyncBatchNorm.convert_sync_batchnorm(model)\n\n    # Define loss function\n    l1loss = nn.L1Loss()\n    l2loss = nn.MSELoss()\n    def criterion(pred, gt):\n        loss_g1v = l1loss(pred, gt)\n        loss_g2v = l2loss(pred, gt)\n        loss = args.lambda_g1v * loss_g1v + args.lambda_g2v * loss_g2v\n        return loss, loss_g1v, loss_g2v\n\n    # Scale lr according to effective batch size\n    lr = args.lr * args.world_size\n    optimizer = torch.optim.AdamW(model.parameters(), lr=lr, betas=(0.9, 0.999), weight_decay=args.weight_decay)\n\n    # Convert scheduler to be per iteration instead of per epoch\n    warmup_iters = args.lr_warmup_epochs * len(dataloader_train)\n    lr_milestones = [len(dataloader_train) * m for m in args.lr_milestones]\n    lr_scheduler = WarmupMultiStepLR(\n        optimizer, milestones=lr_milestones, gamma=args.lr_gamma,\n        warmup_iters=warmup_iters, warmup_factor=1e-5)\n\n    model_without_ddp = model\n    if args.distributed:\n        model = DistributedDataParallel(model, device_ids=[args.local_rank])\n        model_without_ddp = model.module\n\n    if args.resume:\n        checkpoint = torch.load(args.resume, map_location='cpu')\n        model_without_ddp.load_state_dict(network.replace_legacy(checkpoint['model']))\n        optimizer.load_state_dict(checkpoint['optimizer'])\n        lr_scheduler.load_state_dict(checkpoint['lr_scheduler'])\n        args.start_epoch = checkpoint['epoch'] + 1\n        step = checkpoint['step']\n        lr_scheduler.milestones=lr_milestones\n\n    print('Start training')\n    start_time = time.time()\n    best_loss = 10\n    chp=1 \n    for epoch in range(args.start_epoch, args.epochs):\n        if args.distributed:\n            train_sampler.set_epoch(epoch)\n        train_one_epoch(model, criterion, optimizer, lr_scheduler, dataloader_train,\n                        device, epoch, args.print_freq, train_writer)\n        \n        loss = evaluate(model, criterion, dataloader_valid, device, val_writer)\n        \n        checkpoint = {\n            'model': model_without_ddp.state_dict(),\n            'optimizer': optimizer.state_dict(),\n            'lr_scheduler': lr_scheduler.state_dict(),\n            'epoch': epoch,\n            'step': step,\n            'args': args}\n        # Save checkpoint per epoch\n        if loss < best_loss:\n            utils.save_on_master(\n            checkpoint,\n            os.path.join(args.output_path, 'checkpoint.pth'))\n            print('saving checkpoint at epoch: ', epoch)\n            chp = epoch\n            best_loss = loss\n        # Save checkpoint every epoch block\n        print('current best loss: ', best_loss)\n        print('current best epoch: ', chp)\n        if args.output_path and (epoch + 1) % args.epoch_block == 0:\n            utils.save_on_master(\n                checkpoint,\n                os.path.join(args.output_path, 'model_{}.pth'.format(epoch + 1)))\n\n    total_time = time.time() - start_time\n    total_time_str = str(datetime.timedelta(seconds=int(total_time)))\n    print('Training time {}'.format(total_time_str))\n\n\ndef parse_args():\n    import argparse\n    parser = argparse.ArgumentParser(description='FCN Training')\n    parser.add_argument('-d', '--device', default='cuda', help='device')\n    parser.add_argument('-ds', '--dataset', default='flatfault-b', type=str, help='dataset name')\n    parser.add_argument('-fs', '--file-size', default=None, type=int, help='number of samples in each npy file')\n\n    # Path related\n    parser.add_argument('-ap', '--anno-path', default='split_files', help='annotation files location')\n    parser.add_argument('-t', '--train-anno', default='flatfault_b_train_invnet.txt', help='name of train anno')\n    parser.add_argument('-v', '--val-anno', default='flatfault_b_val_invnet.txt', help='name of val anno')\n    parser.add_argument('-o', '--output-path', default='Invnet_models', help='path to parent folder to save checkpoints')\n    parser.add_argument('-l', '--log-path', default='Invnet_models', help='path to parent folder to save logs')\n    parser.add_argument('-n', '--save-name', default='fcn_l1loss_ffb', help='folder name for this experiment')\n    parser.add_argument('-s', '--suffix', type=str, default=None, help='subfolder name for this run')\n\n    # Model related\n    parser.add_argument('-m', '--model', type=str, help='inverse model name')\n    parser.add_argument('-um', '--up-mode', default=None, help='upsampling layer mode such as \"nearest\", \"bicubic\", etc.')\n    parser.add_argument('-ss', '--sample-spatial', type=float, default=1.0, help='spatial sampling ratio')\n    parser.add_argument('-st', '--sample-temporal', type=int, default=1, help='temporal sampling ratio')\n    # Training related\n    parser.add_argument('-b', '--batch-size', default=256, type=int)\n    parser.add_argument('--lr', default=0.0001, type=float, help='initial learning rate')\n    parser.add_argument('-lm', '--lr-milestones', nargs='+', default=[], type=int, help='decrease lr on milestones')\n    parser.add_argument('--momentum', default=0.9, type=float, help='momentum')\n    parser.add_argument('--weight-decay', default=1e-4 , type=float, help='weight decay (default: 1e-4)')\n    parser.add_argument('--lr-gamma', default=0.1, type=float, help='decrease lr by a factor of lr-gamma')\n    parser.add_argument('--lr-warmup-epochs', default=0, type=int, help='number of warmup epochs')   \n    parser.add_argument('-eb', '--epoch_block', type=int, default=40, help='epochs in a saved block')\n    parser.add_argument('-nb', '--num_block', type=int, default=3, help='number of saved block')\n    parser.add_argument('-j', '--workers', default=16, type=int, help='number of data loading workers (default: 16)')\n    parser.add_argument('--k', default=1, type=float, help='k in log transformation')\n    parser.add_argument('--print-freq', default=50, type=int, help='print frequency')\n    parser.add_argument('-r', '--resume', default=None, help='resume from checkpoint')\n    parser.add_argument('--start-epoch', default=0, type=int, help='start epoch')\n\n    # Loss related\n    parser.add_argument('-g1v', '--lambda_g1v', type=float, default=1.0)\n    parser.add_argument('-g2v', '--lambda_g2v', type=float, default=1.0)\n    \n    # Distributed training related\n    parser.add_argument('--sync-bn', action='store_true', help='Use sync batch norm')\n    parser.add_argument('--world-size', default=1, type=int, help='number of distributed processes')\n    parser.add_argument('--dist-url', default='env://', help='url used to set up distributed training')\n\n    # Tensorboard related\n    parser.add_argument('--tensorboard', action='store_true', help='Use tensorboard for logging.')\n\n    args = parser.parse_args()\n\n    args.output_path = os.path.join(args.output_path, args.save_name, args.suffix or '')\n    args.log_path = os.path.join(args.log_path, args.save_name, args.suffix or '')\n    args.train_anno = os.path.join(args.anno_path, args.train_anno)\n    args.val_anno = os.path.join(args.anno_path, args.val_anno)\n    \n    args.epochs = args.epoch_block * args.num_block\n\n    if args.resume:\n        args.resume = os.path.join(args.output_path, args.resume)\n\n    return args\n\n\nif __name__ == '__main__':\n    args = parse_args()\n    main(args)\n"
  },
  {
    "path": "transforms.py",
    "content": "# © 2022. Triad National Security, LLC. All rights reserved.\n\n# This program was produced under U.S. Government contract 89233218CNA000001 for Los Alamos\n\n# National Laboratory (LANL), which is operated by Triad National Security, LLC for the U.S.\n\n# Department of Energy/National Nuclear Security Administration. All rights in the program are\n\n# reserved by Triad National Security, LLC, and the U.S. Department of Energy/National Nuclear\n\n# Security Administration. The Government is granted for itself and others acting on its behalf a\n\n# nonexclusive, paid-up, irrevocable worldwide license in this material to reproduce, prepare\n\n# derivative works, distribute copies to the public, perform publicly and display publicly, and to permit\n\n# others to do so.\n\nimport torch\nimport numpy as np\nimport random\nfrom sklearn.decomposition import PCA\n\ndef crop(vid, i, j, h, w):\n    return vid[..., i:(i + h), j:(j + w)]\n\n\ndef center_crop(vid, output_size):\n    h, w = vid.shape[-2:]\n    th, tw = output_size\n\n    i = int(round((h - th) / 2.))\n    j = int(round((w - tw) / 2.))\n    return crop(vid, i, j, th, tw)\n\n\ndef hflip(vid):\n    return vid.flip(dims=(-1,))\n\n\n# NOTE: for those functions, which generally expect mini-batches, we keep them\n# as non-minibatch so that they are applied as if they were 4d (thus image).\n# this way, we only apply the transformation in the spatial domain\ndef resize(vid, size, interpolation='bilinear'):\n    # NOTE: using bilinear interpolation because we don't work on minibatches\n    # at this level\n    scale = None\n    if isinstance(size, int):\n        scale = float(size) / min(vid.shape[-2:])\n        size = None\n    return torch.nn.functional.interpolate(\n        vid, size=size, scale_factor=scale, mode=interpolation, align_corners=False)\n\ndef random_resize(vid, size, random_factor, interpolation='bilinear'):\n    # NOTE: using bilinear interpolation because we don't work on minibatches\n    # at this level\n    scale = None\n    r = 1 + random.random() * (random_factor - 1)\n    if isinstance(size, int):\n        scale = float(size) / min(vid.shape[-2:]) * r\n        size = None\n    else:\n        size = tuple([int(elem * r) for elem in list(size)])\n    return torch.nn.functional.interpolate(\n        vid, size=size, scale_factor=scale, mode=interpolation, align_corners=False)\n\ndef pad(vid, padding, fill=0, padding_mode=\"constant\"):\n    # NOTE: don't want to pad on temporal dimension, so let as non-batch\n    # (4d) before padding. This works as expected\n    return torch.nn.functional.pad(vid, padding, value=fill, mode=padding_mode)\n\n\ndef to_normalized_float_tensor(vid):\n    return vid.permute(3, 0, 1, 2).to(torch.float32) / 255\n\n\ndef normalize(vid, mean, std):\n    shape = (-1,) + (1,) * (vid.dim() - 1)\n    mean = torch.as_tensor(mean).reshape(shape)\n    std = torch.as_tensor(std).reshape(shape)\n    return (vid - mean) / std\n\ndef minmax_normalize(vid, vmin, vmax, scale=2):\n    vid -= vmin\n    vid /= (vmax - vmin)\n    return (vid - 0.5) * 2 if scale == 2 else vid\n    \ndef minmax_denormalize(vid, vmin, vmax, scale=2):\n    if scale == 2:\n        vid = vid / 2 + 0.5\n    return vid * (vmax - vmin) + vmin\n\ndef add_noise(data, snr):\n    sig_avg_power_db = 10*np.log10(np.mean(data**2))\n    noise_avg_power_db = sig_avg_power_db - snr\n    noise_avg_power = 10**(noise_avg_power_db/10)\n    noise = np.random.normal(0, np.sqrt(noise_avg_power), data.shape)\n    noisy_data = data + noise\n    \n    return noisy_data      \n\ndef log_transform(data, k=1, c=0):\n    return (np.log1p(np.abs(k * data) + c)) * np.sign(data)\n\ndef log_transform_tensor(data, k=1, c=0):\n    return (torch.log1p(torch.abs(k * data) + c)) * torch.sign(data)\n\ndef exp_transform(data, k=1, c=0):\n    return (np.expm1(np.abs(data)) - c) * np.sign(data) / k\n\ndef tonumpy_denormalize(vid, vmin, vmax, exp=True, k=1, c=0, scale=2):\n    if exp:\n        vmin = log_transform(vmin, k=k, c=c) \n        vmax = log_transform(vmax, k=k, c=c) \n    vid = minmax_denormalize(vid.cpu().numpy(), vmin, vmax, scale)\n    return exp_transform(vid, k=k, c=c) if exp else vid\n\n# Class interface\n\nclass RandomCrop(object):\n    def __init__(self, size):\n        self.size = size\n\n    @staticmethod\n    def get_params(vid, output_size):\n        \"\"\"Get parameters for ``crop`` for a random crop.\n        \"\"\"\n        h, w = vid.shape[-2:]\n        th, tw = output_size\n        if w == tw and h == th:\n            return 0, 0, h, w\n        i = random.randint(0, h - th)\n        j = random.randint(0, w - tw)\n        return i, j, th, tw\n\n    def __call__(self, vid):\n        i, j, h, w = self.get_params(vid, self.size)\n        return crop(vid, i, j, h, w)\n\n\nclass CenterCrop(object):\n    def __init__(self, size):\n        self.size = size\n\n    def __call__(self, vid):\n        return center_crop(vid, self.size)\n\n\nclass Resize(object):\n    def __init__(self, size):\n        self.size = size\n\n    def __call__(self, vid):\n        return resize(vid, self.size)\n\nclass RandomResize(object):\n    def __init__(self, size, random_factor=1.25):\n        self.size = size\n        self.factor = random_factor\n\n    def __call__(self, vid):\n        return random_resize(vid, self.size, self.factor)\n\nclass ToFloatTensorInZeroOne(object):\n    def __call__(self, vid):\n        return to_normalized_float_tensor(vid)\n\n\nclass Normalize(object):\n    def __init__(self, mean, std):\n        self.mean = mean\n        self.std = std\n\n    def __call__(self, vid):\n        return normalize(vid, self.mean, self.std)\n\nclass MinMaxNormalize(object):\n    def __init__(self, datamin, datamax, scale=2):\n        self.datamin = datamin\n        self.datamax = datamax\n        self.scale = scale\n\n    def __call__(self, vid):\n        return minmax_normalize(vid, self.datamin, self.datamax, self.scale)\n\nclass RandomHorizontalFlip(object):\n    def __init__(self, p=0.5):\n        self.p = p\n\n    def __call__(self, vid):\n        if random.random() < self.p:\n            return hflip(vid)\n        return vid\n\nclass Pad(object):\n    def __init__(self, padding, fill=0):\n        self.padding = padding\n        self.fill = fill\n\n    def __call__(self, vid):\n        return pad(vid, self.padding, self.fill)\n        \nclass TemporalDownsample(object):\n    def __init__(self, rate=1):\n        self.rate = rate\n        \n    def __call__(self, vid):\n        return vid[::self.rate]\n\nclass AddNoise(object):\n    def __init__(self, snr=10):\n        self.snr = snr\n        \n    def __call__(self, vid):\n        return add_noise(vid, self.snr)\n        \nclass PCD(object):\n    def __init__(self, n_comp=8):\n        self.pca = PCA(n_components=n_comp)\n    \n    def __call__(self, data):\n        data= data.reshape((data.shape[0], -1))\n        feat_mean = data.mean(axis=0)\n        data -= np.tile(feat_mean, (data.shape[0], 1))\n        pc = self.pca.fit_transform(data)\n        pc = pc.reshape((-1,))\n        pc = pc[:, np.newaxis, np.newaxis]\n        \n        return pc\n        \nclass StackPCD(object):\n    def __init__(self, n_comp=(32, 8)):\n        \n        self.primary_pca = PCA(n_components=n_comp[0])\n        self.secondary_pca = PCA(n_components=n_comp[1])\n    \n    def __call__(self, data):\n        \n        data = np.transpose(data, (0, 2, 1))\n        \n        primary_pc = []\n        for sample in data:\n            feat_mean = sample.mean(axis=0)\n            sample -= np.tile(feat_mean, (sample.shape[0], 1))\n            primary_pc.append(self.primary_pca.fit_transform(sample))\n        primary_pc = np.array(primary_pc)\n        \n        data = primary_pc.reshape((data.shape[0], -1))\n        feat_mean = data.mean(axis=0)\n        data -= np.tile(feat_mean, (data.shape[0], 1))\n        secondary_pc = self.secondary_pca.fit_transform(data)\n        secondary_pc = secondary_pc.reshape((-1,))\n        secondary_pc = pc[:, np.newaxis, np.newaxis]\n        \n        return secondary_pc\n    \nclass LogTransform(object):\n    def __init__(self, k=1, c=0):\n        self.k = k\n        self.c = c\n\n    def __call__(self, data):\n        return log_transform(data, k=self.k, c=self.c)\n \nclass ToTensor(object):\n    \"\"\"Convert ndarrays in sample to Tensors.\"\"\"\n    # def __init__(self, device):\n    #     self.device = device\n    def __call__(self, sample):\n        return torch.from_numpy(sample)\n"
  },
  {
    "path": "utils.py",
    "content": "# © 2022. Triad National Security, LLC. All rights reserved.\n\n# This program was produced under U.S. Government contract 89233218CNA000001 for Los Alamos\n\n# National Laboratory (LANL), which is operated by Triad National Security, LLC for the U.S.\n\n# Department of Energy/National Nuclear Security Administration. All rights in the program are\n\n# reserved by Triad National Security, LLC, and the U.S. Department of Energy/National Nuclear\n\n# Security Administration. The Government is granted for itself and others acting on its behalf a\n\n# nonexclusive, paid-up, irrevocable worldwide license in this material to reproduce, prepare\n\n# derivative works, distribute copies to the public, perform publicly and display publicly, and to permit\n\n# others to do so.\n\nfrom collections import defaultdict, deque\nimport datetime\nimport time\nimport torch\nimport torch.distributed as dist\nimport torch.autograd as autograd\nfrom torch.autograd import Variable\nimport torch.nn as nn\nimport errno\nimport os\nimport itertools\nfrom torchvision.models import vgg16\nimport numpy as np\n\nclass SmoothedValue(object):\n    \"\"\"Track a series of values and provide access to smoothed values over a\n    window or the global series average.\n    \"\"\"\n\n    def __init__(self, window_size=20, fmt=None):\n        if fmt is None:\n            fmt = \"{median:.4f} ({global_avg:.4f})\"\n        self.deque = deque(maxlen=window_size)\n        self.total = 0.0\n        self.count = 0\n        self.fmt = fmt\n\n    def update(self, value, n=1):\n        self.deque.append(value)\n        self.count += n\n        self.total += value * n\n\n    def synchronize_between_processes(self):\n        \"\"\"\n        Warning: does not synchronize the deque!\n        \"\"\"\n        if not is_dist_avail_and_initialized():\n            return\n        t = torch.tensor([self.count, self.total], dtype=torch.float64, device='cuda')\n        dist.barrier()\n        dist.all_reduce(t)\n        t = t.tolist()\n        self.count = int(t[0])\n        self.total = t[1]\n\n    @property\n    def median(self):\n        d = torch.tensor(list(self.deque))\n        return d.median().item()\n\n    @property\n    def avg(self):\n        d = torch.tensor(list(self.deque), dtype=torch.float32)\n        return d.mean().item()\n\n    @property\n    def global_avg(self):\n        return self.total / self.count\n\n    @property\n    def max(self):\n        return max(self.deque)\n\n    @property\n    def value(self):\n        return self.deque[-1]\n\n    def __str__(self):\n        return self.fmt.format(\n            median=self.median,\n            avg=self.avg,\n            global_avg=self.global_avg,\n            max=self.max,\n            value=self.value)\n\n\nclass MetricLogger(object):\n    def __init__(self, delimiter=\"\\t\"):\n        self.meters = defaultdict(SmoothedValue)\n        self.delimiter = delimiter\n\n    def update(self, **kwargs):\n        for k, v in kwargs.items():\n            if isinstance(v, torch.Tensor):\n                v = v.item()\n            assert isinstance(v, (float, int))\n            self.meters[k].update(v)\n\n    def __getattr__(self, attr):\n        if attr in self.meters:\n            return self.meters[attr]\n        if attr in self.__dict__:\n            return self.__dict__[attr]\n        raise AttributeError(\"'{}' object has no attribute '{}'\".format(\n            type(self).__name__, attr))\n\n    def __str__(self):\n        loss_str = []\n        for name, meter in self.meters.items():\n            loss_str.append(\n                \"{}: {}\".format(name, str(meter))\n            )\n        return self.delimiter.join(loss_str)\n\n    def synchronize_between_processes(self):\n        for meter in self.meters.values():\n            meter.synchronize_between_processes()\n\n    def add_meter(self, name, meter):\n        self.meters[name] = meter\n\n    def log_every(self, iterable, print_freq, header=None):\n        if isinstance(iterable, list):\n            length = max(len(x) for x in iterable)\n            iterable = [x if len(x) == length else itertools.cycle(x) for x in iterable]\n            iterable = zip(*iterable)\n        else:\n            length = len(iterable)\n        i = 0\n        if not header:\n            header = ''\n        start_time = time.time()\n        end = time.time()\n        iter_time = SmoothedValue(fmt='{avg:.4f}')\n        data_time = SmoothedValue(fmt='{avg:.4f}')\n        space_fmt = ':' + str(len(str(length))) + 'd'\n        if torch.cuda.is_available():\n            log_msg = self.delimiter.join([\n                header,\n                '[{0' + space_fmt + '}/{1}]',\n                'eta: {eta}',\n                '{meters}',\n                'time: {time}',\n                'data: {data}',\n                'max mem: {memory:.0f}'\n            ])\n        else:\n            log_msg = self.delimiter.join([\n                header,\n                '[{0' + space_fmt + '}/{1}]',\n                'eta: {eta}',\n                '{meters}',\n                'time: {time}',\n                'data: {data}'\n            ])\n        MB = 1024.0 * 1024.0\n        for obj in iterable:\n            data_time.update(time.time() - end)\n            yield obj # <-- yield the batch in for loop\n            iter_time.update(time.time() - end)\n            if i % print_freq == 0:\n                eta_seconds = iter_time.global_avg * (length - i)\n                eta_string = str(datetime.timedelta(seconds=int(eta_seconds)))\n                if torch.cuda.is_available():\n                    print(log_msg.format(\n                        i, length, eta=eta_string,\n                        meters=str(self),\n                        time=str(iter_time), data=str(data_time),\n                        memory=torch.cuda.max_memory_allocated() / MB))\n                else:\n                    print(log_msg.format(\n                        i, length, eta=eta_string,\n                        meters=str(self),\n                        time=str(iter_time), data=str(data_time)))\n            i += 1\n            end = time.time()\n        total_time = time.time() - start_time\n        total_time_str = str(datetime.timedelta(seconds=int(total_time)))\n        print('{} Total time: {}'.format(header, total_time_str))\n\n\n# Legacy code\nclass ContentLoss(nn.Module):\n    def __init__(self, args):\n        super(ContentLoss, self).__init__()\n        names = ['l1', 'l2']\n        self.loss_names = ['loss_' + n for n in names]\n        for key in ['lambda_' + n for n in names]:\n            setattr(self, key, getattr(args, key))\n        self.l1loss = nn.L1Loss()\n        self.l2loss = nn.MSELoss()\n\n    def forward(self, model, input, target):\n        pred = model(input)\n        loss_l1 = self.l1loss(target, pred)\n        loss_l2 = self.l2loss(target, pred)\n        loss = loss_l1 * self.lambda_l1 + loss_l2 * self.lambda_l2\n        scope = locals()\n        return loss, { k: eval(k, scope) for k in self.loss_names }\n\n\n# Legacy code\nclass IdenticalLoss(nn.Module):\n    def __init__(self, args):\n        super(IdenticalLoss, self).__init__()\n        names = ['id1s', 'id2s']\n        self.loss_names = ['loss_' + n for n in names]\n        for key in ['lambda_' + n for n in names]:\n            setattr(self, key, getattr(args, key))\n        self.l1loss = nn.L1Loss()\n        self.l2loss = nn.MSELoss()\n\n    def forward(self, model_s2v, model_v2s, input):\n        mid = model_s2v(input)\n        pred = model_v2s(mid)\n        cal_loss = lambda x, y: (self.l1loss(x, y), self.l2loss(x, y))\n        loss_id1s, loss_id2s = cal_loss(input, pred)\n        loss = loss_id1s * self.lambda_id1s + loss_id2s * self.lambda_id2s\n        scope = locals()\n        return loss, { k: eval(k, scope) for k in self.loss_names }\n\n# Implemented according to H-PGNN, not useful\nclass NMSELoss(nn.Module):\n    def __init__(self):\n        super(NMSELoss, self).__init__()\n    \n    def forward(self, pred, gt):\n        return torch.mean(((pred - gt) / (torch.amax(gt, (-2, -1), keepdim=True) + 1e-5)) ** 2)\n\n\nclass CycleLoss(nn.Module):\n    def __init__(self, args):\n        super(CycleLoss, self).__init__()\n        names = ['g1v', 'g2v', 'g1s', 'g2s', 'c1v', 'c2v', 'c1s', 'c2s']\n        self.loss_names = ['loss_' + n for n in names]\n        for key in ['lambda_' + n for n in names]:\n            setattr(self, key, getattr(args, key))\n        self.l1loss = nn.L1Loss()\n        self.l2loss = nn.MSELoss()\n    \n    def forward(self, data, label, pred_s=None, pred_v=None, recon_s=None, recon_v=None):\n        cal_loss = lambda x, y: (self.l1loss(x, y), self.l2loss(x, y))\n        loss_g1v, loss_g2v, loss_g1s, loss_g2s = [0] * 4\n        if pred_v is not None:\n            loss_g1v, loss_g2v = cal_loss(pred_v, label) \n        if pred_s is not None:\n            loss_g1s, loss_g2s = cal_loss(pred_s, data)\n\n        loss_c1v, loss_c2v, loss_c1s , loss_c2s = [0] * 4\n        if recon_v is not None:\n            loss_c1v, loss_c2v = cal_loss(recon_v, label)\n        if recon_s is not None:\n            loss_c1s, loss_c2s = cal_loss(recon_s, data)\n\n        loss = loss_g1v * self.lambda_g1v + loss_g2v * self.lambda_g2v + \\\n            loss_g1s * self.lambda_g1s + loss_g2s * self.lambda_g2s + \\\n            loss_c1v * self.lambda_c1v + loss_c2v * self.lambda_c2v + \\\n            loss_c1s * self.lambda_c1s + loss_c2s * self.lambda_c2s\n        scope = locals()\n        return loss, { k: eval(k, scope) for k in self.loss_names }\n\n\n# Legacy code\nclass _CycleLoss(nn.Module):\n    def __init__(self, args):\n        super(_CycleLoss, self).__init__()\n        names = ['g1v', 'g2v', 'g1s', 'g2s', 'c1v', 'c2v', 'c1s', 'c2s']\n        self.loss_names = ['loss_' + n for n in names]\n        for key in ['lambda_' + n for n in names]:\n            setattr(self, key, getattr(args, key))\n        self.l1loss = nn.L1Loss()\n        self.l2loss = nn.MSELoss()\n    \n    def forward(self, data, label, pred_s=None, pred_v=None, recon_s=None, recon_v=None):\n        cal_loss = lambda x, y: (self.l1loss(x, y), self.l2loss(x, y))\n        loss_g1v, loss_g2v, loss_g1s, loss_g2s = [0] * 4\n        if pred_v is not None and (self.lambda_g1v != 0 or self.lambda_g2v != 0):\n            loss_g1v, loss_g2v = cal_loss(pred_v, label) \n        if pred_s is not None and (self.lambda_g1s != 0 or self.lambda_g2s != 0):\n            loss_g1s, loss_g2s = cal_loss(pred_s, data)\n\n        loss_c1v, loss_c2v, loss_c1s , loss_c2s = [0] * 4\n        if recon_v is not None and (self.lambda_c1v != 0 or self.lambda_c2v != 0):\n            loss_c1v, loss_c2v = cal_loss(recon_v, label)\n        if recon_s is not None and (self.lambda_c1s != 0 or self.lambda_c2s != 0):\n            loss_c1s, loss_c2s = cal_loss(recon_s, data)\n\n        loss = loss_g1v * self.lambda_g1v + loss_g2v * self.lambda_g2v + \\\n            loss_g1s * self.lambda_g1s + loss_g2s * self.lambda_g2s + \\\n            loss_c1v * self.lambda_c1v + loss_c2v * self.lambda_c2v + \\\n            loss_c1s * self.lambda_c1s + loss_c2s * self.lambda_c2s\n        scope = locals()\n        return loss, { k: eval(k, scope) for k in self.loss_names }\n\ndef accuracy(output, target, topk=(1,)):\n    \"\"\"Computes the accuracy over the k top predictions for the specified values of k\"\"\"\n    with torch.no_grad():\n        maxk = max(topk)\n        batch_size = target.size(0)\n\n        _, pred = output.topk(maxk, 1, True, True)\n        pred = pred.t()\n        correct = pred.eq(target[None])\n\n        res = []\n        for k in topk:\n            correct_k = correct[:k].flatten().sum(dtype=torch.float32)\n            res.append(correct_k * (100.0 / batch_size))\n        return res\n\n\ndef mkdir(path):\n    try:\n        os.makedirs(path)\n    except OSError as e:\n        if e.errno != errno.EEXIST:\n            raise\n\n\ndef setup_for_distributed(is_master):\n    \"\"\"\n    This function disables printing when not in master process\n    \"\"\"\n    import builtins as __builtin__\n    builtin_print = __builtin__.print\n\n    def print(*args, **kwargs):\n        force = kwargs.pop('force', False)\n        if is_master or force:\n            builtin_print(*args, **kwargs)\n\n    __builtin__.print = print\n\n\ndef is_dist_avail_and_initialized():\n    if not dist.is_available():\n        return False\n    if not dist.is_initialized():\n        return False\n    return True\n\n\ndef get_world_size():\n    if not is_dist_avail_and_initialized():\n        return 1\n    return dist.get_world_size()\n\n\ndef get_rank():\n    if not is_dist_avail_and_initialized():\n        return 0\n    return dist.get_rank()\n\n\ndef is_main_process():\n    return get_rank() == 0\n\n\ndef save_on_master(*args, **kwargs):\n    if is_main_process():\n        torch.save(*args, **kwargs)\n\n\ndef init_distributed_mode(args):\n    if 'RANK' in os.environ and 'WORLD_SIZE' in os.environ:\n        args.rank = int(os.environ[\"RANK\"])\n        args.world_size = int(os.environ['WORLD_SIZE'])\n        args.local_rank = int(os.environ['LOCAL_RANK'])\n    elif 'SLURM_PROCID' in os.environ and args.world_size > 1:\n        args.rank = int(os.environ['SLURM_PROCID'])\n        args.local_rank = args.rank % torch.cuda.device_count()\n    elif hasattr(args, \"rank\"):\n        pass\n    else:\n        print('Not using distributed mode')\n        args.distributed = False\n        return\n\n    args.distributed = True\n\n    torch.cuda.set_device(args.local_rank)\n    args.dist_backend = 'nccl'\n    print('| distributed init (rank {}): {}'.format(\n        args.rank, args.dist_url), flush=True)\n    torch.distributed.init_process_group(backend=args.dist_backend, init_method=args.dist_url,\n                                         world_size=args.world_size, rank=args.rank)\n    setup_for_distributed(args.rank == 0)\n    \n    \nclass Wasserstein_GP(nn.Module):\n    def __init__(self, device, lambda_gp):\n        super(Wasserstein_GP, self).__init__()\n        self.device = device\n        self.lambda_gp = lambda_gp\n\n    def forward(self, real, fake, model):\n        gradient_penalty = self.compute_gradient_penalty(model, real, fake)\n        loss_real = torch.mean(model(real))\n        loss_fake = torch.mean(model(fake))\n        loss = -loss_real + loss_fake + gradient_penalty * self.lambda_gp\n        return loss, loss_real-loss_fake, gradient_penalty\n\n    def compute_gradient_penalty(self, model, real_samples, fake_samples):\n        alpha = torch.rand(real_samples.size(0), 1, 1, 1, device=self.device)\n        interpolates = (alpha * real_samples + ((1 - alpha) * fake_samples)).requires_grad_(True)\n        d_interpolates = model(interpolates)\n        gradients = autograd.grad(\n            outputs=d_interpolates,\n            inputs=interpolates,\n            grad_outputs=torch.ones(real_samples.size(0), d_interpolates.size(1)).to(self.device),\n            create_graph=True,\n            retain_graph=True,\n            only_inputs=True,\n        )[0]\n        gradients = gradients.view(gradients.size(0), -1)\n        gradient_penalty = ((gradients.norm(2, dim=1) - 1) ** 2).mean()\n        return gradient_penalty\n\n# Modified from https://gist.github.com/alper111/8233cdb0414b4cb5853f2f730ab95a49     \nclass VGGPerceptualLoss(nn.Module):\n    def __init__(self, resize=True):\n        super(VGGPerceptualLoss, self).__init__()\n        blocks = []\n        blocks.append(vgg16(pretrained=True).features[:4].eval()) # relu1_2\n        blocks.append(vgg16(pretrained=True).features[4:9].eval()) # relu2_2\n        blocks.append(vgg16(pretrained=True).features[9:16].eval()) # relu3_3\n        blocks.append(vgg16(pretrained=True).features[16:23].eval()) # relu4_3\n        for bl in blocks:\n            for p in bl:\n                p.requires_grad = False\n        self.blocks = nn.ModuleList(blocks)\n        self.transform = nn.functional.interpolate\n        self.resize = resize\n        self.register_buffer(\"mean\", torch.tensor([0.485, 0.456, 0.406]).view(1, 3, 1, 1))\n        self.register_buffer(\"std\", torch.tensor([0.229, 0.224, 0.225]).view(1, 3, 1, 1))\n        self.l1loss = nn.L1Loss()\n        self.l2loss = nn.MSELoss()\n\n    def forward(self, input, target, rescale=True, feature_layers=[1]):\n        input = input.view(-1, 1, input.shape[-2], input.shape[-1]).repeat(1, 3, 1, 1)\n        target = target.view(-1, 1, target.shape[-2], target.shape[-1]).repeat(1, 3, 1, 1)\n        if rescale: # from [-1, 1] to [0, 1]\n            input = input / 2 + 0.5\n            target = target / 2 + 0.5\n        input = (input-self.mean) / self.std\n        target = (target-self.mean) / self.std\n        if self.resize:\n            input = self.transform(input, mode='bilinear', size=(224, 224), align_corners=False)\n            target = self.transform(target, mode='bilinear', size=(224, 224), align_corners=False)\n        loss_l1, loss_l2 = 0.0, 0.0\n        x = input\n        y = target\n        for i, block in enumerate(self.blocks):\n            x = block(x)\n            y = block(y)\n            if i in feature_layers:\n                loss_l1 += self.l1loss(x, y)\n                loss_l2 += self.l2loss(x, y)\n        return loss_l1, loss_l2\n\n\ndef cal_psnr(gt, data, max_value):\n    mse = np.mean((gt - data) ** 2)\n    if (mse == 0):\n       return 100\n    return 20 * np.log10(max_value / np.sqrt(mse))\n"
  },
  {
    "path": "vis.py",
    "content": "import os\nimport torch\nimport matplotlib\nmatplotlib.use('Agg')\nimport matplotlib.pyplot as plt\nimport numpy as np\nfrom matplotlib.colors import ListedColormap\n\n# Load colormap for velocity map visualization\nrainbow_cmap = ListedColormap(np.load('rainbow256.npy'))\n\ndef plot_velocity(output, target, path, vmin=None, vmax=None):\n    fig, ax = plt.subplots(1, 2, figsize=(11, 5))\n    if vmin is None or vmax is None:\n        vmax, vmin = np.max(target), np.min(target)\n    im = ax[0].matshow(output, cmap=rainbow_cmap, vmin=vmin, vmax=vmax)\n    ax[0].set_title('Prediction', y=1.08)\n    ax[1].matshow(target, cmap=rainbow_cmap, vmin=vmin, vmax=vmax)\n    ax[1].set_title('Ground Truth', y=1.08)\n    \n    for axis in ax:\n        # axis.set_xticks(range(0, 70, 10))\n        # axis.set_xticklabels(range(0, 1050, 150))\n        # axis.set_yticks(range(0, 70, 10))\n        # axis.set_yticklabels(range(0, 1050, 150))\n        axis.set_xticks(range(0, 70, 10))\n        axis.set_xticklabels(range(0, 700, 100))\n        axis.set_yticks(range(0, 70, 10))\n        axis.set_yticklabels(range(0, 700, 100))\n\n        axis.set_ylabel('Depth (m)', fontsize=12)\n        axis.set_xlabel('Offset (m)', fontsize=12)\n\n    fig.colorbar(im, ax=ax, shrink=0.75, label='Velocity(m/s)')\n    plt.savefig(path)\n    plt.close('all')\n\ndef plot_single_velocity(label, path):\n    plt.rcParams.update({'font.size': 16})\n    fig, ax = plt.subplots(1, 1, figsize=(8, 6))\n    vmax, vmin = np.max(label), np.min(label)\n    im = ax.matshow(label, cmap=rainbow_cmap, vmin=vmin, vmax=vmax)\n    # im = ax.matshow(label, cmap=\"gist_rainbow\", vmin=vmin, vmax=vmax)\n\n    # nx = label.shape[0]\n    # ax.set_aspect(aspect=1)\n    # ax.set_xticks(range(0, nx, int(150//(1050/nx)))[:7])\n    # ax.set_xticklabels(range(0, 1050, 150))\n    # ax.set_yticks(range(0, nx, int(150//(1050/nx)))[:7])\n    # ax.set_yticklabels(range(0, 1050, 150))\n    # ax.set_title('Offset (m)', y=1.08)\n    # ax.set_ylabel('Depth (m)', fontsize=18)\n\n    fig.colorbar(im, ax=ax, shrink=1.0, label='Velocity(m/s)')\n    plt.savefig(path)\n    plt.close('all')\n\n# def plot_seismic(output, target, path, vmin=-1e-5, vmax=1e-5):\n#     fig, ax = plt.subplots(1, 3, figsize=(15, 6))\n#     im = ax[0].matshow(output, aspect='auto', cmap='gray', vmin=vmin, vmax=vmax)\n#     ax[0].set_title('Prediction')\n#     ax[1].matshow(target, aspect='auto', cmap='gray', vmin=vmin, vmax=vmax)\n#     ax[1].set_title('Ground Truth')\n#     ax[2].matshow(output - target, aspect='auto', cmap='gray', vmin=vmin, vmax=vmax)\n#     ax[2].set_title('Difference')\n#     fig.colorbar(im, ax=ax, format='%.1e')\n#     plt.savefig(path)\n#     plt.close('all')\n\n\ndef plot_seismic(output, target, path, vmin=-1e-5, vmax=1e-5):\n    fig, ax = plt.subplots(1, 3, figsize=(20, 5))\n    # fig, ax = plt.subplots(1, 2, figsize=(11, 5))\n    aspect = output.shape[1]/output.shape[0]\n    im = ax[0].matshow(target, aspect=aspect, cmap='gray', vmin=vmin, vmax=vmax)\n    ax[0].set_title('Ground Truth')\n    ax[1].matshow(output, aspect=aspect, cmap='gray', vmin=vmin, vmax=vmax)\n    ax[1].set_title('Prediction')\n    ax[2].matshow(output - target, aspect='auto', cmap='gray', vmin=vmin, vmax=vmax)\n    ax[2].set_title('Difference')\n    \n    # for axis in ax:\n    #     axis.set_xticks(range(0, 70, 10))\n    #     axis.set_xticklabels(range(0, 1050, 150))\n    #     axis.set_title('Offset (m)', y=1.1)\n    #     axis.set_ylabel('Time (ms)', fontsize=12)\n    \n    # fig.colorbar(im, ax=ax, shrink=1.0, pad=0.01, label='Amplitude')\n    fig.colorbar(im, ax=ax, shrink=0.75, label='Amplitude')\n    plt.savefig(path)\n    plt.close('all')\n\n\ndef plot_single_seismic(data, path):\n    nz, nx = data.shape\n    plt.rcParams.update({'font.size': 18})\n    vmin, vmax = np.min(data), np.max(data)\n    fig, ax = plt.subplots(1, 1, figsize=(8, 6))\n    im = ax.matshow(data, aspect='auto', cmap='gray', vmin=vmin * 0.01, vmax=vmax * 0.01)\n    ax.set_aspect(aspect=nx/nz)\n    ax.set_xticks(range(0, nx, int(300//(1050/nx)))[:5])\n    ax.set_xticklabels(range(0, 1050, 300))\n    ax.set_title('Offset (m)', y=1.08)\n    ax.set_yticks(range(0, nz, int(200//(1000/nz)))[:5])\n    ax.set_yticklabels(range(0, 1000, 200))\n    ax.set_ylabel('Time (ms)', fontsize=18)\n    fig.colorbar(im, ax=ax, shrink=1.0, pad=0.01, label='Amplitude')\n    plt.savefig(path)\n    plt.close('all')\n"
  }
]