{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.12","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":39763,"databundleVersionId":11756775,"sourceType":"competition"}],"dockerImageVersionId":30918,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"%%capture\nprint(\"Hidden\")\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-09T16:40:01.145822Z","iopub.execute_input":"2025-04-09T16:40:01.146244Z","iopub.status.idle":"2025-04-09T16:41:09.997855Z","shell.execute_reply.started":"2025-04-09T16:40:01.146206Z","shell.execute_reply":"2025-04-09T16:41:09.996658Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import numpy as np\nimport matplotlib.pyplot as plt\nfrom pathlib import Path\n\n# ---------------------------------------------------\n# 1. Dataset Path Setup (Adjust as needed)\n# ---------------------------------------------------\nDATA_DIR = Path(\"/kaggle/input/waveform-inversion\")\nTRAIN_DIR = DATA_DIR / \"train_samples\"\nTEST_DIR = DATA_DIR / \"test\"\n\n# ---------------------------------------------------\n# 2. Load Vel/Style Family Data (FlatVel_A, CurveVel_A, etc.)\n# ---------------------------------------------------\ndef load_vel_style_data(family_type=\"FlatVel_A\", sample_num=1):\n    \"\"\"Load Vel/Style family data from structured directories\"\"\"\n    data_path = TRAIN_DIR / family_type / \"data\" / f\"data{sample_num}.npy\"\n    model_path = TRAIN_DIR / family_type / \"model\" / f\"model{sample_num}.npy\"\n    \n    seismic = np.load(data_path)  # Shape: (500, sources, time, receivers)\n    velocity = np.load(model_path) # Shape: (500, height, width)\n    return seismic, velocity\n\n# Example: Load FlatVel_A's first sample\nflat_vel_seismic, flat_vel_maps = load_vel_style_data(\"FlatVel_A\", 1)\n\n# ---------------------------------------------------\n# 3. Load Fault Family Data (FlatFault_A, CurveFault_A etc.)\n# ---------------------------------------------------\ndef load_fault_data(family_type=\"FlatFault_A\", n=2, file_index=0):\n    \"\"\"Load Fault family data with complex naming convention\"\"\"\n    seis_path = TRAIN_DIR / family_type / f\"seis{n}_1_{file_index}.npy\"\n    vel_path = TRAIN_DIR / family_type / f\"vel{n}_1_{file_index}.npy\"\n    \n    seismic = np.load(seis_path)    # Shape: (500, sources, time, receivers)\n    velocity = np.load(vel_path)    # Shape: (500, height, width)\n    return seismic, velocity\n\n# Example: Load FlatFault_A's seis2_1_0.npy and vel2_1_0.npy\nflat_fault_seismic, flat_fault_maps = load_fault_data(\"FlatFault_A\", n=2, file_index=0)\n\n# ---------------------------------------------------\n# 4. Basic Data Exploration\n# ---------------------------------------------------\n# Updated visualization function\ndef explore_data(seismic, velocity, family_name):\n    \"\"\"Print basic stats and visualize samples\"\"\"\n    print(f\"\\n=== {family_name} Data ===\")\n    print(f\"Seismic shape: {seismic.shape}\")\n    print(f\"Velocity maps shape: {velocity.shape}\")\n    \n    # Remove singleton dimension from velocity maps\n    velocity = velocity.squeeze()  # Shape becomes (500, 70, 70)\n    \n    # Visualize first sample\n    plt.figure(figsize=(12,5))\n    \n    # Seismic plot (first source, first receiver)\n    plt.subplot(121)\n    plt.plot(seismic[0,0,:,0]) \n    plt.title(f\"{family_name} Waveform\")\n    \n    # Velocity map plot\n    plt.subplot(122)\n    plt.imshow(velocity[0], cmap='viridis')  # Now 2D: (70,70)\n    plt.title(f\"{family_name} Velocity\")\n    plt.colorbar()\n    plt.show()\n\n# Explore different families\n# Load data with corrected shape\nflat_vel_seismic, flat_vel_maps = load_vel_style_data(\"FlatVel_A\", 1)\nflat_vel_maps = flat_vel_maps.squeeze()  # Apply squeeze globally\n\n# Now visualization will work\nexplore_data(flat_vel_seismic, flat_vel_maps, \"FlatVel_A\")\n\n# ---------------------------------------------------\n# 5. Test Data Handling\n# ---------------------------------------------------\n# ---------------------------------------------------\n# 5. Updated Test Data Handling with Error Checking\n# ---------------------------------------------------\ndef load_test_data():\n    \"\"\"Load test seismic data with proper path handling\"\"\"\n    # Check available test files\n    test_files = list(TEST_DIR.glob(\"*.npy\")) + list(TEST_DIR.glob(\"*/*.npy\"))\n    \n    if not test_files:\n        raise FileNotFoundError(f\"No .npy files found in {TEST_DIR}\")\n        \n    print(\"Available test files:\")\n    for f in test_files[:3]:  # Show first 3 files to avoid clutter\n        print(f\" - {f.name}\")\n    \n    # Load first test file as example\n    return np.load(test_files[0])\n\n# Example usage\ntry:\n    test_seismic = load_test_data()\n    print(\"\\n=== Test Data Shape ===\")\n    print(f\"Test seismic shape: {test_seismic.shape}\")\nexcept Exception as e:\n    print(f\"\\nError: {str(e)}\")\n    print(\"Check the exact test data path structure in the competition dataset!\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-09T16:41:09.999308Z","iopub.execute_input":"2025-04-09T16:41:09.999627Z","iopub.status.idle":"2025-04-09T16:41:25.612439Z","shell.execute_reply.started":"2025-04-09T16:41:09.999599Z","shell.execute_reply":"2025-04-09T16:41:25.611360Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# 1️⃣ Count and list family types in train_samples\ntrain_family_types = [f.name for f in TRAIN_DIR.iterdir() if f.is_dir()]\nprint(f\"Total family types in train_samples: {len(train_family_types)}\")\nprint(\"Train family types:\")\nfor f in train_family_types:\n    print(f\" - {f}\")\n\n# 2️⃣ For each family, show its subfolders (like data, model/vel)\nprint(\"\\nSubfolders in each train family:\")\nfor fam in train_family_types:\n    subfolders = [sub.name for sub in (TRAIN_DIR / fam).iterdir() if sub.is_dir()]\n    print(f\"{fam}: {subfolders}\")\n\n# 3️⃣ List test files (to see test data structure)\nprint(\"\\nTest directory files:\")\ntest_items = list(TEST_DIR.glob(\"*\"))\nfor item in test_items[:5]:  # Show first 5 items only\n    print(f\" - {item.name}\")\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-09T16:41:25.614539Z","iopub.execute_input":"2025-04-09T16:41:25.614929Z","iopub.status.idle":"2025-04-09T16:41:25.912251Z","shell.execute_reply.started":"2025-04-09T16:41:25.614890Z","shell.execute_reply":"2025-04-09T16:41:25.911229Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import numpy as np\nfrom pathlib import Path\n\n# Set the training directory path\n#DATA_DIR = Path(\"/kaggle/input/waveform-inversion\")\n#TRAIN_DIR = DATA_DIR / \"train_samples\"\n\n# Get all family folders inside train_samples\nfamily_dirs = [f for f in TRAIN_DIR.iterdir() if f.is_dir()]\nprint(f\"Total families found: {len(family_dirs)}\\n\")\n\nfor family in sorted(family_dirs):\n    print(f\"\\n=== {family.name} ===\")\n    \n    # Case 1: If it has 'data' and 'model' or 'vel' folders\n    data_dir = family / \"data\"\n    model_dir = family / \"model\"\n    if data_dir.exists() and model_dir.exists():\n        data_files = list(data_dir.glob(\"*.npy\"))\n        model_files = list(model_dir.glob(\"*.npy\"))\n        \n        print(f\"Data samples: {len(data_files)}, Model samples: {len(model_files)}\")\n        if data_files:\n            data_sample = np.load(data_files[0])\n            model_sample = np.load(model_files[0])\n            print(f\" - Data sample shape: {data_sample.shape}\")\n            print(f\" - Model sample shape: {model_sample.shape}\")\n    \n    # Case 2: If files are directly inside (e.g., FlatFault_*, CurveFault_*)\n    else:\n        npy_files = list(family.glob(\"*.npy\"))\n        print(f\"Raw .npy files: {len(npy_files)}\")\n        \n        # Analyze file naming pattern\n        print(\"Example file names:\")\n        for f in npy_files[:3]:  # Show up to 3\n            print(f\" - {f.name}\")\n        \n        # Check shape of the first 1 or 2 files (if available)\n        if npy_files:\n            sample_data = np.load(npy_files[0])\n            print(f\" - First sample shape: {sample_data.shape}\")\n            if len(npy_files) > 1:\n                sample_data2 = np.load(npy_files[1])\n                print(f\" - Second sample shape: {sample_data2.shape}\")\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-09T16:41:25.913897Z","iopub.execute_input":"2025-04-09T16:41:25.914320Z","iopub.status.idle":"2025-04-09T16:41:38.912615Z","shell.execute_reply.started":"2025-04-09T16:41:25.914277Z","shell.execute_reply":"2025-04-09T16:41:38.911495Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import pandas as pd\n\ndata_summary = []\nfor family in family_dirs:\n    subdirs = [d.name for d in family.iterdir() if d.is_dir()]\n    data_files = list((family/\"data\").glob(\"*.npy\")) if \"data\" in subdirs else list(family.glob(\"seis*.npy\"))\n    model_files = list((family/\"model\").glob(\"*.npy\")) if \"model\" in subdirs else list(family.glob(\"vel*.npy\"))\n    \n    data_summary.append({\n        \"Family\": family.name,\n        \"Data Files\": len(data_files),\n        \"Model Files\": len(model_files),\n        \"Has Subfolders\": subdirs if subdirs else \"No\",\n    })\n\ndf_summary = pd.DataFrame(data_summary)\nprint(df_summary)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-09T16:41:38.913982Z","iopub.execute_input":"2025-04-09T16:41:38.914332Z","iopub.status.idle":"2025-04-09T16:41:38.950077Z","shell.execute_reply.started":"2025-04-09T16:41:38.914303Z","shell.execute_reply":"2025-04-09T16:41:38.949016Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import numpy as np\nfrom pathlib import Path\n\n# Set train data directory\nDATA_DIR = Path(\"/kaggle/input/waveform-inversion/train_samples\")\n\n# List all family folders inside train_samples\nfamily_dirs = [f for f in DATA_DIR.iterdir() if f.is_dir()]\n\n# Initialize results dictionary\nstats_summary = []\n\n# Loop through each family\nfor family_path in family_dirs:\n    family_name = family_path.name\n    subfolders = [f.name for f in family_path.iterdir() if f.is_dir()]\n    \n    # Initialize holders for statistics\n    seismic_shapes = []\n    velocity_shapes = []\n    seismic_vals = []\n    velocity_vals = []\n    \n    # Case 1: Structured folder with 'data' and 'model' subfolders\n    if \"data\" in subfolders and \"model\" in subfolders:\n        data_files = sorted((family_path / \"data\").glob(\"*.npy\"))\n        model_files = sorted((family_path / \"model\").glob(\"*.npy\"))\n        \n        for data_file, model_file in zip(data_files, model_files):\n            try:\n                seismic = np.load(data_file)\n                velocity = np.load(model_file)\n                seismic_vals.append([np.min(seismic), np.max(seismic), np.mean(seismic), np.std(seismic)])\n                velocity_vals.append([np.min(velocity), np.max(velocity), np.mean(velocity), np.std(velocity)])\n                seismic_shapes.append(seismic.shape)\n                velocity_shapes.append(velocity.shape)\n            except Exception as e:\n                print(f\"Error loading file in {family_name}: {e}\")\n                \n    # Case 2: Flat folder (e.g. FlatFault_*) with 'seis*.npy' and 'vel*.npy'\n    else:\n        seis_files = sorted(family_path.glob(\"seis*.npy\"))\n        vel_files = sorted(family_path.glob(\"vel*.npy\"))\n        \n        for seis_file, vel_file in zip(seis_files, vel_files):\n            try:\n                seismic = np.load(seis_file)\n                velocity = np.load(vel_file)\n                seismic_vals.append([np.min(seismic), np.max(seismic), np.mean(seismic), np.std(seismic)])\n                velocity_vals.append([np.min(velocity), np.max(velocity), np.mean(velocity), np.std(velocity)])\n                seismic_shapes.append(seismic.shape)\n                velocity_shapes.append(velocity.shape)\n            except Exception as e:\n                print(f\"Error loading file in {family_name}: {e}\")\n\n    # Summarize statistics for this family\n    if seismic_vals and velocity_vals:\n        seismic_vals = np.array(seismic_vals)\n        velocity_vals = np.array(velocity_vals)\n        stats_summary.append({\n            \"Family\": family_name,\n            \"Num Samples\": len(seismic_vals),\n            \"Seismic Shape Example\": seismic_shapes[0],\n            \"Velocity Shape Example\": velocity_shapes[0],\n            \"Seismic Mean ± Std\": f\"{np.mean(seismic_vals[:,2]):.3f} ± {np.mean(seismic_vals[:,3]):.3f}\",\n            \"Velocity Mean ± Std\": f\"{np.mean(velocity_vals[:,2]):.3f} ± {np.mean(velocity_vals[:,3]):.3f}\",\n            \"Seismic Min/Max\": f\"{np.min(seismic_vals[:,0]):.2f} / {np.max(seismic_vals[:,1]):.2f}\",\n            \"Velocity Min/Max\": f\"{np.min(velocity_vals[:,0]):.2f} / {np.max(velocity_vals[:,1]):.2f}\"\n        })\n\n# Print summary\nimport pandas as pd\ndf_stats = pd.DataFrame(stats_summary)\ndf_stats.head()\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-09T16:41:38.951049Z","iopub.execute_input":"2025-04-09T16:41:38.951448Z","iopub.status.idle":"2025-04-09T16:42:13.490574Z","shell.execute_reply.started":"2025-04-09T16:41:38.951417Z","shell.execute_reply":"2025-04-09T16:42:13.489551Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import re\nimport numpy as np\nfrom pathlib import Path\nimport matplotlib.pyplot as plt\n\n# Set the train directory\n#DATA_DIR = Path(\"/kaggle/input/waveform-inversion/train_samples\")\nfault_families = [f for f in DATA_DIR.iterdir() if f.is_dir() and ('Fault' in f.name)]\n\nprint(\"=== Naming Pattern Checker ===\\n\")\npattern_summary = []\n\nfor family in fault_families:\n    files = list(family.glob(\"*.npy\"))\n    print(f\"Family: {family.name}\")\n    for f in files[:3]:  # Show first 3 files only\n        print(f\" - {f.name}\")\n        match = re.match(r\"(seis|vel)(\\d+)_(\\d+)_(\\d+)\\.npy\", f.name)\n        if match:\n            prefix, version, set_num, index = match.groups()\n            pattern_summary.append((family.name, prefix, version, set_num, index))\n    print()\n\n# Convert to DataFrame (optional)\nimport pandas as pd\ndf_patterns = pd.DataFrame(pattern_summary, columns=[\"Family\", \"Type\", \"Version\", \"Set\", \"Index\"])\nprint(\"Pattern Summary:\\n\", df_patterns.head())\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-09T16:42:13.491693Z","iopub.execute_input":"2025-04-09T16:42:13.492057Z","iopub.status.idle":"2025-04-09T16:42:13.512222Z","shell.execute_reply.started":"2025-04-09T16:42:13.492029Z","shell.execute_reply":"2025-04-09T16:42:13.511136Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}