Notebook 02: Correcting the Bias

This notebook runs the end-to-end bias correction workflow to transform IMERG precipitation into bias-corrected products for a user-selected month and dekad. The workflow is designed to be reproducible across environments (Colab or local Jupyter) by centralizing all runtime settings in config.yml at the project root.

What this notebook does - Linear Scaling (LS): adjusts mean bias. - Empirical Quantile Mapping (EQM) + Gamma fitting: aligns distributions. - GPD tail adjustment: improves representation of extremes. - Optional Deep Learning (DL) refinement: learns residual structure from LSEQM → CPC to further refine the corrected product.

Reproducibility note - Colab-specific steps (Drive mounting, pip install) are explicitly marked.
- Outside Colab, you can skip those sections and keep the same workflow logic unchanged. - To port the workflow to a new environment, update only config.yml (paths + runtime switches).


1 Connect Google Drive (Colab only)

This section is only required when running in Google Colab and your project/data are stored in Google Drive.

  • Mounting Drive makes your repository and datasets accessible under /content/drive.
  • If you run this notebook locally (Jupyter / VS Code), skip this section.

Expected structure (Drive) After mounting, your project root should contain: - notebooks/ - src/ - config.yml (or config.yaml)

Proceed to the code cell below to mount Drive.

from google.colab import drive
import os

# Check if the drive is mounted
if os.path.exists('/content/drive'):
    # Try to unmount
    try:
        drive.flush_and_unmount()
        print("Successfully unmounted")
    except:
        print("Unmount failed, the drive might not be mounted or busy")

# Mount the drive
drive.mount('/content/drive')
Mounted at /content/drive

Troubleshooting:
- If Colab becomes disconnected, Reconnect the runtime and rerun the mounting cell. - If we receive an error such as Mountpoint must not already contain files, delete all the sub-folders under “/content/drive” from the Files panel before retrying. We need to delete these one by one starting from the innermost folders, until the last “drive” folder is deleted.

2 Install packages (only if needed)

In most cases, Google Colab already includes the packages required for this workflow. The most common missing dependency is netCDF4 (NetCDF I/O support).

Check what is already installed (Colab)

Before installing anything, you can inspect the current environment by running !pip list.

  • If all required packages are present and only netCDF4 is missing, install only netCDF4.
  • If other required packages are missing from !pip list, install them together with netCDF4 in the code cell below.

Local Jupyter note

If you are running in a local environment (Jupyter / VS Code), assume all dependencies were installed when preparing the environment following the main repository README. In that case, you can skip this section.

Proceed to the code cell below only when installation is necessary.

# In Google Colab, almost all packages already available, except netCDF4
!pip install netCDF4
Requirement already satisfied: netCDF4 in /usr/local/lib/python3.12/dist-packages (1.7.4)
Requirement already satisfied: cftime in /usr/local/lib/python3.12/dist-packages (from netCDF4) (1.6.5)
Requirement already satisfied: certifi in /usr/local/lib/python3.12/dist-packages (from netCDF4) (2026.4.22)
Requirement already satisfied: numpy>=1.21.2 in /usr/local/lib/python3.12/dist-packages (from netCDF4) (2.0.2)

3 Executing the Bias Correction Workflow

In this section, we will execute the full bias correction process. The process involves:

  • Adjusting Values (Linear Scaling, LS):
    Correct the mean bias by scaling satellite-based precipitation using the ratio of observed to satellite means.

  • Aligning Distributions (EQM & Gamma Quantile Mapping):
    Match the cumulative distribution functions of the satellite data to that of the observed data.
    Gamma distribution-based quantile mapping provides a rigorous fit to the entire distribution.

  • Preserving Extremes (GPD Tail Adjustment):
    Enhance the representation of extreme values by fitting a Generalized Pareto Distribution (GPD) to the tail of the observed data.

  • Refining Corrections with Deep Learning (DL): The DL model is trained to further adjust the EQM-corrected precipitation estimates—especially targeting extreme events and fine-scale spatial variability—to produce the final corrected product.

The code below demonstrates how to set up our environment (by updating configuration paths), loading our datasets, and executing the bias correction workflow.

Step 1: Setup Environment

This section prepares the notebook runtime so the project modules can be imported consistently.

The setup typically: - ensures the project root is on the Python path (so import src... works), - loads the central configuration file (config.yml / config.yaml) from the project root, and - prints key paths to confirm the run is using the intended inputs/outputs.

Reproducibility principle All operational settings (paths, runtime switches, output directories) should come from the configuration file. Avoid editing paths inside notebook cells unless you are deliberately testing an alternative setup.

Proceed to the code cell below to initialize the environment and configuration.

# Setup: Add project root to Python path
import sys
import os
import importlib
import logging

# Configure logging
logging.basicConfig(level=logging.INFO)

# ---------------------------------------------------------------------------
# Windows DLL fix for conda environments
# ---------------------------------------------------------------------------
if sys.platform == 'win32':
    _conda_prefix = os.environ.get('CONDA_PREFIX') or sys.prefix
    _dll_dirs = [
        os.path.join(_conda_prefix, 'Library', 'bin'),
        os.path.join(_conda_prefix, 'Library', 'lib'),
        os.path.join(_conda_prefix, 'Library', 'mingw-w64', 'bin'),
        os.path.join(_conda_prefix, 'bin'),
        _conda_prefix,
    ]
    for _d in _dll_dirs:
        if os.path.isdir(_d):
            try:
                os.add_dll_directory(_d)
            except OSError:
                pass
            if _d not in os.environ.get('PATH', ''):
                os.environ['PATH'] = _d + os.pathsep + os.environ.get('PATH', '')
    del _conda_prefix, _dll_dirs, _d

# ---------------------------------------------------------------------------
# Project root — hardcoded for local Jupyter.
# Change this path to match your local project location.
# ---------------------------------------------------------------------------

# ROOT = os.path.abspath(os.path.join(os.getcwd(), '..'))
ROOT = '/content/drive/MyDrive/hybrid-bias-correction'
assert os.path.isfile(os.path.join(ROOT, 'src', 'config.py')), f"Not found: {ROOT}"

if ROOT not in sys.path:
    sys.path.insert(0, ROOT)
for m in [k for k in sys.modules if k.startswith('src')]:
    del sys.modules[m]

# Initialize configuration from config.yml
# (setup_logging() is called automatically when src.config is imported)
import src.config as _cfg
importlib.reload(_cfg)
# ===========================================================================
# AOI config selector
#   'config.yml'      -> full Indonesia (Zenodo input/output bundle)
#   'config_bali.yml' -> Bali example (ships with the repo, ~11 MB)
# Edit this single line to switch the entire pipeline between the two.
# ===========================================================================
CONFIG_FILE = 'config_bali.yml'

_cfg.initialize_config(os.path.join(ROOT, CONFIG_FILE))

# Verify configuration
from src import config
print("Configuration loaded successfully:")
print(f"  Main directory  : {config.main_dir}")
print(f"  Input directory : {config.input_dir}")
print(f"  Output directory: {config.output_dir}")
print(f"  IMERGL file     : {config.imergl_file}")
print(f"  CPC file        : {config.cpc_file}")
print(f"  Mask file       : {config.mask_file}")
print(f"  NetCDF engine   : {config.NETCDF_ENGINE}")
print(f"  Interactive     : {config.INTERACTIVE}")
2026-05-22 00:50:18,337 - INFO - NumExpr defaulting to 2 threads.
2026-05-22 00:50:24,964 - INFO - Loaded configuration from /content/drive/MyDrive/hybrid-bias-correction/config_bali.yml
2026-05-22 00:50:24,969 - INFO - Configured main_dir '/content/hybrid-bias-correction' does not exist on this system. Using auto-detected project root: /content/drive/MyDrive/hybrid-bias-correction
2026-05-22 00:50:25,551 - INFO - Configuration initialized successfully.
2026-05-22 00:50:25,553 - INFO -   Main directory: /content/drive/MyDrive/hybrid-bias-correction
2026-05-22 00:50:25,554 - INFO -   Input directory: /content/drive/MyDrive/hybrid-bias-correction/data/example_bali
2026-05-22 00:50:25,558 - INFO -   Output directory: /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output
2026-05-22 00:50:25,560 - INFO -   Interactive mode: False
Configuration loaded successfully:
  Main directory  : /content/drive/MyDrive/hybrid-bias-correction
  Input directory : /content/drive/MyDrive/hybrid-bias-correction/data/example_bali
  Output directory: /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output
  IMERGL file     : /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/bali_imergl.nc4
  CPC file        : /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/bali_cpcuni.nc4
  Mask file       : /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/bali_mask.nc
  NetCDF engine   : netcdf4
  Interactive     : False

Step 2: Gather User Inputs

This cell prompts the user to input the month (1–12) and dekad (1, 2, or 3). Input validation is performed to ensure only valid values are accepted. For the third dekad, note that the maximum day of the month will be determined in a later cell.

# Import Library
import logging

# Configure logging
logging.basicConfig(level=logging.INFO)

# Prompt user for month and dekad
month_input = input("Enter the month (1–12): ").strip()
dekad_input = input("Enter the dekad (1, 2, or 3): ").strip()

try:
    month = int(month_input)
    if not (1 <= month <= 12):
        raise ValueError
except ValueError:
    raise SystemExit("Invalid month. Please provide a number from 1 to 12.")

try:
    dekad = int(dekad_input)
    if dekad not in [1, 2, 3]:
        raise ValueError
except ValueError:
    raise SystemExit("Invalid dekad. Must be 1, 2, or 3.")

logging.info("User selected: month=%s, dekad=%s", month, dekad)

# Format the month as a two-digit string
month_str = f"{month:02d}"

# Set the dekad start and default dekad_str; end day for dekad 3 will be set later
if dekad == 1:
    dekad_str = "01"
    dekad_start, dekad_end = 1, 10
elif dekad == 2:
    dekad_str = "11"
    dekad_start, dekad_end = 11, 20
else:
    dekad_str = "21"
    dekad_start = 21  # dekad_end will be updated after loading dataset
Enter the month (1–12): 1
Enter the dekad (1, 2, or 3): 1
2026-05-22 00:50:35,268 - INFO - User selected: month=1, dekad=1

Step 3: Load Datasets

In this cell, we import the necessary libraries and load both the IMERG and CPC datasets using the file paths defined in config.py.

# Import Library
import xarray as xr
from src import config
from src.utility import apply_land_sea_mask

# Use auto-detected engine
_engine = config.NETCDF_ENGINE

logging.info("Loading IMERG dataset from: %s (engine=%s)", config.imergl_file, _engine)
imerg_ds = xr.open_dataset(config.imergl_file, decode_times=True, engine=_engine)
logging.info("IMERG dataset loaded. Time range: %s to %s",
             imerg_ds.time.values[0], imerg_ds.time.values[-1])

logging.info("Loading CPC dataset from: %s (engine=%s)", config.cpc_file, _engine)
cpc_ds = xr.open_dataset(config.cpc_file, decode_times=True, engine=_engine)
logging.info("CPC dataset loaded. Time range: %s to %s",
             cpc_ds.time.values[0], cpc_ds.time.values[-1])

# Load native 0.5° CPC for BCSD parameter fitting (Option B).
# This file was produced by Notebook 01 (Step 2b + 3b): gap-filled at native
# 0.5° resolution, NOT regridded to 0.1°.  lseqm() fits CPC distribution
# parameters on this grid and bilinearly interpolates them to the IMERG 0.1°
# grid, eliminating the 5×5 block boundary artefact.
import os
if hasattr(config, 'cpc_native_file') and os.path.isfile(config.cpc_native_file):
    logging.info("Loading native 0.5° CPC from: %s", config.cpc_native_file)
    cpc_ds_native = xr.open_dataset(config.cpc_native_file, decode_times=True, engine=_engine)
    logging.info("Native CPC loaded: %d lat x %d lon (%.2f deg resolution)",
                 len(cpc_ds_native.lat), len(cpc_ds_native.lon),
                 abs(float(cpc_ds_native.lat[1] - cpc_ds_native.lat[0])))
else:
    logging.warning("Native 0.5 deg CPC file not found at %s; "
                    "falling back to cpc_ds (block artefacts may appear)",
                    getattr(config, 'cpc_native_file', 'NOT CONFIGURED'))
    cpc_ds_native = None

# Apply land-sea mask ONCE at data loading to set ocean pixels to NaN.
# This prevents ocean zeros from contaminating statistical calculations downstream.
# The mask is cached internally, so subsequent calls are fast.
logging.info("Applying land-sea mask to both datasets...")
imerg_ds[config.IMERG_PRECIP_VAR] = apply_land_sea_mask(
    imerg_ds[config.IMERG_PRECIP_VAR], config.mask_file
)
cpc_ds[config.CPC_PRECIP_VAR] = apply_land_sea_mask(
    cpc_ds[config.CPC_PRECIP_VAR], config.mask_file
)
logging.info("Land-sea mask applied. Ocean pixels are now NaN.")
2026-05-22 00:50:38,886 - INFO - Loading IMERG dataset from: /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/bali_imergl.nc4 (engine=netcdf4)
2026-05-22 00:50:41,138 - INFO - IMERG dataset loaded. Time range: 2001-01-01T00:00:00.000000000 to 2025-12-31T00:00:00.000000000
2026-05-22 00:50:41,139 - INFO - Loading CPC dataset from: /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/bali_cpcuni.nc4 (engine=netcdf4)
2026-05-22 00:50:42,645 - INFO - CPC dataset loaded. Time range: 2001-01-01T00:00:00.000000000 to 2025-12-31T00:00:00.000000000
2026-05-22 00:50:42,648 - INFO - Loading native 0.5° CPC from: /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/bali_cpcuni_native05.nc4
2026-05-22 00:50:43,922 - INFO - Native CPC loaded: 4 lat x 6 lon (0.50 deg resolution)
2026-05-22 00:50:43,923 - INFO - Applying land-sea mask to both datasets...
2026-05-22 00:50:43,927 - INFO - Loading land-sea mask from /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/bali_mask.nc (will be cached)
2026-05-22 00:50:44,618 - INFO - Land-sea mask applied. Ocean pixels are now NaN.

After loading, we can preview a summary and a quick plot of the raw IMERG data to ensure it’s loaded correctly.

# Preview a snapshot of the raw IMERG dataset
print("IMERG Data Summary:")
print(imerg_ds)
imerg_ds[config.IMERG_PRECIP_VAR].isel(time=0).plot(cmap='viridis')
IMERG Data Summary:
<xarray.Dataset> Size: 5MB
Dimensions:        (time: 9131, lat: 9, lon: 14)
Coordinates:
  * time           (time) datetime64[ns] 73kB 2001-01-01 ... 2025-12-31
  * lat            (lat) float32 36B -8.85 -8.75 -8.65 ... -8.25 -8.15 -8.05
  * lon            (lon) float32 56B 114.4 114.6 114.7 ... 115.6 115.7 115.8
Data variables:
    precipitation  (time, lat, lon) float32 5MB nan nan nan nan ... nan nan nan
Attributes:
    Conventions:  CF-1.8
    title:        IMERG Late Run daily precipitation subset for AOI

# Preview a snapshot of the raw CPC dataset
print("CPC Data Summary:")
print(cpc_ds)
cpc_ds[config.CPC_PRECIP_VAR].isel(time=0).plot(cmap='viridis')
CPC Data Summary:
<xarray.Dataset> Size: 5MB
Dimensions:  (time: 9131, lat: 9, lon: 14)
Coordinates:
  * time     (time) datetime64[ns] 73kB 2001-01-01 2001-01-02 ... 2025-12-31
  * lat      (lat) float32 36B -8.85 -8.75 -8.65 -8.55 ... -8.25 -8.15 -8.05
  * lon      (lon) float32 56B 114.4 114.6 114.7 114.8 ... 115.6 115.7 115.8
Data variables:
    precip   (time, lat, lon) float32 5MB nan nan nan nan ... nan nan nan nan
Attributes:
    Conventions:  CF-1.8
    title:        CPC Unified daily precipitation (0.1 deg, AOI clipped)

Step 4: Determine Maximum Day for Dekad 3

If the selected dekad is 3, we need to determine the maximum day of the month (to account for leap years). This cell imports and uses the get_max_day_in_month function from the io module to set dekad_end accordingly.

from src.io import get_max_day_in_month

if dekad == 3:
    dekad_end = get_max_day_in_month(imerg_ds, month)

logging.info("Using month=%s, dekad=%s (day-range: %s%s)", month, dekad, dekad_start, dekad_end)
2026-05-22 00:51:19,798 - INFO - Using month=1, dekad=1 (day-range: 1 – 10)

Step 5: Align Datasets

Next, we load the land-sea mask from the mask file defined in config.py and align the CPC dataset with the IMERG dataset. This is done using the reindex_and_align_with_monotonicity function from utility.py.

from src.utility import load_mask, reindex_and_align_with_monotonicity

# Load the land-sea mask (cached — efficient even if called multiple times)
land_sea_mask = load_mask(config.mask_file)

# Align CPC dataset with IMERG dataset (temporal and spatial alignment)
cpc_ds_aligned, _ = reindex_and_align_with_monotonicity(imerg_ds, cpc_ds, land_sea_mask)
logging.info("Datasets aligned successfully.")
2026-05-22 00:51:22,535 - INFO - Datasets aligned successfully.

Step 6: Aggregate Multi-Year Dekad Data

We now aggregate the IMERG and CPC datasets across all years for the specified dekad. This uses the aggregate_data_across_years function from the io module. The aggregated data shapes are then logged.

from src.io import aggregate_data_across_years

# Aggregate datasets across all years for the specified dekad.
# IMPORTANT: Use cpc_ds_aligned (from Step 5), not the original cpc_ds.
# The original CPC dataset has a different native grid than IMERG.
# After reindex_and_align_with_monotonicity(), cpc_ds_aligned shares
# IMERG's exact lat/lon coordinates, so the inner join inside
# aggregate_data_across_years() will find matching coordinates.
imerg_dekad_data, cpc_dekad_data = aggregate_data_across_years(
    imerg_ds, cpc_ds_aligned, month, dekad_start, dekad_end
)
logging.info("Aggregated IMERG shape: %s", imerg_dekad_data.shape)
logging.info("Aggregated CPC shape: %s", cpc_dekad_data.shape)
2026-05-22 00:52:20,528 - INFO - Aligning IMERG and CPC datasets...
2026-05-22 00:52:20,545 - INFO - After alignment: IMERG has 9131 time steps, CPC has 9131 time steps
2026-05-22 00:52:20,546 - INFO - Creating time-based masks...
2026-05-22 00:52:20,574 - INFO - Applying time masks...
2026-05-22 00:52:20,609 - INFO - Aggregated IMERG shape: (250, 9, 14)
2026-05-22 00:52:20,612 - INFO - Aggregated CPC shape: (250, 9, 14)

We can preview the aggregated data summary and plot an example slice to validate the aggregation results.

# Preview the aggregated dekad data for IMERG
print("Aggregated IMERG Data Summary:")
print(imerg_dekad_data)
imerg_dekad_data.isel(time=0).plot(cmap='plasma')
Aggregated IMERG Data Summary:
<xarray.DataArray 'precipitation' (time: 250, lat: 9, lon: 14)> Size: 126kB
array([[[           nan,            nan,            nan, ...,
         2.11500001e+00, 2.39499974e+00,            nan],
        [           nan,            nan,            nan, ...,
         4.16500092e+00, 4.92000103e+00,            nan],
        [           nan,            nan,            nan, ...,
         5.39999962e-01,            nan,            nan],
        ...,
        [0.00000000e+00, 0.00000000e+00, 0.00000000e+00, ...,
         0.00000000e+00, 2.59999990e-01,            nan],
        [0.00000000e+00, 0.00000000e+00, 0.00000000e+00, ...,
         2.34999999e-01,            nan,            nan],
        [0.00000000e+00, 0.00000000e+00,            nan, ...,
                    nan,            nan,            nan]],

       [[           nan,            nan,            nan, ...,
         1.55000001e-01, 2.49999985e-02,            nan],
        [           nan,            nan,            nan, ...,
         1.11999989e+00, 8.99999961e-02,            nan],
        [           nan,            nan,            nan, ...,
         0.00000000e+00,            nan,            nan],
...
        [8.79999876e-01, 2.14999986e+00, 4.20499992e+00, ...,
         3.54600029e+01, 1.79849968e+01,            nan],
        [3.03000021e+00, 4.29499960e+00, 2.78000021e+00, ...,
         4.03050041e+01,            nan,            nan],
        [3.36000013e+00, 7.39499855e+00,            nan, ...,
                    nan,            nan,            nan]],

       [[           nan,            nan,            nan, ...,
         4.26599960e+01, 2.62099953e+01,            nan],
        [           nan,            nan,            nan, ...,
         2.13899994e+01, 1.54100037e+01,            nan],
        [           nan,            nan,            nan, ...,
         2.86549988e+01,            nan,            nan],
        ...,
        [8.40000033e-01, 3.06999969e+00, 3.02499962e+00, ...,
         2.73499966e+00, 6.99999928e-01,            nan],
        [3.99999991e-02, 9.00000036e-02, 6.24999881e-01, ...,
         0.00000000e+00,            nan,            nan],
        [3.65000010e-01, 6.20000005e-01,            nan, ...,
                    nan,            nan,            nan]]], dtype=float32)
Coordinates:
  * time     (time) datetime64[ns] 2kB 2001-01-01 2001-01-02 ... 2025-01-10
  * lat      (lat) float32 36B -8.85 -8.75 -8.65 -8.55 ... -8.25 -8.15 -8.05
  * lon      (lon) float32 56B 114.4 114.6 114.7 114.8 ... 115.6 115.7 115.8
Attributes:
    units:      mm/day
    long_name:  Daily mean precipitation rate (combined microwave-IR) estimat...

Step 7: Run LSEQM Bias Correction

In this cell, we run the physical-statistical bias correction pipeline: Linear Scaling (LS) followed by Empirical Quantile Mapping (EQM) with GPD tail adjustment. This is Step 1 of the two-step workflow.

The lseqm() function returns both the LSEQM-corrected result and the aggregated CPC dekad data, which will be used as the training target for the DL refinement in Step 8.

Start LSEQM bias correction

from src.bias_correction import lseqm

logging.info("Running LSEQM bias correction (LS + EQM + GPD)...")

# IMPORTANT: Use cpc_ds_aligned (from Step 5), not the original cpc_ds.
# lseqm() internally calls aggregate_data_across_years(), which uses
# xr.align(join="inner"). This requires that IMERG and CPC share the
# same spatial grid — which is only true after alignment in Step 5.
#
# cpc_native_ds=cpc_ds_native passes the original 0.5° CPC so that
# distribution parameters (gamma, GPD) are fitted at native CPC resolution
# and bilinearly interpolated to the 0.1° IMERG grid. This eliminates
# the 0.5° block boundary artefact (BCSD principle, Wood et al. 2004).
lseqm_result, cpc_dekad_data = lseqm(
    imerg_ds, cpc_ds_aligned, month, dekad_start, dekad_end,
    month_str=month_str,
    dekad_str=dekad_str,
    ls_corrected_precip_path=config.ls_corrected_precip_path,
    lseqm_corrected_precip_path=config.lseqm_corrected_precip_path,
    cpc_native_ds=cpc_ds_native
)
logging.info("LSEQM bias correction completed successfully.")
2026-05-22 00:52:34,024 - INFO - Running LSEQM bias correction (LS + EQM + GPD)...
2026-05-22 00:52:34,032 - INFO - Aligning IMERG and CPC datasets...
2026-05-22 00:52:34,039 - INFO - After alignment: IMERG has 9131 time steps, CPC has 9131 time steps
2026-05-22 00:52:34,041 - INFO - Creating time-based masks...
2026-05-22 00:52:34,055 - INFO - Applying time masks...
2026-05-22 00:52:34,069 - INFO - IMERG dekad data shape: (250, 9, 14)
2026-05-22 00:52:34,070 - INFO - CPC dekad data shape: (250, 9, 14)
2026-05-22 00:52:34,075 - INFO - Using native-resolution CPC parameter fitting (BCSD principle)...
2026-05-22 00:52:34,113 - INFO - CPC native dekad data: (250, 4, 6) (lat -9.25–-7.75, lon 113.75–116.25)
2026-05-22 00:52:41,637 - INFO -   Native CPC fitting: row 4/4 (100%) | 24 fitted, 0 skipped | elapsed 8s, ETA 0s
2026-05-22 00:52:41,640 - INFO - Fitted CPC params on native grid: 24/24 cells
2026-05-22 00:52:41,736 - INFO - Interpolated CPC params to IMERG grid: 126/126 valid pixels
2026-05-22 00:52:41,739 - INFO - Performing Linear Scaling (LS)...
2026-05-22 00:52:41,759 - INFO - LS using bilinearly interpolated CPC mean (smooth).
2026-05-22 00:52:41,764 - INFO - Saving LS corrected precipitation...
2026-05-22 00:52:42,451 - INFO - File /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_ls/bali_cli_ls_corrected_imergl_month01_dekad01.nc4 already exists.
2026-05-22 00:52:42,453 - INFO - Non-interactive mode: using 'skip' for existing files
2026-05-22 00:52:42,454 - INFO - Skipping file /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_ls/bali_cli_ls_corrected_imergl_month01_dekad01.nc4
2026-05-22 00:52:42,457 - INFO - Applying Empirical Quantile Mapping (EQM) on 9x14 grid...
2026-05-22 00:52:42,686 - INFO -   EQM progress: row 9/9 (100%) | 80 land pixels done | elapsed 0s, ETA 0s
2026-05-22 00:52:42,692 - INFO - EQM complete: 80/126 grid points corrected (46 masked/ocean pixels skipped)
2026-05-22 00:52:42,694 - INFO - Saving LSEQM corrected precipitation...
2026-05-22 00:52:43,015 - INFO - File /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_lseqm/bali_cli_lseqm_corrected_imergl_month01_dekad01.nc4 already exists.
2026-05-22 00:52:43,018 - INFO - Skipping file /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_lseqm/bali_cli_lseqm_corrected_imergl_month01_dekad01.nc4
2026-05-22 00:52:43,019 - INFO - LSEQM bias correction completed successfully.

Step 8: Train the Deep Learning Model on LSEQM -> CPC

In this cell, we train the DL model using the LSEQM-corrected data as input and CPC as the target. This is the key difference from the old workflow — the model now learns what LSEQM missed (spatial residuals, extreme refinement) rather than learning the full IMERG->CPC mapping.

This eliminates the domain shift problem: at inference, the model receives LSEQM-corrected data — the same domain it was trained on.

Lets check if tensorflow is importable from THIS kernel

import sys
print("Python executable:", sys.executable)
print("Python prefix:", sys.prefix)

# Check if tensorflow is importable from THIS kernel
try:
    import tensorflow as tf
    print(f"TensorFlow found: {tf.__version__}")
except ImportError as e:
    print(f"TensorFlow NOT found: {e}")
Python executable: /usr/bin/python3
Python prefix: /usr
TensorFlow found: 2.20.0

Start training model

from src.deep_learning import train_bias_correction_model
import os

# Define a model name using the month and dekad string
model_name = f"bias_correction_model_month{month_str}_dekad{dekad_str}"
logging.info("Training or loading model: %s", model_name)

# Train the DL model on LSEQM -> CPC (two-step workflow)
# The model learns what the physical-statistical correction missed
model = train_bias_correction_model(
    lseqm_result, cpc_dekad_data, model_name,
    interactive=config.INTERACTIVE
)

model_path = os.path.join(config.trained_models_path, f"{model_name}.keras")
logging.info("Model path: %s", model_path)
2026-05-22 01:02:34,392 - INFO - Training or loading model: bias_correction_model_month01_dekad01
2026-05-22 01:02:34,394 - INFO - Checking if the model file exists at: /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/trained_models/bias_correction_model_month01_dekad01.keras

2026-05-22 01:02:34,513 - INFO - Model: "sequential"
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
┃ Layer (type)                    ┃ Output Shape           ┃       Param # ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│ conv2d (Conv2D)                 │ (None, 9, 14, 32)      │           320 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ max_pooling2d (MaxPooling2D)    │ (None, 4, 7, 32)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout (Dropout)               │ (None, 4, 7, 32)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ conv2d_1 (Conv2D)               │ (None, 4, 7, 64)       │        18,496 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ max_pooling2d_1 (MaxPooling2D)  │ (None, 2, 3, 64)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_1 (Dropout)             │ (None, 2, 3, 64)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ flatten (Flatten)               │ (None, 384)            │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dense (Dense)                   │ (None, 128)            │        49,280 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_2 (Dropout)             │ (None, 128)            │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dense_1 (Dense)                 │ (None, 126)            │        16,254 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ reshape (Reshape)               │ (None, 9, 14)          │             0 │
└─────────────────────────────────┴────────────────────────┴───────────────┘
 Total params: 84,350 (329.49 KB)
 Trainable params: 84,350 (329.49 KB)
 Non-trainable params: 0 (0.00 B)

Epoch 1/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 3s 149ms/step - loss: 0.2057 - mae: 0.3239 - val_loss: 0.1923 - val_mae: 0.3079
Epoch 2/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 60ms/step - loss: 0.1772 - mae: 0.2986 - val_loss: 0.1550 - val_mae: 0.2779
Epoch 3/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 61ms/step - loss: 0.1442 - mae: 0.2770 - val_loss: 0.1054 - val_mae: 0.2279
Epoch 4/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 67ms/step - loss: 0.1204 - mae: 0.2597 - val_loss: 0.0857 - val_mae: 0.2028
Epoch 5/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 61ms/step - loss: 0.1018 - mae: 0.2380 - val_loss: 0.0836 - val_mae: 0.1976
Epoch 6/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 60ms/step - loss: 0.0911 - mae: 0.2238 - val_loss: 0.0768 - val_mae: 0.1903
Epoch 7/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 58ms/step - loss: 0.0827 - mae: 0.2146 - val_loss: 0.0627 - val_mae: 0.1744
Epoch 8/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 58ms/step - loss: 0.0769 - mae: 0.2114 - val_loss: 0.0548 - val_mae: 0.1628
Epoch 9/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 47ms/step - loss: 0.0725 - mae: 0.2047 - val_loss: 0.0596 - val_mae: 0.1683
Epoch 10/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 40ms/step - loss: 0.0670 - mae: 0.1950 - val_loss: 0.0556 - val_mae: 0.1628
Epoch 11/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 72ms/step - loss: 0.0663 - mae: 0.1952 - val_loss: 0.0519 - val_mae: 0.1575
Epoch 12/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 40ms/step - loss: 0.0643 - mae: 0.1905 - val_loss: 0.0591 - val_mae: 0.1669
Epoch 13/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 39ms/step - loss: 0.0634 - mae: 0.1874 - val_loss: 0.0534 - val_mae: 0.1595
Epoch 14/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 73ms/step - loss: 0.0615 - mae: 0.1867 - val_loss: 0.0460 - val_mae: 0.1484
Epoch 15/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 38ms/step - loss: 0.0617 - mae: 0.1877 - val_loss: 0.0522 - val_mae: 0.1563
Epoch 16/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 40ms/step - loss: 0.0567 - mae: 0.1778 - val_loss: 0.0532 - val_mae: 0.1577
Epoch 17/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 44ms/step - loss: 0.0583 - mae: 0.1800 - val_loss: 0.0473 - val_mae: 0.1501
Epoch 18/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 38ms/step - loss: 0.0563 - mae: 0.1787 - val_loss: 0.0493 - val_mae: 0.1528
Epoch 19/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step - loss: 0.0558 - mae: 0.1763 - val_loss: 0.0568 - val_mae: 0.1627
2026-05-22 01:02:41,139 - INFO - Final training history: {'loss': [0.20569545030593872, 0.1772155910730362, 0.14420978724956512, 0.12042862921953201, 0.10180139541625977, 0.09114077687263489, 0.082677461206913, 0.07694906741380692, 0.07250121235847473, 0.06700360029935837, 0.06630828231573105, 0.0642581656575203, 0.06341692060232162, 0.06148885563015938, 0.06174951419234276, 0.05669878423213959, 0.0582597441971302, 0.05627232417464256, 0.055838443338871], 'mae': [0.3238552510738373, 0.2986224293708801, 0.276992529630661, 0.25969454646110535, 0.23803944885730743, 0.22382484376430511, 0.21459750831127167, 0.21139614284038544, 0.20472192764282227, 0.1949537992477417, 0.19523516297340393, 0.19054864346981049, 0.18741744756698608, 0.186689093708992, 0.18765485286712646, 0.17779012024402618, 0.1799679398536682, 0.17870591580867767, 0.17627041041851044], 'val_loss': [0.19230379164218903, 0.1549917310476303, 0.10538844764232635, 0.08570413291454315, 0.08363846689462662, 0.07681674510240555, 0.06270621716976166, 0.05476294457912445, 0.05963369831442833, 0.0555584654211998, 0.05192017927765846, 0.059106696397066116, 0.053398989140987396, 0.04599529132246971, 0.052231885492801666, 0.053167808800935745, 0.04731171578168869, 0.049307681620121, 0.056788187474012375], 'val_mae': [0.3078937530517578, 0.27786099910736084, 0.22787588834762573, 0.20282778143882751, 0.19761502742767334, 0.19034771621227264, 0.17435938119888306, 0.16283389925956726, 0.16831427812576294, 0.16282451152801514, 0.15751366317272186, 0.1668534278869629, 0.15945151448249817, 0.14838476479053497, 0.15626908838748932, 0.15770018100738525, 0.15008500218391418, 0.15275155007839203, 0.16267026960849762]}
2026-05-22 01:02:41,326 - INFO - Model training complete. Best model saved as /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/trained_models/bias_correction_model_month01_dekad01.keras
2026-05-22 01:02:41,328 - INFO - Model path: /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/trained_models/bias_correction_model_month01_dekad01.keras

Step 9: Load or Create Station Density Confidence Mask (Optional)

If use_confidence_mask: true is set in config.yml and a station file is available, this cell computes a spatial confidence mask based on gauge station density. The mask modulates the DL blending alpha: areas with many CPC stations get more DL influence, while station-sparse areas revert to pure LSEQM.

If the feature is disabled (default) or no station file is configured, this step is skipped and uniform blend_alpha is used everywhere (backward compatible with the original workflow).

To enable: Set use_confidence_mask: true in the station_density: section of config.yml.

from src import config

confidence_mask = None  # Default: no spatial modulation (uniform blend_alpha)

if (config.USE_CONFIDENCE_MASK
    and config.STATION_FILE
    and os.path.isfile(config.STATION_FILE)):
    from src.station_density import get_or_create_confidence_mask

    logging.info("Station density confidence mask: ENABLED")
    logging.info("Station file: %s", config.STATION_FILE)

    # Use LSEQM grid coordinates as the target working grid
    confidence_mask = get_or_create_confidence_mask(
        station_file=config.STATION_FILE,
        confidence_mask_file=config.CONFIDENCE_MASK_FILE,
        target_lat=lseqm_result.lat.values,
        target_lon=lseqm_result.lon.values,
        cpc_resolution=config.DENSITY_CPC_RESOLUTION,
        smoothing_sigma=config.DENSITY_SMOOTHING_SIGMA,
        saturation_count=config.DENSITY_SATURATION_COUNT,
        lat_range=config.DENSITY_LAT_RANGE,
        lon_range=config.DENSITY_LON_RANGE,
    )
    logging.info("Confidence mask shape: %s", confidence_mask.shape)
    logging.info("Confidence range: [%.3f, %.3f]",
                 float(confidence_mask.min()), float(confidence_mask.max()))

    # Quick visualization
    confidence_mask.plot(cmap='RdYlGn', vmin=0, vmax=1)
else:
    # Explain why the confidence mask is disabled
    if not config.USE_CONFIDENCE_MASK:
        logging.info("Station density confidence mask: DISABLED (use_confidence_mask: false in config.yml)")
        logging.info("  To enable: set 'use_confidence_mask: true' in the station_density section")
    elif not config.STATION_FILE:
        logging.info("Station density confidence mask: DISABLED (no station_file configured)")
    else:
        logging.info("Station density confidence mask: DISABLED (station file not found: %s)",
                     config.STATION_FILE)
    logging.info("Using uniform blend_alpha=%.2f everywhere", config.DL_BLEND_ALPHA)
2026-05-22 01:03:02,150 - INFO - Station density confidence mask: ENABLED
2026-05-22 01:03:02,152 - INFO - Station file: /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/bali_stations_location.csv
2026-05-22 01:03:02,400 - INFO - Loading existing confidence mask: /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/station_density/confidence_mask_station_density.nc4
2026-05-22 01:03:02,741 - INFO - Loaded confidence mask from /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/station_density/confidence_mask_station_density.nc4 (shape: (9, 14), range: [0.000, 0.411])
2026-05-22 01:03:02,742 - INFO - Confidence mask shape: (9, 14)
2026-05-22 01:03:02,743 - INFO - Confidence range: [0.000, 0.411]

Step 10: Apply DL Refinement and Save

Finally, we apply the trained DL model to refine extreme pixels in the LSEQM result. The DL prediction is alpha-blended with the LSEQM values (default: 70% LSEQM, 30% DL) to ensure the physical-statistical backbone dominates while DL provides spatial refinement for extremes.

from src.deep_learning import apply_deeplearning_model
from src.io import save_corrected_precip

logging.info("Applying DL refinement to LSEQM result...")

# Apply the trained DL model to refine extreme pixels
# If confidence_mask is available, alpha is spatially modulated by station density
corrected_precip = apply_deeplearning_model(model, lseqm_result,
                                            confidence_mask=confidence_mask)

# Ensure non-negative precipitation values
corrected_precip = corrected_precip.clip(min=0)

# Save DL-corrected precipitation
logging.info("Saving LSEQMDL corrected precipitation...")
save_corrected_precip(
    corrected_precip,
    lseqm_result,
    method_abbr="lseqmdl",
    method_full="Hybrid Deep Learning-Physical (Linear Scaling and Empirical Quantile Mapping) Approach",
    folder=config.lseqmdl_corrected_precip_path,
    dekad_str=dekad_str,
    month_str=month_str
)
logging.info("LSEQMDL bias correction completed successfully.")
print("Bias correction process finished. Please check the output directories for corrected datasets.")
2026-05-22 01:03:14,509 - INFO - Applying DL refinement to LSEQM result...
2026-05-22 01:03:14,529 - INFO - Pixel-wise threshold map computed at 80th percentile. threshold_2d shape: (9, 14)
2026-05-22 01:03:14,530 - INFO - DL blending: base alpha=0.70 (LSEQM weight), 1-alpha=0.30 (DL weight)
2026-05-22 01:03:14,533 - INFO - Confidence mask active: spatial alpha modulation enabled. Confidence range: [0.000, 0.411]
2026-05-22 01:03:42,503 - INFO - DL blending complete: 250 daily slices processed, 3,999 extreme pixels blended (alpha=0.70)
2026-05-22 01:03:42,695 - INFO - Saving LSEQMDL corrected precipitation...
2026-05-22 01:03:43,013 - INFO - File /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_lseqmdl/bali_cli_lseqmdl_corrected_imergl_month01_dekad01.nc4 already exists.
2026-05-22 01:03:43,014 - INFO - Skipping file /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_lseqmdl/bali_cli_lseqmdl_corrected_imergl_month01_dekad01.nc4
2026-05-22 01:03:43,015 - INFO - LSEQMDL bias correction completed successfully.
Bias correction process finished. Please check the output directories for corrected datasets.

After processing, we can preview a plot of the corrected precipitation data to visually verify the results.

# Preview final bias-corrected data
print("Corrected Precipitation Data Summary:")
print(corrected_precip)
corrected_precip.isel(time=0).plot(cmap='inferno')
Corrected Precipitation Data Summary:
<xarray.DataArray (time: 250, lat: 9, lon: 14)> Size: 126kB
array([[[        nan,         nan,         nan, ...,   4.9697576,
           6.3031607,         nan],
        [        nan,         nan,         nan, ...,   4.1157603,
           6.763117 ,         nan],
        [        nan,         nan,         nan, ...,   0.       ,
                 nan,         nan],
        ...,
        [  0.       ,   0.       ,   0.       , ...,   0.       ,
           0.       ,         nan],
        [  0.       ,   0.       ,   0.       , ...,   0.       ,
                 nan,         nan],
        [  0.       ,   0.       ,         nan, ...,         nan,
                 nan,         nan]],

       [[        nan,         nan,         nan, ...,   0.       ,
           0.       ,         nan],
        [        nan,         nan,         nan, ...,   0.       ,
           0.       ,         nan],
        [        nan,         nan,         nan, ...,   0.       ,
                 nan,         nan],
...
        [  0.       ,   1.4041167,   3.7144518, ...,  42.254105 ,
          22.975971 ,         nan],
        [  2.372005 ,   4.3901095,   2.8183875, ...,  47.278397 ,
                 nan,         nan],
        [  3.3177586,   8.725988 ,         nan, ...,         nan,
                 nan,         nan]],

       [[        nan,         nan,         nan, ...,  66.08467  ,
          42.960262 ,         nan],
        [        nan,         nan,         nan, ...,  37.168877 ,
          23.542604 ,         nan],
        [        nan,         nan,         nan, ...,  34.29889  ,
                 nan,         nan],
        ...,
        [  0.       ,   2.4137375,   2.4427636, ...,   3.3158958,
           0.       ,         nan],
        [  0.       ,   0.       ,   0.       , ...,   0.       ,
                 nan,         nan],
        [  0.       ,   0.       ,         nan, ...,         nan,
                 nan,         nan]]], dtype=float32)
Coordinates:
  * time     (time) datetime64[ns] 2kB 2001-01-01 2001-01-02 ... 2025-01-10
  * lat      (lat) float32 36B -8.85 -8.75 -8.65 -8.55 ... -8.25 -8.15 -8.05
  * lon      (lon) float32 56B 114.4 114.6 114.7 114.8 ... 115.6 115.7 115.8


Summary

This notebook produced bias-corrected precipitation outputs for the selected month and dekad using three correction stages:

  • LS (mean bias correction) saved to: config.ls_corrected_precip_path
  • LSEQM (LS + EQM + GPD tail adjustment) saved to: config.lseqm_corrected_precip_path
  • LSEQM+DL (hybrid refinement) saved to: config.lseqmdl_corrected_precip_path

If Deep Learning is enabled, the trained model is saved under: - config.trained_models_path (as a .keras file, named by month/dekad)

The corrected NetCDF outputs generated here are the inputs for Notebook 03 (Measuring Performances), which computes verification metrics to quantify improvements across methods.


Batch Run - All Months and Dekads

Run this cell to execute the full LSEQMDL bias correction pipeline (LS → LSEQM → DL train → DL apply → save) for every month×dekad combination (12 months × 3 dekads = 36 periods).

Existing DL models are reloaded silently without prompting. Periods that fail are skipped with a warning so the batch can continue.

Prerequisites - run these cells first (skip Steps 2 and 4–10):

Cell Purpose
Step 1 Environment setup, imports, config
Step 3 Load IMERG + CPC datasets (imerg_ds, cpc_ds)
Step 5 Align CPC to IMERG grid (cpc_ds_aligned)
"""
Batch run - full LSEQMDL pipeline for all 36 month×dekad periods.

Requires: imerg_ds, cpc_ds_aligned, cpc_ds_native (from Steps 3 + 5).
"""
from src.bias_correction import run_correction_pipeline

n_done = 0
n_skip = 0

for _m in range(1, 13):
    for _d in [1, 2, 3]:
        tag = f"month {_m:02d} dekad {_d}"
        print(f"\n{'='*60}")
        print(f"▸ {tag}")
        print(f"{'='*60}")
        try:
            out_path = run_correction_pipeline(
                imerg_ds, cpc_ds_aligned, _m, _d,
                cpc_native_ds=cpc_ds_native
            )
            n_done += 1
            print(f"✓ {tag} — saved: {out_path}")
        except Exception as e:
            n_skip += 1
            print(f"✗ {tag} — FAILED: {e}")

print(f"\n{'='*60}")
print(f"Batch complete: {n_done} periods done, {n_skip} skipped.")
print(f"{'='*60}")

============================================================
▸ month 01 dekad 1
============================================================
2026-05-20 06:43:09,754 - INFO - Pipeline [01 d1]: Running LSEQM...
2026-05-20 06:43:09,762 - INFO - Aligning IMERG and CPC datasets...
2026-05-20 06:43:09,793 - INFO - After alignment: IMERG has 9131 time steps, CPC has 9131 time steps
2026-05-20 06:43:09,793 - INFO - Creating time-based masks...
2026-05-20 06:43:09,804 - INFO - Applying time masks...
2026-05-20 06:43:09,828 - INFO - IMERG dekad data shape: (250, 9, 14)
2026-05-20 06:43:09,829 - INFO - CPC dekad data shape: (250, 9, 14)
2026-05-20 06:43:09,832 - INFO - Using native-resolution CPC parameter fitting (BCSD principle)...
2026-05-20 06:43:09,866 - INFO - CPC native dekad data: (250, 4, 6) (lat -9.25–-7.75, lon 113.75–116.25)
2026-05-20 06:43:13,338 - INFO -   Native CPC fitting: row 4/4 (100%) | 24 fitted, 0 skipped | elapsed 3s, ETA 0s
2026-05-20 06:43:13,339 - INFO - Fitted CPC params on native grid: 24/24 cells
2026-05-20 06:43:13,382 - INFO - Interpolated CPC params to IMERG grid: 126/126 valid pixels
2026-05-20 06:43:13,383 - INFO - Performing Linear Scaling (LS)...
2026-05-20 06:43:13,392 - INFO - LS using bilinearly interpolated CPC mean (smooth).
2026-05-20 06:43:13,394 - INFO - Saving LS corrected precipitation...
2026-05-20 06:43:13,396 - INFO - Precip data dims: ('time', 'lat', 'lon'), shape: (250, 9, 14)
2026-05-20 06:43:13,450 - INFO - Saved Linear Scaling corrected precipitation for month 01, dekad 01 at /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_ls/bali_cli_ls_corrected_imergl_month01_dekad01.nc4
2026-05-20 06:43:13,452 - INFO - Applying Empirical Quantile Mapping (EQM) on 9x14 grid...
2026-05-20 06:43:13,533 - INFO -   EQM progress: row 9/9 (100%) | 80 land pixels done | elapsed 0s, ETA 0s
2026-05-20 06:43:13,537 - INFO - EQM complete: 80/126 grid points corrected (46 masked/ocean pixels skipped)
2026-05-20 06:43:13,539 - INFO - Saving LSEQM corrected precipitation...
2026-05-20 06:43:13,541 - INFO - Precip data dims: ('time', 'lat', 'lon'), shape: (250, 9, 14)
2026-05-20 06:43:13,591 - INFO - Saved Linear Scaling and Empirical Quantile Mapping corrected precipitation for month 01, dekad 01 at /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_lseqm/bali_cli_lseqm_corrected_imergl_month01_dekad01.nc4
2026-05-20 06:43:13,593 - INFO - Pipeline [01 d1]: Training / loading DL model...
2026-05-20 06:43:13,595 - INFO - Checking if the model file exists at: /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/trained_models/bias_correction_model_month01_dekad01.keras

2026-05-20 06:43:13,733 - INFO - Model: "sequential"
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
┃ Layer (type)                    ┃ Output Shape           ┃       Param # ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│ conv2d (Conv2D)                 │ (None, 9, 14, 32)      │           320 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ max_pooling2d (MaxPooling2D)    │ (None, 4, 7, 32)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout (Dropout)               │ (None, 4, 7, 32)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ conv2d_1 (Conv2D)               │ (None, 4, 7, 64)       │        18,496 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ max_pooling2d_1 (MaxPooling2D)  │ (None, 2, 3, 64)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_1 (Dropout)             │ (None, 2, 3, 64)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ flatten (Flatten)               │ (None, 384)            │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dense (Dense)                   │ (None, 128)            │        49,280 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_2 (Dropout)             │ (None, 128)            │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dense_1 (Dense)                 │ (None, 126)            │        16,254 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ reshape (Reshape)               │ (None, 9, 14)          │             0 │
└─────────────────────────────────┴────────────────────────┴───────────────┘
 Total params: 84,350 (329.49 KB)
 Trainable params: 84,350 (329.49 KB)
 Non-trainable params: 0 (0.00 B)

Epoch 1/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 2s 109ms/step - loss: 0.2054 - mae: 0.3252 - val_loss: 0.1896 - val_mae: 0.3069
Epoch 2/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 41ms/step - loss: 0.1754 - mae: 0.2988 - val_loss: 0.1508 - val_mae: 0.2748
Epoch 3/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 54ms/step - loss: 0.1420 - mae: 0.2765 - val_loss: 0.0972 - val_mae: 0.2211
Epoch 4/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 43ms/step - loss: 0.1192 - mae: 0.2599 - val_loss: 0.0766 - val_mae: 0.1920
Epoch 5/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step - loss: 0.0992 - mae: 0.2366 - val_loss: 0.0801 - val_mae: 0.1948
Epoch 6/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 42ms/step - loss: 0.0904 - mae: 0.2240 - val_loss: 0.0747 - val_mae: 0.1895
Epoch 7/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 42ms/step - loss: 0.0812 - mae: 0.2144 - val_loss: 0.0575 - val_mae: 0.1678
Epoch 8/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 46ms/step - loss: 0.0761 - mae: 0.2119 - val_loss: 0.0551 - val_mae: 0.1632
Epoch 9/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step - loss: 0.0700 - mae: 0.2025 - val_loss: 0.0645 - val_mae: 0.1750
Epoch 10/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step - loss: 0.0703 - mae: 0.1984 - val_loss: 0.0651 - val_mae: 0.1755
Epoch 11/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 40ms/step - loss: 0.0664 - mae: 0.1942 - val_loss: 0.0496 - val_mae: 0.1549
Epoch 12/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 42ms/step - loss: 0.0661 - mae: 0.1968 - val_loss: 0.0473 - val_mae: 0.1509
Epoch 13/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step - loss: 0.0637 - mae: 0.1916 - val_loss: 0.0594 - val_mae: 0.1669
Epoch 14/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step - loss: 0.0660 - mae: 0.1906 - val_loss: 0.0679 - val_mae: 0.1775
Epoch 15/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step - loss: 0.0640 - mae: 0.1868 - val_loss: 0.0502 - val_mae: 0.1548
Epoch 16/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 40ms/step - loss: 0.0611 - mae: 0.1869 - val_loss: 0.0458 - val_mae: 0.1481
Epoch 17/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step - loss: 0.0588 - mae: 0.1834 - val_loss: 0.0522 - val_mae: 0.1570
Epoch 18/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step - loss: 0.0583 - mae: 0.1804 - val_loss: 0.0551 - val_mae: 0.1612
Epoch 19/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step - loss: 0.0567 - mae: 0.1777 - val_loss: 0.0488 - val_mae: 0.1530
Epoch 20/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step - loss: 0.0565 - mae: 0.1780 - val_loss: 0.0473 - val_mae: 0.1507
Epoch 21/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step - loss: 0.0577 - mae: 0.1802 - val_loss: 0.0456 - val_mae: 0.1479
Epoch 22/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 39ms/step - loss: 0.0561 - mae: 0.1773 - val_loss: 0.0454 - val_mae: 0.1477
Epoch 23/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step - loss: 0.0558 - mae: 0.1766 - val_loss: 0.0496 - val_mae: 0.1535
Epoch 24/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step - loss: 0.0556 - mae: 0.1753 - val_loss: 0.0540 - val_mae: 0.1589
Epoch 25/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step - loss: 0.0557 - mae: 0.1738 - val_loss: 0.0505 - val_mae: 0.1542
Epoch 26/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step - loss: 0.0533 - mae: 0.1705 - val_loss: 0.0456 - val_mae: 0.1475
Epoch 27/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 41ms/step - loss: 0.0536 - mae: 0.1727 - val_loss: 0.0446 - val_mae: 0.1458
Epoch 28/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step - loss: 0.0530 - mae: 0.1712 - val_loss: 0.0493 - val_mae: 0.1522
Epoch 29/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step - loss: 0.0527 - mae: 0.1687 - val_loss: 0.0491 - val_mae: 0.1517
Epoch 30/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 46ms/step - loss: 0.0522 - mae: 0.1688 - val_loss: 0.0439 - val_mae: 0.1439
Epoch 31/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step - loss: 0.0521 - mae: 0.1683 - val_loss: 0.0442 - val_mae: 0.1441
Epoch 32/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step - loss: 0.0504 - mae: 0.1654 - val_loss: 0.0462 - val_mae: 0.1470
Epoch 33/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step - loss: 0.0515 - mae: 0.1672 - val_loss: 0.0447 - val_mae: 0.1452
Epoch 34/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step - loss: 0.0507 - mae: 0.1657 - val_loss: 0.0458 - val_mae: 0.1467
Epoch 35/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step - loss: 0.0516 - mae: 0.1668 - val_loss: 0.0466 - val_mae: 0.1475
2026-05-20 06:43:20,550 - INFO - Final training history: {'loss': [0.20541471242904663, 0.1754322499036789, 0.1420200765132904, 0.11921518296003342, 0.09922513365745544, 0.0904005616903305, 0.08117583394050598, 0.07611152529716492, 0.06997907906770706, 0.07031281292438507, 0.06642446666955948, 0.06614454090595245, 0.06374429911375046, 0.06600525975227356, 0.06397747248411179, 0.06109028309583664, 0.05879795178771019, 0.05828377231955528, 0.05672439560294151, 0.056547120213508606, 0.057724133133888245, 0.056123003363609314, 0.05576472356915474, 0.05561840906739235, 0.055662449449300766, 0.05327320471405983, 0.05358465015888214, 0.052980922162532806, 0.05269564315676689, 0.052210643887519836, 0.05214922875165939, 0.050396326929330826, 0.0515163317322731, 0.05071359500288963, 0.05156546086072922], 'mae': [0.3252464532852173, 0.29877620935440063, 0.2765044867992401, 0.25992292165756226, 0.23657551407814026, 0.22396504878997803, 0.2143888622522354, 0.21186405420303345, 0.20247916877269745, 0.1984061598777771, 0.19416025280952454, 0.19682671129703522, 0.19155220687389374, 0.19056211411952972, 0.1868010014295578, 0.1869390457868576, 0.183397576212883, 0.18043601512908936, 0.17772668600082397, 0.17797434329986572, 0.18021774291992188, 0.1772594004869461, 0.17658396065235138, 0.1753319352865219, 0.17381495237350464, 0.17052185535430908, 0.17268098890781403, 0.17117196321487427, 0.16874665021896362, 0.16883201897144318, 0.16834045946598053, 0.16538892686367035, 0.16716548800468445, 0.165736123919487, 0.16681377589702606], 'val_loss': [0.18963250517845154, 0.1507822871208191, 0.09722372889518738, 0.07656259089708328, 0.08006451278924942, 0.07469813525676727, 0.05746929720044136, 0.0550961047410965, 0.06450812518596649, 0.06512390822172165, 0.049567241221666336, 0.04725818336009979, 0.0594380646944046, 0.06794053316116333, 0.05021851509809494, 0.04577766731381416, 0.05224074795842171, 0.05510983616113663, 0.048827387392520905, 0.047293439507484436, 0.0456155389547348, 0.045421380549669266, 0.049565982073545456, 0.053956061601638794, 0.050482045859098434, 0.045590583235025406, 0.0445837639272213, 0.049309711903333664, 0.04909268394112587, 0.043905388563871384, 0.04415978491306305, 0.04615490138530731, 0.044696107506752014, 0.045755695551633835, 0.04662426933646202], 'val_mae': [0.30691856145858765, 0.2747943103313446, 0.22107963263988495, 0.19202955067157745, 0.19477578997612, 0.18953385949134827, 0.16784782707691193, 0.16321533918380737, 0.17499805986881256, 0.17550130188465118, 0.15487879514694214, 0.1508832722902298, 0.16688407957553864, 0.1774904876947403, 0.15484797954559326, 0.1481449455022812, 0.15695154666900635, 0.16123582422733307, 0.15304194390773773, 0.15066052973270416, 0.14789794385433197, 0.14771689474582672, 0.15347667038440704, 0.15892885625362396, 0.1541765183210373, 0.14749406278133392, 0.14580382406711578, 0.15218815207481384, 0.1516532301902771, 0.1439480036497116, 0.14410603046417236, 0.14697393774986267, 0.14521515369415283, 0.14674320816993713, 0.1474968045949936]}
2026-05-20 06:43:20,688 - INFO - Model training complete. Best model saved as /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/trained_models/bias_correction_model_month01_dekad01.keras
2026-05-20 06:43:20,689 - INFO - Pipeline [01 d1]: Loading confidence mask...
2026-05-20 06:43:20,691 - INFO - Confidence mask not found, building from station data...
2026-05-20 06:43:20,691 - INFO - Building station density confidence mask...
2026-05-20 06:43:20,703 - INFO - Loaded 4 station locations from /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/bali_stations_location.csv
2026-05-20 06:43:20,704 - INFO - Station density: 4 stations in 3/6 cells (CPC 0.5° grid, max 2 stations/cell)
2026-05-20 06:43:20,706 - INFO - Confidence map: min=0.239, max=0.411, mean=0.333 (sigma=1.0, saturation=2)
2026-05-20 06:43:20,714 - INFO - Upscaled confidence mask: (2, 3) -> (9, 14)
2026-05-20 06:43:20,715 - INFO - Station density confidence mask built successfully.
2026-05-20 06:43:20,776 - INFO - Confidence mask saved to /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/station_density/confidence_mask_station_density.nc4
2026-05-20 06:43:20,778 - INFO - Pipeline [01 d1]: Applying DL refinement...
2026-05-20 06:43:20,794 - INFO - Pixel-wise threshold map computed at 80th percentile. threshold_2d shape: (9, 14)
2026-05-20 06:43:20,796 - INFO - DL blending: base alpha=0.70 (LSEQM weight), 1-alpha=0.30 (DL weight)
2026-05-20 06:43:20,798 - INFO - Confidence mask active: spatial alpha modulation enabled. Confidence range: [0.000, 0.411]
2026-05-20 06:43:37,287 - INFO - DL blending complete: 250 daily slices processed, 3,999 extreme pixels blended (alpha=0.70)
2026-05-20 06:43:37,405 - INFO - Precip data dims: ('time', 'lat', 'lon'), shape: (250, 9, 14)
2026-05-20 06:43:37,451 - INFO - Saved Hybrid Deep Learning-Physical (Linear Scaling and Empirical Quantile Mapping) Approach corrected precipitation for month 01, dekad 01 at /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_lseqmdl/bali_cli_lseqmdl_corrected_imergl_month01_dekad01.nc4
2026-05-20 06:43:37,452 - INFO - Pipeline [01 d1]: Complete.
✓ month 01 dekad 1 — saved: /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_lseqmdl/bali_cli_imergl_lseqmdl_corrected_precip_month01_dekad01.nc4

============================================================
▸ month 01 dekad 2
============================================================
2026-05-20 06:43:37,453 - INFO - Pipeline [01 d2]: Running LSEQM...
2026-05-20 06:43:37,458 - INFO - Aligning IMERG and CPC datasets...
2026-05-20 06:43:37,466 - INFO - After alignment: IMERG has 9131 time steps, CPC has 9131 time steps
2026-05-20 06:43:37,469 - INFO - Creating time-based masks...
2026-05-20 06:43:37,488 - INFO - Applying time masks...
2026-05-20 06:43:37,506 - INFO - IMERG dekad data shape: (250, 9, 14)
2026-05-20 06:43:37,508 - INFO - CPC dekad data shape: (250, 9, 14)
2026-05-20 06:43:37,511 - INFO - Using native-resolution CPC parameter fitting (BCSD principle)...
2026-05-20 06:43:37,541 - INFO - CPC native dekad data: (250, 4, 6) (lat -9.25–-7.75, lon 113.75–116.25)
2026-05-20 06:43:39,995 - INFO -   Native CPC fitting: row 4/4 (100%) | 24 fitted, 0 skipped | elapsed 2s, ETA 0s
2026-05-20 06:43:39,996 - INFO - Fitted CPC params on native grid: 24/24 cells
2026-05-20 06:43:40,035 - INFO - Interpolated CPC params to IMERG grid: 126/126 valid pixels
2026-05-20 06:43:40,036 - INFO - Performing Linear Scaling (LS)...
2026-05-20 06:43:40,044 - INFO - LS using bilinearly interpolated CPC mean (smooth).
2026-05-20 06:43:40,048 - INFO - Saving LS corrected precipitation...
2026-05-20 06:43:40,050 - INFO - Precip data dims: ('time', 'lat', 'lon'), shape: (250, 9, 14)
2026-05-20 06:43:40,094 - INFO - Saved Linear Scaling corrected precipitation for month 01, dekad 11 at /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_ls/bali_cli_ls_corrected_imergl_month01_dekad11.nc4
2026-05-20 06:43:40,096 - INFO - Applying Empirical Quantile Mapping (EQM) on 9x14 grid...
2026-05-20 06:43:40,175 - INFO -   EQM progress: row 9/9 (100%) | 80 land pixels done | elapsed 0s, ETA 0s
2026-05-20 06:43:40,178 - INFO - EQM complete: 80/126 grid points corrected (46 masked/ocean pixels skipped)
2026-05-20 06:43:40,179 - INFO - Saving LSEQM corrected precipitation...
2026-05-20 06:43:40,183 - INFO - Precip data dims: ('time', 'lat', 'lon'), shape: (250, 9, 14)
2026-05-20 06:43:40,232 - INFO - Saved Linear Scaling and Empirical Quantile Mapping corrected precipitation for month 01, dekad 11 at /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_lseqm/bali_cli_lseqm_corrected_imergl_month01_dekad11.nc4
2026-05-20 06:43:40,233 - INFO - Pipeline [01 d2]: Training / loading DL model...
2026-05-20 06:43:40,234 - INFO - Checking if the model file exists at: /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/trained_models/bias_correction_model_month01_dekad11.keras

2026-05-20 06:43:40,299 - INFO - Model: "sequential_1"
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
┃ Layer (type)                    ┃ Output Shape           ┃       Param # ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│ conv2d_2 (Conv2D)               │ (None, 9, 14, 32)      │           320 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ max_pooling2d_2 (MaxPooling2D)  │ (None, 4, 7, 32)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_3 (Dropout)             │ (None, 4, 7, 32)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ conv2d_3 (Conv2D)               │ (None, 4, 7, 64)       │        18,496 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ max_pooling2d_3 (MaxPooling2D)  │ (None, 2, 3, 64)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_4 (Dropout)             │ (None, 2, 3, 64)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ flatten_1 (Flatten)             │ (None, 384)            │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dense_2 (Dense)                 │ (None, 128)            │        49,280 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_5 (Dropout)             │ (None, 128)            │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dense_3 (Dense)                 │ (None, 126)            │        16,254 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ reshape_1 (Reshape)             │ (None, 9, 14)          │             0 │
└─────────────────────────────────┴────────────────────────┴───────────────┘
 Total params: 84,350 (329.49 KB)
 Trainable params: 84,350 (329.49 KB)
 Non-trainable params: 0 (0.00 B)

Epoch 1/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 2s 96ms/step - loss: 0.2077 - mae: 0.3243 - val_loss: 0.2216 - val_mae: 0.3343
Epoch 2/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 39ms/step - loss: 0.1805 - mae: 0.3012 - val_loss: 0.1822 - val_mae: 0.3037
Epoch 3/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 39ms/step - loss: 0.1451 - mae: 0.2760 - val_loss: 0.1167 - val_mae: 0.2416
Epoch 4/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 41ms/step - loss: 0.1158 - mae: 0.2557 - val_loss: 0.0855 - val_mae: 0.2048
Epoch 5/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step - loss: 0.0970 - mae: 0.2367 - val_loss: 0.0870 - val_mae: 0.2038
Epoch 6/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 45ms/step - loss: 0.0887 - mae: 0.2226 - val_loss: 0.0846 - val_mae: 0.2014
Epoch 7/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 39ms/step - loss: 0.0783 - mae: 0.2102 - val_loss: 0.0638 - val_mae: 0.1744
Epoch 8/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 42ms/step - loss: 0.0752 - mae: 0.2104 - val_loss: 0.0586 - val_mae: 0.1665
Epoch 9/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step - loss: 0.0683 - mae: 0.1999 - val_loss: 0.0684 - val_mae: 0.1797
Epoch 10/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step - loss: 0.0696 - mae: 0.1983 - val_loss: 0.0691 - val_mae: 0.1809
Epoch 11/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 39ms/step - loss: 0.0645 - mae: 0.1911 - val_loss: 0.0576 - val_mae: 0.1652
Epoch 12/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 39ms/step - loss: 0.0651 - mae: 0.1936 - val_loss: 0.0541 - val_mae: 0.1593
Epoch 13/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step - loss: 0.0606 - mae: 0.1860 - val_loss: 0.0631 - val_mae: 0.1704
Epoch 14/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step - loss: 0.0609 - mae: 0.1835 - val_loss: 0.0625 - val_mae: 0.1693
Epoch 15/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 40ms/step - loss: 0.0578 - mae: 0.1796 - val_loss: 0.0527 - val_mae: 0.1564
Epoch 16/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step - loss: 0.0596 - mae: 0.1837 - val_loss: 0.0548 - val_mae: 0.1587
Epoch 17/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 34ms/step - loss: 0.0573 - mae: 0.1784 - val_loss: 0.0654 - val_mae: 0.1732
Epoch 18/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step - loss: 0.0588 - mae: 0.1786 - val_loss: 0.0633 - val_mae: 0.1707
Epoch 19/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 43ms/step - loss: 0.0546 - mae: 0.1732 - val_loss: 0.0504 - val_mae: 0.1530
Epoch 20/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step - loss: 0.0559 - mae: 0.1765 - val_loss: 0.0510 - val_mae: 0.1536
Epoch 21/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step - loss: 0.0533 - mae: 0.1725 - val_loss: 0.0548 - val_mae: 0.1586
Epoch 22/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step - loss: 0.0519 - mae: 0.1688 - val_loss: 0.0530 - val_mae: 0.1560
Epoch 23/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step - loss: 0.0534 - mae: 0.1718 - val_loss: 0.0520 - val_mae: 0.1549
Epoch 24/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step - loss: 0.0531 - mae: 0.1703 - val_loss: 0.0550 - val_mae: 0.1589
2026-05-20 06:43:45,045 - INFO - Final training history: {'loss': [0.20767086744308472, 0.18045872449874878, 0.1450509876012802, 0.11577501893043518, 0.09696760028600693, 0.08874978125095367, 0.07830332219600677, 0.0752486065030098, 0.06829970329999924, 0.06964866816997528, 0.06447114795446396, 0.0650608167052269, 0.06059270352125168, 0.060907721519470215, 0.05777352675795555, 0.05956503003835678, 0.05725450441241264, 0.05882851034402847, 0.05462026968598366, 0.05585967376828194, 0.05332161486148834, 0.05190259590744972, 0.05344659462571144, 0.053073544055223465], 'mae': [0.3243464529514313, 0.3011680543422699, 0.2759525775909424, 0.2557245194911957, 0.23674197494983673, 0.22260595858097076, 0.21023383736610413, 0.21039415895938873, 0.19994689524173737, 0.19833238422870636, 0.1911163479089737, 0.1935872882604599, 0.18604308366775513, 0.1834629476070404, 0.17960390448570251, 0.18369513750076294, 0.17840875685214996, 0.17855098843574524, 0.1731850802898407, 0.17654985189437866, 0.17252914607524872, 0.1687634438276291, 0.17175941169261932, 0.17030872404575348], 'val_loss': [0.2216373234987259, 0.1821543574333191, 0.1167132556438446, 0.08547603338956833, 0.086954265832901, 0.08458301424980164, 0.06375929713249207, 0.05855024978518486, 0.06840195506811142, 0.06906881183385849, 0.05755932629108429, 0.05414682254195213, 0.06309406459331512, 0.06247938796877861, 0.052663568407297134, 0.054751135408878326, 0.06539894640445709, 0.06327580660581589, 0.0504007562994957, 0.051033906638622284, 0.05484559386968613, 0.05296917259693146, 0.052003584802150726, 0.054950326681137085], 'val_mae': [0.33429571986198425, 0.3036576509475708, 0.24158203601837158, 0.20476679503917694, 0.20380695164203644, 0.20139655470848083, 0.17436014115810394, 0.16650846600532532, 0.17966078221797943, 0.18091319501399994, 0.16518442332744598, 0.15934224426746368, 0.17041106522083282, 0.16930840909481049, 0.15639349818229675, 0.1587497740983963, 0.173166885972023, 0.17072153091430664, 0.15300416946411133, 0.15356697142124176, 0.15859322249889374, 0.15603524446487427, 0.15491357445716858, 0.158869206905365]}
2026-05-20 06:43:45,204 - INFO - Model training complete. Best model saved as /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/trained_models/bias_correction_model_month01_dekad11.keras
2026-05-20 06:43:45,206 - INFO - Pipeline [01 d2]: Loading confidence mask...
2026-05-20 06:43:45,207 - INFO - Loading existing confidence mask: /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/station_density/confidence_mask_station_density.nc4
2026-05-20 06:43:45,746 - INFO - Loaded confidence mask from /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/station_density/confidence_mask_station_density.nc4 (shape: (9, 14), range: [0.000, 0.411])
2026-05-20 06:43:45,748 - INFO - Pipeline [01 d2]: Applying DL refinement...
2026-05-20 06:43:45,765 - INFO - Pixel-wise threshold map computed at 80th percentile. threshold_2d shape: (9, 14)
2026-05-20 06:43:45,766 - INFO - DL blending: base alpha=0.70 (LSEQM weight), 1-alpha=0.30 (DL weight)
2026-05-20 06:43:45,768 - INFO - Confidence mask active: spatial alpha modulation enabled. Confidence range: [0.000, 0.411]
2026-05-20 06:44:02,228 - INFO - DL blending complete: 250 daily slices processed, 3,999 extreme pixels blended (alpha=0.70)
2026-05-20 06:44:02,370 - INFO - Precip data dims: ('time', 'lat', 'lon'), shape: (250, 9, 14)
2026-05-20 06:44:02,411 - INFO - Saved Hybrid Deep Learning-Physical (Linear Scaling and Empirical Quantile Mapping) Approach corrected precipitation for month 01, dekad 11 at /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_lseqmdl/bali_cli_lseqmdl_corrected_imergl_month01_dekad11.nc4
2026-05-20 06:44:02,413 - INFO - Pipeline [01 d2]: Complete.
✓ month 01 dekad 2 — saved: /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_lseqmdl/bali_cli_imergl_lseqmdl_corrected_precip_month01_dekad11.nc4

============================================================
▸ month 01 dekad 3
============================================================
2026-05-20 06:44:02,417 - INFO - Pipeline [01 d3]: Running LSEQM...
2026-05-20 06:44:02,422 - INFO - Aligning IMERG and CPC datasets...
2026-05-20 06:44:02,438 - INFO - After alignment: IMERG has 9131 time steps, CPC has 9131 time steps
2026-05-20 06:44:02,441 - INFO - Creating time-based masks...
2026-05-20 06:44:02,457 - INFO - Applying time masks...
2026-05-20 06:44:02,476 - INFO - IMERG dekad data shape: (275, 9, 14)
2026-05-20 06:44:02,477 - INFO - CPC dekad data shape: (275, 9, 14)
2026-05-20 06:44:02,482 - INFO - Using native-resolution CPC parameter fitting (BCSD principle)...
2026-05-20 06:44:02,515 - INFO - CPC native dekad data: (275, 4, 6) (lat -9.25–-7.75, lon 113.75–116.25)
2026-05-20 06:44:05,015 - INFO -   Native CPC fitting: row 4/4 (100%) | 24 fitted, 0 skipped | elapsed 2s, ETA 0s
2026-05-20 06:44:05,016 - INFO - Fitted CPC params on native grid: 24/24 cells
2026-05-20 06:44:05,055 - INFO - Interpolated CPC params to IMERG grid: 126/126 valid pixels
2026-05-20 06:44:05,056 - INFO - Performing Linear Scaling (LS)...
2026-05-20 06:44:05,065 - INFO - LS using bilinearly interpolated CPC mean (smooth).
2026-05-20 06:44:05,067 - INFO - Saving LS corrected precipitation...
2026-05-20 06:44:05,070 - INFO - Precip data dims: ('time', 'lat', 'lon'), shape: (275, 9, 14)
2026-05-20 06:44:05,114 - INFO - Saved Linear Scaling corrected precipitation for month 01, dekad 21 at /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_ls/bali_cli_ls_corrected_imergl_month01_dekad21.nc4
2026-05-20 06:44:05,115 - INFO - Applying Empirical Quantile Mapping (EQM) on 9x14 grid...
2026-05-20 06:44:05,200 - INFO -   EQM progress: row 9/9 (100%) | 80 land pixels done | elapsed 0s, ETA 0s
2026-05-20 06:44:05,203 - INFO - EQM complete: 80/126 grid points corrected (46 masked/ocean pixels skipped)
2026-05-20 06:44:05,204 - INFO - Saving LSEQM corrected precipitation...
2026-05-20 06:44:05,206 - INFO - Precip data dims: ('time', 'lat', 'lon'), shape: (275, 9, 14)
2026-05-20 06:44:05,251 - INFO - Saved Linear Scaling and Empirical Quantile Mapping corrected precipitation for month 01, dekad 21 at /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_lseqm/bali_cli_lseqm_corrected_imergl_month01_dekad21.nc4
2026-05-20 06:44:05,253 - INFO - Pipeline [01 d3]: Training / loading DL model...
2026-05-20 06:44:05,254 - INFO - Checking if the model file exists at: /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/trained_models/bias_correction_model_month01_dekad21.keras

2026-05-20 06:44:05,322 - INFO - Model: "sequential_2"
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
┃ Layer (type)                    ┃ Output Shape           ┃       Param # ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│ conv2d_4 (Conv2D)               │ (None, 9, 14, 32)      │           320 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ max_pooling2d_4 (MaxPooling2D)  │ (None, 4, 7, 32)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_6 (Dropout)             │ (None, 4, 7, 32)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ conv2d_5 (Conv2D)               │ (None, 4, 7, 64)       │        18,496 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ max_pooling2d_5 (MaxPooling2D)  │ (None, 2, 3, 64)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_7 (Dropout)             │ (None, 2, 3, 64)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ flatten_2 (Flatten)             │ (None, 384)            │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dense_4 (Dense)                 │ (None, 128)            │        49,280 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_8 (Dropout)             │ (None, 128)            │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dense_5 (Dense)                 │ (None, 126)            │        16,254 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ reshape_2 (Reshape)             │ (None, 9, 14)          │             0 │
└─────────────────────────────────┴────────────────────────┴───────────────┘
 Total params: 84,350 (329.49 KB)
 Trainable params: 84,350 (329.49 KB)
 Non-trainable params: 0 (0.00 B)

Epoch 1/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 2s 101ms/step - loss: 0.2031 - mae: 0.3292 - val_loss: 0.1773 - val_mae: 0.2997
Epoch 2/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 43ms/step - loss: 0.1562 - mae: 0.2919 - val_loss: 0.1163 - val_mae: 0.2450
Epoch 3/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 49ms/step - loss: 0.1307 - mae: 0.2743 - val_loss: 0.0928 - val_mae: 0.2148
Epoch 4/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 41ms/step - loss: 0.1088 - mae: 0.2491 - val_loss: 0.0926 - val_mae: 0.2132
Epoch 5/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 45ms/step - loss: 0.0947 - mae: 0.2327 - val_loss: 0.0737 - val_mae: 0.1914
Epoch 6/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 45ms/step - loss: 0.0831 - mae: 0.2217 - val_loss: 0.0670 - val_mae: 0.1827
Epoch 7/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step - loss: 0.0775 - mae: 0.2145 - val_loss: 0.0700 - val_mae: 0.1878
Epoch 8/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step - loss: 0.0716 - mae: 0.2055 - val_loss: 0.0686 - val_mae: 0.1861
Epoch 9/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 45ms/step - loss: 0.0694 - mae: 0.2015 - val_loss: 0.0666 - val_mae: 0.1828
Epoch 10/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 45ms/step - loss: 0.0649 - mae: 0.1957 - val_loss: 0.0598 - val_mae: 0.1730
Epoch 11/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 44ms/step - loss: 0.0641 - mae: 0.1941 - val_loss: 0.0585 - val_mae: 0.1706
Epoch 12/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step - loss: 0.0604 - mae: 0.1867 - val_loss: 0.0599 - val_mae: 0.1722
Epoch 13/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 42ms/step - loss: 0.0604 - mae: 0.1872 - val_loss: 0.0556 - val_mae: 0.1658
Epoch 14/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step - loss: 0.0582 - mae: 0.1827 - val_loss: 0.0560 - val_mae: 0.1663
Epoch 15/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step - loss: 0.0581 - mae: 0.1801 - val_loss: 0.0597 - val_mae: 0.1713
Epoch 16/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 44ms/step - loss: 0.0563 - mae: 0.1786 - val_loss: 0.0503 - val_mae: 0.1574
Epoch 17/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step - loss: 0.0551 - mae: 0.1771 - val_loss: 0.0542 - val_mae: 0.1633
Epoch 18/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step - loss: 0.0554 - mae: 0.1765 - val_loss: 0.0516 - val_mae: 0.1591
Epoch 19/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step - loss: 0.0546 - mae: 0.1746 - val_loss: 0.0510 - val_mae: 0.1581
Epoch 20/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step - loss: 0.0537 - mae: 0.1733 - val_loss: 0.0511 - val_mae: 0.1583
Epoch 21/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step - loss: 0.0534 - mae: 0.1714 - val_loss: 0.0525 - val_mae: 0.1606
2026-05-20 06:44:10,033 - INFO - Final training history: {'loss': [0.20308782160282135, 0.15620145201683044, 0.13070771098136902, 0.10880111157894135, 0.094716377556324, 0.08307013660669327, 0.07754601538181305, 0.07164481282234192, 0.06943210959434509, 0.06493032723665237, 0.06407537311315536, 0.06037707254290581, 0.06043918803334236, 0.05817326158285141, 0.05809958651661873, 0.056274596601724625, 0.05509977415204048, 0.055397406220436096, 0.0545777902007103, 0.05367562174797058, 0.05340550094842911], 'mae': [0.3291586935520172, 0.2919415533542633, 0.2742677330970764, 0.24910393357276917, 0.2326553910970688, 0.22174835205078125, 0.21446503698825836, 0.20547913014888763, 0.2015177309513092, 0.1957298219203949, 0.19407248497009277, 0.18672092258930206, 0.18720294535160065, 0.18272656202316284, 0.18012239038944244, 0.17860625684261322, 0.17714005708694458, 0.17649713158607483, 0.17459401488304138, 0.17332904040813446, 0.17135991156101227], 'val_loss': [0.17734308540821075, 0.1162656769156456, 0.09278219938278198, 0.09264571219682693, 0.07370201498270035, 0.06695155054330826, 0.06997953355312347, 0.0686386376619339, 0.06655775010585785, 0.059843502938747406, 0.058455754071474075, 0.059916336089372635, 0.05556359887123108, 0.056043840944767, 0.05965633690357208, 0.05033942684531212, 0.05424860864877701, 0.05160541087388992, 0.05097566172480583, 0.0511496365070343, 0.052493561059236526], 'val_mae': [0.2996959686279297, 0.24504882097244263, 0.21479792892932892, 0.21317322552204132, 0.1914076954126358, 0.18270330131053925, 0.18779592216014862, 0.18614886701107025, 0.1827651560306549, 0.17299506068229675, 0.17057952284812927, 0.17221589386463165, 0.1657562106847763, 0.16630299389362335, 0.17132316529750824, 0.15742506086826324, 0.1632954478263855, 0.15914182364940643, 0.15807445347309113, 0.15828336775302887, 0.16059334576129913]}
2026-05-20 06:44:10,178 - INFO - Model training complete. Best model saved as /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/trained_models/bias_correction_model_month01_dekad21.keras
2026-05-20 06:44:10,180 - INFO - Pipeline [01 d3]: Loading confidence mask...
2026-05-20 06:44:10,185 - INFO - Loading existing confidence mask: /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/station_density/confidence_mask_station_density.nc4
2026-05-20 06:44:10,186 - INFO - Pipeline [01 d3]: Applying DL refinement...
2026-05-20 06:44:10,200 - INFO - Pixel-wise threshold map computed at 80th percentile. threshold_2d shape: (9, 14)
2026-05-20 06:44:10,201 - INFO - DL blending: base alpha=0.70 (LSEQM weight), 1-alpha=0.30 (DL weight)
2026-05-20 06:44:10,204 - INFO - Confidence mask active: spatial alpha modulation enabled. Confidence range: [0.000, 0.411]
2026-05-20 06:44:29,515 - INFO - DL blending complete: 275 daily slices processed, 4,400 extreme pixels blended (alpha=0.70)
2026-05-20 06:44:29,607 - INFO - Precip data dims: ('time', 'lat', 'lon'), shape: (275, 9, 14)
2026-05-20 06:44:29,679 - INFO - Saved Hybrid Deep Learning-Physical (Linear Scaling and Empirical Quantile Mapping) Approach corrected precipitation for month 01, dekad 21 at /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_lseqmdl/bali_cli_lseqmdl_corrected_imergl_month01_dekad21.nc4
2026-05-20 06:44:29,681 - INFO - Pipeline [01 d3]: Complete.
✓ month 01 dekad 3 — saved: /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_lseqmdl/bali_cli_imergl_lseqmdl_corrected_precip_month01_dekad21.nc4

============================================================
▸ month 02 dekad 1
============================================================
2026-05-20 06:44:29,683 - INFO - Pipeline [02 d1]: Running LSEQM...
2026-05-20 06:44:29,688 - INFO - Aligning IMERG and CPC datasets...
2026-05-20 06:44:29,707 - INFO - After alignment: IMERG has 9131 time steps, CPC has 9131 time steps
2026-05-20 06:44:29,708 - INFO - Creating time-based masks...
2026-05-20 06:44:29,720 - INFO - Applying time masks...
2026-05-20 06:44:29,736 - INFO - IMERG dekad data shape: (250, 9, 14)
2026-05-20 06:44:29,737 - INFO - CPC dekad data shape: (250, 9, 14)
2026-05-20 06:44:29,742 - INFO - Using native-resolution CPC parameter fitting (BCSD principle)...
2026-05-20 06:44:29,767 - INFO - CPC native dekad data: (250, 4, 6) (lat -9.25–-7.75, lon 113.75–116.25)
2026-05-20 06:44:32,030 - INFO -   Native CPC fitting: row 4/4 (100%) | 24 fitted, 0 skipped | elapsed 2s, ETA 0s
2026-05-20 06:44:32,031 - INFO - Fitted CPC params on native grid: 24/24 cells
2026-05-20 06:44:32,074 - INFO - Interpolated CPC params to IMERG grid: 126/126 valid pixels
2026-05-20 06:44:32,075 - INFO - Performing Linear Scaling (LS)...
2026-05-20 06:44:32,084 - INFO - LS using bilinearly interpolated CPC mean (smooth).
2026-05-20 06:44:32,087 - INFO - Saving LS corrected precipitation...
2026-05-20 06:44:32,090 - INFO - Precip data dims: ('time', 'lat', 'lon'), shape: (250, 9, 14)
2026-05-20 06:44:32,139 - INFO - Saved Linear Scaling corrected precipitation for month 02, dekad 01 at /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_ls/bali_cli_ls_corrected_imergl_month02_dekad01.nc4
2026-05-20 06:44:32,140 - INFO - Applying Empirical Quantile Mapping (EQM) on 9x14 grid...
2026-05-20 06:44:32,222 - INFO -   EQM progress: row 9/9 (100%) | 80 land pixels done | elapsed 0s, ETA 0s
2026-05-20 06:44:32,225 - INFO - EQM complete: 80/126 grid points corrected (46 masked/ocean pixels skipped)
2026-05-20 06:44:32,227 - INFO - Saving LSEQM corrected precipitation...
2026-05-20 06:44:32,230 - INFO - Precip data dims: ('time', 'lat', 'lon'), shape: (250, 9, 14)
2026-05-20 06:44:32,273 - INFO - Saved Linear Scaling and Empirical Quantile Mapping corrected precipitation for month 02, dekad 01 at /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_lseqm/bali_cli_lseqm_corrected_imergl_month02_dekad01.nc4
2026-05-20 06:44:32,274 - INFO - Pipeline [02 d1]: Training / loading DL model...
2026-05-20 06:44:32,276 - INFO - Checking if the model file exists at: /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/trained_models/bias_correction_model_month02_dekad01.keras

2026-05-20 06:44:32,339 - INFO - Model: "sequential_3"
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
┃ Layer (type)                    ┃ Output Shape           ┃       Param # ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│ conv2d_6 (Conv2D)               │ (None, 9, 14, 32)      │           320 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ max_pooling2d_6 (MaxPooling2D)  │ (None, 4, 7, 32)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_9 (Dropout)             │ (None, 4, 7, 32)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ conv2d_7 (Conv2D)               │ (None, 4, 7, 64)       │        18,496 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ max_pooling2d_7 (MaxPooling2D)  │ (None, 2, 3, 64)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_10 (Dropout)            │ (None, 2, 3, 64)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ flatten_3 (Flatten)             │ (None, 384)            │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dense_6 (Dense)                 │ (None, 128)            │        49,280 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_11 (Dropout)            │ (None, 128)            │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dense_7 (Dense)                 │ (None, 126)            │        16,254 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ reshape_3 (Reshape)             │ (None, 9, 14)          │             0 │
└─────────────────────────────────┴────────────────────────┴───────────────┘
 Total params: 84,350 (329.49 KB)
 Trainable params: 84,350 (329.49 KB)
 Non-trainable params: 0 (0.00 B)

Epoch 1/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 1s 92ms/step - loss: 0.2135 - mae: 0.3382 - val_loss: 0.2026 - val_mae: 0.3245
Epoch 2/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 41ms/step - loss: 0.1735 - mae: 0.3055 - val_loss: 0.1509 - val_mae: 0.2838
Epoch 3/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 45ms/step - loss: 0.1401 - mae: 0.2825 - val_loss: 0.1036 - val_mae: 0.2351
Epoch 4/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 43ms/step - loss: 0.1202 - mae: 0.2650 - val_loss: 0.0934 - val_mae: 0.2179
Epoch 5/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 47ms/step - loss: 0.1002 - mae: 0.2402 - val_loss: 0.0892 - val_mae: 0.2111
Epoch 6/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 41ms/step - loss: 0.0880 - mae: 0.2254 - val_loss: 0.0725 - val_mae: 0.1913
Epoch 7/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 45ms/step - loss: 0.0808 - mae: 0.2184 - val_loss: 0.0616 - val_mae: 0.1763
Epoch 8/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step - loss: 0.0757 - mae: 0.2114 - val_loss: 0.0746 - val_mae: 0.1912
Epoch 9/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step - loss: 0.0734 - mae: 0.2053 - val_loss: 0.0728 - val_mae: 0.1887
Epoch 10/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 43ms/step - loss: 0.0696 - mae: 0.2014 - val_loss: 0.0600 - val_mae: 0.1724
Epoch 11/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 46ms/step - loss: 0.0696 - mae: 0.2016 - val_loss: 0.0545 - val_mae: 0.1633
Epoch 12/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step - loss: 0.0650 - mae: 0.1950 - val_loss: 0.0596 - val_mae: 0.1698
Epoch 13/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step - loss: 0.0618 - mae: 0.1897 - val_loss: 0.0660 - val_mae: 0.1787
Epoch 14/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step - loss: 0.0628 - mae: 0.1889 - val_loss: 0.0582 - val_mae: 0.1688
Epoch 15/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step - loss: 0.0610 - mae: 0.1878 - val_loss: 0.0593 - val_mae: 0.1689
Epoch 16/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step - loss: 0.0603 - mae: 0.1844 - val_loss: 0.0624 - val_mae: 0.1725
2026-05-20 06:44:36,128 - INFO - Final training history: {'loss': [0.21354831755161285, 0.17349596321582794, 0.14014247059822083, 0.12023284286260605, 0.10020788013935089, 0.08801314979791641, 0.08079531788825989, 0.0756792277097702, 0.07335935533046722, 0.0696042850613594, 0.06962169706821442, 0.06498753279447556, 0.06180281192064285, 0.06279342621564865, 0.060997847467660904, 0.06030552461743355], 'mae': [0.3382287621498108, 0.3054918944835663, 0.282470703125, 0.26499703526496887, 0.24015909433364868, 0.22543779015541077, 0.2183951735496521, 0.21139270067214966, 0.2053055614233017, 0.20136885344982147, 0.2016371488571167, 0.19496563076972961, 0.18969713151454926, 0.1888928860425949, 0.1877540647983551, 0.18438327312469482], 'val_loss': [0.20260170102119446, 0.15089011192321777, 0.10364017635583878, 0.09337744116783142, 0.08917540311813354, 0.07253894954919815, 0.061626411974430084, 0.07464388757944107, 0.07278508692979813, 0.05998211354017258, 0.05448383465409279, 0.05960274115204811, 0.06602084636688232, 0.05823378264904022, 0.05928121507167816, 0.06240106746554375], 'val_mae': [0.32445797324180603, 0.2837862968444824, 0.23509134352207184, 0.2179330438375473, 0.21114669740200043, 0.19128113985061646, 0.1763399839401245, 0.19121074676513672, 0.1887337863445282, 0.172370046377182, 0.16327837109565735, 0.16983062028884888, 0.17870882153511047, 0.1688223034143448, 0.1689072549343109, 0.1724947690963745]}
2026-05-20 06:44:36,274 - INFO - Model training complete. Best model saved as /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/trained_models/bias_correction_model_month02_dekad01.keras
2026-05-20 06:44:36,279 - INFO - Pipeline [02 d1]: Loading confidence mask...
2026-05-20 06:44:36,280 - INFO - Loading existing confidence mask: /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/station_density/confidence_mask_station_density.nc4
2026-05-20 06:44:36,281 - INFO - Pipeline [02 d1]: Applying DL refinement...
2026-05-20 06:44:36,299 - INFO - Pixel-wise threshold map computed at 80th percentile. threshold_2d shape: (9, 14)
2026-05-20 06:44:36,300 - INFO - DL blending: base alpha=0.70 (LSEQM weight), 1-alpha=0.30 (DL weight)
2026-05-20 06:44:36,301 - INFO - Confidence mask active: spatial alpha modulation enabled. Confidence range: [0.000, 0.411]
2026-05-20 06:44:53,566 - INFO - DL blending complete: 250 daily slices processed, 4,000 extreme pixels blended (alpha=0.70)
2026-05-20 06:44:53,653 - INFO - Precip data dims: ('time', 'lat', 'lon'), shape: (250, 9, 14)
2026-05-20 06:44:53,697 - INFO - Saved Hybrid Deep Learning-Physical (Linear Scaling and Empirical Quantile Mapping) Approach corrected precipitation for month 02, dekad 01 at /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_lseqmdl/bali_cli_lseqmdl_corrected_imergl_month02_dekad01.nc4
2026-05-20 06:44:53,699 - INFO - Pipeline [02 d1]: Complete.
✓ month 02 dekad 1 — saved: /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_lseqmdl/bali_cli_imergl_lseqmdl_corrected_precip_month02_dekad01.nc4

============================================================
▸ month 02 dekad 2
============================================================
2026-05-20 06:44:53,701 - INFO - Pipeline [02 d2]: Running LSEQM...
2026-05-20 06:44:53,707 - INFO - Aligning IMERG and CPC datasets...
2026-05-20 06:44:53,714 - INFO - After alignment: IMERG has 9131 time steps, CPC has 9131 time steps
2026-05-20 06:44:53,715 - INFO - Creating time-based masks...
2026-05-20 06:44:53,727 - INFO - Applying time masks...
2026-05-20 06:44:53,737 - INFO - IMERG dekad data shape: (250, 9, 14)
2026-05-20 06:44:53,738 - INFO - CPC dekad data shape: (250, 9, 14)
2026-05-20 06:44:53,742 - INFO - Using native-resolution CPC parameter fitting (BCSD principle)...
2026-05-20 06:44:53,766 - INFO - CPC native dekad data: (250, 4, 6) (lat -9.25–-7.75, lon 113.75–116.25)
2026-05-20 06:44:56,016 - INFO -   Native CPC fitting: row 4/4 (100%) | 24 fitted, 0 skipped | elapsed 2s, ETA 0s
2026-05-20 06:44:56,017 - INFO - Fitted CPC params on native grid: 24/24 cells
2026-05-20 06:44:56,060 - INFO - Interpolated CPC params to IMERG grid: 126/126 valid pixels
2026-05-20 06:44:56,060 - INFO - Performing Linear Scaling (LS)...
2026-05-20 06:44:56,070 - INFO - LS using bilinearly interpolated CPC mean (smooth).
2026-05-20 06:44:56,073 - INFO - Saving LS corrected precipitation...
2026-05-20 06:44:56,078 - INFO - Precip data dims: ('time', 'lat', 'lon'), shape: (250, 9, 14)
2026-05-20 06:44:56,130 - INFO - Saved Linear Scaling corrected precipitation for month 02, dekad 11 at /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_ls/bali_cli_ls_corrected_imergl_month02_dekad11.nc4
2026-05-20 06:44:56,132 - INFO - Applying Empirical Quantile Mapping (EQM) on 9x14 grid...
2026-05-20 06:44:56,222 - INFO -   EQM progress: row 9/9 (100%) | 80 land pixels done | elapsed 0s, ETA 0s
2026-05-20 06:44:56,226 - INFO - EQM complete: 80/126 grid points corrected (46 masked/ocean pixels skipped)
2026-05-20 06:44:56,228 - INFO - Saving LSEQM corrected precipitation...
2026-05-20 06:44:56,230 - INFO - Precip data dims: ('time', 'lat', 'lon'), shape: (250, 9, 14)
2026-05-20 06:44:56,283 - INFO - Saved Linear Scaling and Empirical Quantile Mapping corrected precipitation for month 02, dekad 11 at /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_lseqm/bali_cli_lseqm_corrected_imergl_month02_dekad11.nc4
2026-05-20 06:44:56,284 - INFO - Pipeline [02 d2]: Training / loading DL model...
2026-05-20 06:44:56,285 - INFO - Checking if the model file exists at: /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/trained_models/bias_correction_model_month02_dekad11.keras

2026-05-20 06:44:56,352 - INFO - Model: "sequential_4"
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
┃ Layer (type)                    ┃ Output Shape           ┃       Param # ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│ conv2d_8 (Conv2D)               │ (None, 9, 14, 32)      │           320 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ max_pooling2d_8 (MaxPooling2D)  │ (None, 4, 7, 32)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_12 (Dropout)            │ (None, 4, 7, 32)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ conv2d_9 (Conv2D)               │ (None, 4, 7, 64)       │        18,496 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ max_pooling2d_9 (MaxPooling2D)  │ (None, 2, 3, 64)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_13 (Dropout)            │ (None, 2, 3, 64)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ flatten_4 (Flatten)             │ (None, 384)            │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dense_8 (Dense)                 │ (None, 128)            │        49,280 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_14 (Dropout)            │ (None, 128)            │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dense_9 (Dense)                 │ (None, 126)            │        16,254 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ reshape_4 (Reshape)             │ (None, 9, 14)          │             0 │
└─────────────────────────────────┴────────────────────────┴───────────────┘
 Total params: 84,350 (329.49 KB)
 Trainable params: 84,350 (329.49 KB)
 Non-trainable params: 0 (0.00 B)

Epoch 1/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 1s 93ms/step - loss: 0.1845 - mae: 0.3021 - val_loss: 0.1777 - val_mae: 0.2977
Epoch 2/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 45ms/step - loss: 0.1586 - mae: 0.2801 - val_loss: 0.1428 - val_mae: 0.2681
Epoch 3/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 42ms/step - loss: 0.1313 - mae: 0.2635 - val_loss: 0.0997 - val_mae: 0.2232
Epoch 4/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 46ms/step - loss: 0.1154 - mae: 0.2555 - val_loss: 0.0855 - val_mae: 0.2020
Epoch 5/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 39ms/step - loss: 0.0961 - mae: 0.2309 - val_loss: 0.0838 - val_mae: 0.1974
Epoch 6/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 42ms/step - loss: 0.0872 - mae: 0.2200 - val_loss: 0.0684 - val_mae: 0.1804
Epoch 7/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 41ms/step - loss: 0.0817 - mae: 0.2167 - val_loss: 0.0613 - val_mae: 0.1703
Epoch 8/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 40ms/step - loss: 0.0727 - mae: 0.2045 - val_loss: 0.0606 - val_mae: 0.1671
Epoch 9/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 42ms/step - loss: 0.0698 - mae: 0.1989 - val_loss: 0.0556 - val_mae: 0.1599
Epoch 10/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 42ms/step - loss: 0.0672 - mae: 0.1960 - val_loss: 0.0535 - val_mae: 0.1566
Epoch 11/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step - loss: 0.0649 - mae: 0.1925 - val_loss: 0.0539 - val_mae: 0.1567
Epoch 12/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 42ms/step - loss: 0.0633 - mae: 0.1898 - val_loss: 0.0517 - val_mae: 0.1539
Epoch 13/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 42ms/step - loss: 0.0602 - mae: 0.1856 - val_loss: 0.0514 - val_mae: 0.1529
Epoch 14/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 42ms/step - loss: 0.0604 - mae: 0.1844 - val_loss: 0.0499 - val_mae: 0.1510
Epoch 15/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step - loss: 0.0554 - mae: 0.1773 - val_loss: 0.0522 - val_mae: 0.1536
Epoch 16/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step - loss: 0.0587 - mae: 0.1801 - val_loss: 0.0526 - val_mae: 0.1538
Epoch 17/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 44ms/step - loss: 0.0569 - mae: 0.1781 - val_loss: 0.0465 - val_mae: 0.1471
Epoch 18/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step - loss: 0.0562 - mae: 0.1777 - val_loss: 0.0519 - val_mae: 0.1521
Epoch 19/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step - loss: 0.0548 - mae: 0.1733 - val_loss: 0.0527 - val_mae: 0.1527
Epoch 20/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step - loss: 0.0550 - mae: 0.1727 - val_loss: 0.0501 - val_mae: 0.1498
Epoch 21/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step - loss: 0.0542 - mae: 0.1726 - val_loss: 0.0484 - val_mae: 0.1480
Epoch 22/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step - loss: 0.0535 - mae: 0.1712 - val_loss: 0.0500 - val_mae: 0.1501
2026-05-20 06:45:01,082 - INFO - Final training history: {'loss': [0.1844872683286667, 0.15857023000717163, 0.1312524378299713, 0.11537105590105057, 0.09609176963567734, 0.0872235894203186, 0.08174058049917221, 0.0726628452539444, 0.06978287547826767, 0.06724546104669571, 0.06486018002033234, 0.0632866844534874, 0.060169514268636703, 0.060375723987817764, 0.0553988441824913, 0.05870674178004265, 0.056928765028715134, 0.056202102452516556, 0.05476796627044678, 0.0549740307033062, 0.05421825870871544, 0.053516682237386703], 'mae': [0.302129864692688, 0.28008314967155457, 0.2635427415370941, 0.2555197477340698, 0.2308991402387619, 0.21996565163135529, 0.2167135626077652, 0.20451687276363373, 0.1989201158285141, 0.19598805904388428, 0.19251291453838348, 0.1897735446691513, 0.18563523888587952, 0.18439266085624695, 0.1772807240486145, 0.18010199069976807, 0.1780635118484497, 0.1776948869228363, 0.17328386008739471, 0.17269054055213928, 0.17257174849510193, 0.17122691869735718], 'val_loss': [0.17765425145626068, 0.14280562102794647, 0.09970273077487946, 0.0855330154299736, 0.08376310020685196, 0.06844213604927063, 0.06130163371562958, 0.060635682195425034, 0.055611833930015564, 0.0534619465470314, 0.0539204403758049, 0.05168478190898895, 0.05141167715191841, 0.049936044961214066, 0.0521651953458786, 0.05261595547199249, 0.046503759920597076, 0.05192512646317482, 0.05272190272808075, 0.05013742297887802, 0.04839179664850235, 0.049999259412288666], 'val_mae': [0.2977409064769745, 0.26813608407974243, 0.22319895029067993, 0.2019546627998352, 0.19736939668655396, 0.180392324924469, 0.1703275442123413, 0.16707275807857513, 0.1598917543888092, 0.15662142634391785, 0.1567327082157135, 0.15392018854618073, 0.15288327634334564, 0.15104813873767853, 0.15358345210552216, 0.15384948253631592, 0.14708565175533295, 0.1520715206861496, 0.15267649292945862, 0.14983941614627838, 0.14802150428295135, 0.15014119446277618]}
2026-05-20 06:45:01,237 - INFO - Model training complete. Best model saved as /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/trained_models/bias_correction_model_month02_dekad11.keras
2026-05-20 06:45:01,239 - INFO - Pipeline [02 d2]: Loading confidence mask...
2026-05-20 06:45:01,242 - INFO - Loading existing confidence mask: /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/station_density/confidence_mask_station_density.nc4
2026-05-20 06:45:01,243 - INFO - Pipeline [02 d2]: Applying DL refinement...
2026-05-20 06:45:01,258 - INFO - Pixel-wise threshold map computed at 80th percentile. threshold_2d shape: (9, 14)
2026-05-20 06:45:01,259 - INFO - DL blending: base alpha=0.70 (LSEQM weight), 1-alpha=0.30 (DL weight)
2026-05-20 06:45:01,260 - INFO - Confidence mask active: spatial alpha modulation enabled. Confidence range: [0.000, 0.411]
2026-05-20 06:45:19,032 - INFO - DL blending complete: 250 daily slices processed, 4,000 extreme pixels blended (alpha=0.70)
2026-05-20 06:45:19,573 - INFO - Precip data dims: ('time', 'lat', 'lon'), shape: (250, 9, 14)
2026-05-20 06:45:19,632 - INFO - Saved Hybrid Deep Learning-Physical (Linear Scaling and Empirical Quantile Mapping) Approach corrected precipitation for month 02, dekad 11 at /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_lseqmdl/bali_cli_lseqmdl_corrected_imergl_month02_dekad11.nc4
2026-05-20 06:45:19,633 - INFO - Pipeline [02 d2]: Complete.
✓ month 02 dekad 2 — saved: /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_lseqmdl/bali_cli_imergl_lseqmdl_corrected_precip_month02_dekad11.nc4

============================================================
▸ month 02 dekad 3
============================================================
2026-05-20 06:45:19,638 - INFO - Pipeline [02 d3]: Running LSEQM...
2026-05-20 06:45:19,643 - INFO - Aligning IMERG and CPC datasets...
2026-05-20 06:45:19,651 - INFO - After alignment: IMERG has 9131 time steps, CPC has 9131 time steps
2026-05-20 06:45:19,652 - INFO - Creating time-based masks...
2026-05-20 06:45:19,661 - INFO - Applying time masks...
2026-05-20 06:45:19,671 - INFO - IMERG dekad data shape: (206, 9, 14)
2026-05-20 06:45:19,671 - INFO - CPC dekad data shape: (206, 9, 14)
2026-05-20 06:45:19,677 - INFO - Using native-resolution CPC parameter fitting (BCSD principle)...
2026-05-20 06:45:19,697 - INFO - CPC native dekad data: (206, 4, 6) (lat -9.25–-7.75, lon 113.75–116.25)
2026-05-20 06:45:21,857 - INFO -   Native CPC fitting: row 4/4 (100%) | 24 fitted, 0 skipped | elapsed 2s, ETA 0s
2026-05-20 06:45:21,857 - INFO - Fitted CPC params on native grid: 24/24 cells
2026-05-20 06:45:21,896 - INFO - Interpolated CPC params to IMERG grid: 126/126 valid pixels
2026-05-20 06:45:21,897 - INFO - Performing Linear Scaling (LS)...
2026-05-20 06:45:21,907 - INFO - LS using bilinearly interpolated CPC mean (smooth).
2026-05-20 06:45:21,909 - INFO - Saving LS corrected precipitation...
2026-05-20 06:45:21,912 - INFO - Precip data dims: ('time', 'lat', 'lon'), shape: (206, 9, 14)
2026-05-20 06:45:21,962 - INFO - Saved Linear Scaling corrected precipitation for month 02, dekad 21 at /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_ls/bali_cli_ls_corrected_imergl_month02_dekad21.nc4
2026-05-20 06:45:21,964 - INFO - Applying Empirical Quantile Mapping (EQM) on 9x14 grid...
2026-05-20 06:45:22,045 - INFO -   EQM progress: row 9/9 (100%) | 80 land pixels done | elapsed 0s, ETA 0s
2026-05-20 06:45:22,049 - INFO - EQM complete: 80/126 grid points corrected (46 masked/ocean pixels skipped)
2026-05-20 06:45:22,049 - INFO - Saving LSEQM corrected precipitation...
2026-05-20 06:45:22,052 - INFO - Precip data dims: ('time', 'lat', 'lon'), shape: (206, 9, 14)
2026-05-20 06:45:22,097 - INFO - Saved Linear Scaling and Empirical Quantile Mapping corrected precipitation for month 02, dekad 21 at /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_lseqm/bali_cli_lseqm_corrected_imergl_month02_dekad21.nc4
2026-05-20 06:45:22,099 - INFO - Pipeline [02 d3]: Training / loading DL model...
2026-05-20 06:45:22,101 - INFO - Checking if the model file exists at: /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/trained_models/bias_correction_model_month02_dekad21.keras

2026-05-20 06:45:22,170 - INFO - Model: "sequential_5"
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
┃ Layer (type)                    ┃ Output Shape           ┃       Param # ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│ conv2d_10 (Conv2D)              │ (None, 9, 14, 32)      │           320 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ max_pooling2d_10 (MaxPooling2D) │ (None, 4, 7, 32)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_15 (Dropout)            │ (None, 4, 7, 32)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ conv2d_11 (Conv2D)              │ (None, 4, 7, 64)       │        18,496 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ max_pooling2d_11 (MaxPooling2D) │ (None, 2, 3, 64)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_16 (Dropout)            │ (None, 2, 3, 64)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ flatten_5 (Flatten)             │ (None, 384)            │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dense_10 (Dense)                │ (None, 128)            │        49,280 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_17 (Dropout)            │ (None, 128)            │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dense_11 (Dense)                │ (None, 126)            │        16,254 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ reshape_5 (Reshape)             │ (None, 9, 14)          │             0 │
└─────────────────────────────────┴────────────────────────┴───────────────┘
 Total params: 84,350 (329.49 KB)
 Trainable params: 84,350 (329.49 KB)
 Non-trainable params: 0 (0.00 B)

Epoch 1/50
3/3 ━━━━━━━━━━━━━━━━━━━━ 2s 139ms/step - loss: 0.1790 - mae: 0.2979 - val_loss: 0.2276 - val_mae: 0.3497
Epoch 2/50
3/3 ━━━━━━━━━━━━━━━━━━━━ 0s 55ms/step - loss: 0.1603 - mae: 0.2808 - val_loss: 0.1987 - val_mae: 0.3260
Epoch 3/50
3/3 ━━━━━━━━━━━━━━━━━━━━ 0s 62ms/step - loss: 0.1395 - mae: 0.2654 - val_loss: 0.1499 - val_mae: 0.2794
Epoch 4/50
3/3 ━━━━━━━━━━━━━━━━━━━━ 0s 66ms/step - loss: 0.1179 - mae: 0.2526 - val_loss: 0.1069 - val_mae: 0.2327
Epoch 5/50
3/3 ━━━━━━━━━━━━━━━━━━━━ 0s 60ms/step - loss: 0.1078 - mae: 0.2466 - val_loss: 0.0923 - val_mae: 0.2121
Epoch 6/50
3/3 ━━━━━━━━━━━━━━━━━━━━ 0s 34ms/step - loss: 0.0946 - mae: 0.2300 - val_loss: 0.0942 - val_mae: 0.2129
Epoch 7/50
3/3 ━━━━━━━━━━━━━━━━━━━━ 0s 64ms/step - loss: 0.0858 - mae: 0.2167 - val_loss: 0.0892 - val_mae: 0.2076
Epoch 8/50
3/3 ━━━━━━━━━━━━━━━━━━━━ 0s 65ms/step - loss: 0.0793 - mae: 0.2093 - val_loss: 0.0750 - val_mae: 0.1903
Epoch 9/50
3/3 ━━━━━━━━━━━━━━━━━━━━ 0s 58ms/step - loss: 0.0718 - mae: 0.2015 - val_loss: 0.0637 - val_mae: 0.1750
Epoch 10/50
3/3 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step - loss: 0.0690 - mae: 0.1989 - val_loss: 0.0669 - val_mae: 0.1781
Epoch 11/50
3/3 ━━━━━━━━━━━━━━━━━━━━ 0s 39ms/step - loss: 0.0646 - mae: 0.1905 - val_loss: 0.0717 - val_mae: 0.1838
Epoch 12/50
3/3 ━━━━━━━━━━━━━━━━━━━━ 0s 35ms/step - loss: 0.0637 - mae: 0.1885 - val_loss: 0.0660 - val_mae: 0.1754
Epoch 13/50
3/3 ━━━━━━━━━━━━━━━━━━━━ 0s 57ms/step - loss: 0.0635 - mae: 0.1884 - val_loss: 0.0588 - val_mae: 0.1646
Epoch 14/50
3/3 ━━━━━━━━━━━━━━━━━━━━ 0s 34ms/step - loss: 0.0606 - mae: 0.1851 - val_loss: 0.0588 - val_mae: 0.1642
Epoch 15/50
3/3 ━━━━━━━━━━━━━━━━━━━━ 0s 34ms/step - loss: 0.0576 - mae: 0.1804 - val_loss: 0.0608 - val_mae: 0.1671
Epoch 16/50
3/3 ━━━━━━━━━━━━━━━━━━━━ 0s 36ms/step - loss: 0.0587 - mae: 0.1805 - val_loss: 0.0646 - val_mae: 0.1723
Epoch 17/50
3/3 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step - loss: 0.0570 - mae: 0.1768 - val_loss: 0.0642 - val_mae: 0.1717
Epoch 18/50
3/3 ━━━━━━━━━━━━━━━━━━━━ 0s 60ms/step - loss: 0.0566 - mae: 0.1757 - val_loss: 0.0560 - val_mae: 0.1599
Epoch 19/50
3/3 ━━━━━━━━━━━━━━━━━━━━ 0s 67ms/step - loss: 0.0545 - mae: 0.1736 - val_loss: 0.0539 - val_mae: 0.1566
Epoch 20/50
3/3 ━━━━━━━━━━━━━━━━━━━━ 0s 34ms/step - loss: 0.0546 - mae: 0.1728 - val_loss: 0.0655 - val_mae: 0.1730
Epoch 21/50
3/3 ━━━━━━━━━━━━━━━━━━━━ 0s 36ms/step - loss: 0.0543 - mae: 0.1704 - val_loss: 0.0581 - val_mae: 0.1621
Epoch 22/50
3/3 ━━━━━━━━━━━━━━━━━━━━ 0s 61ms/step - loss: 0.0513 - mae: 0.1673 - val_loss: 0.0511 - val_mae: 0.1518
Epoch 23/50
3/3 ━━━━━━━━━━━━━━━━━━━━ 0s 35ms/step - loss: 0.0530 - mae: 0.1715 - val_loss: 0.0549 - val_mae: 0.1571
Epoch 24/50
3/3 ━━━━━━━━━━━━━━━━━━━━ 0s 36ms/step - loss: 0.0521 - mae: 0.1672 - val_loss: 0.0636 - val_mae: 0.1696
Epoch 25/50
3/3 ━━━━━━━━━━━━━━━━━━━━ 0s 35ms/step - loss: 0.0528 - mae: 0.1671 - val_loss: 0.0535 - val_mae: 0.1551
Epoch 26/50
3/3 ━━━━━━━━━━━━━━━━━━━━ 0s 71ms/step - loss: 0.0492 - mae: 0.1627 - val_loss: 0.0500 - val_mae: 0.1500
Epoch 27/50
3/3 ━━━━━━━━━━━━━━━━━━━━ 0s 35ms/step - loss: 0.0509 - mae: 0.1653 - val_loss: 0.0558 - val_mae: 0.1582
Epoch 28/50
3/3 ━━━━━━━━━━━━━━━━━━━━ 0s 33ms/step - loss: 0.0495 - mae: 0.1625 - val_loss: 0.0564 - val_mae: 0.1590
Epoch 29/50
3/3 ━━━━━━━━━━━━━━━━━━━━ 0s 36ms/step - loss: 0.0488 - mae: 0.1611 - val_loss: 0.0516 - val_mae: 0.1520
Epoch 30/50
3/3 ━━━━━━━━━━━━━━━━━━━━ 0s 38ms/step - loss: 0.0472 - mae: 0.1600 - val_loss: 0.0530 - val_mae: 0.1539
Epoch 31/50
3/3 ━━━━━━━━━━━━━━━━━━━━ 0s 39ms/step - loss: 0.0480 - mae: 0.1589 - val_loss: 0.0569 - val_mae: 0.1598
2026-05-20 06:45:27,893 - INFO - Final training history: {'loss': [0.1789560317993164, 0.16030049324035645, 0.1395014524459839, 0.11793255060911179, 0.10776296257972717, 0.09461528807878494, 0.0858316421508789, 0.0793251171708107, 0.07181664556264877, 0.06903320550918579, 0.06458926945924759, 0.06369287520647049, 0.06352037936449051, 0.06055975705385208, 0.05764571577310562, 0.058689385652542114, 0.05703069642186165, 0.0565606914460659, 0.05452672392129898, 0.0546339713037014, 0.05426904186606407, 0.051314808428287506, 0.053042370826005936, 0.05213363468647003, 0.05278407782316208, 0.04921576380729675, 0.05087651312351227, 0.049510855227708817, 0.04875699058175087, 0.04723681882023811, 0.0479959212243557], 'mae': [0.29793086647987366, 0.280754029750824, 0.26538658142089844, 0.2526302635669708, 0.24662499129772186, 0.23004448413848877, 0.21669109165668488, 0.2093299776315689, 0.20145337283611298, 0.19893448054790497, 0.19050325453281403, 0.18846529722213745, 0.1884266585111618, 0.18507538735866547, 0.1803891658782959, 0.18050722777843475, 0.1767542064189911, 0.17568863928318024, 0.17358900606632233, 0.172810897231102, 0.17041583359241486, 0.16732916235923767, 0.1715494990348816, 0.1672215759754181, 0.1671314239501953, 0.1626947671175003, 0.16533508896827698, 0.16247057914733887, 0.16112643480300903, 0.16003049910068512, 0.15885137021541595], 'val_loss': [0.22762072086334229, 0.19868600368499756, 0.14994600415229797, 0.10694567114114761, 0.0922965481877327, 0.09416032582521439, 0.08922995626926422, 0.07503973692655563, 0.06369492411613464, 0.066945381462574, 0.07171638309955597, 0.06601365655660629, 0.05876309424638748, 0.05877707526087761, 0.06082889065146446, 0.06462284922599792, 0.06417165696620941, 0.0559767410159111, 0.05388910323381424, 0.06546879559755325, 0.058074820786714554, 0.05113634467124939, 0.05488074570894241, 0.06360161304473877, 0.05350528284907341, 0.05004037171602249, 0.05576566234230995, 0.05637217313051224, 0.05164773762226105, 0.05299306660890579, 0.056892555207014084], 'val_mae': [0.3496755063533783, 0.3260327875614166, 0.279406875371933, 0.23274174332618713, 0.2120528221130371, 0.2128923088312149, 0.20755161345005035, 0.19025371968746185, 0.17504706978797913, 0.17805004119873047, 0.18379242718219757, 0.1754438430070877, 0.16464030742645264, 0.16424515843391418, 0.16714923083782196, 0.17234119772911072, 0.17165033519268036, 0.1598782241344452, 0.1566443145275116, 0.17302894592285156, 0.16206865012645721, 0.15184511244297028, 0.15714871883392334, 0.16963137686252594, 0.15509192645549774, 0.14999493956565857, 0.15817081928253174, 0.15903544425964355, 0.15197508037090302, 0.15392892062664032, 0.15977522730827332]}
2026-05-20 06:45:28,030 - INFO - Model training complete. Best model saved as /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/trained_models/bias_correction_model_month02_dekad21.keras
2026-05-20 06:45:28,032 - INFO - Pipeline [02 d3]: Loading confidence mask...
2026-05-20 06:45:28,034 - INFO - Loading existing confidence mask: /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/station_density/confidence_mask_station_density.nc4
2026-05-20 06:45:28,035 - INFO - Pipeline [02 d3]: Applying DL refinement...
2026-05-20 06:45:28,052 - INFO - Pixel-wise threshold map computed at 80th percentile. threshold_2d shape: (9, 14)
2026-05-20 06:45:28,053 - INFO - DL blending: base alpha=0.70 (LSEQM weight), 1-alpha=0.30 (DL weight)
2026-05-20 06:45:28,055 - INFO - Confidence mask active: spatial alpha modulation enabled. Confidence range: [0.000, 0.411]
2026-05-20 06:45:42,176 - INFO - DL blending complete: 206 daily slices processed, 3,280 extreme pixels blended (alpha=0.70)
2026-05-20 06:45:42,278 - INFO - Precip data dims: ('time', 'lat', 'lon'), shape: (206, 9, 14)
2026-05-20 06:45:42,321 - INFO - Saved Hybrid Deep Learning-Physical (Linear Scaling and Empirical Quantile Mapping) Approach corrected precipitation for month 02, dekad 21 at /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_lseqmdl/bali_cli_lseqmdl_corrected_imergl_month02_dekad21.nc4
2026-05-20 06:45:42,324 - INFO - Pipeline [02 d3]: Complete.
✓ month 02 dekad 3 — saved: /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_lseqmdl/bali_cli_imergl_lseqmdl_corrected_precip_month02_dekad21.nc4

============================================================
▸ month 03 dekad 1
============================================================
2026-05-20 06:45:42,325 - INFO - Pipeline [03 d1]: Running LSEQM...
2026-05-20 06:45:42,329 - INFO - Aligning IMERG and CPC datasets...
2026-05-20 06:45:42,339 - INFO - After alignment: IMERG has 9131 time steps, CPC has 9131 time steps
2026-05-20 06:45:42,340 - INFO - Creating time-based masks...
2026-05-20 06:45:42,353 - INFO - Applying time masks...
2026-05-20 06:45:42,365 - INFO - IMERG dekad data shape: (250, 9, 14)
2026-05-20 06:45:42,367 - INFO - CPC dekad data shape: (250, 9, 14)
2026-05-20 06:45:42,371 - INFO - Using native-resolution CPC parameter fitting (BCSD principle)...
2026-05-20 06:45:42,409 - INFO - CPC native dekad data: (250, 4, 6) (lat -9.25–-7.75, lon 113.75–116.25)
2026-05-20 06:45:44,972 - INFO -   Native CPC fitting: row 4/4 (100%) | 24 fitted, 0 skipped | elapsed 3s, ETA 0s
2026-05-20 06:45:44,973 - INFO - Fitted CPC params on native grid: 24/24 cells
2026-05-20 06:45:45,014 - INFO - Interpolated CPC params to IMERG grid: 126/126 valid pixels
2026-05-20 06:45:45,014 - INFO - Performing Linear Scaling (LS)...
2026-05-20 06:45:45,024 - INFO - LS using bilinearly interpolated CPC mean (smooth).
2026-05-20 06:45:45,026 - INFO - Saving LS corrected precipitation...
2026-05-20 06:45:45,028 - INFO - Precip data dims: ('time', 'lat', 'lon'), shape: (250, 9, 14)
2026-05-20 06:45:45,076 - INFO - Saved Linear Scaling corrected precipitation for month 03, dekad 01 at /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_ls/bali_cli_ls_corrected_imergl_month03_dekad01.nc4
2026-05-20 06:45:45,079 - INFO - Applying Empirical Quantile Mapping (EQM) on 9x14 grid...
2026-05-20 06:45:45,165 - INFO -   EQM progress: row 9/9 (100%) | 80 land pixels done | elapsed 0s, ETA 0s
2026-05-20 06:45:45,168 - INFO - EQM complete: 80/126 grid points corrected (46 masked/ocean pixels skipped)
2026-05-20 06:45:45,169 - INFO - Saving LSEQM corrected precipitation...
2026-05-20 06:45:45,172 - INFO - Precip data dims: ('time', 'lat', 'lon'), shape: (250, 9, 14)
2026-05-20 06:45:45,236 - INFO - Saved Linear Scaling and Empirical Quantile Mapping corrected precipitation for month 03, dekad 01 at /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_lseqm/bali_cli_lseqm_corrected_imergl_month03_dekad01.nc4
2026-05-20 06:45:45,237 - INFO - Pipeline [03 d1]: Training / loading DL model...
2026-05-20 06:45:45,239 - INFO - Checking if the model file exists at: /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/trained_models/bias_correction_model_month03_dekad01.keras

2026-05-20 06:45:45,306 - INFO - Model: "sequential_6"
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
┃ Layer (type)                    ┃ Output Shape           ┃       Param # ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│ conv2d_12 (Conv2D)              │ (None, 9, 14, 32)      │           320 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ max_pooling2d_12 (MaxPooling2D) │ (None, 4, 7, 32)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_18 (Dropout)            │ (None, 4, 7, 32)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ conv2d_13 (Conv2D)              │ (None, 4, 7, 64)       │        18,496 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ max_pooling2d_13 (MaxPooling2D) │ (None, 2, 3, 64)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_19 (Dropout)            │ (None, 2, 3, 64)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ flatten_6 (Flatten)             │ (None, 384)            │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dense_12 (Dense)                │ (None, 128)            │        49,280 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_20 (Dropout)            │ (None, 128)            │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dense_13 (Dense)                │ (None, 126)            │        16,254 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ reshape_6 (Reshape)             │ (None, 9, 14)          │             0 │
└─────────────────────────────────┴────────────────────────┴───────────────┘
 Total params: 84,350 (329.49 KB)
 Trainable params: 84,350 (329.49 KB)
 Non-trainable params: 0 (0.00 B)

Epoch 1/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 1s 88ms/step - loss: 0.1936 - mae: 0.3075 - val_loss: 0.1814 - val_mae: 0.2885
Epoch 2/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 43ms/step - loss: 0.1657 - mae: 0.2851 - val_loss: 0.1453 - val_mae: 0.2637
Epoch 3/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 38ms/step - loss: 0.1338 - mae: 0.2667 - val_loss: 0.0985 - val_mae: 0.2236
Epoch 4/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 40ms/step - loss: 0.1190 - mae: 0.2613 - val_loss: 0.0827 - val_mae: 0.2016
Epoch 5/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step - loss: 0.0983 - mae: 0.2355 - val_loss: 0.0896 - val_mae: 0.2066
Epoch 6/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step - loss: 0.0898 - mae: 0.2213 - val_loss: 0.0845 - val_mae: 0.2015
Epoch 7/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 40ms/step - loss: 0.0826 - mae: 0.2143 - val_loss: 0.0678 - val_mae: 0.1839
Epoch 8/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 41ms/step - loss: 0.0791 - mae: 0.2149 - val_loss: 0.0620 - val_mae: 0.1757
Epoch 9/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step - loss: 0.0747 - mae: 0.2086 - val_loss: 0.0654 - val_mae: 0.1779
Epoch 10/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step - loss: 0.0690 - mae: 0.1985 - val_loss: 0.0680 - val_mae: 0.1801
Epoch 11/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step - loss: 0.0683 - mae: 0.1957 - val_loss: 0.0647 - val_mae: 0.1762
Epoch 12/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 40ms/step - loss: 0.0650 - mae: 0.1917 - val_loss: 0.0619 - val_mae: 0.1726
Epoch 13/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 42ms/step - loss: 0.0654 - mae: 0.1929 - val_loss: 0.0597 - val_mae: 0.1693
Epoch 14/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step - loss: 0.0625 - mae: 0.1875 - val_loss: 0.0640 - val_mae: 0.1733
Epoch 15/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step - loss: 0.0626 - mae: 0.1853 - val_loss: 0.0674 - val_mae: 0.1768
Epoch 16/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 48ms/step - loss: 0.0624 - mae: 0.1842 - val_loss: 0.0590 - val_mae: 0.1673
Epoch 17/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 40ms/step - loss: 0.0605 - mae: 0.1834 - val_loss: 0.0563 - val_mae: 0.1639
Epoch 18/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step - loss: 0.0593 - mae: 0.1810 - val_loss: 0.0605 - val_mae: 0.1684
Epoch 19/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 44ms/step - loss: 0.0577 - mae: 0.1783 - val_loss: 0.0553 - val_mae: 0.1623
Epoch 20/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 41ms/step - loss: 0.0582 - mae: 0.1801 - val_loss: 0.0543 - val_mae: 0.1609
Epoch 21/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step - loss: 0.0561 - mae: 0.1768 - val_loss: 0.0626 - val_mae: 0.1703
Epoch 22/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step - loss: 0.0569 - mae: 0.1741 - val_loss: 0.0587 - val_mae: 0.1658
Epoch 23/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 60ms/step - loss: 0.0552 - mae: 0.1743 - val_loss: 0.0530 - val_mae: 0.1590
Epoch 24/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step - loss: 0.0543 - mae: 0.1728 - val_loss: 0.0572 - val_mae: 0.1636
Epoch 25/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step - loss: 0.0538 - mae: 0.1713 - val_loss: 0.0540 - val_mae: 0.1598
Epoch 26/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step - loss: 0.0517 - mae: 0.1680 - val_loss: 0.0533 - val_mae: 0.1592
Epoch 27/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step - loss: 0.0546 - mae: 0.1733 - val_loss: 0.0565 - val_mae: 0.1630
Epoch 28/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step - loss: 0.0506 - mae: 0.1658 - val_loss: 0.0538 - val_mae: 0.1600
2026-05-20 06:45:50,587 - INFO - Final training history: {'loss': [0.1935749053955078, 0.16571149230003357, 0.13381434977054596, 0.1189967691898346, 0.09832841157913208, 0.08977304399013519, 0.08262119442224503, 0.07905475795269012, 0.07466351985931396, 0.06903257220983505, 0.06826126575469971, 0.06503330171108246, 0.06539613008499146, 0.06247830390930176, 0.06259702146053314, 0.06244172528386116, 0.06051862612366676, 0.05927416682243347, 0.057709354907274246, 0.05817247927188873, 0.05613325536251068, 0.05689767003059387, 0.055218882858753204, 0.05428982153534889, 0.05379246547818184, 0.05171801522374153, 0.054591547697782516, 0.050599027425050735], 'mae': [0.30753931403160095, 0.28506433963775635, 0.26670530438423157, 0.2612638771533966, 0.23554864525794983, 0.22134973108768463, 0.2142675369977951, 0.2149144560098648, 0.208627849817276, 0.1985369473695755, 0.1956886351108551, 0.19169357419013977, 0.19291695952415466, 0.18745389580726624, 0.18534225225448608, 0.18419240415096283, 0.1833987832069397, 0.18097378313541412, 0.17830316722393036, 0.18013334274291992, 0.17679239809513092, 0.17407092452049255, 0.17432737350463867, 0.17284400761127472, 0.17132949829101562, 0.16797754168510437, 0.1732950061559677, 0.16575641930103302], 'val_loss': [0.18138131499290466, 0.14533524215221405, 0.09850285202264786, 0.08273722976446152, 0.08962836861610413, 0.08445116132497787, 0.0678304061293602, 0.061985958367586136, 0.06543078273534775, 0.06800179928541183, 0.06470678746700287, 0.06191898509860039, 0.05967690795660019, 0.06396065652370453, 0.06742255389690399, 0.05903690680861473, 0.05634145811200142, 0.0605105385184288, 0.05530820041894913, 0.0542621947824955, 0.0625881627202034, 0.05865564942359924, 0.05298766493797302, 0.05719616264104843, 0.053986143320798874, 0.053296007215976715, 0.05647846683859825, 0.05375916510820389], 'val_mae': [0.28850603103637695, 0.26371029019355774, 0.2236127257347107, 0.2016483098268509, 0.2066257894039154, 0.20146967470645905, 0.18389223515987396, 0.17570903897285461, 0.17791429162025452, 0.18013599514961243, 0.1761535406112671, 0.1725877970457077, 0.16931277513504028, 0.1732896864414215, 0.17678675055503845, 0.16733264923095703, 0.1639212816953659, 0.16837137937545776, 0.16230939328670502, 0.1608862727880478, 0.17034544050693512, 0.1657872051000595, 0.1589600294828415, 0.16355659067630768, 0.15981101989746094, 0.15915948152542114, 0.16300208866596222, 0.1599869281053543]}
2026-05-20 06:45:50,729 - INFO - Model training complete. Best model saved as /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/trained_models/bias_correction_model_month03_dekad01.keras
2026-05-20 06:45:50,732 - INFO - Pipeline [03 d1]: Loading confidence mask...
2026-05-20 06:45:50,734 - INFO - Loading existing confidence mask: /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/station_density/confidence_mask_station_density.nc4
2026-05-20 06:45:50,735 - INFO - Pipeline [03 d1]: Applying DL refinement...
2026-05-20 06:45:50,749 - INFO - Pixel-wise threshold map computed at 80th percentile. threshold_2d shape: (9, 14)
2026-05-20 06:45:50,750 - INFO - DL blending: base alpha=0.70 (LSEQM weight), 1-alpha=0.30 (DL weight)
2026-05-20 06:45:50,751 - INFO - Confidence mask active: spatial alpha modulation enabled. Confidence range: [0.000, 0.411]
2026-05-20 06:46:08,045 - INFO - DL blending complete: 250 daily slices processed, 4,000 extreme pixels blended (alpha=0.70)
2026-05-20 06:46:08,177 - INFO - Precip data dims: ('time', 'lat', 'lon'), shape: (250, 9, 14)
2026-05-20 06:46:08,225 - INFO - Saved Hybrid Deep Learning-Physical (Linear Scaling and Empirical Quantile Mapping) Approach corrected precipitation for month 03, dekad 01 at /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_lseqmdl/bali_cli_lseqmdl_corrected_imergl_month03_dekad01.nc4
2026-05-20 06:46:08,226 - INFO - Pipeline [03 d1]: Complete.
✓ month 03 dekad 1 — saved: /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_lseqmdl/bali_cli_imergl_lseqmdl_corrected_precip_month03_dekad01.nc4

============================================================
▸ month 03 dekad 2
============================================================
2026-05-20 06:46:08,227 - INFO - Pipeline [03 d2]: Running LSEQM...
2026-05-20 06:46:08,234 - INFO - Aligning IMERG and CPC datasets...
2026-05-20 06:46:08,242 - INFO - After alignment: IMERG has 9131 time steps, CPC has 9131 time steps
2026-05-20 06:46:08,244 - INFO - Creating time-based masks...
2026-05-20 06:46:08,254 - INFO - Applying time masks...
2026-05-20 06:46:08,265 - INFO - IMERG dekad data shape: (250, 9, 14)
2026-05-20 06:46:08,266 - INFO - CPC dekad data shape: (250, 9, 14)
2026-05-20 06:46:08,270 - INFO - Using native-resolution CPC parameter fitting (BCSD principle)...
2026-05-20 06:46:08,302 - INFO - CPC native dekad data: (250, 4, 6) (lat -9.25–-7.75, lon 113.75–116.25)
2026-05-20 06:46:10,558 - INFO -   Native CPC fitting: row 4/4 (100%) | 24 fitted, 0 skipped | elapsed 2s, ETA 0s
2026-05-20 06:46:10,559 - INFO - Fitted CPC params on native grid: 24/24 cells
2026-05-20 06:46:10,598 - INFO - Interpolated CPC params to IMERG grid: 126/126 valid pixels
2026-05-20 06:46:10,599 - INFO - Performing Linear Scaling (LS)...
2026-05-20 06:46:10,611 - INFO - LS using bilinearly interpolated CPC mean (smooth).
2026-05-20 06:46:10,613 - INFO - Saving LS corrected precipitation...
2026-05-20 06:46:10,615 - INFO - Precip data dims: ('time', 'lat', 'lon'), shape: (250, 9, 14)
2026-05-20 06:46:10,662 - INFO - Saved Linear Scaling corrected precipitation for month 03, dekad 11 at /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_ls/bali_cli_ls_corrected_imergl_month03_dekad11.nc4
2026-05-20 06:46:10,667 - INFO - Applying Empirical Quantile Mapping (EQM) on 9x14 grid...
2026-05-20 06:46:10,751 - INFO -   EQM progress: row 9/9 (100%) | 80 land pixels done | elapsed 0s, ETA 0s
2026-05-20 06:46:10,755 - INFO - EQM complete: 80/126 grid points corrected (46 masked/ocean pixels skipped)
2026-05-20 06:46:10,756 - INFO - Saving LSEQM corrected precipitation...
2026-05-20 06:46:10,760 - INFO - Precip data dims: ('time', 'lat', 'lon'), shape: (250, 9, 14)
2026-05-20 06:46:10,806 - INFO - Saved Linear Scaling and Empirical Quantile Mapping corrected precipitation for month 03, dekad 11 at /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_lseqm/bali_cli_lseqm_corrected_imergl_month03_dekad11.nc4
2026-05-20 06:46:10,808 - INFO - Pipeline [03 d2]: Training / loading DL model...
2026-05-20 06:46:10,809 - INFO - Checking if the model file exists at: /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/trained_models/bias_correction_model_month03_dekad11.keras

2026-05-20 06:46:10,872 - INFO - Model: "sequential_7"
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
┃ Layer (type)                    ┃ Output Shape           ┃       Param # ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│ conv2d_14 (Conv2D)              │ (None, 9, 14, 32)      │           320 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ max_pooling2d_14 (MaxPooling2D) │ (None, 4, 7, 32)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_21 (Dropout)            │ (None, 4, 7, 32)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ conv2d_15 (Conv2D)              │ (None, 4, 7, 64)       │        18,496 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ max_pooling2d_15 (MaxPooling2D) │ (None, 2, 3, 64)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_22 (Dropout)            │ (None, 2, 3, 64)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ flatten_7 (Flatten)             │ (None, 384)            │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dense_14 (Dense)                │ (None, 128)            │        49,280 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_23 (Dropout)            │ (None, 128)            │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dense_15 (Dense)                │ (None, 126)            │        16,254 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ reshape_7 (Reshape)             │ (None, 9, 14)          │             0 │
└─────────────────────────────────┴────────────────────────┴───────────────┘
 Total params: 84,350 (329.49 KB)
 Trainable params: 84,350 (329.49 KB)
 Non-trainable params: 0 (0.00 B)

Epoch 1/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 1s 94ms/step - loss: 0.1563 - mae: 0.2651 - val_loss: 0.1564 - val_mae: 0.2506
Epoch 2/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 41ms/step - loss: 0.1328 - mae: 0.2464 - val_loss: 0.1184 - val_mae: 0.2276
Epoch 3/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 44ms/step - loss: 0.1094 - mae: 0.2387 - val_loss: 0.0845 - val_mae: 0.2014
Epoch 4/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 43ms/step - loss: 0.0952 - mae: 0.2310 - val_loss: 0.0793 - val_mae: 0.1911
Epoch 5/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step - loss: 0.0829 - mae: 0.2104 - val_loss: 0.0824 - val_mae: 0.1923
Epoch 6/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 42ms/step - loss: 0.0773 - mae: 0.2018 - val_loss: 0.0708 - val_mae: 0.1814
Epoch 7/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 42ms/step - loss: 0.0721 - mae: 0.1991 - val_loss: 0.0647 - val_mae: 0.1756
Epoch 8/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step - loss: 0.0678 - mae: 0.1962 - val_loss: 0.0648 - val_mae: 0.1759
Epoch 9/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step - loss: 0.0674 - mae: 0.1931 - val_loss: 0.0688 - val_mae: 0.1792
Epoch 10/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step - loss: 0.0654 - mae: 0.1868 - val_loss: 0.0651 - val_mae: 0.1759
Epoch 11/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 38ms/step - loss: 0.0633 - mae: 0.1877 - val_loss: 0.0589 - val_mae: 0.1709
Epoch 12/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step - loss: 0.0633 - mae: 0.1900 - val_loss: 0.0608 - val_mae: 0.1715
Epoch 13/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step - loss: 0.0605 - mae: 0.1843 - val_loss: 0.0657 - val_mae: 0.1762
Epoch 14/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step - loss: 0.0602 - mae: 0.1797 - val_loss: 0.0674 - val_mae: 0.1780
Epoch 15/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step - loss: 0.0591 - mae: 0.1790 - val_loss: 0.0591 - val_mae: 0.1709
Epoch 16/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step - loss: 0.0580 - mae: 0.1819 - val_loss: 0.0598 - val_mae: 0.1708
2026-05-20 06:46:14,700 - INFO - Final training history: {'loss': [0.15633638203144073, 0.13283002376556396, 0.10942745208740234, 0.09518388658761978, 0.08294174075126648, 0.07727556675672531, 0.07206316292285919, 0.06783264875411987, 0.06736456602811813, 0.0653635784983635, 0.06325610727071762, 0.06328616291284561, 0.06045630946755409, 0.06017812713980675, 0.0590805783867836, 0.05798782408237457], 'mae': [0.2651006579399109, 0.24635644257068634, 0.23870962858200073, 0.23103660345077515, 0.2104225903749466, 0.20178814232349396, 0.1990831345319748, 0.19617623090744019, 0.19310660660266876, 0.1867769956588745, 0.18769899010658264, 0.19003058969974518, 0.18427622318267822, 0.17971622943878174, 0.17902757227420807, 0.18193313479423523], 'val_loss': [0.15636344254016876, 0.11838407814502716, 0.08451204001903534, 0.07927192747592926, 0.08237151056528091, 0.07077886164188385, 0.06473255902528763, 0.06477515399456024, 0.06883372366428375, 0.06510224938392639, 0.05893873795866966, 0.060756076127290726, 0.06574708968400955, 0.06737107038497925, 0.05913986638188362, 0.059787772595882416], 'val_mae': [0.2505999505519867, 0.22760894894599915, 0.2014314830303192, 0.19114281237125397, 0.19230343401432037, 0.1814073771238327, 0.17564788460731506, 0.1759425699710846, 0.17920330166816711, 0.17593753337860107, 0.17090488970279694, 0.1715165674686432, 0.17621777951717377, 0.177983358502388, 0.17086684703826904, 0.17084099352359772]}
2026-05-20 06:46:14,847 - INFO - Model training complete. Best model saved as /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/trained_models/bias_correction_model_month03_dekad11.keras
2026-05-20 06:46:14,848 - INFO - Pipeline [03 d2]: Loading confidence mask...
2026-05-20 06:46:14,851 - INFO - Loading existing confidence mask: /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/station_density/confidence_mask_station_density.nc4
2026-05-20 06:46:14,852 - INFO - Pipeline [03 d2]: Applying DL refinement...
2026-05-20 06:46:14,868 - INFO - Pixel-wise threshold map computed at 80th percentile. threshold_2d shape: (9, 14)
2026-05-20 06:46:14,869 - INFO - DL blending: base alpha=0.70 (LSEQM weight), 1-alpha=0.30 (DL weight)
2026-05-20 06:46:14,870 - INFO - Confidence mask active: spatial alpha modulation enabled. Confidence range: [0.000, 0.411]
2026-05-20 06:46:33,489 - INFO - DL blending complete: 250 daily slices processed, 4,000 extreme pixels blended (alpha=0.70)
2026-05-20 06:46:33,574 - INFO - Precip data dims: ('time', 'lat', 'lon'), shape: (250, 9, 14)
2026-05-20 06:46:33,619 - INFO - Saved Hybrid Deep Learning-Physical (Linear Scaling and Empirical Quantile Mapping) Approach corrected precipitation for month 03, dekad 11 at /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_lseqmdl/bali_cli_lseqmdl_corrected_imergl_month03_dekad11.nc4
2026-05-20 06:46:33,621 - INFO - Pipeline [03 d2]: Complete.
✓ month 03 dekad 2 — saved: /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_lseqmdl/bali_cli_imergl_lseqmdl_corrected_precip_month03_dekad11.nc4

============================================================
▸ month 03 dekad 3
============================================================
2026-05-20 06:46:33,627 - INFO - Pipeline [03 d3]: Running LSEQM...
2026-05-20 06:46:33,631 - INFO - Aligning IMERG and CPC datasets...
2026-05-20 06:46:33,639 - INFO - After alignment: IMERG has 9131 time steps, CPC has 9131 time steps
2026-05-20 06:46:33,640 - INFO - Creating time-based masks...
2026-05-20 06:46:33,653 - INFO - Applying time masks...
2026-05-20 06:46:33,663 - INFO - IMERG dekad data shape: (275, 9, 14)
2026-05-20 06:46:33,664 - INFO - CPC dekad data shape: (275, 9, 14)
2026-05-20 06:46:33,668 - INFO - Using native-resolution CPC parameter fitting (BCSD principle)...
2026-05-20 06:46:33,698 - INFO - CPC native dekad data: (275, 4, 6) (lat -9.25–-7.75, lon 113.75–116.25)
2026-05-20 06:46:35,741 - INFO -   Native CPC fitting: row 4/4 (100%) | 24 fitted, 0 skipped | elapsed 2s, ETA 0s
2026-05-20 06:46:35,742 - INFO - Fitted CPC params on native grid: 24/24 cells
2026-05-20 06:46:35,786 - INFO - Interpolated CPC params to IMERG grid: 126/126 valid pixels
2026-05-20 06:46:35,786 - INFO - Performing Linear Scaling (LS)...
2026-05-20 06:46:35,797 - INFO - LS using bilinearly interpolated CPC mean (smooth).
2026-05-20 06:46:35,799 - INFO - Saving LS corrected precipitation...
2026-05-20 06:46:35,801 - INFO - Precip data dims: ('time', 'lat', 'lon'), shape: (275, 9, 14)
2026-05-20 06:46:35,854 - INFO - Saved Linear Scaling corrected precipitation for month 03, dekad 21 at /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_ls/bali_cli_ls_corrected_imergl_month03_dekad21.nc4
2026-05-20 06:46:35,857 - INFO - Applying Empirical Quantile Mapping (EQM) on 9x14 grid...
2026-05-20 06:46:35,934 - INFO -   EQM progress: row 9/9 (100%) | 80 land pixels done | elapsed 0s, ETA 0s
2026-05-20 06:46:35,937 - INFO - EQM complete: 80/126 grid points corrected (46 masked/ocean pixels skipped)
2026-05-20 06:46:35,939 - INFO - Saving LSEQM corrected precipitation...
2026-05-20 06:46:35,941 - INFO - Precip data dims: ('time', 'lat', 'lon'), shape: (275, 9, 14)
2026-05-20 06:46:36,005 - INFO - Saved Linear Scaling and Empirical Quantile Mapping corrected precipitation for month 03, dekad 21 at /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_lseqm/bali_cli_lseqm_corrected_imergl_month03_dekad21.nc4
2026-05-20 06:46:36,006 - INFO - Pipeline [03 d3]: Training / loading DL model...
2026-05-20 06:46:36,008 - INFO - Checking if the model file exists at: /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/trained_models/bias_correction_model_month03_dekad21.keras

2026-05-20 06:46:36,079 - INFO - Model: "sequential_8"
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
┃ Layer (type)                    ┃ Output Shape           ┃       Param # ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│ conv2d_16 (Conv2D)              │ (None, 9, 14, 32)      │           320 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ max_pooling2d_16 (MaxPooling2D) │ (None, 4, 7, 32)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_24 (Dropout)            │ (None, 4, 7, 32)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ conv2d_17 (Conv2D)              │ (None, 4, 7, 64)       │        18,496 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ max_pooling2d_17 (MaxPooling2D) │ (None, 2, 3, 64)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_25 (Dropout)            │ (None, 2, 3, 64)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ flatten_8 (Flatten)             │ (None, 384)            │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dense_16 (Dense)                │ (None, 128)            │        49,280 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_26 (Dropout)            │ (None, 128)            │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dense_17 (Dense)                │ (None, 126)            │        16,254 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ reshape_8 (Reshape)             │ (None, 9, 14)          │             0 │
└─────────────────────────────────┴────────────────────────┴───────────────┘
 Total params: 84,350 (329.49 KB)
 Trainable params: 84,350 (329.49 KB)
 Non-trainable params: 0 (0.00 B)

Epoch 1/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 2s 106ms/step - loss: 0.1486 - mae: 0.2534 - val_loss: 0.1601 - val_mae: 0.2616
Epoch 2/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 44ms/step - loss: 0.1247 - mae: 0.2374 - val_loss: 0.1206 - val_mae: 0.2354
Epoch 3/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 41ms/step - loss: 0.1045 - mae: 0.2321 - val_loss: 0.0875 - val_mae: 0.2043
Epoch 4/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 40ms/step - loss: 0.0922 - mae: 0.2228 - val_loss: 0.0815 - val_mae: 0.1933
Epoch 5/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 44ms/step - loss: 0.0803 - mae: 0.2054 - val_loss: 0.0804 - val_mae: 0.1908
Epoch 6/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 44ms/step - loss: 0.0735 - mae: 0.1969 - val_loss: 0.0695 - val_mae: 0.1807
Epoch 7/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 53ms/step - loss: 0.0697 - mae: 0.1957 - val_loss: 0.0671 - val_mae: 0.1778
Epoch 8/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step - loss: 0.0670 - mae: 0.1912 - val_loss: 0.0690 - val_mae: 0.1787
Epoch 9/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 45ms/step - loss: 0.0645 - mae: 0.1868 - val_loss: 0.0637 - val_mae: 0.1727
Epoch 10/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 48ms/step - loss: 0.0617 - mae: 0.1840 - val_loss: 0.0610 - val_mae: 0.1688
Epoch 11/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 44ms/step - loss: 0.0606 - mae: 0.1833 - val_loss: 0.0592 - val_mae: 0.1660
Epoch 12/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step - loss: 0.0588 - mae: 0.1788 - val_loss: 0.0656 - val_mae: 0.1723
Epoch 13/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step - loss: 0.0570 - mae: 0.1738 - val_loss: 0.0611 - val_mae: 0.1671
Epoch 14/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 47ms/step - loss: 0.0557 - mae: 0.1741 - val_loss: 0.0567 - val_mae: 0.1619
Epoch 15/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step - loss: 0.0554 - mae: 0.1727 - val_loss: 0.0628 - val_mae: 0.1681
Epoch 16/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step - loss: 0.0560 - mae: 0.1720 - val_loss: 0.0569 - val_mae: 0.1614
Epoch 17/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step - loss: 0.0556 - mae: 0.1737 - val_loss: 0.0579 - val_mae: 0.1622
Epoch 18/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step - loss: 0.0538 - mae: 0.1684 - val_loss: 0.0604 - val_mae: 0.1648
Epoch 19/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step - loss: 0.0534 - mae: 0.1673 - val_loss: 0.0576 - val_mae: 0.1619
2026-05-20 06:46:40,415 - INFO - Final training history: {'loss': [0.1486247181892395, 0.12474008649587631, 0.10446824878454208, 0.09219775348901749, 0.08034949004650116, 0.07354581356048584, 0.0697454959154129, 0.06704194843769073, 0.06454382091760635, 0.06173782795667648, 0.060625068843364716, 0.05876670777797699, 0.056956905871629715, 0.05568213015794754, 0.05544725060462952, 0.05596039444208145, 0.0556037463247776, 0.0538356676697731, 0.053403571248054504], 'mae': [0.2533796727657318, 0.23736613988876343, 0.23207591474056244, 0.22284558415412903, 0.20539025962352753, 0.19686917960643768, 0.19568213820457458, 0.1911807358264923, 0.18675149977207184, 0.18397296965122223, 0.18328478932380676, 0.17881368100643158, 0.17380672693252563, 0.17405660450458527, 0.1727098822593689, 0.17201824486255646, 0.17372870445251465, 0.16842813789844513, 0.1673118770122528], 'val_loss': [0.16013602912425995, 0.12060847133398056, 0.0875018760561943, 0.0815289095044136, 0.08042622357606888, 0.069490946829319, 0.06714429706335068, 0.06898806989192963, 0.06367726624011993, 0.06100372225046158, 0.05920865014195442, 0.06557763367891312, 0.061073895543813705, 0.056674130260944366, 0.06282216310501099, 0.05688079819083214, 0.05788086727261543, 0.060373879969120026, 0.057592280209064484], 'val_mae': [0.26159602403640747, 0.2354479730129242, 0.2043067067861557, 0.19329778850078583, 0.1907675862312317, 0.18073821067810059, 0.17780058085918427, 0.17865495383739471, 0.17270468175411224, 0.16878341138362885, 0.16596275568008423, 0.17230075597763062, 0.16713552176952362, 0.1618914008140564, 0.16807346045970917, 0.1613905131816864, 0.16224080324172974, 0.16480329632759094, 0.16192518174648285]}
2026-05-20 06:46:40,566 - INFO - Model training complete. Best model saved as /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/trained_models/bias_correction_model_month03_dekad21.keras
2026-05-20 06:46:40,568 - INFO - Pipeline [03 d3]: Loading confidence mask...
2026-05-20 06:46:40,573 - INFO - Loading existing confidence mask: /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/station_density/confidence_mask_station_density.nc4
2026-05-20 06:46:40,574 - INFO - Pipeline [03 d3]: Applying DL refinement...
2026-05-20 06:46:40,591 - INFO - Pixel-wise threshold map computed at 80th percentile. threshold_2d shape: (9, 14)
2026-05-20 06:46:40,592 - INFO - DL blending: base alpha=0.70 (LSEQM weight), 1-alpha=0.30 (DL weight)
2026-05-20 06:46:40,593 - INFO - Confidence mask active: spatial alpha modulation enabled. Confidence range: [0.000, 0.411]
2026-05-20 06:47:00,456 - INFO - DL blending complete: 275 daily slices processed, 4,400 extreme pixels blended (alpha=0.70)
2026-05-20 06:47:00,553 - INFO - Precip data dims: ('time', 'lat', 'lon'), shape: (275, 9, 14)
2026-05-20 06:47:00,610 - INFO - Saved Hybrid Deep Learning-Physical (Linear Scaling and Empirical Quantile Mapping) Approach corrected precipitation for month 03, dekad 21 at /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_lseqmdl/bali_cli_lseqmdl_corrected_imergl_month03_dekad21.nc4
2026-05-20 06:47:00,612 - INFO - Pipeline [03 d3]: Complete.
✓ month 03 dekad 3 — saved: /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_lseqmdl/bali_cli_imergl_lseqmdl_corrected_precip_month03_dekad21.nc4

============================================================
▸ month 04 dekad 1
============================================================
2026-05-20 06:47:00,613 - INFO - Pipeline [04 d1]: Running LSEQM...
2026-05-20 06:47:00,619 - INFO - Aligning IMERG and CPC datasets...
2026-05-20 06:47:00,627 - INFO - After alignment: IMERG has 9131 time steps, CPC has 9131 time steps
2026-05-20 06:47:00,629 - INFO - Creating time-based masks...
2026-05-20 06:47:00,642 - INFO - Applying time masks...
2026-05-20 06:47:00,653 - INFO - IMERG dekad data shape: (250, 9, 14)
2026-05-20 06:47:00,654 - INFO - CPC dekad data shape: (250, 9, 14)
2026-05-20 06:47:00,658 - INFO - Using native-resolution CPC parameter fitting (BCSD principle)...
2026-05-20 06:47:00,683 - INFO - CPC native dekad data: (250, 4, 6) (lat -9.25–-7.75, lon 113.75–116.25)
2026-05-20 06:47:02,928 - INFO -   Native CPC fitting: row 4/4 (100%) | 24 fitted, 0 skipped | elapsed 2s, ETA 0s
2026-05-20 06:47:02,929 - INFO - Fitted CPC params on native grid: 24/24 cells
2026-05-20 06:47:02,969 - INFO - Interpolated CPC params to IMERG grid: 126/126 valid pixels
2026-05-20 06:47:02,970 - INFO - Performing Linear Scaling (LS)...
2026-05-20 06:47:02,984 - INFO - LS using bilinearly interpolated CPC mean (smooth).
2026-05-20 06:47:02,986 - INFO - Saving LS corrected precipitation...
2026-05-20 06:47:02,989 - INFO - Precip data dims: ('time', 'lat', 'lon'), shape: (250, 9, 14)
2026-05-20 06:47:03,041 - INFO - Saved Linear Scaling corrected precipitation for month 04, dekad 01 at /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_ls/bali_cli_ls_corrected_imergl_month04_dekad01.nc4
2026-05-20 06:47:03,043 - INFO - Applying Empirical Quantile Mapping (EQM) on 9x14 grid...
2026-05-20 06:47:03,124 - INFO -   EQM progress: row 9/9 (100%) | 80 land pixels done | elapsed 0s, ETA 0s
2026-05-20 06:47:03,127 - INFO - EQM complete: 80/126 grid points corrected (46 masked/ocean pixels skipped)
2026-05-20 06:47:03,128 - INFO - Saving LSEQM corrected precipitation...
2026-05-20 06:47:03,130 - INFO - Precip data dims: ('time', 'lat', 'lon'), shape: (250, 9, 14)
2026-05-20 06:47:03,185 - INFO - Saved Linear Scaling and Empirical Quantile Mapping corrected precipitation for month 04, dekad 01 at /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_lseqm/bali_cli_lseqm_corrected_imergl_month04_dekad01.nc4
2026-05-20 06:47:03,188 - INFO - Pipeline [04 d1]: Training / loading DL model...
2026-05-20 06:47:03,189 - INFO - Checking if the model file exists at: /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/trained_models/bias_correction_model_month04_dekad01.keras

2026-05-20 06:47:03,265 - INFO - Model: "sequential_9"
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
┃ Layer (type)                    ┃ Output Shape           ┃       Param # ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│ conv2d_18 (Conv2D)              │ (None, 9, 14, 32)      │           320 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ max_pooling2d_18 (MaxPooling2D) │ (None, 4, 7, 32)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_27 (Dropout)            │ (None, 4, 7, 32)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ conv2d_19 (Conv2D)              │ (None, 4, 7, 64)       │        18,496 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ max_pooling2d_19 (MaxPooling2D) │ (None, 2, 3, 64)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_28 (Dropout)            │ (None, 2, 3, 64)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ flatten_9 (Flatten)             │ (None, 384)            │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dense_18 (Dense)                │ (None, 128)            │        49,280 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_29 (Dropout)            │ (None, 128)            │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dense_19 (Dense)                │ (None, 126)            │        16,254 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ reshape_9 (Reshape)             │ (None, 9, 14)          │             0 │
└─────────────────────────────────┴────────────────────────┴───────────────┘
 Total params: 84,350 (329.49 KB)
 Trainable params: 84,350 (329.49 KB)
 Non-trainable params: 0 (0.00 B)

Epoch 1/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 2s 96ms/step - loss: 0.1539 - mae: 0.2582 - val_loss: 0.1506 - val_mae: 0.2512
Epoch 2/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 43ms/step - loss: 0.1321 - mae: 0.2433 - val_loss: 0.1191 - val_mae: 0.2285
Epoch 3/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 49ms/step - loss: 0.1098 - mae: 0.2367 - val_loss: 0.0897 - val_mae: 0.2050
Epoch 4/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 41ms/step - loss: 0.0975 - mae: 0.2311 - val_loss: 0.0805 - val_mae: 0.1905
Epoch 5/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 41ms/step - loss: 0.0840 - mae: 0.2124 - val_loss: 0.0755 - val_mae: 0.1828
Epoch 6/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 53ms/step - loss: 0.0772 - mae: 0.2040 - val_loss: 0.0698 - val_mae: 0.1763
Epoch 7/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 46ms/step - loss: 0.0724 - mae: 0.1987 - val_loss: 0.0608 - val_mae: 0.1683
Epoch 8/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 43ms/step - loss: 0.0671 - mae: 0.1957 - val_loss: 0.0569 - val_mae: 0.1636
Epoch 9/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step - loss: 0.0653 - mae: 0.1916 - val_loss: 0.0585 - val_mae: 0.1630
Epoch 10/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 42ms/step - loss: 0.0605 - mae: 0.1831 - val_loss: 0.0568 - val_mae: 0.1604
Epoch 11/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 44ms/step - loss: 0.0621 - mae: 0.1844 - val_loss: 0.0556 - val_mae: 0.1581
Epoch 12/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 43ms/step - loss: 0.0584 - mae: 0.1779 - val_loss: 0.0525 - val_mae: 0.1543
Epoch 13/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 43ms/step - loss: 0.0590 - mae: 0.1813 - val_loss: 0.0484 - val_mae: 0.1493
Epoch 14/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step - loss: 0.0590 - mae: 0.1809 - val_loss: 0.0516 - val_mae: 0.1515
Epoch 15/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step - loss: 0.0566 - mae: 0.1740 - val_loss: 0.0524 - val_mae: 0.1521
Epoch 16/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step - loss: 0.0553 - mae: 0.1717 - val_loss: 0.0499 - val_mae: 0.1492
Epoch 17/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 45ms/step - loss: 0.0551 - mae: 0.1725 - val_loss: 0.0501 - val_mae: 0.1494
Epoch 18/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 46ms/step - loss: 0.0554 - mae: 0.1725 - val_loss: 0.0512 - val_mae: 0.1509
2026-05-20 06:47:08,405 - INFO - Final training history: {'loss': [0.15394049882888794, 0.13211078941822052, 0.1097647100687027, 0.09745383262634277, 0.08397488296031952, 0.07722828537225723, 0.07244645059108734, 0.06711531430482864, 0.0652877688407898, 0.0605187751352787, 0.06206999346613884, 0.05835144221782684, 0.05901411920785904, 0.05897693336009979, 0.056601785123348236, 0.055329032242298126, 0.05513356998562813, 0.05542376637458801], 'mae': [0.2581782639026642, 0.2433014065027237, 0.2366829514503479, 0.2311168611049652, 0.21238189935684204, 0.20404906570911407, 0.19874465465545654, 0.19567644596099854, 0.191559299826622, 0.18311336636543274, 0.18435142934322357, 0.1779160350561142, 0.1812630593776703, 0.18089886009693146, 0.17403028905391693, 0.17171697318553925, 0.1724579930305481, 0.17246046662330627], 'val_loss': [0.15062880516052246, 0.11906477063894272, 0.08969228714704514, 0.08046826720237732, 0.0755346491932869, 0.06980090588331223, 0.06079058721661568, 0.056936297565698624, 0.05847600847482681, 0.05682871490716934, 0.05564194172620773, 0.05250610038638115, 0.04840632900595665, 0.05155408754944801, 0.052386246621608734, 0.04985462501645088, 0.050065722316503525, 0.05121822655200958], 'val_mae': [0.2511894106864929, 0.2284536212682724, 0.20496955513954163, 0.19049029052257538, 0.18275800347328186, 0.17632748186588287, 0.1683058887720108, 0.16355343163013458, 0.16301898658275604, 0.160383403301239, 0.15810443460941315, 0.15429335832595825, 0.14930300414562225, 0.1515234410762787, 0.15212145447731018, 0.14919906854629517, 0.1493528038263321, 0.15087708830833435]}
2026-05-20 06:47:08,584 - INFO - Model training complete. Best model saved as /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/trained_models/bias_correction_model_month04_dekad01.keras
2026-05-20 06:47:08,587 - INFO - Pipeline [04 d1]: Loading confidence mask...
2026-05-20 06:47:08,588 - INFO - Loading existing confidence mask: /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/station_density/confidence_mask_station_density.nc4
2026-05-20 06:47:08,589 - INFO - Pipeline [04 d1]: Applying DL refinement...
2026-05-20 06:47:08,614 - INFO - Pixel-wise threshold map computed at 80th percentile. threshold_2d shape: (9, 14)
2026-05-20 06:47:08,617 - INFO - DL blending: base alpha=0.70 (LSEQM weight), 1-alpha=0.30 (DL weight)
2026-05-20 06:47:08,618 - INFO - Confidence mask active: spatial alpha modulation enabled. Confidence range: [0.000, 0.411]
2026-05-20 06:47:25,886 - INFO - DL blending complete: 250 daily slices processed, 3,999 extreme pixels blended (alpha=0.70)
2026-05-20 06:47:25,965 - INFO - Precip data dims: ('time', 'lat', 'lon'), shape: (250, 9, 14)
2026-05-20 06:47:26,007 - INFO - Saved Hybrid Deep Learning-Physical (Linear Scaling and Empirical Quantile Mapping) Approach corrected precipitation for month 04, dekad 01 at /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_lseqmdl/bali_cli_lseqmdl_corrected_imergl_month04_dekad01.nc4
2026-05-20 06:47:26,008 - INFO - Pipeline [04 d1]: Complete.
✓ month 04 dekad 1 — saved: /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_lseqmdl/bali_cli_imergl_lseqmdl_corrected_precip_month04_dekad01.nc4

============================================================
▸ month 04 dekad 2
============================================================
2026-05-20 06:47:26,009 - INFO - Pipeline [04 d2]: Running LSEQM...
2026-05-20 06:47:26,016 - INFO - Aligning IMERG and CPC datasets...
2026-05-20 06:47:26,026 - INFO - After alignment: IMERG has 9131 time steps, CPC has 9131 time steps
2026-05-20 06:47:26,026 - INFO - Creating time-based masks...
2026-05-20 06:47:26,038 - INFO - Applying time masks...
2026-05-20 06:47:26,048 - INFO - IMERG dekad data shape: (250, 9, 14)
2026-05-20 06:47:26,049 - INFO - CPC dekad data shape: (250, 9, 14)
2026-05-20 06:47:26,052 - INFO - Using native-resolution CPC parameter fitting (BCSD principle)...
2026-05-20 06:47:26,079 - INFO - CPC native dekad data: (250, 4, 6) (lat -9.25–-7.75, lon 113.75–116.25)
2026-05-20 06:47:28,531 - INFO -   Native CPC fitting: row 4/4 (100%) | 24 fitted, 0 skipped | elapsed 2s, ETA 0s
2026-05-20 06:47:28,532 - INFO - Fitted CPC params on native grid: 24/24 cells
2026-05-20 06:47:28,583 - INFO - Interpolated CPC params to IMERG grid: 126/126 valid pixels
2026-05-20 06:47:28,583 - INFO - Performing Linear Scaling (LS)...
2026-05-20 06:47:28,593 - INFO - LS using bilinearly interpolated CPC mean (smooth).
2026-05-20 06:47:28,596 - INFO - Saving LS corrected precipitation...
2026-05-20 06:47:28,598 - INFO - Precip data dims: ('time', 'lat', 'lon'), shape: (250, 9, 14)
2026-05-20 06:47:28,660 - INFO - Saved Linear Scaling corrected precipitation for month 04, dekad 11 at /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_ls/bali_cli_ls_corrected_imergl_month04_dekad11.nc4
2026-05-20 06:47:28,662 - INFO - Applying Empirical Quantile Mapping (EQM) on 9x14 grid...
2026-05-20 06:47:28,763 - INFO -   EQM progress: row 9/9 (100%) | 80 land pixels done | elapsed 0s, ETA 0s
2026-05-20 06:47:28,768 - INFO - EQM complete: 80/126 grid points corrected (46 masked/ocean pixels skipped)
2026-05-20 06:47:28,770 - INFO - Saving LSEQM corrected precipitation...
2026-05-20 06:47:28,776 - INFO - Precip data dims: ('time', 'lat', 'lon'), shape: (250, 9, 14)
2026-05-20 06:47:28,844 - INFO - Saved Linear Scaling and Empirical Quantile Mapping corrected precipitation for month 04, dekad 11 at /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_lseqm/bali_cli_lseqm_corrected_imergl_month04_dekad11.nc4
2026-05-20 06:47:28,845 - INFO - Pipeline [04 d2]: Training / loading DL model...
2026-05-20 06:47:28,847 - INFO - Checking if the model file exists at: /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/trained_models/bias_correction_model_month04_dekad11.keras

2026-05-20 06:47:28,926 - INFO - Model: "sequential_10"
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
┃ Layer (type)                    ┃ Output Shape           ┃       Param # ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│ conv2d_20 (Conv2D)              │ (None, 9, 14, 32)      │           320 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ max_pooling2d_20 (MaxPooling2D) │ (None, 4, 7, 32)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_30 (Dropout)            │ (None, 4, 7, 32)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ conv2d_21 (Conv2D)              │ (None, 4, 7, 64)       │        18,496 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ max_pooling2d_21 (MaxPooling2D) │ (None, 2, 3, 64)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_31 (Dropout)            │ (None, 2, 3, 64)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ flatten_10 (Flatten)            │ (None, 384)            │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dense_20 (Dense)                │ (None, 128)            │        49,280 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_32 (Dropout)            │ (None, 128)            │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dense_21 (Dense)                │ (None, 126)            │        16,254 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ reshape_10 (Reshape)            │ (None, 9, 14)          │             0 │
└─────────────────────────────────┴────────────────────────┴───────────────┘
 Total params: 84,350 (329.49 KB)
 Trainable params: 84,350 (329.49 KB)
 Non-trainable params: 0 (0.00 B)

Epoch 1/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 2s 118ms/step - loss: 0.1422 - mae: 0.2443 - val_loss: 0.1422 - val_mae: 0.2272
Epoch 2/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 55ms/step - loss: 0.1245 - mae: 0.2296 - val_loss: 0.1207 - val_mae: 0.2175
Epoch 3/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 53ms/step - loss: 0.1067 - mae: 0.2233 - val_loss: 0.0990 - val_mae: 0.2031
Epoch 4/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 68ms/step - loss: 0.0958 - mae: 0.2193 - val_loss: 0.0901 - val_mae: 0.1948
Epoch 5/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 58ms/step - loss: 0.0839 - mae: 0.2038 - val_loss: 0.0865 - val_mae: 0.1919
Epoch 6/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 60ms/step - loss: 0.0781 - mae: 0.1979 - val_loss: 0.0787 - val_mae: 0.1876
Epoch 7/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 68ms/step - loss: 0.0736 - mae: 0.1966 - val_loss: 0.0748 - val_mae: 0.1850
Epoch 8/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 64ms/step - loss: 0.0697 - mae: 0.1913 - val_loss: 0.0742 - val_mae: 0.1841
Epoch 9/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 81ms/step - loss: 0.0659 - mae: 0.1865 - val_loss: 0.0710 - val_mae: 0.1816
Epoch 10/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 100ms/step - loss: 0.0637 - mae: 0.1853 - val_loss: 0.0654 - val_mae: 0.1773
Epoch 11/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 88ms/step - loss: 0.0616 - mae: 0.1850 - val_loss: 0.0647 - val_mae: 0.1754
Epoch 12/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 52ms/step - loss: 0.0615 - mae: 0.1833 - val_loss: 0.0666 - val_mae: 0.1756
Epoch 13/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 42ms/step - loss: 0.0589 - mae: 0.1764 - val_loss: 0.0661 - val_mae: 0.1752
Epoch 14/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 68ms/step - loss: 0.0594 - mae: 0.1791 - val_loss: 0.0618 - val_mae: 0.1732
Epoch 15/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 51ms/step - loss: 0.0590 - mae: 0.1820 - val_loss: 0.0626 - val_mae: 0.1725
Epoch 16/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 54ms/step - loss: 0.0580 - mae: 0.1776 - val_loss: 0.0659 - val_mae: 0.1745
Epoch 17/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 39ms/step - loss: 0.0567 - mae: 0.1728 - val_loss: 0.0628 - val_mae: 0.1728
Epoch 18/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 82ms/step - loss: 0.0565 - mae: 0.1753 - val_loss: 0.0613 - val_mae: 0.1720
Epoch 19/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 49ms/step - loss: 0.0564 - mae: 0.1767 - val_loss: 0.0615 - val_mae: 0.1719
Epoch 20/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 45ms/step - loss: 0.0530 - mae: 0.1684 - val_loss: 0.0653 - val_mae: 0.1732
Epoch 21/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 57ms/step - loss: 0.0542 - mae: 0.1664 - val_loss: 0.0643 - val_mae: 0.1715
Epoch 22/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 54ms/step - loss: 0.0554 - mae: 0.1684 - val_loss: 0.0620 - val_mae: 0.1693
Epoch 23/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 41ms/step - loss: 0.0531 - mae: 0.1664 - val_loss: 0.0609 - val_mae: 0.1688
Epoch 24/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 42ms/step - loss: 0.0546 - mae: 0.1694 - val_loss: 0.0593 - val_mae: 0.1688
Epoch 25/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step - loss: 0.0549 - mae: 0.1726 - val_loss: 0.0611 - val_mae: 0.1701
Epoch 26/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step - loss: 0.0516 - mae: 0.1629 - val_loss: 0.0665 - val_mae: 0.1741
Epoch 27/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step - loss: 0.0537 - mae: 0.1638 - val_loss: 0.0623 - val_mae: 0.1712
Epoch 28/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 44ms/step - loss: 0.0524 - mae: 0.1669 - val_loss: 0.0587 - val_mae: 0.1688
Epoch 29/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step - loss: 0.0559 - mae: 0.1729 - val_loss: 0.0596 - val_mae: 0.1677
Epoch 30/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step - loss: 0.0516 - mae: 0.1622 - val_loss: 0.0634 - val_mae: 0.1699
Epoch 31/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step - loss: 0.0527 - mae: 0.1620 - val_loss: 0.0605 - val_mae: 0.1678
Epoch 32/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 42ms/step - loss: 0.0516 - mae: 0.1638 - val_loss: 0.0577 - val_mae: 0.1669
Epoch 33/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step - loss: 0.0520 - mae: 0.1662 - val_loss: 0.0590 - val_mae: 0.1674
Epoch 34/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step - loss: 0.0503 - mae: 0.1614 - val_loss: 0.0622 - val_mae: 0.1695
Epoch 35/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step - loss: 0.0499 - mae: 0.1578 - val_loss: 0.0610 - val_mae: 0.1682
Epoch 36/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step - loss: 0.0502 - mae: 0.1606 - val_loss: 0.0579 - val_mae: 0.1666
Epoch 37/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step - loss: 0.0500 - mae: 0.1614 - val_loss: 0.0603 - val_mae: 0.1668
2026-05-20 06:47:38,430 - INFO - Final training history: {'loss': [0.14215907454490662, 0.12451154738664627, 0.1066712737083435, 0.09575962275266647, 0.0838986337184906, 0.07810245454311371, 0.07362668216228485, 0.06972600519657135, 0.06593984365463257, 0.06366309523582458, 0.061596713960170746, 0.06154300272464752, 0.05890747159719467, 0.059387531131505966, 0.05903331935405731, 0.057997122406959534, 0.0566590391099453, 0.05647846311330795, 0.056356146931648254, 0.05302301421761513, 0.054199691861867905, 0.055363159626722336, 0.05306379497051239, 0.054610010236501694, 0.05485718697309494, 0.05155205354094505, 0.05370788648724556, 0.05244055762887001, 0.05588429048657417, 0.051645904779434204, 0.05265128239989281, 0.051623620092868805, 0.0519549660384655, 0.05030107870697975, 0.04990279674530029, 0.05016324669122696, 0.04996078088879585], 'mae': [0.2443312406539917, 0.22964192926883698, 0.22331461310386658, 0.21929048001766205, 0.2037608027458191, 0.19793830811977386, 0.19655412435531616, 0.19128692150115967, 0.18649324774742126, 0.1853291392326355, 0.18500246107578278, 0.18326161801815033, 0.1764276921749115, 0.179067462682724, 0.18196091055870056, 0.1776028871536255, 0.17278264462947845, 0.17528685927391052, 0.17671355605125427, 0.16839629411697388, 0.16638317704200745, 0.1683877408504486, 0.1664092242717743, 0.16942666471004486, 0.1725933849811554, 0.16285651922225952, 0.16378086805343628, 0.1669229120016098, 0.17293106019496918, 0.16223211586475372, 0.16197893023490906, 0.16379886865615845, 0.1662367880344391, 0.1613708734512329, 0.15783075988292694, 0.160623699426651, 0.16141124069690704], 'val_loss': [0.1422123908996582, 0.1206950694322586, 0.09900271147489548, 0.09013476967811584, 0.08646438270807266, 0.07874225080013275, 0.07483633607625961, 0.07419443875551224, 0.0709652230143547, 0.0653558224439621, 0.06468098610639572, 0.06659094244241714, 0.066098652780056, 0.061834026128053665, 0.06258366256952286, 0.06588312983512878, 0.06275317072868347, 0.06133070960640907, 0.06151886284351349, 0.06525139510631561, 0.06430724263191223, 0.062040187418460846, 0.060940220952034, 0.05925793945789337, 0.06107077747583389, 0.06649642437696457, 0.06231202930212021, 0.05869992822408676, 0.059634093195199966, 0.06336653232574463, 0.060454387217760086, 0.05770797282457352, 0.05903223529458046, 0.062236886471509933, 0.061030540615320206, 0.05785100907087326, 0.060286976397037506], 'val_mae': [0.22716107964515686, 0.21751661598682404, 0.20306561887264252, 0.19483806192874908, 0.19192995131015778, 0.18762195110321045, 0.18503810465335846, 0.1840599775314331, 0.18157507479190826, 0.17728514969348907, 0.17537517845630646, 0.17560508847236633, 0.1752289980649948, 0.1732434779405594, 0.1725481152534485, 0.17453338205814362, 0.17284493148326874, 0.1720268279314041, 0.1718539446592331, 0.17321594059467316, 0.17149269580841064, 0.16926126182079315, 0.16878993809223175, 0.1688169687986374, 0.17008823156356812, 0.1740674376487732, 0.17117348313331604, 0.16879220306873322, 0.16773365437984467, 0.1698978841304779, 0.16783194243907928, 0.1668676733970642, 0.16742801666259766, 0.16945919394493103, 0.1682325154542923, 0.16662681102752686, 0.16678239405155182]}
2026-05-20 06:47:38,578 - INFO - Model training complete. Best model saved as /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/trained_models/bias_correction_model_month04_dekad11.keras
2026-05-20 06:47:38,580 - INFO - Pipeline [04 d2]: Loading confidence mask...
2026-05-20 06:47:38,582 - INFO - Loading existing confidence mask: /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/station_density/confidence_mask_station_density.nc4
2026-05-20 06:47:38,583 - INFO - Pipeline [04 d2]: Applying DL refinement...
2026-05-20 06:47:38,601 - INFO - Pixel-wise threshold map computed at 80th percentile. threshold_2d shape: (9, 14)
2026-05-20 06:47:38,601 - INFO - DL blending: base alpha=0.70 (LSEQM weight), 1-alpha=0.30 (DL weight)
2026-05-20 06:47:38,603 - INFO - Confidence mask active: spatial alpha modulation enabled. Confidence range: [0.000, 0.411]
2026-05-20 06:47:58,696 - INFO - DL blending complete: 250 daily slices processed, 4,000 extreme pixels blended (alpha=0.70)
2026-05-20 06:47:58,813 - INFO - Precip data dims: ('time', 'lat', 'lon'), shape: (250, 9, 14)
2026-05-20 06:47:58,872 - INFO - Saved Hybrid Deep Learning-Physical (Linear Scaling and Empirical Quantile Mapping) Approach corrected precipitation for month 04, dekad 11 at /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_lseqmdl/bali_cli_lseqmdl_corrected_imergl_month04_dekad11.nc4
2026-05-20 06:47:58,874 - INFO - Pipeline [04 d2]: Complete.
✓ month 04 dekad 2 — saved: /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_lseqmdl/bali_cli_imergl_lseqmdl_corrected_precip_month04_dekad11.nc4

============================================================
▸ month 04 dekad 3
============================================================
2026-05-20 06:47:58,878 - INFO - Pipeline [04 d3]: Running LSEQM...
2026-05-20 06:47:58,883 - INFO - Aligning IMERG and CPC datasets...
2026-05-20 06:47:58,894 - INFO - After alignment: IMERG has 9131 time steps, CPC has 9131 time steps
2026-05-20 06:47:58,897 - INFO - Creating time-based masks...
2026-05-20 06:47:58,913 - INFO - Applying time masks...
2026-05-20 06:47:58,931 - INFO - IMERG dekad data shape: (250, 9, 14)
2026-05-20 06:47:58,931 - INFO - CPC dekad data shape: (250, 9, 14)
2026-05-20 06:47:58,937 - INFO - Using native-resolution CPC parameter fitting (BCSD principle)...
2026-05-20 06:47:58,977 - INFO - CPC native dekad data: (250, 4, 6) (lat -9.25–-7.75, lon 113.75–116.25)
2026-05-20 06:48:03,734 - INFO -   Native CPC fitting: row 4/4 (100%) | 24 fitted, 0 skipped | elapsed 5s, ETA 0s
2026-05-20 06:48:03,735 - INFO - Fitted CPC params on native grid: 24/24 cells
2026-05-20 06:48:03,779 - INFO - Interpolated CPC params to IMERG grid: 126/126 valid pixels
2026-05-20 06:48:03,780 - INFO - Performing Linear Scaling (LS)...
2026-05-20 06:48:03,792 - INFO - LS using bilinearly interpolated CPC mean (smooth).
2026-05-20 06:48:03,795 - INFO - Saving LS corrected precipitation...
2026-05-20 06:48:03,797 - INFO - Precip data dims: ('time', 'lat', 'lon'), shape: (250, 9, 14)
2026-05-20 06:48:03,860 - INFO - Saved Linear Scaling corrected precipitation for month 04, dekad 21 at /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_ls/bali_cli_ls_corrected_imergl_month04_dekad21.nc4
2026-05-20 06:48:03,861 - INFO - Applying Empirical Quantile Mapping (EQM) on 9x14 grid...
2026-05-20 06:48:03,939 - INFO -   EQM progress: row 9/9 (100%) | 80 land pixels done | elapsed 0s, ETA 0s
2026-05-20 06:48:03,942 - INFO - EQM complete: 80/126 grid points corrected (46 masked/ocean pixels skipped)
2026-05-20 06:48:03,942 - INFO - Saving LSEQM corrected precipitation...
2026-05-20 06:48:03,944 - INFO - Precip data dims: ('time', 'lat', 'lon'), shape: (250, 9, 14)
2026-05-20 06:48:03,994 - INFO - Saved Linear Scaling and Empirical Quantile Mapping corrected precipitation for month 04, dekad 21 at /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_lseqm/bali_cli_lseqm_corrected_imergl_month04_dekad21.nc4
2026-05-20 06:48:03,995 - INFO - Pipeline [04 d3]: Training / loading DL model...
2026-05-20 06:48:03,997 - INFO - Checking if the model file exists at: /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/trained_models/bias_correction_model_month04_dekad21.keras

2026-05-20 06:48:04,066 - INFO - Model: "sequential_11"
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
┃ Layer (type)                    ┃ Output Shape           ┃       Param # ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│ conv2d_22 (Conv2D)              │ (None, 9, 14, 32)      │           320 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ max_pooling2d_22 (MaxPooling2D) │ (None, 4, 7, 32)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_33 (Dropout)            │ (None, 4, 7, 32)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ conv2d_23 (Conv2D)              │ (None, 4, 7, 64)       │        18,496 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ max_pooling2d_23 (MaxPooling2D) │ (None, 2, 3, 64)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_34 (Dropout)            │ (None, 2, 3, 64)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ flatten_11 (Flatten)            │ (None, 384)            │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dense_22 (Dense)                │ (None, 128)            │        49,280 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_35 (Dropout)            │ (None, 128)            │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dense_23 (Dense)                │ (None, 126)            │        16,254 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ reshape_11 (Reshape)            │ (None, 9, 14)          │             0 │
└─────────────────────────────────┴────────────────────────┴───────────────┘
 Total params: 84,350 (329.49 KB)
 Trainable params: 84,350 (329.49 KB)
 Non-trainable params: 0 (0.00 B)

Epoch 1/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 2s 100ms/step - loss: 0.0989 - mae: 0.1842 - val_loss: 0.1201 - val_mae: 0.1877
Epoch 2/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 49ms/step - loss: 0.0871 - mae: 0.1733 - val_loss: 0.1093 - val_mae: 0.1852
Epoch 3/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 45ms/step - loss: 0.0786 - mae: 0.1744 - val_loss: 0.0981 - val_mae: 0.1815
Epoch 4/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 45ms/step - loss: 0.0716 - mae: 0.1736 - val_loss: 0.0910 - val_mae: 0.1781
Epoch 5/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 46ms/step - loss: 0.0653 - mae: 0.1721 - val_loss: 0.0852 - val_mae: 0.1767
Epoch 6/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 48ms/step - loss: 0.0611 - mae: 0.1694 - val_loss: 0.0822 - val_mae: 0.1755
Epoch 7/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 45ms/step - loss: 0.0569 - mae: 0.1655 - val_loss: 0.0788 - val_mae: 0.1745
Epoch 8/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 51ms/step - loss: 0.0560 - mae: 0.1662 - val_loss: 0.0765 - val_mae: 0.1737
Epoch 9/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 46ms/step - loss: 0.0534 - mae: 0.1643 - val_loss: 0.0756 - val_mae: 0.1725
Epoch 10/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 47ms/step - loss: 0.0521 - mae: 0.1626 - val_loss: 0.0737 - val_mae: 0.1723
Epoch 11/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step - loss: 0.0516 - mae: 0.1627 - val_loss: 0.0741 - val_mae: 0.1714
Epoch 12/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step - loss: 0.0519 - mae: 0.1604 - val_loss: 0.0750 - val_mae: 0.1709
Epoch 13/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 42ms/step - loss: 0.0497 - mae: 0.1572 - val_loss: 0.0722 - val_mae: 0.1718
Epoch 14/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 51ms/step - loss: 0.0495 - mae: 0.1605 - val_loss: 0.0708 - val_mae: 0.1720
Epoch 15/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step - loss: 0.0506 - mae: 0.1632 - val_loss: 0.0721 - val_mae: 0.1699
Epoch 16/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step - loss: 0.0497 - mae: 0.1538 - val_loss: 0.0776 - val_mae: 0.1685
Epoch 17/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step - loss: 0.0503 - mae: 0.1496 - val_loss: 0.0761 - val_mae: 0.1679
Epoch 18/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step - loss: 0.0492 - mae: 0.1497 - val_loss: 0.0728 - val_mae: 0.1680
Epoch 19/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step - loss: 0.0484 - mae: 0.1536 - val_loss: 0.0713 - val_mae: 0.1689
2026-05-20 06:48:08,814 - INFO - Final training history: {'loss': [0.09891261160373688, 0.08712243288755417, 0.0785958468914032, 0.07160237431526184, 0.06531382352113724, 0.061099667102098465, 0.05689946562051773, 0.0559757724404335, 0.05336742475628853, 0.0521375946700573, 0.05160956829786301, 0.05187227204442024, 0.04969247803092003, 0.04951668903231621, 0.05058357119560242, 0.04971477389335632, 0.05027178302407265, 0.04921961948275566, 0.04838501289486885], 'mae': [0.1841803789138794, 0.17333678901195526, 0.17439061403274536, 0.17358650267124176, 0.17213909327983856, 0.1693936586380005, 0.16549085080623627, 0.1661989837884903, 0.16431786119937897, 0.1625504046678543, 0.16274391114711761, 0.16036197543144226, 0.15720823407173157, 0.16045139729976654, 0.16319313645362854, 0.15380734205245972, 0.1495828479528427, 0.14967596530914307, 0.15356388688087463], 'val_loss': [0.12009873241186142, 0.10933937132358551, 0.09809994697570801, 0.09095077216625214, 0.0851721316576004, 0.0822310671210289, 0.07877040654420853, 0.07653028517961502, 0.07558482140302658, 0.07367373257875443, 0.07405561953783035, 0.07504857331514359, 0.0721549466252327, 0.07084856927394867, 0.0721442699432373, 0.07756002992391586, 0.07609498500823975, 0.07282237708568573, 0.07127934694290161], 'val_mae': [0.18770110607147217, 0.18516908586025238, 0.18151533603668213, 0.1780567616224289, 0.17670099437236786, 0.17553302645683289, 0.17445175349712372, 0.17366531491279602, 0.17246653139591217, 0.17229290306568146, 0.17135624587535858, 0.17093700170516968, 0.17178745567798615, 0.17197899520397186, 0.16994020342826843, 0.16854175925254822, 0.16790452599525452, 0.16804231703281403, 0.1688529998064041]}
2026-05-20 06:48:08,981 - INFO - Model training complete. Best model saved as /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/trained_models/bias_correction_model_month04_dekad21.keras
2026-05-20 06:48:08,984 - INFO - Pipeline [04 d3]: Loading confidence mask...
2026-05-20 06:48:08,987 - INFO - Loading existing confidence mask: /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/station_density/confidence_mask_station_density.nc4
2026-05-20 06:48:08,988 - INFO - Pipeline [04 d3]: Applying DL refinement...
2026-05-20 06:48:09,009 - INFO - Pixel-wise threshold map computed at 80th percentile. threshold_2d shape: (9, 14)
2026-05-20 06:48:09,010 - INFO - DL blending: base alpha=0.70 (LSEQM weight), 1-alpha=0.30 (DL weight)
2026-05-20 06:48:09,011 - INFO - Confidence mask active: spatial alpha modulation enabled. Confidence range: [0.000, 0.411]
2026-05-20 06:48:27,827 - INFO - DL blending complete: 250 daily slices processed, 3,996 extreme pixels blended (alpha=0.70)
2026-05-20 06:48:27,917 - INFO - Precip data dims: ('time', 'lat', 'lon'), shape: (250, 9, 14)
2026-05-20 06:48:27,988 - INFO - Saved Hybrid Deep Learning-Physical (Linear Scaling and Empirical Quantile Mapping) Approach corrected precipitation for month 04, dekad 21 at /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_lseqmdl/bali_cli_lseqmdl_corrected_imergl_month04_dekad21.nc4
2026-05-20 06:48:27,989 - INFO - Pipeline [04 d3]: Complete.
✓ month 04 dekad 3 — saved: /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_lseqmdl/bali_cli_imergl_lseqmdl_corrected_precip_month04_dekad21.nc4

============================================================
▸ month 05 dekad 1
============================================================
2026-05-20 06:48:27,990 - INFO - Pipeline [05 d1]: Running LSEQM...
2026-05-20 06:48:27,996 - INFO - Aligning IMERG and CPC datasets...
2026-05-20 06:48:28,006 - INFO - After alignment: IMERG has 9131 time steps, CPC has 9131 time steps
2026-05-20 06:48:28,007 - INFO - Creating time-based masks...
2026-05-20 06:48:28,021 - INFO - Applying time masks...
2026-05-20 06:48:28,035 - INFO - IMERG dekad data shape: (250, 9, 14)
2026-05-20 06:48:28,036 - INFO - CPC dekad data shape: (250, 9, 14)
2026-05-20 06:48:28,039 - INFO - Using native-resolution CPC parameter fitting (BCSD principle)...
2026-05-20 06:48:28,068 - INFO - CPC native dekad data: (250, 4, 6) (lat -9.25–-7.75, lon 113.75–116.25)
2026-05-20 06:48:30,598 - INFO -   Native CPC fitting: row 4/4 (100%) | 24 fitted, 0 skipped | elapsed 3s, ETA 0s
2026-05-20 06:48:30,599 - INFO - Fitted CPC params on native grid: 24/24 cells
2026-05-20 06:48:30,641 - INFO - Interpolated CPC params to IMERG grid: 126/126 valid pixels
2026-05-20 06:48:30,642 - INFO - Performing Linear Scaling (LS)...
2026-05-20 06:48:30,652 - INFO - LS using bilinearly interpolated CPC mean (smooth).
2026-05-20 06:48:30,654 - INFO - Saving LS corrected precipitation...
2026-05-20 06:48:30,656 - INFO - Precip data dims: ('time', 'lat', 'lon'), shape: (250, 9, 14)
2026-05-20 06:48:30,719 - INFO - Saved Linear Scaling corrected precipitation for month 05, dekad 01 at /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_ls/bali_cli_ls_corrected_imergl_month05_dekad01.nc4
2026-05-20 06:48:30,720 - INFO - Applying Empirical Quantile Mapping (EQM) on 9x14 grid...
2026-05-20 06:48:30,797 - INFO -   EQM progress: row 9/9 (100%) | 80 land pixels done | elapsed 0s, ETA 0s
2026-05-20 06:48:30,800 - INFO - EQM complete: 80/126 grid points corrected (46 masked/ocean pixels skipped)
2026-05-20 06:48:30,802 - INFO - Saving LSEQM corrected precipitation...
2026-05-20 06:48:30,806 - INFO - Precip data dims: ('time', 'lat', 'lon'), shape: (250, 9, 14)
2026-05-20 06:48:30,857 - INFO - Saved Linear Scaling and Empirical Quantile Mapping corrected precipitation for month 05, dekad 01 at /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_lseqm/bali_cli_lseqm_corrected_imergl_month05_dekad01.nc4
2026-05-20 06:48:30,859 - INFO - Pipeline [05 d1]: Training / loading DL model...
2026-05-20 06:48:30,860 - INFO - Checking if the model file exists at: /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/trained_models/bias_correction_model_month05_dekad01.keras

2026-05-20 06:48:30,927 - INFO - Model: "sequential_12"
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
┃ Layer (type)                    ┃ Output Shape           ┃       Param # ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│ conv2d_24 (Conv2D)              │ (None, 9, 14, 32)      │           320 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ max_pooling2d_24 (MaxPooling2D) │ (None, 4, 7, 32)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_36 (Dropout)            │ (None, 4, 7, 32)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ conv2d_25 (Conv2D)              │ (None, 4, 7, 64)       │        18,496 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ max_pooling2d_25 (MaxPooling2D) │ (None, 2, 3, 64)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_37 (Dropout)            │ (None, 2, 3, 64)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ flatten_12 (Flatten)            │ (None, 384)            │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dense_24 (Dense)                │ (None, 128)            │        49,280 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_38 (Dropout)            │ (None, 128)            │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dense_25 (Dense)                │ (None, 126)            │        16,254 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ reshape_12 (Reshape)            │ (None, 9, 14)          │             0 │
└─────────────────────────────────┴────────────────────────┴───────────────┘
 Total params: 84,350 (329.49 KB)
 Trainable params: 84,350 (329.49 KB)
 Non-trainable params: 0 (0.00 B)

Epoch 1/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 2s 95ms/step - loss: 0.1205 - mae: 0.2093 - val_loss: 0.1105 - val_mae: 0.1780
Epoch 2/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 43ms/step - loss: 0.1066 - mae: 0.1999 - val_loss: 0.0946 - val_mae: 0.1727
Epoch 3/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 40ms/step - loss: 0.0924 - mae: 0.1979 - val_loss: 0.0780 - val_mae: 0.1699
Epoch 4/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 43ms/step - loss: 0.0840 - mae: 0.1987 - val_loss: 0.0714 - val_mae: 0.1660
Epoch 5/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 41ms/step - loss: 0.0787 - mae: 0.1954 - val_loss: 0.0683 - val_mae: 0.1636
Epoch 6/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 40ms/step - loss: 0.0718 - mae: 0.1873 - val_loss: 0.0645 - val_mae: 0.1633
Epoch 7/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 41ms/step - loss: 0.0685 - mae: 0.1877 - val_loss: 0.0617 - val_mae: 0.1634
Epoch 8/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 53ms/step - loss: 0.0658 - mae: 0.1857 - val_loss: 0.0615 - val_mae: 0.1623
Epoch 9/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 41ms/step - loss: 0.0633 - mae: 0.1813 - val_loss: 0.0606 - val_mae: 0.1623
Epoch 10/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step - loss: 0.0621 - mae: 0.1803 - val_loss: 0.0606 - val_mae: 0.1617
Epoch 11/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 43ms/step - loss: 0.0593 - mae: 0.1751 - val_loss: 0.0593 - val_mae: 0.1600
Epoch 12/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 45ms/step - loss: 0.0600 - mae: 0.1764 - val_loss: 0.0566 - val_mae: 0.1590
Epoch 13/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 41ms/step - loss: 0.0575 - mae: 0.1746 - val_loss: 0.0541 - val_mae: 0.1601
Epoch 14/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step - loss: 0.0581 - mae: 0.1762 - val_loss: 0.0549 - val_mae: 0.1581
Epoch 15/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step - loss: 0.0557 - mae: 0.1709 - val_loss: 0.0564 - val_mae: 0.1570
Epoch 16/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step - loss: 0.0548 - mae: 0.1668 - val_loss: 0.0569 - val_mae: 0.1562
Epoch 17/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step - loss: 0.0544 - mae: 0.1658 - val_loss: 0.0544 - val_mae: 0.1558
Epoch 18/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 43ms/step - loss: 0.0537 - mae: 0.1668 - val_loss: 0.0532 - val_mae: 0.1550
Epoch 19/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step - loss: 0.0540 - mae: 0.1643 - val_loss: 0.0568 - val_mae: 0.1521
Epoch 20/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step - loss: 0.0549 - mae: 0.1602 - val_loss: 0.0569 - val_mae: 0.1515
Epoch 21/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 42ms/step - loss: 0.0537 - mae: 0.1606 - val_loss: 0.0531 - val_mae: 0.1530
Epoch 22/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step - loss: 0.0527 - mae: 0.1626 - val_loss: 0.0557 - val_mae: 0.1529
Epoch 23/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 47ms/step - loss: 0.0524 - mae: 0.1581 - val_loss: 0.0594 - val_mae: 0.1535
Epoch 24/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 49ms/step - loss: 0.0544 - mae: 0.1590 - val_loss: 0.0552 - val_mae: 0.1529
Epoch 25/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 65ms/step - loss: 0.0512 - mae: 0.1590 - val_loss: 0.0527 - val_mae: 0.1544
Epoch 26/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 49ms/step - loss: 0.0508 - mae: 0.1605 - val_loss: 0.0530 - val_mae: 0.1547
Epoch 27/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step - loss: 0.0509 - mae: 0.1611 - val_loss: 0.0536 - val_mae: 0.1553
Epoch 28/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step - loss: 0.0517 - mae: 0.1606 - val_loss: 0.0563 - val_mae: 0.1555
Epoch 29/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 44ms/step - loss: 0.0507 - mae: 0.1565 - val_loss: 0.0569 - val_mae: 0.1559
Epoch 30/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 58ms/step - loss: 0.0492 - mae: 0.1569 - val_loss: 0.0539 - val_mae: 0.1572
2026-05-20 06:48:38,029 - INFO - Final training history: {'loss': [0.120545893907547, 0.1066436842083931, 0.09237426519393921, 0.08403754979372025, 0.0786781907081604, 0.0717955008149147, 0.06849085539579391, 0.0658264234662056, 0.06333868205547333, 0.062112342566251755, 0.05929124727845192, 0.05998072773218155, 0.05754288658499718, 0.05808235704898834, 0.05567918345332146, 0.05476163327693939, 0.054404906928539276, 0.05372648313641548, 0.05404586344957352, 0.05490563064813614, 0.05369286239147186, 0.05271346867084503, 0.05235811695456505, 0.05435873940587044, 0.05120992660522461, 0.05076372250914574, 0.05090257525444031, 0.05172980949282646, 0.05065399035811424, 0.04917478933930397], 'mae': [0.2092822790145874, 0.1998680680990219, 0.1978827863931656, 0.19869765639305115, 0.19541795551776886, 0.18730202317237854, 0.18769250810146332, 0.18574461340904236, 0.18134182691574097, 0.1803014576435089, 0.17509466409683228, 0.17643654346466064, 0.1746356338262558, 0.176175057888031, 0.17087173461914062, 0.16677168011665344, 0.16578811407089233, 0.16679221391677856, 0.16432054340839386, 0.160222589969635, 0.16060903668403625, 0.1625596582889557, 0.15809014439582825, 0.1589808613061905, 0.15900225937366486, 0.16054479777812958, 0.16108030080795288, 0.16056828200817108, 0.15647171437740326, 0.15685325860977173], 'val_loss': [0.1105087548494339, 0.09463251382112503, 0.0779963880777359, 0.07136678695678711, 0.0683329850435257, 0.06446623057126999, 0.06166113540530205, 0.06145995110273361, 0.06057997792959213, 0.060627177357673645, 0.059339672327041626, 0.05655497685074806, 0.05405626446008682, 0.05491970106959343, 0.056356173008680344, 0.05688299983739853, 0.05438946187496185, 0.053222235292196274, 0.05683084949851036, 0.05694226175546646, 0.05308990180492401, 0.05572457239031792, 0.05935775861144066, 0.05522617697715759, 0.05266954377293587, 0.05303828418254852, 0.053569402545690536, 0.05634178966283798, 0.05691635608673096, 0.05389132350683212], 'val_mae': [0.17795105278491974, 0.17269374430179596, 0.16987277567386627, 0.16604764759540558, 0.16361147165298462, 0.16334415972232819, 0.16336265206336975, 0.16234464943408966, 0.16229377686977386, 0.16171802580356598, 0.15997625887393951, 0.15898501873016357, 0.16005486249923706, 0.1581091284751892, 0.15700137615203857, 0.15618525445461273, 0.15584240853786469, 0.1550205945968628, 0.1521446853876114, 0.15150262415409088, 0.15301711857318878, 0.1528840810060501, 0.15351518988609314, 0.1528749316930771, 0.1543823778629303, 0.1547269970178604, 0.15528373420238495, 0.15552935004234314, 0.15585759282112122, 0.15721260011196136]}
2026-05-20 06:48:38,202 - INFO - Model training complete. Best model saved as /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/trained_models/bias_correction_model_month05_dekad01.keras
2026-05-20 06:48:38,205 - INFO - Pipeline [05 d1]: Loading confidence mask...
2026-05-20 06:48:38,207 - INFO - Loading existing confidence mask: /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/station_density/confidence_mask_station_density.nc4
2026-05-20 06:48:38,207 - INFO - Pipeline [05 d1]: Applying DL refinement...
2026-05-20 06:48:38,224 - INFO - Pixel-wise threshold map computed at 80th percentile. threshold_2d shape: (9, 14)
2026-05-20 06:48:38,227 - INFO - DL blending: base alpha=0.70 (LSEQM weight), 1-alpha=0.30 (DL weight)
2026-05-20 06:48:38,229 - INFO - Confidence mask active: spatial alpha modulation enabled. Confidence range: [0.000, 0.411]
2026-05-20 06:48:55,773 - INFO - DL blending complete: 250 daily slices processed, 3,999 extreme pixels blended (alpha=0.70)
2026-05-20 06:48:55,869 - INFO - Precip data dims: ('time', 'lat', 'lon'), shape: (250, 9, 14)
2026-05-20 06:48:55,917 - INFO - Saved Hybrid Deep Learning-Physical (Linear Scaling and Empirical Quantile Mapping) Approach corrected precipitation for month 05, dekad 01 at /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_lseqmdl/bali_cli_lseqmdl_corrected_imergl_month05_dekad01.nc4
2026-05-20 06:48:55,918 - INFO - Pipeline [05 d1]: Complete.
✓ month 05 dekad 1 — saved: /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_lseqmdl/bali_cli_imergl_lseqmdl_corrected_precip_month05_dekad01.nc4

============================================================
▸ month 05 dekad 2
============================================================
2026-05-20 06:48:55,919 - INFO - Pipeline [05 d2]: Running LSEQM...
2026-05-20 06:48:55,925 - INFO - Aligning IMERG and CPC datasets...
2026-05-20 06:48:55,935 - INFO - After alignment: IMERG has 9131 time steps, CPC has 9131 time steps
2026-05-20 06:48:55,937 - INFO - Creating time-based masks...
2026-05-20 06:48:55,948 - INFO - Applying time masks...
2026-05-20 06:48:55,962 - INFO - IMERG dekad data shape: (250, 9, 14)
2026-05-20 06:48:55,963 - INFO - CPC dekad data shape: (250, 9, 14)
2026-05-20 06:48:55,965 - INFO - Using native-resolution CPC parameter fitting (BCSD principle)...
2026-05-20 06:48:55,993 - INFO - CPC native dekad data: (250, 4, 6) (lat -9.25–-7.75, lon 113.75–116.25)
2026-05-20 06:48:58,843 - INFO -   Native CPC fitting: row 4/4 (100%) | 24 fitted, 0 skipped | elapsed 3s, ETA 0s
2026-05-20 06:48:58,844 - INFO - Fitted CPC params on native grid: 24/24 cells
2026-05-20 06:48:58,888 - INFO - Interpolated CPC params to IMERG grid: 126/126 valid pixels
2026-05-20 06:48:58,889 - INFO - Performing Linear Scaling (LS)...
2026-05-20 06:48:58,900 - INFO - LS using bilinearly interpolated CPC mean (smooth).
2026-05-20 06:48:58,903 - INFO - Saving LS corrected precipitation...
2026-05-20 06:48:58,905 - INFO - Precip data dims: ('time', 'lat', 'lon'), shape: (250, 9, 14)
2026-05-20 06:48:58,953 - INFO - Saved Linear Scaling corrected precipitation for month 05, dekad 11 at /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_ls/bali_cli_ls_corrected_imergl_month05_dekad11.nc4
2026-05-20 06:48:58,955 - INFO - Applying Empirical Quantile Mapping (EQM) on 9x14 grid...
2026-05-20 06:48:59,030 - INFO -   EQM progress: row 9/9 (100%) | 80 land pixels done | elapsed 0s, ETA 0s
2026-05-20 06:48:59,035 - INFO - EQM complete: 80/126 grid points corrected (46 masked/ocean pixels skipped)
2026-05-20 06:48:59,035 - INFO - Saving LSEQM corrected precipitation...
2026-05-20 06:48:59,038 - INFO - Precip data dims: ('time', 'lat', 'lon'), shape: (250, 9, 14)
2026-05-20 06:48:59,101 - INFO - Saved Linear Scaling and Empirical Quantile Mapping corrected precipitation for month 05, dekad 11 at /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_lseqm/bali_cli_lseqm_corrected_imergl_month05_dekad11.nc4
2026-05-20 06:48:59,102 - INFO - Pipeline [05 d2]: Training / loading DL model...
2026-05-20 06:48:59,103 - INFO - Checking if the model file exists at: /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/trained_models/bias_correction_model_month05_dekad11.keras

2026-05-20 06:48:59,168 - INFO - Model: "sequential_13"
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
┃ Layer (type)                    ┃ Output Shape           ┃       Param # ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│ conv2d_26 (Conv2D)              │ (None, 9, 14, 32)      │           320 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ max_pooling2d_26 (MaxPooling2D) │ (None, 4, 7, 32)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_39 (Dropout)            │ (None, 4, 7, 32)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ conv2d_27 (Conv2D)              │ (None, 4, 7, 64)       │        18,496 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ max_pooling2d_27 (MaxPooling2D) │ (None, 2, 3, 64)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_40 (Dropout)            │ (None, 2, 3, 64)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ flatten_13 (Flatten)            │ (None, 384)            │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dense_26 (Dense)                │ (None, 128)            │        49,280 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_41 (Dropout)            │ (None, 128)            │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dense_27 (Dense)                │ (None, 126)            │        16,254 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ reshape_13 (Reshape)            │ (None, 9, 14)          │             0 │
└─────────────────────────────────┴────────────────────────┴───────────────┘
 Total params: 84,350 (329.49 KB)
 Trainable params: 84,350 (329.49 KB)
 Non-trainable params: 0 (0.00 B)

Epoch 1/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 2s 96ms/step - loss: 0.0866 - mae: 0.1583 - val_loss: 0.0697 - val_mae: 0.1225
Epoch 2/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 40ms/step - loss: 0.0769 - mae: 0.1512 - val_loss: 0.0603 - val_mae: 0.1219
Epoch 3/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 40ms/step - loss: 0.0683 - mae: 0.1525 - val_loss: 0.0502 - val_mae: 0.1235
Epoch 4/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 45ms/step - loss: 0.0628 - mae: 0.1588 - val_loss: 0.0464 - val_mae: 0.1266
Epoch 5/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 44ms/step - loss: 0.0576 - mae: 0.1580 - val_loss: 0.0454 - val_mae: 0.1291
Epoch 6/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 79ms/step - loss: 0.0551 - mae: 0.1582 - val_loss: 0.0447 - val_mae: 0.1322
Epoch 7/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 49ms/step - loss: 0.0531 - mae: 0.1595 - val_loss: 0.0454 - val_mae: 0.1318
Epoch 8/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 51ms/step - loss: 0.0505 - mae: 0.1530 - val_loss: 0.0456 - val_mae: 0.1297
Epoch 9/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 59ms/step - loss: 0.0503 - mae: 0.1521 - val_loss: 0.0423 - val_mae: 0.1309
Epoch 10/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 68ms/step - loss: 0.0491 - mae: 0.1568 - val_loss: 0.0413 - val_mae: 0.1319
Epoch 11/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 39ms/step - loss: 0.0487 - mae: 0.1546 - val_loss: 0.0431 - val_mae: 0.1288
Epoch 12/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 49ms/step - loss: 0.0475 - mae: 0.1489 - val_loss: 0.0432 - val_mae: 0.1275
Epoch 13/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 38ms/step - loss: 0.0469 - mae: 0.1460 - val_loss: 0.0446 - val_mae: 0.1251
Epoch 14/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 39ms/step - loss: 0.0470 - mae: 0.1411 - val_loss: 0.0448 - val_mae: 0.1239
Epoch 15/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 40ms/step - loss: 0.0455 - mae: 0.1388 - val_loss: 0.0418 - val_mae: 0.1237
2026-05-20 06:49:03,970 - INFO - Final training history: {'loss': [0.0866302028298378, 0.07689818739891052, 0.06833107769489288, 0.06276442855596542, 0.05760066956281662, 0.05513514205813408, 0.05307568237185478, 0.050471626222133636, 0.050263967365026474, 0.04909396171569824, 0.04867681860923767, 0.04752471297979355, 0.04690123721957207, 0.04697450250387192, 0.045482784509658813], 'mae': [0.15832071006298065, 0.15121875703334808, 0.15253736078739166, 0.15884333848953247, 0.15799875557422638, 0.15822508931159973, 0.1594753861427307, 0.1529974788427353, 0.15211187303066254, 0.15677955746650696, 0.15464553236961365, 0.14888840913772583, 0.1460086852312088, 0.14105378091335297, 0.13880734145641327], 'val_loss': [0.06970789283514023, 0.06027485430240631, 0.05020306631922722, 0.04639311134815216, 0.0453735776245594, 0.04465862363576889, 0.045426949858665466, 0.04558419808745384, 0.042337559163570404, 0.04125295579433441, 0.04311931133270264, 0.04320567101240158, 0.04456551373004913, 0.04479394108057022, 0.041840702295303345], 'val_mae': [0.12246495485305786, 0.12185020744800568, 0.12348344922065735, 0.12659423053264618, 0.12905003130435944, 0.13218747079372406, 0.13181240856647491, 0.12971799075603485, 0.13090333342552185, 0.131905198097229, 0.1288420706987381, 0.12751273810863495, 0.12514182925224304, 0.12388631701469421, 0.12368525564670563]}
2026-05-20 06:49:04,101 - INFO - Model training complete. Best model saved as /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/trained_models/bias_correction_model_month05_dekad11.keras
2026-05-20 06:49:04,104 - INFO - Pipeline [05 d2]: Loading confidence mask...
2026-05-20 06:49:04,107 - INFO - Loading existing confidence mask: /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/station_density/confidence_mask_station_density.nc4
2026-05-20 06:49:04,108 - INFO - Pipeline [05 d2]: Applying DL refinement...
2026-05-20 06:49:04,126 - INFO - Pixel-wise threshold map computed at 80th percentile. threshold_2d shape: (9, 14)
2026-05-20 06:49:04,127 - INFO - DL blending: base alpha=0.70 (LSEQM weight), 1-alpha=0.30 (DL weight)
2026-05-20 06:49:04,129 - INFO - Confidence mask active: spatial alpha modulation enabled. Confidence range: [0.000, 0.411]
2026-05-20 06:49:20,288 - INFO - DL blending complete: 250 daily slices processed, 3,928 extreme pixels blended (alpha=0.70)
2026-05-20 06:49:20,928 - INFO - Precip data dims: ('time', 'lat', 'lon'), shape: (250, 9, 14)
2026-05-20 06:49:20,986 - INFO - Saved Hybrid Deep Learning-Physical (Linear Scaling and Empirical Quantile Mapping) Approach corrected precipitation for month 05, dekad 11 at /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_lseqmdl/bali_cli_lseqmdl_corrected_imergl_month05_dekad11.nc4
2026-05-20 06:49:20,987 - INFO - Pipeline [05 d2]: Complete.
✓ month 05 dekad 2 — saved: /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_lseqmdl/bali_cli_imergl_lseqmdl_corrected_precip_month05_dekad11.nc4

============================================================
▸ month 05 dekad 3
============================================================
2026-05-20 06:49:20,991 - INFO - Pipeline [05 d3]: Running LSEQM...
2026-05-20 06:49:20,996 - INFO - Aligning IMERG and CPC datasets...
2026-05-20 06:49:21,004 - INFO - After alignment: IMERG has 9131 time steps, CPC has 9131 time steps
2026-05-20 06:49:21,005 - INFO - Creating time-based masks...
2026-05-20 06:49:21,018 - INFO - Applying time masks...
2026-05-20 06:49:21,029 - INFO - IMERG dekad data shape: (275, 9, 14)
2026-05-20 06:49:21,030 - INFO - CPC dekad data shape: (275, 9, 14)
2026-05-20 06:49:21,032 - INFO - Using native-resolution CPC parameter fitting (BCSD principle)...
2026-05-20 06:49:21,061 - INFO - CPC native dekad data: (275, 4, 6) (lat -9.25–-7.75, lon 113.75–116.25)
2026-05-20 06:49:23,283 - INFO -   Native CPC fitting: row 4/4 (100%) | 24 fitted, 0 skipped | elapsed 2s, ETA 0s
2026-05-20 06:49:23,284 - INFO - Fitted CPC params on native grid: 24/24 cells
2026-05-20 06:49:23,325 - INFO - Interpolated CPC params to IMERG grid: 126/126 valid pixels
2026-05-20 06:49:23,327 - INFO - Performing Linear Scaling (LS)...
2026-05-20 06:49:23,337 - INFO - LS using bilinearly interpolated CPC mean (smooth).
2026-05-20 06:49:23,340 - INFO - Saving LS corrected precipitation...
2026-05-20 06:49:23,343 - INFO - Precip data dims: ('time', 'lat', 'lon'), shape: (275, 9, 14)
2026-05-20 06:49:23,400 - INFO - Saved Linear Scaling corrected precipitation for month 05, dekad 21 at /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_ls/bali_cli_ls_corrected_imergl_month05_dekad21.nc4
2026-05-20 06:49:23,401 - INFO - Applying Empirical Quantile Mapping (EQM) on 9x14 grid...
2026-05-20 06:49:23,495 - INFO -   EQM progress: row 9/9 (100%) | 80 land pixels done | elapsed 0s, ETA 0s
2026-05-20 06:49:23,498 - INFO - EQM complete: 80/126 grid points corrected (46 masked/ocean pixels skipped)
2026-05-20 06:49:23,499 - INFO - Saving LSEQM corrected precipitation...
2026-05-20 06:49:23,500 - INFO - Precip data dims: ('time', 'lat', 'lon'), shape: (275, 9, 14)
2026-05-20 06:49:23,551 - INFO - Saved Linear Scaling and Empirical Quantile Mapping corrected precipitation for month 05, dekad 21 at /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_lseqm/bali_cli_lseqm_corrected_imergl_month05_dekad21.nc4
2026-05-20 06:49:23,553 - INFO - Pipeline [05 d3]: Training / loading DL model...
2026-05-20 06:49:23,554 - INFO - Checking if the model file exists at: /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/trained_models/bias_correction_model_month05_dekad21.keras

2026-05-20 06:49:23,619 - INFO - Model: "sequential_14"
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
┃ Layer (type)                    ┃ Output Shape           ┃       Param # ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│ conv2d_28 (Conv2D)              │ (None, 9, 14, 32)      │           320 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ max_pooling2d_28 (MaxPooling2D) │ (None, 4, 7, 32)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_42 (Dropout)            │ (None, 4, 7, 32)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ conv2d_29 (Conv2D)              │ (None, 4, 7, 64)       │        18,496 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ max_pooling2d_29 (MaxPooling2D) │ (None, 2, 3, 64)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_43 (Dropout)            │ (None, 2, 3, 64)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ flatten_14 (Flatten)            │ (None, 384)            │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dense_28 (Dense)                │ (None, 128)            │        49,280 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_44 (Dropout)            │ (None, 128)            │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dense_29 (Dense)                │ (None, 126)            │        16,254 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ reshape_14 (Reshape)            │ (None, 9, 14)          │             0 │
└─────────────────────────────────┴────────────────────────┴───────────────┘
 Total params: 84,350 (329.49 KB)
 Trainable params: 84,350 (329.49 KB)
 Non-trainable params: 0 (0.00 B)

Epoch 1/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 2s 92ms/step - loss: 0.1080 - mae: 0.1904 - val_loss: 0.0948 - val_mae: 0.1557
Epoch 2/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 43ms/step - loss: 0.0932 - mae: 0.1822 - val_loss: 0.0787 - val_mae: 0.1562
Epoch 3/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 44ms/step - loss: 0.0813 - mae: 0.1859 - val_loss: 0.0668 - val_mae: 0.1572
Epoch 4/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 44ms/step - loss: 0.0735 - mae: 0.1864 - val_loss: 0.0643 - val_mae: 0.1539
Epoch 5/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step - loss: 0.0675 - mae: 0.1764 - val_loss: 0.0647 - val_mae: 0.1535
Epoch 6/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 42ms/step - loss: 0.0639 - mae: 0.1717 - val_loss: 0.0608 - val_mae: 0.1561
Epoch 7/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 59ms/step - loss: 0.0612 - mae: 0.1764 - val_loss: 0.0585 - val_mae: 0.1582
Epoch 8/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 41ms/step - loss: 0.0580 - mae: 0.1732 - val_loss: 0.0600 - val_mae: 0.1555
Epoch 9/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step - loss: 0.0556 - mae: 0.1651 - val_loss: 0.0614 - val_mae: 0.1545
Epoch 10/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 40ms/step - loss: 0.0556 - mae: 0.1647 - val_loss: 0.0587 - val_mae: 0.1562
Epoch 11/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 78ms/step - loss: 0.0542 - mae: 0.1667 - val_loss: 0.0583 - val_mae: 0.1554
Epoch 12/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 58ms/step - loss: 0.0522 - mae: 0.1610 - val_loss: 0.0609 - val_mae: 0.1529
Epoch 13/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 50ms/step - loss: 0.0525 - mae: 0.1567 - val_loss: 0.0605 - val_mae: 0.1520
Epoch 14/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 61ms/step - loss: 0.0508 - mae: 0.1550 - val_loss: 0.0580 - val_mae: 0.1533
Epoch 15/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 45ms/step - loss: 0.0512 - mae: 0.1591 - val_loss: 0.0584 - val_mae: 0.1518
Epoch 16/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 46ms/step - loss: 0.0505 - mae: 0.1540 - val_loss: 0.0599 - val_mae: 0.1500
Epoch 17/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step - loss: 0.0502 - mae: 0.1522 - val_loss: 0.0581 - val_mae: 0.1509
Epoch 18/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 54ms/step - loss: 0.0489 - mae: 0.1532 - val_loss: 0.0571 - val_mae: 0.1521
Epoch 19/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step - loss: 0.0485 - mae: 0.1521 - val_loss: 0.0577 - val_mae: 0.1520
Epoch 20/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step - loss: 0.0474 - mae: 0.1501 - val_loss: 0.0577 - val_mae: 0.1524
Epoch 21/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step - loss: 0.0486 - mae: 0.1509 - val_loss: 0.0582 - val_mae: 0.1525
Epoch 22/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step - loss: 0.0464 - mae: 0.1490 - val_loss: 0.0572 - val_mae: 0.1538
Epoch 23/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step - loss: 0.0464 - mae: 0.1498 - val_loss: 0.0576 - val_mae: 0.1520
2026-05-20 06:49:29,673 - INFO - Final training history: {'loss': [0.10797258466482162, 0.0931568518280983, 0.08125656843185425, 0.07353061437606812, 0.06749986857175827, 0.06385603547096252, 0.06116514280438423, 0.058045316487550735, 0.055600836873054504, 0.05564284697175026, 0.05421166121959686, 0.05217868462204933, 0.052462946623563766, 0.05078626424074173, 0.05123508349061012, 0.05051745846867561, 0.05020274221897125, 0.04885043948888779, 0.048456136137247086, 0.047379836440086365, 0.04855860769748688, 0.04639146104454994, 0.04637191444635391], 'mae': [0.19042493402957916, 0.18220022320747375, 0.1858827769756317, 0.1863582581281662, 0.1764059215784073, 0.17170333862304688, 0.17639116942882538, 0.17322537302970886, 0.16507072746753693, 0.16473358869552612, 0.1667071133852005, 0.16102226078510284, 0.1567452847957611, 0.15501494705677032, 0.15911507606506348, 0.15404456853866577, 0.15218918025493622, 0.15324059128761292, 0.15213404595851898, 0.1500624269247055, 0.15088491141796112, 0.1489524394273758, 0.14981885254383087], 'val_loss': [0.09484756737947464, 0.07868664711713791, 0.06676054000854492, 0.06432539969682693, 0.0646577775478363, 0.06076204404234886, 0.05848774313926697, 0.06003013253211975, 0.061441570520401, 0.058659281581640244, 0.058332812041044235, 0.060931023210287094, 0.060469966381788254, 0.05796152353286743, 0.05838095396757126, 0.05990026518702507, 0.05808161571621895, 0.057137876749038696, 0.057661090046167374, 0.05771995708346367, 0.05820516496896744, 0.057181958109140396, 0.057633936405181885], 'val_mae': [0.1557234674692154, 0.15619711577892303, 0.15721692144870758, 0.1538674384355545, 0.15353190898895264, 0.1560802459716797, 0.1582418978214264, 0.15546487271785736, 0.15445971488952637, 0.15620854496955872, 0.15539932250976562, 0.15286320447921753, 0.15203335881233215, 0.15329627692699432, 0.1518465280532837, 0.14999984204769135, 0.15086442232131958, 0.15212909877300262, 0.15204374492168427, 0.15241727232933044, 0.1525048315525055, 0.15376704931259155, 0.15200519561767578]}
2026-05-20 06:49:29,820 - INFO - Model training complete. Best model saved as /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/trained_models/bias_correction_model_month05_dekad21.keras
2026-05-20 06:49:29,823 - INFO - Pipeline [05 d3]: Loading confidence mask...
2026-05-20 06:49:29,826 - INFO - Loading existing confidence mask: /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/station_density/confidence_mask_station_density.nc4
2026-05-20 06:49:29,826 - INFO - Pipeline [05 d3]: Applying DL refinement...
2026-05-20 06:49:29,841 - INFO - Pixel-wise threshold map computed at 80th percentile. threshold_2d shape: (9, 14)
2026-05-20 06:49:29,842 - INFO - DL blending: base alpha=0.70 (LSEQM weight), 1-alpha=0.30 (DL weight)
2026-05-20 06:49:29,843 - INFO - Confidence mask active: spatial alpha modulation enabled. Confidence range: [0.000, 0.411]
2026-05-20 06:49:48,932 - INFO - DL blending complete: 275 daily slices processed, 4,386 extreme pixels blended (alpha=0.70)
2026-05-20 06:49:49,038 - INFO - Precip data dims: ('time', 'lat', 'lon'), shape: (275, 9, 14)
2026-05-20 06:49:49,085 - INFO - Saved Hybrid Deep Learning-Physical (Linear Scaling and Empirical Quantile Mapping) Approach corrected precipitation for month 05, dekad 21 at /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_lseqmdl/bali_cli_lseqmdl_corrected_imergl_month05_dekad21.nc4
2026-05-20 06:49:49,087 - INFO - Pipeline [05 d3]: Complete.
✓ month 05 dekad 3 — saved: /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_lseqmdl/bali_cli_imergl_lseqmdl_corrected_precip_month05_dekad21.nc4

============================================================
▸ month 06 dekad 1
============================================================
2026-05-20 06:49:49,087 - INFO - Pipeline [06 d1]: Running LSEQM...
2026-05-20 06:49:49,092 - INFO - Aligning IMERG and CPC datasets...
2026-05-20 06:49:49,100 - INFO - After alignment: IMERG has 9131 time steps, CPC has 9131 time steps
2026-05-20 06:49:49,101 - INFO - Creating time-based masks...
2026-05-20 06:49:49,112 - INFO - Applying time masks...
2026-05-20 06:49:49,124 - INFO - IMERG dekad data shape: (250, 9, 14)
2026-05-20 06:49:49,125 - INFO - CPC dekad data shape: (250, 9, 14)
2026-05-20 06:49:49,128 - INFO - Using native-resolution CPC parameter fitting (BCSD principle)...
2026-05-20 06:49:49,158 - INFO - CPC native dekad data: (250, 4, 6) (lat -9.25–-7.75, lon 113.75–116.25)
2026-05-20 06:49:51,785 - INFO -   Native CPC fitting: row 4/4 (100%) | 24 fitted, 0 skipped | elapsed 3s, ETA 0s
2026-05-20 06:49:51,786 - INFO - Fitted CPC params on native grid: 24/24 cells
2026-05-20 06:49:51,844 - INFO - Interpolated CPC params to IMERG grid: 126/126 valid pixels
2026-05-20 06:49:51,845 - INFO - Performing Linear Scaling (LS)...
2026-05-20 06:49:51,856 - INFO - LS using bilinearly interpolated CPC mean (smooth).
2026-05-20 06:49:51,859 - INFO - Saving LS corrected precipitation...
2026-05-20 06:49:51,862 - INFO - Precip data dims: ('time', 'lat', 'lon'), shape: (250, 9, 14)
2026-05-20 06:49:51,927 - INFO - Saved Linear Scaling corrected precipitation for month 06, dekad 01 at /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_ls/bali_cli_ls_corrected_imergl_month06_dekad01.nc4
2026-05-20 06:49:51,930 - INFO - Applying Empirical Quantile Mapping (EQM) on 9x14 grid...
2026-05-20 06:49:52,038 - INFO -   EQM progress: row 9/9 (100%) | 80 land pixels done | elapsed 0s, ETA 0s
2026-05-20 06:49:52,042 - INFO - EQM complete: 80/126 grid points corrected (46 masked/ocean pixels skipped)
2026-05-20 06:49:52,042 - INFO - Saving LSEQM corrected precipitation...
2026-05-20 06:49:52,044 - INFO - Precip data dims: ('time', 'lat', 'lon'), shape: (250, 9, 14)
2026-05-20 06:49:52,106 - INFO - Saved Linear Scaling and Empirical Quantile Mapping corrected precipitation for month 06, dekad 01 at /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_lseqm/bali_cli_lseqm_corrected_imergl_month06_dekad01.nc4
2026-05-20 06:49:52,107 - INFO - Pipeline [06 d1]: Training / loading DL model...
2026-05-20 06:49:52,108 - INFO - Checking if the model file exists at: /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/trained_models/bias_correction_model_month06_dekad01.keras

2026-05-20 06:49:52,184 - INFO - Model: "sequential_15"
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
┃ Layer (type)                    ┃ Output Shape           ┃       Param # ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│ conv2d_30 (Conv2D)              │ (None, 9, 14, 32)      │           320 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ max_pooling2d_30 (MaxPooling2D) │ (None, 4, 7, 32)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_45 (Dropout)            │ (None, 4, 7, 32)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ conv2d_31 (Conv2D)              │ (None, 4, 7, 64)       │        18,496 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ max_pooling2d_31 (MaxPooling2D) │ (None, 2, 3, 64)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_46 (Dropout)            │ (None, 2, 3, 64)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ flatten_15 (Flatten)            │ (None, 384)            │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dense_30 (Dense)                │ (None, 128)            │        49,280 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_47 (Dropout)            │ (None, 128)            │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dense_31 (Dense)                │ (None, 126)            │        16,254 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ reshape_15 (Reshape)            │ (None, 9, 14)          │             0 │
└─────────────────────────────────┴────────────────────────┴───────────────┘
 Total params: 84,350 (329.49 KB)
 Trainable params: 84,350 (329.49 KB)
 Non-trainable params: 0 (0.00 B)

Epoch 1/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 2s 94ms/step - loss: 0.0792 - mae: 0.1503 - val_loss: 0.1296 - val_mae: 0.2028
Epoch 2/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 42ms/step - loss: 0.0716 - mae: 0.1425 - val_loss: 0.1188 - val_mae: 0.1974
Epoch 3/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 44ms/step - loss: 0.0657 - mae: 0.1460 - val_loss: 0.1016 - val_mae: 0.1907
Epoch 4/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 43ms/step - loss: 0.0625 - mae: 0.1598 - val_loss: 0.0882 - val_mae: 0.1845
Epoch 5/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 43ms/step - loss: 0.0605 - mae: 0.1663 - val_loss: 0.0862 - val_mae: 0.1815
Epoch 6/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step - loss: 0.0558 - mae: 0.1561 - val_loss: 0.0935 - val_mae: 0.1835
Epoch 7/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step - loss: 0.0545 - mae: 0.1465 - val_loss: 0.0970 - val_mae: 0.1844
Epoch 8/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step - loss: 0.0537 - mae: 0.1439 - val_loss: 0.0929 - val_mae: 0.1822
Epoch 9/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step - loss: 0.0528 - mae: 0.1473 - val_loss: 0.0862 - val_mae: 0.1792
Epoch 10/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 42ms/step - loss: 0.0510 - mae: 0.1501 - val_loss: 0.0804 - val_mae: 0.1770
Epoch 11/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 43ms/step - loss: 0.0520 - mae: 0.1583 - val_loss: 0.0772 - val_mae: 0.1763
Epoch 12/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step - loss: 0.0495 - mae: 0.1538 - val_loss: 0.0842 - val_mae: 0.1775
Epoch 13/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step - loss: 0.0499 - mae: 0.1470 - val_loss: 0.0901 - val_mae: 0.1797
Epoch 14/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step - loss: 0.0487 - mae: 0.1383 - val_loss: 0.0918 - val_mae: 0.1802
Epoch 15/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step - loss: 0.0493 - mae: 0.1397 - val_loss: 0.0870 - val_mae: 0.1779
Epoch 16/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step - loss: 0.0470 - mae: 0.1423 - val_loss: 0.0805 - val_mae: 0.1757
2026-05-20 06:49:56,386 - INFO - Final training history: {'loss': [0.0791606679558754, 0.07155061513185501, 0.0656743124127388, 0.06245379522442818, 0.0604904368519783, 0.05575619637966156, 0.05454027280211449, 0.053716570138931274, 0.052839674055576324, 0.05096527189016342, 0.052003707736730576, 0.049456313252449036, 0.049868784844875336, 0.04871615022420883, 0.049315862357616425, 0.04700249060988426], 'mae': [0.15033148229122162, 0.14245548844337463, 0.1460343301296234, 0.15978211164474487, 0.1662972867488861, 0.15613874793052673, 0.14649467170238495, 0.14391763508319855, 0.14727729558944702, 0.15007521212100983, 0.15834812819957733, 0.15381883084774017, 0.14698494970798492, 0.138309046626091, 0.13972334563732147, 0.1423317939043045], 'val_loss': [0.12955039739608765, 0.11878000944852829, 0.1015729233622551, 0.0881829485297203, 0.08616572618484497, 0.09354107826948166, 0.09695792943239212, 0.09286118298768997, 0.08617819100618362, 0.08037249743938446, 0.0772017240524292, 0.08417084068059921, 0.09006255120038986, 0.09176885336637497, 0.08697670698165894, 0.08045343309640884], 'val_mae': [0.20282715559005737, 0.19737040996551514, 0.19065441191196442, 0.18454837799072266, 0.18152350187301636, 0.18345409631729126, 0.18440020084381104, 0.1821877807378769, 0.17915397882461548, 0.17700134217739105, 0.1762513667345047, 0.17751523852348328, 0.17973874509334564, 0.18016394972801208, 0.17787867784500122, 0.17567680776119232]}
2026-05-20 06:49:56,524 - INFO - Model training complete. Best model saved as /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/trained_models/bias_correction_model_month06_dekad01.keras
2026-05-20 06:49:56,525 - INFO - Pipeline [06 d1]: Loading confidence mask...
2026-05-20 06:49:56,527 - INFO - Loading existing confidence mask: /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/station_density/confidence_mask_station_density.nc4
2026-05-20 06:49:56,528 - INFO - Pipeline [06 d1]: Applying DL refinement...
2026-05-20 06:49:56,543 - INFO - Pixel-wise threshold map computed at 80th percentile. threshold_2d shape: (9, 14)
2026-05-20 06:49:56,544 - INFO - DL blending: base alpha=0.70 (LSEQM weight), 1-alpha=0.30 (DL weight)
2026-05-20 06:49:56,545 - INFO - Confidence mask active: spatial alpha modulation enabled. Confidence range: [0.000, 0.411]
2026-05-20 06:50:13,391 - INFO - DL blending complete: 250 daily slices processed, 3,861 extreme pixels blended (alpha=0.70)
2026-05-20 06:50:13,483 - INFO - Precip data dims: ('time', 'lat', 'lon'), shape: (250, 9, 14)
2026-05-20 06:50:13,528 - INFO - Saved Hybrid Deep Learning-Physical (Linear Scaling and Empirical Quantile Mapping) Approach corrected precipitation for month 06, dekad 01 at /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_lseqmdl/bali_cli_lseqmdl_corrected_imergl_month06_dekad01.nc4
2026-05-20 06:50:13,529 - INFO - Pipeline [06 d1]: Complete.
✓ month 06 dekad 1 — saved: /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_lseqmdl/bali_cli_imergl_lseqmdl_corrected_precip_month06_dekad01.nc4

============================================================
▸ month 06 dekad 2
============================================================
2026-05-20 06:50:13,530 - INFO - Pipeline [06 d2]: Running LSEQM...
2026-05-20 06:50:13,536 - INFO - Aligning IMERG and CPC datasets...
2026-05-20 06:50:13,544 - INFO - After alignment: IMERG has 9131 time steps, CPC has 9131 time steps
2026-05-20 06:50:13,545 - INFO - Creating time-based masks...
2026-05-20 06:50:13,558 - INFO - Applying time masks...
2026-05-20 06:50:13,572 - INFO - IMERG dekad data shape: (250, 9, 14)
2026-05-20 06:50:13,574 - INFO - CPC dekad data shape: (250, 9, 14)
2026-05-20 06:50:13,579 - INFO - Using native-resolution CPC parameter fitting (BCSD principle)...
2026-05-20 06:50:13,608 - INFO - CPC native dekad data: (250, 4, 6) (lat -9.25–-7.75, lon 113.75–116.25)
2026-05-20 06:50:16,059 - INFO -   Native CPC fitting: row 4/4 (100%) | 24 fitted, 0 skipped | elapsed 2s, ETA 0s
2026-05-20 06:50:16,060 - INFO - Fitted CPC params on native grid: 24/24 cells
2026-05-20 06:50:16,111 - INFO - Interpolated CPC params to IMERG grid: 126/126 valid pixels
2026-05-20 06:50:16,112 - INFO - Performing Linear Scaling (LS)...
2026-05-20 06:50:16,122 - INFO - LS using bilinearly interpolated CPC mean (smooth).
2026-05-20 06:50:16,125 - INFO - Saving LS corrected precipitation...
2026-05-20 06:50:16,128 - INFO - Precip data dims: ('time', 'lat', 'lon'), shape: (250, 9, 14)
2026-05-20 06:50:16,175 - INFO - Saved Linear Scaling corrected precipitation for month 06, dekad 11 at /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_ls/bali_cli_ls_corrected_imergl_month06_dekad11.nc4
2026-05-20 06:50:16,176 - INFO - Applying Empirical Quantile Mapping (EQM) on 9x14 grid...
2026-05-20 06:50:16,271 - INFO -   EQM progress: row 9/9 (100%) | 80 land pixels done | elapsed 0s, ETA 0s
2026-05-20 06:50:16,274 - INFO - EQM complete: 80/126 grid points corrected (46 masked/ocean pixels skipped)
2026-05-20 06:50:16,276 - INFO - Saving LSEQM corrected precipitation...
2026-05-20 06:50:16,279 - INFO - Precip data dims: ('time', 'lat', 'lon'), shape: (250, 9, 14)
2026-05-20 06:50:16,329 - INFO - Saved Linear Scaling and Empirical Quantile Mapping corrected precipitation for month 06, dekad 11 at /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_lseqm/bali_cli_lseqm_corrected_imergl_month06_dekad11.nc4
2026-05-20 06:50:16,330 - INFO - Pipeline [06 d2]: Training / loading DL model...
2026-05-20 06:50:16,331 - INFO - Checking if the model file exists at: /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/trained_models/bias_correction_model_month06_dekad11.keras

2026-05-20 06:50:16,426 - INFO - Model: "sequential_16"
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
┃ Layer (type)                    ┃ Output Shape           ┃       Param # ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│ conv2d_32 (Conv2D)              │ (None, 9, 14, 32)      │           320 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ max_pooling2d_32 (MaxPooling2D) │ (None, 4, 7, 32)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_48 (Dropout)            │ (None, 4, 7, 32)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ conv2d_33 (Conv2D)              │ (None, 4, 7, 64)       │        18,496 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ max_pooling2d_33 (MaxPooling2D) │ (None, 2, 3, 64)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_49 (Dropout)            │ (None, 2, 3, 64)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ flatten_16 (Flatten)            │ (None, 384)            │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dense_32 (Dense)                │ (None, 128)            │        49,280 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_50 (Dropout)            │ (None, 128)            │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dense_33 (Dense)                │ (None, 126)            │        16,254 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ reshape_16 (Reshape)            │ (None, 9, 14)          │             0 │
└─────────────────────────────────┴────────────────────────┴───────────────┘
 Total params: 84,350 (329.49 KB)
 Trainable params: 84,350 (329.49 KB)
 Non-trainable params: 0 (0.00 B)

Epoch 1/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 2s 147ms/step - loss: 0.0835 - mae: 0.1509 - val_loss: 0.0697 - val_mae: 0.1229
Epoch 2/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 68ms/step - loss: 0.0759 - mae: 0.1460 - val_loss: 0.0613 - val_mae: 0.1264
Epoch 3/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 69ms/step - loss: 0.0674 - mae: 0.1490 - val_loss: 0.0521 - val_mae: 0.1344
Epoch 4/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 44ms/step - loss: 0.0621 - mae: 0.1581 - val_loss: 0.0476 - val_mae: 0.1351
Epoch 5/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 52ms/step - loss: 0.0585 - mae: 0.1555 - val_loss: 0.0467 - val_mae: 0.1288
Epoch 6/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 44ms/step - loss: 0.0558 - mae: 0.1505 - val_loss: 0.0461 - val_mae: 0.1283
Epoch 7/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 45ms/step - loss: 0.0529 - mae: 0.1487 - val_loss: 0.0436 - val_mae: 0.1316
Epoch 8/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 41ms/step - loss: 0.0501 - mae: 0.1521 - val_loss: 0.0419 - val_mae: 0.1346
Epoch 9/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step - loss: 0.0502 - mae: 0.1530 - val_loss: 0.0421 - val_mae: 0.1297
Epoch 10/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step - loss: 0.0483 - mae: 0.1467 - val_loss: 0.0426 - val_mae: 0.1285
Epoch 11/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step - loss: 0.0483 - mae: 0.1466 - val_loss: 0.0431 - val_mae: 0.1278
Epoch 12/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step - loss: 0.0478 - mae: 0.1450 - val_loss: 0.0433 - val_mae: 0.1267
Epoch 13/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step - loss: 0.0462 - mae: 0.1428 - val_loss: 0.0419 - val_mae: 0.1281
2026-05-20 06:50:20,619 - INFO - Final training history: {'loss': [0.08345184475183487, 0.07585816085338593, 0.06735112518072128, 0.0621207095682621, 0.05848045274615288, 0.05584409087896347, 0.05286280810832977, 0.05008812993764877, 0.050193339586257935, 0.04829326272010803, 0.0482722707092762, 0.0478421151638031, 0.04616359621286392], 'mae': [0.15085065364837646, 0.1459515541791916, 0.14896894991397858, 0.158124640583992, 0.1555299162864685, 0.1504731923341751, 0.14871905744075775, 0.1521255075931549, 0.15299810469150543, 0.1466529816389084, 0.146592378616333, 0.14495819807052612, 0.1427943855524063], 'val_loss': [0.06969944387674332, 0.061264511197805405, 0.05211564525961876, 0.04761667549610138, 0.04666709899902344, 0.04613615572452545, 0.04356122016906738, 0.04190877825021744, 0.04208673536777496, 0.04259612038731575, 0.04313831403851509, 0.04331562668085098, 0.04192585125565529], 'val_mae': [0.12289228290319443, 0.12638305127620697, 0.13435202836990356, 0.13506077229976654, 0.1288232058286667, 0.12831439077854156, 0.13162168860435486, 0.1345810741186142, 0.12972812354564667, 0.12854953110218048, 0.12784641981124878, 0.12671999633312225, 0.12814520299434662]}
2026-05-20 06:50:20,761 - INFO - Model training complete. Best model saved as /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/trained_models/bias_correction_model_month06_dekad11.keras
2026-05-20 06:50:20,765 - INFO - Pipeline [06 d2]: Loading confidence mask...
2026-05-20 06:50:20,767 - INFO - Loading existing confidence mask: /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/station_density/confidence_mask_station_density.nc4
2026-05-20 06:50:20,768 - INFO - Pipeline [06 d2]: Applying DL refinement...
2026-05-20 06:50:20,783 - INFO - Pixel-wise threshold map computed at 80th percentile. threshold_2d shape: (9, 14)
2026-05-20 06:50:20,785 - INFO - DL blending: base alpha=0.70 (LSEQM weight), 1-alpha=0.30 (DL weight)
2026-05-20 06:50:20,786 - INFO - Confidence mask active: spatial alpha modulation enabled. Confidence range: [0.000, 0.411]
2026-05-20 06:50:37,622 - INFO - DL blending complete: 250 daily slices processed, 3,840 extreme pixels blended (alpha=0.70)
2026-05-20 06:50:37,712 - INFO - Precip data dims: ('time', 'lat', 'lon'), shape: (250, 9, 14)
2026-05-20 06:50:37,760 - INFO - Saved Hybrid Deep Learning-Physical (Linear Scaling and Empirical Quantile Mapping) Approach corrected precipitation for month 06, dekad 11 at /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_lseqmdl/bali_cli_lseqmdl_corrected_imergl_month06_dekad11.nc4
2026-05-20 06:50:37,762 - INFO - Pipeline [06 d2]: Complete.
✓ month 06 dekad 2 — saved: /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_lseqmdl/bali_cli_imergl_lseqmdl_corrected_precip_month06_dekad11.nc4

============================================================
▸ month 06 dekad 3
============================================================
2026-05-20 06:50:37,766 - INFO - Pipeline [06 d3]: Running LSEQM...
2026-05-20 06:50:37,769 - INFO - Aligning IMERG and CPC datasets...
2026-05-20 06:50:37,777 - INFO - After alignment: IMERG has 9131 time steps, CPC has 9131 time steps
2026-05-20 06:50:37,778 - INFO - Creating time-based masks...
2026-05-20 06:50:37,789 - INFO - Applying time masks...
2026-05-20 06:50:37,799 - INFO - IMERG dekad data shape: (250, 9, 14)
2026-05-20 06:50:37,800 - INFO - CPC dekad data shape: (250, 9, 14)
2026-05-20 06:50:37,803 - INFO - Using native-resolution CPC parameter fitting (BCSD principle)...
2026-05-20 06:50:37,832 - INFO - CPC native dekad data: (250, 4, 6) (lat -9.25–-7.75, lon 113.75–116.25)
2026-05-20 06:50:41,163 - INFO -   Native CPC fitting: row 4/4 (100%) | 24 fitted, 0 skipped | elapsed 3s, ETA 0s
2026-05-20 06:50:41,164 - INFO - Fitted CPC params on native grid: 24/24 cells
2026-05-20 06:50:41,213 - INFO - Interpolated CPC params to IMERG grid: 126/126 valid pixels
2026-05-20 06:50:41,214 - INFO - Performing Linear Scaling (LS)...
2026-05-20 06:50:41,226 - INFO - LS using bilinearly interpolated CPC mean (smooth).
2026-05-20 06:50:41,231 - INFO - Saving LS corrected precipitation...
2026-05-20 06:50:41,233 - INFO - Precip data dims: ('time', 'lat', 'lon'), shape: (250, 9, 14)
2026-05-20 06:50:41,283 - INFO - Saved Linear Scaling corrected precipitation for month 06, dekad 21 at /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_ls/bali_cli_ls_corrected_imergl_month06_dekad21.nc4
2026-05-20 06:50:41,284 - INFO - Applying Empirical Quantile Mapping (EQM) on 9x14 grid...
2026-05-20 06:50:41,362 - INFO -   EQM progress: row 9/9 (100%) | 80 land pixels done | elapsed 0s, ETA 0s
2026-05-20 06:50:41,365 - INFO - EQM complete: 80/126 grid points corrected (46 masked/ocean pixels skipped)
2026-05-20 06:50:41,366 - INFO - Saving LSEQM corrected precipitation...
2026-05-20 06:50:41,368 - INFO - Precip data dims: ('time', 'lat', 'lon'), shape: (250, 9, 14)
2026-05-20 06:50:41,413 - INFO - Saved Linear Scaling and Empirical Quantile Mapping corrected precipitation for month 06, dekad 21 at /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_lseqm/bali_cli_lseqm_corrected_imergl_month06_dekad21.nc4
2026-05-20 06:50:41,414 - INFO - Pipeline [06 d3]: Training / loading DL model...
2026-05-20 06:50:41,415 - INFO - Checking if the model file exists at: /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/trained_models/bias_correction_model_month06_dekad21.keras

2026-05-20 06:50:41,472 - INFO - Model: "sequential_17"
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
┃ Layer (type)                    ┃ Output Shape           ┃       Param # ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│ conv2d_34 (Conv2D)              │ (None, 9, 14, 32)      │           320 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ max_pooling2d_34 (MaxPooling2D) │ (None, 4, 7, 32)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_51 (Dropout)            │ (None, 4, 7, 32)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ conv2d_35 (Conv2D)              │ (None, 4, 7, 64)       │        18,496 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ max_pooling2d_35 (MaxPooling2D) │ (None, 2, 3, 64)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_52 (Dropout)            │ (None, 2, 3, 64)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ flatten_17 (Flatten)            │ (None, 384)            │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dense_34 (Dense)                │ (None, 128)            │        49,280 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_53 (Dropout)            │ (None, 128)            │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dense_35 (Dense)                │ (None, 126)            │        16,254 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ reshape_17 (Reshape)            │ (None, 9, 14)          │             0 │
└─────────────────────────────────┴────────────────────────┴───────────────┘
 Total params: 84,350 (329.49 KB)
 Trainable params: 84,350 (329.49 KB)
 Non-trainable params: 0 (0.00 B)

Epoch 1/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 2s 156ms/step - loss: 0.0731 - mae: 0.1358 - val_loss: 0.1162 - val_mae: 0.1798
Epoch 2/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 68ms/step - loss: 0.0668 - mae: 0.1342 - val_loss: 0.1043 - val_mae: 0.1765
Epoch 3/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 72ms/step - loss: 0.0613 - mae: 0.1418 - val_loss: 0.0903 - val_mae: 0.1705
Epoch 4/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 60ms/step - loss: 0.0569 - mae: 0.1447 - val_loss: 0.0849 - val_mae: 0.1661
Epoch 5/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 42ms/step - loss: 0.0537 - mae: 0.1424 - val_loss: 0.0810 - val_mae: 0.1646
Epoch 6/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 45ms/step - loss: 0.0512 - mae: 0.1420 - val_loss: 0.0786 - val_mae: 0.1636
Epoch 7/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 41ms/step - loss: 0.0496 - mae: 0.1399 - val_loss: 0.0747 - val_mae: 0.1608
Epoch 8/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 43ms/step - loss: 0.0474 - mae: 0.1409 - val_loss: 0.0669 - val_mae: 0.1561
Epoch 9/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 42ms/step - loss: 0.0466 - mae: 0.1447 - val_loss: 0.0650 - val_mae: 0.1540
Epoch 10/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step - loss: 0.0448 - mae: 0.1409 - val_loss: 0.0693 - val_mae: 0.1552
Epoch 11/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step - loss: 0.0438 - mae: 0.1339 - val_loss: 0.0687 - val_mae: 0.1537
Epoch 12/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step - loss: 0.0433 - mae: 0.1325 - val_loss: 0.0663 - val_mae: 0.1507
Epoch 13/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step - loss: 0.0437 - mae: 0.1340 - val_loss: 0.0655 - val_mae: 0.1494
Epoch 14/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 44ms/step - loss: 0.0428 - mae: 0.1313 - val_loss: 0.0637 - val_mae: 0.1480
Epoch 15/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step - loss: 0.0434 - mae: 0.1345 - val_loss: 0.0640 - val_mae: 0.1484
Epoch 16/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step - loss: 0.0419 - mae: 0.1303 - val_loss: 0.0677 - val_mae: 0.1514
Epoch 17/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 33ms/step - loss: 0.0405 - mae: 0.1266 - val_loss: 0.0654 - val_mae: 0.1511
Epoch 18/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 42ms/step - loss: 0.0409 - mae: 0.1297 - val_loss: 0.0610 - val_mae: 0.1492
Epoch 19/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 44ms/step - loss: 0.0412 - mae: 0.1346 - val_loss: 0.0607 - val_mae: 0.1484
Epoch 20/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step - loss: 0.0396 - mae: 0.1282 - val_loss: 0.0655 - val_mae: 0.1505
Epoch 21/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step - loss: 0.0393 - mae: 0.1250 - val_loss: 0.0654 - val_mae: 0.1501
Epoch 22/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step - loss: 0.0390 - mae: 0.1239 - val_loss: 0.0629 - val_mae: 0.1480
Epoch 23/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 44ms/step - loss: 0.0376 - mae: 0.1235 - val_loss: 0.0577 - val_mae: 0.1445
Epoch 24/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step - loss: 0.0380 - mae: 0.1269 - val_loss: 0.0610 - val_mae: 0.1468
Epoch 25/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step - loss: 0.0374 - mae: 0.1211 - val_loss: 0.0671 - val_mae: 0.1516
Epoch 26/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step - loss: 0.0371 - mae: 0.1184 - val_loss: 0.0628 - val_mae: 0.1493
Epoch 27/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step - loss: 0.0363 - mae: 0.1214 - val_loss: 0.0603 - val_mae: 0.1469
Epoch 28/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step - loss: 0.0359 - mae: 0.1193 - val_loss: 0.0639 - val_mae: 0.1483
2026-05-20 06:50:47,871 - INFO - Final training history: {'loss': [0.07314199209213257, 0.06677485257387161, 0.06125982850790024, 0.056873250752687454, 0.053693875670433044, 0.05119451507925987, 0.04958430305123329, 0.04742421582341194, 0.046553559601306915, 0.04479329660534859, 0.04383884370326996, 0.04333679750561714, 0.043743059039115906, 0.04284200072288513, 0.0434027761220932, 0.04194317385554314, 0.04054374247789383, 0.040868304669857025, 0.04117201641201973, 0.039614904671907425, 0.039305683225393295, 0.039024002850055695, 0.037619397044181824, 0.037999071180820465, 0.03739568963646889, 0.03707868605852127, 0.036310821771621704, 0.0358746200799942], 'mae': [0.13575682044029236, 0.1341608166694641, 0.14175379276275635, 0.14466774463653564, 0.14240941405296326, 0.14198508858680725, 0.13994911313056946, 0.1409258246421814, 0.14469249546527863, 0.14088012278079987, 0.13390447199344635, 0.13247039914131165, 0.1339654177427292, 0.1312968134880066, 0.13448302447795868, 0.1302804797887802, 0.12659992277622223, 0.12974891066551208, 0.13459302484989166, 0.1281658411026001, 0.12504807114601135, 0.12389599531888962, 0.1235310286283493, 0.12691152095794678, 0.12111031264066696, 0.1184399425983429, 0.12143527716398239, 0.11925309151411057], 'val_loss': [0.11619880795478821, 0.10433206707239151, 0.09025426208972931, 0.08489899337291718, 0.08097648620605469, 0.07856178283691406, 0.07470483332872391, 0.06687261909246445, 0.06495925784111023, 0.06934753060340881, 0.06874413788318634, 0.06632674485445023, 0.06554964184761047, 0.06365610659122467, 0.06402934342622757, 0.06767497956752777, 0.06538909673690796, 0.06097377464175224, 0.060680270195007324, 0.06547584384679794, 0.06543764472007751, 0.06292259693145752, 0.05771482363343239, 0.060981228947639465, 0.06714217364788055, 0.06281597167253494, 0.06032043322920799, 0.06390929222106934], 'val_mae': [0.17979268729686737, 0.17647680640220642, 0.1705453097820282, 0.16613319516181946, 0.16463981568813324, 0.16359438002109528, 0.16080434620380402, 0.15609626471996307, 0.1540326029062271, 0.15520766377449036, 0.1537226289510727, 0.15070189535617828, 0.14938437938690186, 0.14801108837127686, 0.14842626452445984, 0.15135253965854645, 0.151140496134758, 0.14923861622810364, 0.14839614927768707, 0.1505349576473236, 0.1501423567533493, 0.14797283709049225, 0.144475519657135, 0.14680437743663788, 0.15156497061252594, 0.14931227266788483, 0.1469028741121292, 0.1482950747013092]}
2026-05-20 06:50:48,015 - INFO - Model training complete. Best model saved as /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/trained_models/bias_correction_model_month06_dekad21.keras
2026-05-20 06:50:48,017 - INFO - Pipeline [06 d3]: Loading confidence mask...
2026-05-20 06:50:48,019 - INFO - Loading existing confidence mask: /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/station_density/confidence_mask_station_density.nc4
2026-05-20 06:50:48,019 - INFO - Pipeline [06 d3]: Applying DL refinement...
2026-05-20 06:50:48,036 - INFO - Pixel-wise threshold map computed at 80th percentile. threshold_2d shape: (9, 14)
2026-05-20 06:50:48,037 - INFO - DL blending: base alpha=0.70 (LSEQM weight), 1-alpha=0.30 (DL weight)
2026-05-20 06:50:48,038 - INFO - Confidence mask active: spatial alpha modulation enabled. Confidence range: [0.000, 0.411]
2026-05-20 06:51:09,086 - INFO - DL blending complete: 250 daily slices processed, 3,496 extreme pixels blended (alpha=0.70)
2026-05-20 06:51:09,184 - INFO - Precip data dims: ('time', 'lat', 'lon'), shape: (250, 9, 14)
2026-05-20 06:51:09,249 - INFO - Saved Hybrid Deep Learning-Physical (Linear Scaling and Empirical Quantile Mapping) Approach corrected precipitation for month 06, dekad 21 at /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_lseqmdl/bali_cli_lseqmdl_corrected_imergl_month06_dekad21.nc4
2026-05-20 06:51:09,250 - INFO - Pipeline [06 d3]: Complete.
✓ month 06 dekad 3 — saved: /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_lseqmdl/bali_cli_imergl_lseqmdl_corrected_precip_month06_dekad21.nc4

============================================================
▸ month 07 dekad 1
============================================================
2026-05-20 06:51:09,251 - INFO - Pipeline [07 d1]: Running LSEQM...
2026-05-20 06:51:09,257 - INFO - Aligning IMERG and CPC datasets...
2026-05-20 06:51:09,266 - INFO - After alignment: IMERG has 9131 time steps, CPC has 9131 time steps
2026-05-20 06:51:09,267 - INFO - Creating time-based masks...
2026-05-20 06:51:09,279 - INFO - Applying time masks...
2026-05-20 06:51:09,292 - INFO - IMERG dekad data shape: (250, 9, 14)
2026-05-20 06:51:09,293 - INFO - CPC dekad data shape: (250, 9, 14)
2026-05-20 06:51:09,296 - INFO - Using native-resolution CPC parameter fitting (BCSD principle)...
2026-05-20 06:51:09,328 - INFO - CPC native dekad data: (250, 4, 6) (lat -9.25–-7.75, lon 113.75–116.25)
2026-05-20 06:51:12,788 - INFO -   Native CPC fitting: row 4/4 (100%) | 24 fitted, 0 skipped | elapsed 3s, ETA 0s
2026-05-20 06:51:12,789 - INFO - Fitted CPC params on native grid: 24/24 cells
2026-05-20 06:51:12,833 - INFO - Interpolated CPC params to IMERG grid: 126/126 valid pixels
2026-05-20 06:51:12,834 - INFO - Performing Linear Scaling (LS)...
2026-05-20 06:51:12,846 - INFO - LS using bilinearly interpolated CPC mean (smooth).
2026-05-20 06:51:12,850 - INFO - Saving LS corrected precipitation...
2026-05-20 06:51:12,855 - INFO - Precip data dims: ('time', 'lat', 'lon'), shape: (250, 9, 14)
2026-05-20 06:51:12,903 - INFO - Saved Linear Scaling corrected precipitation for month 07, dekad 01 at /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_ls/bali_cli_ls_corrected_imergl_month07_dekad01.nc4
2026-05-20 06:51:12,904 - INFO - Applying Empirical Quantile Mapping (EQM) on 9x14 grid...
2026-05-20 06:51:12,978 - INFO -   EQM progress: row 9/9 (100%) | 80 land pixels done | elapsed 0s, ETA 0s
2026-05-20 06:51:12,981 - INFO - EQM complete: 80/126 grid points corrected (46 masked/ocean pixels skipped)
2026-05-20 06:51:12,983 - INFO - Saving LSEQM corrected precipitation...
2026-05-20 06:51:12,986 - INFO - Precip data dims: ('time', 'lat', 'lon'), shape: (250, 9, 14)
2026-05-20 06:51:13,033 - INFO - Saved Linear Scaling and Empirical Quantile Mapping corrected precipitation for month 07, dekad 01 at /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_lseqm/bali_cli_lseqm_corrected_imergl_month07_dekad01.nc4
2026-05-20 06:51:13,034 - INFO - Pipeline [07 d1]: Training / loading DL model...
2026-05-20 06:51:13,036 - INFO - Checking if the model file exists at: /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/trained_models/bias_correction_model_month07_dekad01.keras

2026-05-20 06:51:13,099 - INFO - Model: "sequential_18"
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
┃ Layer (type)                    ┃ Output Shape           ┃       Param # ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│ conv2d_36 (Conv2D)              │ (None, 9, 14, 32)      │           320 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ max_pooling2d_36 (MaxPooling2D) │ (None, 4, 7, 32)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_54 (Dropout)            │ (None, 4, 7, 32)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ conv2d_37 (Conv2D)              │ (None, 4, 7, 64)       │        18,496 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ max_pooling2d_37 (MaxPooling2D) │ (None, 2, 3, 64)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_55 (Dropout)            │ (None, 2, 3, 64)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ flatten_18 (Flatten)            │ (None, 384)            │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dense_36 (Dense)                │ (None, 128)            │        49,280 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_56 (Dropout)            │ (None, 128)            │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dense_37 (Dense)                │ (None, 126)            │        16,254 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ reshape_18 (Reshape)            │ (None, 9, 14)          │             0 │
└─────────────────────────────────┴────────────────────────┴───────────────┘
 Total params: 84,350 (329.49 KB)
 Trainable params: 84,350 (329.49 KB)
 Non-trainable params: 0 (0.00 B)

Epoch 1/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 2s 92ms/step - loss: 0.0665 - mae: 0.1222 - val_loss: 0.1410 - val_mae: 0.2133
Epoch 2/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 42ms/step - loss: 0.0615 - mae: 0.1209 - val_loss: 0.1279 - val_mae: 0.2082
Epoch 3/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 48ms/step - loss: 0.0576 - mae: 0.1285 - val_loss: 0.1107 - val_mae: 0.1998
Epoch 4/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 41ms/step - loss: 0.0542 - mae: 0.1377 - val_loss: 0.0974 - val_mae: 0.1913
Epoch 5/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 43ms/step - loss: 0.0521 - mae: 0.1417 - val_loss: 0.0918 - val_mae: 0.1872
Epoch 6/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 50ms/step - loss: 0.0502 - mae: 0.1432 - val_loss: 0.0911 - val_mae: 0.1867
Epoch 7/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step - loss: 0.0490 - mae: 0.1376 - val_loss: 0.0938 - val_mae: 0.1871
Epoch 8/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 62ms/step - loss: 0.0474 - mae: 0.1350 - val_loss: 0.0864 - val_mae: 0.1825
Epoch 9/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 46ms/step - loss: 0.0462 - mae: 0.1390 - val_loss: 0.0781 - val_mae: 0.1770
Epoch 10/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step - loss: 0.0455 - mae: 0.1413 - val_loss: 0.0786 - val_mae: 0.1758
Epoch 11/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step - loss: 0.0444 - mae: 0.1347 - val_loss: 0.0840 - val_mae: 0.1778
Epoch 12/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step - loss: 0.0435 - mae: 0.1290 - val_loss: 0.0810 - val_mae: 0.1746
Epoch 13/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 43ms/step - loss: 0.0434 - mae: 0.1302 - val_loss: 0.0754 - val_mae: 0.1691
Epoch 14/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 44ms/step - loss: 0.0427 - mae: 0.1297 - val_loss: 0.0702 - val_mae: 0.1639
Epoch 15/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step - loss: 0.0426 - mae: 0.1306 - val_loss: 0.0707 - val_mae: 0.1619
Epoch 16/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 45ms/step - loss: 0.0420 - mae: 0.1272 - val_loss: 0.0691 - val_mae: 0.1588
Epoch 17/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 43ms/step - loss: 0.0413 - mae: 0.1254 - val_loss: 0.0682 - val_mae: 0.1576
Epoch 18/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 43ms/step - loss: 0.0410 - mae: 0.1247 - val_loss: 0.0666 - val_mae: 0.1564
Epoch 19/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 43ms/step - loss: 0.0405 - mae: 0.1272 - val_loss: 0.0651 - val_mae: 0.1562
Epoch 20/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step - loss: 0.0398 - mae: 0.1270 - val_loss: 0.0657 - val_mae: 0.1569
Epoch 21/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step - loss: 0.0397 - mae: 0.1257 - val_loss: 0.0703 - val_mae: 0.1608
Epoch 22/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step - loss: 0.0400 - mae: 0.1241 - val_loss: 0.0723 - val_mae: 0.1626
Epoch 23/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 45ms/step - loss: 0.0395 - mae: 0.1233 - val_loss: 0.0698 - val_mae: 0.1616
Epoch 24/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 53ms/step - loss: 0.0394 - mae: 0.1257 - val_loss: 0.0677 - val_mae: 0.1600
2026-05-20 06:51:18,977 - INFO - Final training history: {'loss': [0.06646904349327087, 0.06152022257447243, 0.05761547014117241, 0.05422685667872429, 0.052075911313295364, 0.0502198189496994, 0.048963919281959534, 0.047417089343070984, 0.04624073579907417, 0.04546453803777695, 0.04444355517625809, 0.04353206977248192, 0.04337691888213158, 0.04273562133312225, 0.04258893057703972, 0.04203431308269501, 0.04132099449634552, 0.04102727398276329, 0.04051414504647255, 0.03979272022843361, 0.03973110765218735, 0.04004065692424774, 0.039530180394649506, 0.039381466805934906], 'mae': [0.12223294377326965, 0.12089289724826813, 0.1284726858139038, 0.13765603303909302, 0.14166919887065887, 0.14316172897815704, 0.1375780552625656, 0.13495609164237976, 0.1390019804239273, 0.14132702350616455, 0.13473321497440338, 0.12898360192775726, 0.13017910718917847, 0.1297467052936554, 0.13061554729938507, 0.12724679708480835, 0.12538297474384308, 0.12474469840526581, 0.12717518210411072, 0.1269800066947937, 0.12568651139736176, 0.12410372495651245, 0.12326554954051971, 0.12572301924228668], 'val_loss': [0.14096498489379883, 0.12785212695598602, 0.11071997880935669, 0.09738446027040482, 0.09183797240257263, 0.09113001823425293, 0.09375102818012238, 0.08638553321361542, 0.07809469103813171, 0.0785900428891182, 0.08404318988323212, 0.08100021630525589, 0.07538628578186035, 0.07021810859441757, 0.07069497555494308, 0.0690591037273407, 0.0682322084903717, 0.0665564090013504, 0.06512641906738281, 0.06573011726140976, 0.07031749188899994, 0.07231573015451431, 0.06981682032346725, 0.06774471700191498], 'val_mae': [0.21329627931118011, 0.2081674337387085, 0.19980916380882263, 0.19126775860786438, 0.18716207146644592, 0.18673622608184814, 0.18713070452213287, 0.18246635794639587, 0.17702430486679077, 0.1758396476507187, 0.17775142192840576, 0.174584299325943, 0.16905330121517181, 0.1638714075088501, 0.16185235977172852, 0.1587957888841629, 0.1575566828250885, 0.156357541680336, 0.15621638298034668, 0.15685439109802246, 0.16081644594669342, 0.16261011362075806, 0.16157081723213196, 0.15998372435569763]}
2026-05-20 06:51:19,156 - INFO - Model training complete. Best model saved as /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/trained_models/bias_correction_model_month07_dekad01.keras
2026-05-20 06:51:19,158 - INFO - Pipeline [07 d1]: Loading confidence mask...
2026-05-20 06:51:19,160 - INFO - Loading existing confidence mask: /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/station_density/confidence_mask_station_density.nc4
2026-05-20 06:51:19,160 - INFO - Pipeline [07 d1]: Applying DL refinement...
2026-05-20 06:51:19,174 - INFO - Pixel-wise threshold map computed at 80th percentile. threshold_2d shape: (9, 14)
2026-05-20 06:51:19,176 - INFO - DL blending: base alpha=0.70 (LSEQM weight), 1-alpha=0.30 (DL weight)
2026-05-20 06:51:19,177 - INFO - Confidence mask active: spatial alpha modulation enabled. Confidence range: [0.000, 0.411]
2026-05-20 06:51:36,516 - INFO - DL blending complete: 250 daily slices processed, 3,448 extreme pixels blended (alpha=0.70)
2026-05-20 06:51:36,607 - INFO - Precip data dims: ('time', 'lat', 'lon'), shape: (250, 9, 14)
2026-05-20 06:51:36,652 - INFO - Saved Hybrid Deep Learning-Physical (Linear Scaling and Empirical Quantile Mapping) Approach corrected precipitation for month 07, dekad 01 at /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_lseqmdl/bali_cli_lseqmdl_corrected_imergl_month07_dekad01.nc4
2026-05-20 06:51:36,654 - INFO - Pipeline [07 d1]: Complete.
✓ month 07 dekad 1 — saved: /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_lseqmdl/bali_cli_imergl_lseqmdl_corrected_precip_month07_dekad01.nc4

============================================================
▸ month 07 dekad 2
============================================================
2026-05-20 06:51:36,655 - INFO - Pipeline [07 d2]: Running LSEQM...
2026-05-20 06:51:36,659 - INFO - Aligning IMERG and CPC datasets...
2026-05-20 06:51:36,668 - INFO - After alignment: IMERG has 9131 time steps, CPC has 9131 time steps
2026-05-20 06:51:36,669 - INFO - Creating time-based masks...
2026-05-20 06:51:36,681 - INFO - Applying time masks...
2026-05-20 06:51:36,692 - INFO - IMERG dekad data shape: (250, 9, 14)
2026-05-20 06:51:36,693 - INFO - CPC dekad data shape: (250, 9, 14)
2026-05-20 06:51:36,697 - INFO - Using native-resolution CPC parameter fitting (BCSD principle)...
2026-05-20 06:51:36,728 - INFO - CPC native dekad data: (250, 4, 6) (lat -9.25–-7.75, lon 113.75–116.25)
2026-05-20 06:51:39,469 - INFO -   Native CPC fitting: row 4/4 (100%) | 24 fitted, 0 skipped | elapsed 3s, ETA 0s
2026-05-20 06:51:39,470 - INFO - Fitted CPC params on native grid: 24/24 cells
2026-05-20 06:51:39,512 - INFO - Interpolated CPC params to IMERG grid: 126/126 valid pixels
2026-05-20 06:51:39,513 - INFO - Performing Linear Scaling (LS)...
2026-05-20 06:51:39,522 - INFO - LS using bilinearly interpolated CPC mean (smooth).
2026-05-20 06:51:39,526 - INFO - Saving LS corrected precipitation...
2026-05-20 06:51:39,528 - INFO - Precip data dims: ('time', 'lat', 'lon'), shape: (250, 9, 14)
2026-05-20 06:51:39,577 - INFO - Saved Linear Scaling corrected precipitation for month 07, dekad 11 at /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_ls/bali_cli_ls_corrected_imergl_month07_dekad11.nc4
2026-05-20 06:51:39,578 - INFO - Applying Empirical Quantile Mapping (EQM) on 9x14 grid...
2026-05-20 06:51:39,653 - INFO -   EQM progress: row 9/9 (100%) | 80 land pixels done | elapsed 0s, ETA 0s
2026-05-20 06:51:39,656 - INFO - EQM complete: 80/126 grid points corrected (46 masked/ocean pixels skipped)
2026-05-20 06:51:39,657 - INFO - Saving LSEQM corrected precipitation...
2026-05-20 06:51:39,659 - INFO - Precip data dims: ('time', 'lat', 'lon'), shape: (250, 9, 14)
2026-05-20 06:51:39,727 - INFO - Saved Linear Scaling and Empirical Quantile Mapping corrected precipitation for month 07, dekad 11 at /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_lseqm/bali_cli_lseqm_corrected_imergl_month07_dekad11.nc4
2026-05-20 06:51:39,728 - INFO - Pipeline [07 d2]: Training / loading DL model...
2026-05-20 06:51:39,730 - INFO - Checking if the model file exists at: /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/trained_models/bias_correction_model_month07_dekad11.keras

2026-05-20 06:51:39,790 - INFO - Model: "sequential_19"
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
┃ Layer (type)                    ┃ Output Shape           ┃       Param # ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│ conv2d_38 (Conv2D)              │ (None, 9, 14, 32)      │           320 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ max_pooling2d_38 (MaxPooling2D) │ (None, 4, 7, 32)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_57 (Dropout)            │ (None, 4, 7, 32)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ conv2d_39 (Conv2D)              │ (None, 4, 7, 64)       │        18,496 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ max_pooling2d_39 (MaxPooling2D) │ (None, 2, 3, 64)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_58 (Dropout)            │ (None, 2, 3, 64)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ flatten_19 (Flatten)            │ (None, 384)            │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dense_38 (Dense)                │ (None, 128)            │        49,280 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_59 (Dropout)            │ (None, 128)            │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dense_39 (Dense)                │ (None, 126)            │        16,254 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ reshape_19 (Reshape)            │ (None, 9, 14)          │             0 │
└─────────────────────────────────┴────────────────────────┴───────────────┘
 Total params: 84,350 (329.49 KB)
 Trainable params: 84,350 (329.49 KB)
 Non-trainable params: 0 (0.00 B)

Epoch 1/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 1s 97ms/step - loss: 0.0863 - mae: 0.1564 - val_loss: 0.0334 - val_mae: 0.0654
Epoch 2/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 43ms/step - loss: 0.0774 - mae: 0.1513 - val_loss: 0.0312 - val_mae: 0.0776
Epoch 3/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 41ms/step - loss: 0.0692 - mae: 0.1565 - val_loss: 0.0310 - val_mae: 0.0961
Epoch 4/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step - loss: 0.0644 - mae: 0.1632 - val_loss: 0.0310 - val_mae: 0.1027
Epoch 5/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 42ms/step - loss: 0.0600 - mae: 0.1594 - val_loss: 0.0303 - val_mae: 0.1022
Epoch 6/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 41ms/step - loss: 0.0570 - mae: 0.1568 - val_loss: 0.0302 - val_mae: 0.1052
Epoch 7/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step - loss: 0.0549 - mae: 0.1559 - val_loss: 0.0305 - val_mae: 0.1085
Epoch 8/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step - loss: 0.0537 - mae: 0.1549 - val_loss: 0.0308 - val_mae: 0.1108
Epoch 9/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step - loss: 0.0525 - mae: 0.1566 - val_loss: 0.0323 - val_mae: 0.1179
Epoch 10/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step - loss: 0.0509 - mae: 0.1564 - val_loss: 0.0312 - val_mae: 0.1129
Epoch 11/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 46ms/step - loss: 0.0512 - mae: 0.1537 - val_loss: 0.0300 - val_mae: 0.1074
Epoch 12/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step - loss: 0.0488 - mae: 0.1481 - val_loss: 0.0303 - val_mae: 0.1093
Epoch 13/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step - loss: 0.0499 - mae: 0.1509 - val_loss: 0.0303 - val_mae: 0.1093
Epoch 14/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step - loss: 0.0490 - mae: 0.1488 - val_loss: 0.0301 - val_mae: 0.1079
Epoch 15/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 69ms/step - loss: 0.0476 - mae: 0.1471 - val_loss: 0.0298 - val_mae: 0.1058
Epoch 16/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 55ms/step - loss: 0.0477 - mae: 0.1450 - val_loss: 0.0297 - val_mae: 0.1044
Epoch 17/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 38ms/step - loss: 0.0468 - mae: 0.1440 - val_loss: 0.0310 - val_mae: 0.1097
Epoch 18/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 51ms/step - loss: 0.0465 - mae: 0.1453 - val_loss: 0.0310 - val_mae: 0.1099
Epoch 19/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 53ms/step - loss: 0.0464 - mae: 0.1458 - val_loss: 0.0300 - val_mae: 0.1051
Epoch 20/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 56ms/step - loss: 0.0452 - mae: 0.1405 - val_loss: 0.0294 - val_mae: 0.1011
Epoch 21/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 35ms/step - loss: 0.0467 - mae: 0.1400 - val_loss: 0.0298 - val_mae: 0.1027
Epoch 22/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 39ms/step - loss: 0.0440 - mae: 0.1371 - val_loss: 0.0309 - val_mae: 0.1066
Epoch 23/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 42ms/step - loss: 0.0450 - mae: 0.1400 - val_loss: 0.0310 - val_mae: 0.1049
Epoch 24/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 51ms/step - loss: 0.0443 - mae: 0.1373 - val_loss: 0.0313 - val_mae: 0.1052
Epoch 25/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 53ms/step - loss: 0.0437 - mae: 0.1379 - val_loss: 0.0310 - val_mae: 0.1034
2026-05-20 06:51:45,920 - INFO - Final training history: {'loss': [0.08629389107227325, 0.07737090438604355, 0.06924473494291306, 0.06437871605157852, 0.06004292517900467, 0.05695082247257233, 0.05494553595781326, 0.05366172641515732, 0.052453555166721344, 0.05088984593749046, 0.05121656507253647, 0.04883558303117752, 0.04992125928401947, 0.04902736097574234, 0.04758533090353012, 0.04774816334247589, 0.046835724264383316, 0.04647469148039818, 0.04640980064868927, 0.045166317373514175, 0.04673363268375397, 0.04403715208172798, 0.04502858966588974, 0.04431094601750374, 0.04367678239941597], 'mae': [0.15641427040100098, 0.1512853503227234, 0.156511127948761, 0.16322967410087585, 0.1594480574131012, 0.15678873658180237, 0.15592166781425476, 0.1549346148967743, 0.15661679208278656, 0.15635570883750916, 0.15365056693553925, 0.14808204770088196, 0.15094581246376038, 0.14878030121326447, 0.14709289371967316, 0.14497001469135284, 0.14395830035209656, 0.14525549113750458, 0.14575906097888947, 0.14047561585903168, 0.13995420932769775, 0.13707472383975983, 0.14001670479774475, 0.13729800283908844, 0.13788582384586334], 'val_loss': [0.033359330147504807, 0.03120044618844986, 0.03097272478044033, 0.031032491475343704, 0.030267581343650818, 0.03021947853267193, 0.030468938872218132, 0.030762916430830956, 0.032322321087121964, 0.03118383139371872, 0.030042123049497604, 0.030318904668092728, 0.030344288796186447, 0.03006981685757637, 0.029764872044324875, 0.029701299965381622, 0.03096764162182808, 0.031033730134367943, 0.02998359501361847, 0.02941671572625637, 0.02983895316720009, 0.03092704527080059, 0.03103628009557724, 0.03131347894668579, 0.031032798811793327], 'val_mae': [0.06543505936861038, 0.07764019817113876, 0.09611154347658157, 0.10267660021781921, 0.10220783203840256, 0.10517766326665878, 0.10845991969108582, 0.11083409190177917, 0.1179051473736763, 0.11292988806962967, 0.10738621652126312, 0.10925423353910446, 0.1092718318104744, 0.10786283761262894, 0.10580672323703766, 0.10441321134567261, 0.10972169041633606, 0.10994536429643631, 0.1050637885928154, 0.10112235695123672, 0.10265634208917618, 0.1065891832113266, 0.10489752143621445, 0.10519848763942719, 0.10341211408376694]}
2026-05-20 06:51:46,114 - INFO - Model training complete. Best model saved as /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/trained_models/bias_correction_model_month07_dekad11.keras
2026-05-20 06:51:46,116 - INFO - Pipeline [07 d2]: Loading confidence mask...
2026-05-20 06:51:46,119 - INFO - Loading existing confidence mask: /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/station_density/confidence_mask_station_density.nc4
2026-05-20 06:51:46,120 - INFO - Pipeline [07 d2]: Applying DL refinement...
2026-05-20 06:51:46,134 - INFO - Pixel-wise threshold map computed at 80th percentile. threshold_2d shape: (9, 14)
2026-05-20 06:51:46,135 - INFO - DL blending: base alpha=0.70 (LSEQM weight), 1-alpha=0.30 (DL weight)
2026-05-20 06:51:46,136 - INFO - Confidence mask active: spatial alpha modulation enabled. Confidence range: [0.000, 0.411]
2026-05-20 06:52:02,827 - INFO - DL blending complete: 250 daily slices processed, 2,721 extreme pixels blended (alpha=0.70)
2026-05-20 06:52:02,914 - INFO - Precip data dims: ('time', 'lat', 'lon'), shape: (250, 9, 14)
2026-05-20 06:52:02,976 - INFO - Saved Hybrid Deep Learning-Physical (Linear Scaling and Empirical Quantile Mapping) Approach corrected precipitation for month 07, dekad 11 at /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_lseqmdl/bali_cli_lseqmdl_corrected_imergl_month07_dekad11.nc4
2026-05-20 06:52:02,977 - INFO - Pipeline [07 d2]: Complete.
✓ month 07 dekad 2 — saved: /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_lseqmdl/bali_cli_imergl_lseqmdl_corrected_precip_month07_dekad11.nc4

============================================================
▸ month 07 dekad 3
============================================================
2026-05-20 06:52:02,982 - INFO - Pipeline [07 d3]: Running LSEQM...
2026-05-20 06:52:02,985 - INFO - Aligning IMERG and CPC datasets...
2026-05-20 06:52:02,995 - INFO - After alignment: IMERG has 9131 time steps, CPC has 9131 time steps
2026-05-20 06:52:02,996 - INFO - Creating time-based masks...
2026-05-20 06:52:03,009 - INFO - Applying time masks...
2026-05-20 06:52:03,020 - INFO - IMERG dekad data shape: (275, 9, 14)
2026-05-20 06:52:03,020 - INFO - CPC dekad data shape: (275, 9, 14)
2026-05-20 06:52:03,023 - INFO - Using native-resolution CPC parameter fitting (BCSD principle)...
2026-05-20 06:52:03,057 - INFO - CPC native dekad data: (275, 4, 6) (lat -9.25–-7.75, lon 113.75–116.25)
2026-05-20 06:52:06,330 - INFO -   Native CPC fitting: row 4/4 (100%) | 24 fitted, 0 skipped | elapsed 3s, ETA 0s
2026-05-20 06:52:06,331 - INFO - Fitted CPC params on native grid: 24/24 cells
2026-05-20 06:52:06,377 - INFO - Interpolated CPC params to IMERG grid: 126/126 valid pixels
2026-05-20 06:52:06,378 - INFO - Performing Linear Scaling (LS)...
2026-05-20 06:52:06,390 - INFO - LS using bilinearly interpolated CPC mean (smooth).
2026-05-20 06:52:06,396 - INFO - Saving LS corrected precipitation...
2026-05-20 06:52:06,399 - INFO - Precip data dims: ('time', 'lat', 'lon'), shape: (275, 9, 14)
2026-05-20 06:52:06,452 - INFO - Saved Linear Scaling corrected precipitation for month 07, dekad 21 at /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_ls/bali_cli_ls_corrected_imergl_month07_dekad21.nc4
2026-05-20 06:52:06,453 - INFO - Applying Empirical Quantile Mapping (EQM) on 9x14 grid...
2026-05-20 06:52:06,525 - INFO -   EQM progress: row 9/9 (100%) | 80 land pixels done | elapsed 0s, ETA 0s
2026-05-20 06:52:06,528 - INFO - EQM complete: 80/126 grid points corrected (46 masked/ocean pixels skipped)
2026-05-20 06:52:06,530 - INFO - Saving LSEQM corrected precipitation...
2026-05-20 06:52:06,532 - INFO - Precip data dims: ('time', 'lat', 'lon'), shape: (275, 9, 14)
2026-05-20 06:52:06,581 - INFO - Saved Linear Scaling and Empirical Quantile Mapping corrected precipitation for month 07, dekad 21 at /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_lseqm/bali_cli_lseqm_corrected_imergl_month07_dekad21.nc4
2026-05-20 06:52:06,582 - INFO - Pipeline [07 d3]: Training / loading DL model...
2026-05-20 06:52:06,583 - INFO - Checking if the model file exists at: /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/trained_models/bias_correction_model_month07_dekad21.keras

2026-05-20 06:52:06,643 - INFO - Model: "sequential_20"
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
┃ Layer (type)                    ┃ Output Shape           ┃       Param # ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│ conv2d_40 (Conv2D)              │ (None, 9, 14, 32)      │           320 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ max_pooling2d_40 (MaxPooling2D) │ (None, 4, 7, 32)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_60 (Dropout)            │ (None, 4, 7, 32)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ conv2d_41 (Conv2D)              │ (None, 4, 7, 64)       │        18,496 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ max_pooling2d_41 (MaxPooling2D) │ (None, 2, 3, 64)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_61 (Dropout)            │ (None, 2, 3, 64)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ flatten_20 (Flatten)            │ (None, 384)            │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dense_40 (Dense)                │ (None, 128)            │        49,280 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_62 (Dropout)            │ (None, 128)            │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dense_41 (Dense)                │ (None, 126)            │        16,254 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ reshape_20 (Reshape)            │ (None, 9, 14)          │             0 │
└─────────────────────────────────┴────────────────────────┴───────────────┘
 Total params: 84,350 (329.49 KB)
 Trainable params: 84,350 (329.49 KB)
 Non-trainable params: 0 (0.00 B)

Epoch 1/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 1s 94ms/step - loss: 0.0642 - mae: 0.1201 - val_loss: 0.0864 - val_mae: 0.1290
Epoch 2/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 1s 69ms/step - loss: 0.0585 - mae: 0.1196 - val_loss: 0.0811 - val_mae: 0.1339
Epoch 3/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 67ms/step - loss: 0.0539 - mae: 0.1279 - val_loss: 0.0751 - val_mae: 0.1406
Epoch 4/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 62ms/step - loss: 0.0522 - mae: 0.1399 - val_loss: 0.0716 - val_mae: 0.1437
Epoch 5/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 78ms/step - loss: 0.0491 - mae: 0.1376 - val_loss: 0.0713 - val_mae: 0.1429
Epoch 6/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 72ms/step - loss: 0.0478 - mae: 0.1340 - val_loss: 0.0707 - val_mae: 0.1436
Epoch 7/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 85ms/step - loss: 0.0469 - mae: 0.1335 - val_loss: 0.0694 - val_mae: 0.1449
Epoch 8/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 79ms/step - loss: 0.0461 - mae: 0.1352 - val_loss: 0.0679 - val_mae: 0.1465
Epoch 9/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 81ms/step - loss: 0.0448 - mae: 0.1370 - val_loss: 0.0665 - val_mae: 0.1479
Epoch 10/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 54ms/step - loss: 0.0425 - mae: 0.1345 - val_loss: 0.0660 - val_mae: 0.1474
Epoch 11/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 33ms/step - loss: 0.0444 - mae: 0.1368 - val_loss: 0.0664 - val_mae: 0.1456
Epoch 12/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step - loss: 0.0420 - mae: 0.1317 - val_loss: 0.0663 - val_mae: 0.1450
Epoch 13/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step - loss: 0.0426 - mae: 0.1308 - val_loss: 0.0663 - val_mae: 0.1442
Epoch 14/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step - loss: 0.0426 - mae: 0.1307 - val_loss: 0.0662 - val_mae: 0.1440
Epoch 15/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step - loss: 0.0410 - mae: 0.1262 - val_loss: 0.0666 - val_mae: 0.1424
2026-05-20 06:52:11,625 - INFO - Final training history: {'loss': [0.06419536471366882, 0.05849197134375572, 0.053922779858112335, 0.05217796191573143, 0.04907995089888573, 0.04781720042228699, 0.046887148171663284, 0.04605589807033539, 0.044809576123952866, 0.042463839054107666, 0.04443817585706711, 0.042021848261356354, 0.042597267776727676, 0.042610540986061096, 0.04104218631982803], 'mae': [0.12009401619434357, 0.1196429654955864, 0.12791557610034943, 0.13985304534435272, 0.1376340389251709, 0.13396935164928436, 0.13352321088314056, 0.13522589206695557, 0.13700005412101746, 0.13454598188400269, 0.1368408054113388, 0.13165651261806488, 0.13078410923480988, 0.13066892325878143, 0.12624956667423248], 'val_loss': [0.08635202050209045, 0.0810931995511055, 0.0750611200928688, 0.0715707391500473, 0.07128927856683731, 0.0706707239151001, 0.06938961893320084, 0.06787177920341492, 0.06650321185588837, 0.06604878604412079, 0.06635648757219315, 0.066328264772892, 0.06630721688270569, 0.06619668006896973, 0.06661516427993774], 'val_mae': [0.12902098894119263, 0.13392585515975952, 0.14062634110450745, 0.14374171197414398, 0.1429266482591629, 0.14363297820091248, 0.14488224685192108, 0.14653344452381134, 0.14790917932987213, 0.14739389717578888, 0.1455858051776886, 0.145002543926239, 0.14418615400791168, 0.143959179520607, 0.14239180088043213]}
2026-05-20 06:52:11,772 - INFO - Model training complete. Best model saved as /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/trained_models/bias_correction_model_month07_dekad21.keras
2026-05-20 06:52:11,774 - INFO - Pipeline [07 d3]: Loading confidence mask...
2026-05-20 06:52:11,776 - INFO - Loading existing confidence mask: /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/station_density/confidence_mask_station_density.nc4
2026-05-20 06:52:11,777 - INFO - Pipeline [07 d3]: Applying DL refinement...
2026-05-20 06:52:11,795 - INFO - Pixel-wise threshold map computed at 80th percentile. threshold_2d shape: (9, 14)
2026-05-20 06:52:11,796 - INFO - DL blending: base alpha=0.70 (LSEQM weight), 1-alpha=0.30 (DL weight)
2026-05-20 06:52:11,797 - INFO - Confidence mask active: spatial alpha modulation enabled. Confidence range: [0.000, 0.411]
2026-05-20 06:52:30,534 - INFO - DL blending complete: 275 daily slices processed, 2,071 extreme pixels blended (alpha=0.70)
2026-05-20 06:52:30,631 - INFO - Precip data dims: ('time', 'lat', 'lon'), shape: (275, 9, 14)
2026-05-20 06:52:30,681 - INFO - Saved Hybrid Deep Learning-Physical (Linear Scaling and Empirical Quantile Mapping) Approach corrected precipitation for month 07, dekad 21 at /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_lseqmdl/bali_cli_lseqmdl_corrected_imergl_month07_dekad21.nc4
2026-05-20 06:52:30,682 - INFO - Pipeline [07 d3]: Complete.
✓ month 07 dekad 3 — saved: /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_lseqmdl/bali_cli_imergl_lseqmdl_corrected_precip_month07_dekad21.nc4

============================================================
▸ month 08 dekad 1
============================================================
2026-05-20 06:52:30,684 - INFO - Pipeline [08 d1]: Running LSEQM...
2026-05-20 06:52:30,688 - INFO - Aligning IMERG and CPC datasets...
2026-05-20 06:52:30,696 - INFO - After alignment: IMERG has 9131 time steps, CPC has 9131 time steps
2026-05-20 06:52:30,697 - INFO - Creating time-based masks...
2026-05-20 06:52:30,709 - INFO - Applying time masks...
2026-05-20 06:52:30,721 - INFO - IMERG dekad data shape: (250, 9, 14)
2026-05-20 06:52:30,723 - INFO - CPC dekad data shape: (250, 9, 14)
2026-05-20 06:52:30,726 - INFO - Using native-resolution CPC parameter fitting (BCSD principle)...
2026-05-20 06:52:30,762 - INFO - CPC native dekad data: (250, 4, 6) (lat -9.25–-7.75, lon 113.75–116.25)
2026-05-20 06:52:32,422 - INFO -   Native CPC fitting: row 4/4 (100%) | 24 fitted, 0 skipped | elapsed 2s, ETA 0s
2026-05-20 06:52:32,423 - INFO - Fitted CPC params on native grid: 24/24 cells
2026-05-20 06:52:32,466 - INFO - Interpolated CPC params to IMERG grid: 126/126 valid pixels
2026-05-20 06:52:32,467 - INFO - Performing Linear Scaling (LS)...
2026-05-20 06:52:32,475 - INFO - LS using bilinearly interpolated CPC mean (smooth).
2026-05-20 06:52:32,479 - INFO - Saving LS corrected precipitation...
2026-05-20 06:52:32,481 - INFO - Precip data dims: ('time', 'lat', 'lon'), shape: (250, 9, 14)
2026-05-20 06:52:32,526 - INFO - Saved Linear Scaling corrected precipitation for month 08, dekad 01 at /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_ls/bali_cli_ls_corrected_imergl_month08_dekad01.nc4
2026-05-20 06:52:32,527 - INFO - Applying Empirical Quantile Mapping (EQM) on 9x14 grid...
2026-05-20 06:52:32,608 - INFO -   EQM progress: row 9/9 (100%) | 80 land pixels done | elapsed 0s, ETA 0s
2026-05-20 06:52:32,611 - INFO - EQM complete: 80/126 grid points corrected (46 masked/ocean pixels skipped)
2026-05-20 06:52:32,613 - INFO - Saving LSEQM corrected precipitation...
2026-05-20 06:52:32,616 - INFO - Precip data dims: ('time', 'lat', 'lon'), shape: (250, 9, 14)
2026-05-20 06:52:32,667 - INFO - Saved Linear Scaling and Empirical Quantile Mapping corrected precipitation for month 08, dekad 01 at /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_lseqm/bali_cli_lseqm_corrected_imergl_month08_dekad01.nc4
2026-05-20 06:52:32,668 - INFO - Pipeline [08 d1]: Training / loading DL model...
2026-05-20 06:52:32,670 - INFO - Checking if the model file exists at: /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/trained_models/bias_correction_model_month08_dekad01.keras

2026-05-20 06:52:32,738 - INFO - Model: "sequential_21"
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
┃ Layer (type)                    ┃ Output Shape           ┃       Param # ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│ conv2d_42 (Conv2D)              │ (None, 9, 14, 32)      │           320 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ max_pooling2d_42 (MaxPooling2D) │ (None, 4, 7, 32)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_63 (Dropout)            │ (None, 4, 7, 32)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ conv2d_43 (Conv2D)              │ (None, 4, 7, 64)       │        18,496 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ max_pooling2d_43 (MaxPooling2D) │ (None, 2, 3, 64)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_64 (Dropout)            │ (None, 2, 3, 64)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ flatten_21 (Flatten)            │ (None, 384)            │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dense_42 (Dense)                │ (None, 128)            │        49,280 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_65 (Dropout)            │ (None, 128)            │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dense_43 (Dense)                │ (None, 126)            │        16,254 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ reshape_21 (Reshape)            │ (None, 9, 14)          │             0 │
└─────────────────────────────────┴────────────────────────┴───────────────┘
 Total params: 84,350 (329.49 KB)
 Trainable params: 84,350 (329.49 KB)
 Non-trainable params: 0 (0.00 B)

Epoch 1/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 3s 154ms/step - loss: 0.0612 - mae: 0.1151 - val_loss: 0.0537 - val_mae: 0.0980
Epoch 2/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 51ms/step - loss: 0.0566 - mae: 0.1139 - val_loss: 0.0493 - val_mae: 0.1035
Epoch 3/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 50ms/step - loss: 0.0523 - mae: 0.1197 - val_loss: 0.0450 - val_mae: 0.1084
Epoch 4/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 44ms/step - loss: 0.0497 - mae: 0.1288 - val_loss: 0.0416 - val_mae: 0.1130
Epoch 5/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 44ms/step - loss: 0.0481 - mae: 0.1340 - val_loss: 0.0407 - val_mae: 0.1125
Epoch 6/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 42ms/step - loss: 0.0457 - mae: 0.1292 - val_loss: 0.0407 - val_mae: 0.1113
Epoch 7/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 42ms/step - loss: 0.0441 - mae: 0.1274 - val_loss: 0.0390 - val_mae: 0.1139
Epoch 8/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 43ms/step - loss: 0.0419 - mae: 0.1286 - val_loss: 0.0375 - val_mae: 0.1151
Epoch 9/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 43ms/step - loss: 0.0413 - mae: 0.1305 - val_loss: 0.0362 - val_mae: 0.1142
Epoch 10/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 43ms/step - loss: 0.0406 - mae: 0.1291 - val_loss: 0.0354 - val_mae: 0.1103
Epoch 11/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 42ms/step - loss: 0.0404 - mae: 0.1262 - val_loss: 0.0344 - val_mae: 0.1075
Epoch 12/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 43ms/step - loss: 0.0392 - mae: 0.1230 - val_loss: 0.0340 - val_mae: 0.1051
Epoch 13/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 43ms/step - loss: 0.0389 - mae: 0.1205 - val_loss: 0.0335 - val_mae: 0.1041
Epoch 14/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 43ms/step - loss: 0.0382 - mae: 0.1198 - val_loss: 0.0328 - val_mae: 0.1050
Epoch 15/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 44ms/step - loss: 0.0379 - mae: 0.1219 - val_loss: 0.0323 - val_mae: 0.1046
Epoch 16/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step - loss: 0.0389 - mae: 0.1232 - val_loss: 0.0325 - val_mae: 0.1031
Epoch 17/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step - loss: 0.0374 - mae: 0.1177 - val_loss: 0.0339 - val_mae: 0.1008
Epoch 18/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step - loss: 0.0379 - mae: 0.1132 - val_loss: 0.0357 - val_mae: 0.0994
Epoch 19/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step - loss: 0.0382 - mae: 0.1105 - val_loss: 0.0347 - val_mae: 0.0998
Epoch 20/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step - loss: 0.0366 - mae: 0.1123 - val_loss: 0.0328 - val_mae: 0.1020
2026-05-20 06:52:38,843 - INFO - Final training history: {'loss': [0.06116192787885666, 0.056623734533786774, 0.052310843020677567, 0.04974722862243652, 0.04807167872786522, 0.04565104469656944, 0.04408213496208191, 0.041901908814907074, 0.04131875932216644, 0.04059003293514252, 0.04039132967591286, 0.039246536791324615, 0.03886261582374573, 0.03823035582900047, 0.037890490144491196, 0.03894070163369179, 0.03738722205162048, 0.03788219019770622, 0.03817710280418396, 0.03659714385867119], 'mae': [0.11510160565376282, 0.11386770009994507, 0.11968556046485901, 0.128845676779747, 0.1339576095342636, 0.1291738897562027, 0.1274377405643463, 0.1285766065120697, 0.13053861260414124, 0.1290857195854187, 0.12622174620628357, 0.12302564829587936, 0.12054617702960968, 0.11979904025793076, 0.12186962366104126, 0.12323497980833054, 0.11765381693840027, 0.11320607364177704, 0.11047321557998657, 0.11230016499757767], 'val_loss': [0.05372031778097153, 0.04926348850131035, 0.04500998556613922, 0.041572365909814835, 0.040720440447330475, 0.04067278280854225, 0.03897784277796745, 0.037505339831113815, 0.03617609292268753, 0.03542013093829155, 0.03439558669924736, 0.03401034697890282, 0.03350801765918732, 0.032750729471445084, 0.03234447166323662, 0.03250761702656746, 0.03385837376117706, 0.03567790985107422, 0.034670885652303696, 0.03284592553973198], 'val_mae': [0.09804916381835938, 0.10352516174316406, 0.10839466750621796, 0.11298207938671112, 0.11247634142637253, 0.11131389439105988, 0.11385134607553482, 0.11512956023216248, 0.11424732953310013, 0.110320083796978, 0.10746343433856964, 0.10505639016628265, 0.10405762493610382, 0.10497218370437622, 0.10458848625421524, 0.1030755415558815, 0.10081621259450912, 0.09936967492103577, 0.09981438517570496, 0.10201821476221085]}
2026-05-20 06:52:38,980 - INFO - Model training complete. Best model saved as /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/trained_models/bias_correction_model_month08_dekad01.keras
2026-05-20 06:52:38,981 - INFO - Pipeline [08 d1]: Loading confidence mask...
2026-05-20 06:52:38,984 - INFO - Loading existing confidence mask: /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/station_density/confidence_mask_station_density.nc4
2026-05-20 06:52:38,985 - INFO - Pipeline [08 d1]: Applying DL refinement...
2026-05-20 06:52:39,002 - INFO - Pixel-wise threshold map computed at 80th percentile. threshold_2d shape: (9, 14)
2026-05-20 06:52:39,002 - INFO - DL blending: base alpha=0.70 (LSEQM weight), 1-alpha=0.30 (DL weight)
2026-05-20 06:52:39,004 - INFO - Confidence mask active: spatial alpha modulation enabled. Confidence range: [0.000, 0.411]
2026-05-20 06:52:56,369 - INFO - DL blending complete: 250 daily slices processed, 2,019 extreme pixels blended (alpha=0.70)
2026-05-20 06:52:56,464 - INFO - Precip data dims: ('time', 'lat', 'lon'), shape: (250, 9, 14)
2026-05-20 06:52:56,518 - INFO - Saved Hybrid Deep Learning-Physical (Linear Scaling and Empirical Quantile Mapping) Approach corrected precipitation for month 08, dekad 01 at /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_lseqmdl/bali_cli_lseqmdl_corrected_imergl_month08_dekad01.nc4
2026-05-20 06:52:56,519 - INFO - Pipeline [08 d1]: Complete.
✓ month 08 dekad 1 — saved: /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_lseqmdl/bali_cli_imergl_lseqmdl_corrected_precip_month08_dekad01.nc4

============================================================
▸ month 08 dekad 2
============================================================
2026-05-20 06:52:56,521 - INFO - Pipeline [08 d2]: Running LSEQM...
2026-05-20 06:52:56,527 - INFO - Aligning IMERG and CPC datasets...
2026-05-20 06:52:56,536 - INFO - After alignment: IMERG has 9131 time steps, CPC has 9131 time steps
2026-05-20 06:52:56,537 - INFO - Creating time-based masks...
2026-05-20 06:52:56,548 - INFO - Applying time masks...
2026-05-20 06:52:56,558 - INFO - IMERG dekad data shape: (250, 9, 14)
2026-05-20 06:52:56,560 - INFO - CPC dekad data shape: (250, 9, 14)
2026-05-20 06:52:56,563 - INFO - Using native-resolution CPC parameter fitting (BCSD principle)...
2026-05-20 06:52:56,596 - INFO - CPC native dekad data: (250, 4, 6) (lat -9.25–-7.75, lon 113.75–116.25)
2026-05-20 06:52:59,238 - INFO -   Native CPC fitting: row 4/4 (100%) | 24 fitted, 0 skipped | elapsed 3s, ETA 0s
2026-05-20 06:52:59,240 - INFO - Fitted CPC params on native grid: 24/24 cells
2026-05-20 06:52:59,310 - INFO - Interpolated CPC params to IMERG grid: 126/126 valid pixels
2026-05-20 06:52:59,311 - INFO - Performing Linear Scaling (LS)...
2026-05-20 06:52:59,329 - INFO - LS using bilinearly interpolated CPC mean (smooth).
2026-05-20 06:52:59,333 - INFO - Saving LS corrected precipitation...
2026-05-20 06:52:59,337 - INFO - Precip data dims: ('time', 'lat', 'lon'), shape: (250, 9, 14)
2026-05-20 06:52:59,399 - INFO - Saved Linear Scaling corrected precipitation for month 08, dekad 11 at /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_ls/bali_cli_ls_corrected_imergl_month08_dekad11.nc4
2026-05-20 06:52:59,401 - INFO - Applying Empirical Quantile Mapping (EQM) on 9x14 grid...
2026-05-20 06:52:59,526 - INFO -   EQM progress: row 9/9 (100%) | 80 land pixels done | elapsed 0s, ETA 0s
2026-05-20 06:52:59,531 - INFO - EQM complete: 80/126 grid points corrected (46 masked/ocean pixels skipped)
2026-05-20 06:52:59,534 - INFO - Saving LSEQM corrected precipitation...
2026-05-20 06:52:59,537 - INFO - Precip data dims: ('time', 'lat', 'lon'), shape: (250, 9, 14)
2026-05-20 06:52:59,601 - INFO - Saved Linear Scaling and Empirical Quantile Mapping corrected precipitation for month 08, dekad 11 at /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_lseqm/bali_cli_lseqm_corrected_imergl_month08_dekad11.nc4
2026-05-20 06:52:59,603 - INFO - Pipeline [08 d2]: Training / loading DL model...
2026-05-20 06:52:59,604 - INFO - Checking if the model file exists at: /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/trained_models/bias_correction_model_month08_dekad11.keras

2026-05-20 06:52:59,685 - INFO - Model: "sequential_22"
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
┃ Layer (type)                    ┃ Output Shape           ┃       Param # ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│ conv2d_44 (Conv2D)              │ (None, 9, 14, 32)      │           320 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ max_pooling2d_44 (MaxPooling2D) │ (None, 4, 7, 32)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_66 (Dropout)            │ (None, 4, 7, 32)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ conv2d_45 (Conv2D)              │ (None, 4, 7, 64)       │        18,496 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ max_pooling2d_45 (MaxPooling2D) │ (None, 2, 3, 64)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_67 (Dropout)            │ (None, 2, 3, 64)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ flatten_22 (Flatten)            │ (None, 384)            │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dense_44 (Dense)                │ (None, 128)            │        49,280 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_68 (Dropout)            │ (None, 128)            │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dense_45 (Dense)                │ (None, 126)            │        16,254 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ reshape_22 (Reshape)            │ (None, 9, 14)          │             0 │
└─────────────────────────────────┴────────────────────────┴───────────────┘
 Total params: 84,350 (329.49 KB)
 Trainable params: 84,350 (329.49 KB)
 Non-trainable params: 0 (0.00 B)

Epoch 1/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 2s 98ms/step - loss: 0.0643 - mae: 0.1201 - val_loss: 0.0800 - val_mae: 0.1394
Epoch 2/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 43ms/step - loss: 0.0592 - mae: 0.1187 - val_loss: 0.0733 - val_mae: 0.1414
Epoch 3/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 43ms/step - loss: 0.0553 - mae: 0.1262 - val_loss: 0.0661 - val_mae: 0.1443
Epoch 4/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 46ms/step - loss: 0.0524 - mae: 0.1357 - val_loss: 0.0623 - val_mae: 0.1440
Epoch 5/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 42ms/step - loss: 0.0501 - mae: 0.1386 - val_loss: 0.0600 - val_mae: 0.1439
Epoch 6/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 45ms/step - loss: 0.0486 - mae: 0.1403 - val_loss: 0.0591 - val_mae: 0.1425
Epoch 7/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step - loss: 0.0477 - mae: 0.1364 - val_loss: 0.0602 - val_mae: 0.1402
Epoch 8/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 53ms/step - loss: 0.0464 - mae: 0.1332 - val_loss: 0.0582 - val_mae: 0.1409
Epoch 9/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 44ms/step - loss: 0.0454 - mae: 0.1357 - val_loss: 0.0562 - val_mae: 0.1416
Epoch 10/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 46ms/step - loss: 0.0452 - mae: 0.1411 - val_loss: 0.0547 - val_mae: 0.1426
Epoch 11/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 47ms/step - loss: 0.0456 - mae: 0.1442 - val_loss: 0.0542 - val_mae: 0.1420
Epoch 12/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 48ms/step - loss: 0.0453 - mae: 0.1447 - val_loss: 0.0540 - val_mae: 0.1413
Epoch 13/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 44ms/step - loss: 0.0440 - mae: 0.1418 - val_loss: 0.0538 - val_mae: 0.1407
Epoch 14/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step - loss: 0.0431 - mae: 0.1394 - val_loss: 0.0551 - val_mae: 0.1384
Epoch 15/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step - loss: 0.0423 - mae: 0.1332 - val_loss: 0.0574 - val_mae: 0.1361
Epoch 16/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 42ms/step - loss: 0.0428 - mae: 0.1282 - val_loss: 0.0596 - val_mae: 0.1347
Epoch 17/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step - loss: 0.0419 - mae: 0.1214 - val_loss: 0.0603 - val_mae: 0.1339
Epoch 18/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step - loss: 0.0420 - mae: 0.1221 - val_loss: 0.0580 - val_mae: 0.1336
2026-05-20 06:53:04,343 - INFO - Final training history: {'loss': [0.06427085399627686, 0.05916542187333107, 0.055257268249988556, 0.05240292102098465, 0.050061289221048355, 0.04859553650021553, 0.047676172107458115, 0.04641430824995041, 0.04541876167058945, 0.0451759397983551, 0.04564473032951355, 0.04533297196030617, 0.04395178705453873, 0.0431477315723896, 0.04233712702989578, 0.04283126816153526, 0.041946038603782654, 0.04199719801545143], 'mae': [0.12010989338159561, 0.11866267025470734, 0.12619157135486603, 0.13572727143764496, 0.13861368596553802, 0.14034312963485718, 0.13638949394226074, 0.13318799436092377, 0.13574932515621185, 0.1410706639289856, 0.1441953182220459, 0.14466966688632965, 0.14175854623317719, 0.13940945267677307, 0.13320715725421906, 0.12824766337871552, 0.1214454397559166, 0.1221221387386322], 'val_loss': [0.08004463464021683, 0.07331717759370804, 0.06609638035297394, 0.06230679899454117, 0.05996818095445633, 0.05909447744488716, 0.06018564850091934, 0.05824277549982071, 0.056232139468193054, 0.054655734449625015, 0.05420207604765892, 0.05396587401628494, 0.05382118374109268, 0.055051565170288086, 0.05735825374722481, 0.05956258624792099, 0.060276929289102554, 0.0580151304602623], 'val_mae': [0.13937972486019135, 0.1413688063621521, 0.14429737627506256, 0.14404746890068054, 0.14388799667358398, 0.14251407980918884, 0.14018158614635468, 0.14088165760040283, 0.14164729416370392, 0.14257007837295532, 0.14200957119464874, 0.14131921529769897, 0.14074814319610596, 0.13836316764354706, 0.13613063097000122, 0.13469929993152618, 0.1338530033826828, 0.1336313635110855]}
2026-05-20 06:53:04,491 - INFO - Model training complete. Best model saved as /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/trained_models/bias_correction_model_month08_dekad11.keras
2026-05-20 06:53:04,495 - INFO - Pipeline [08 d2]: Loading confidence mask...
2026-05-20 06:53:04,498 - INFO - Loading existing confidence mask: /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/station_density/confidence_mask_station_density.nc4
2026-05-20 06:53:04,501 - INFO - Pipeline [08 d2]: Applying DL refinement...
2026-05-20 06:53:04,516 - INFO - Pixel-wise threshold map computed at 80th percentile. threshold_2d shape: (9, 14)
2026-05-20 06:53:04,517 - INFO - DL blending: base alpha=0.70 (LSEQM weight), 1-alpha=0.30 (DL weight)
2026-05-20 06:53:04,518 - INFO - Confidence mask active: spatial alpha modulation enabled. Confidence range: [0.000, 0.411]
2026-05-20 06:53:21,328 - INFO - DL blending complete: 250 daily slices processed, 2,219 extreme pixels blended (alpha=0.70)
2026-05-20 06:53:21,415 - INFO - Precip data dims: ('time', 'lat', 'lon'), shape: (250, 9, 14)
2026-05-20 06:53:21,454 - INFO - Saved Hybrid Deep Learning-Physical (Linear Scaling and Empirical Quantile Mapping) Approach corrected precipitation for month 08, dekad 11 at /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_lseqmdl/bali_cli_lseqmdl_corrected_imergl_month08_dekad11.nc4
2026-05-20 06:53:21,455 - INFO - Pipeline [08 d2]: Complete.
✓ month 08 dekad 2 — saved: /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_lseqmdl/bali_cli_imergl_lseqmdl_corrected_precip_month08_dekad11.nc4

============================================================
▸ month 08 dekad 3
============================================================
2026-05-20 06:53:21,458 - INFO - Pipeline [08 d3]: Running LSEQM...
2026-05-20 06:53:21,463 - INFO - Aligning IMERG and CPC datasets...
2026-05-20 06:53:21,473 - INFO - After alignment: IMERG has 9131 time steps, CPC has 9131 time steps
2026-05-20 06:53:21,474 - INFO - Creating time-based masks...
2026-05-20 06:53:21,486 - INFO - Applying time masks...
2026-05-20 06:53:21,498 - INFO - IMERG dekad data shape: (275, 9, 14)
2026-05-20 06:53:21,498 - INFO - CPC dekad data shape: (275, 9, 14)
2026-05-20 06:53:21,503 - INFO - Using native-resolution CPC parameter fitting (BCSD principle)...
2026-05-20 06:53:21,536 - INFO - CPC native dekad data: (275, 4, 6) (lat -9.25–-7.75, lon 113.75–116.25)
2026-05-20 06:53:24,021 - INFO -   Native CPC fitting: row 4/4 (100%) | 24 fitted, 0 skipped | elapsed 2s, ETA 0s
2026-05-20 06:53:24,022 - INFO - Fitted CPC params on native grid: 24/24 cells
2026-05-20 06:53:24,076 - INFO - Interpolated CPC params to IMERG grid: 126/126 valid pixels
2026-05-20 06:53:24,077 - INFO - Performing Linear Scaling (LS)...
2026-05-20 06:53:24,086 - INFO - LS using bilinearly interpolated CPC mean (smooth).
2026-05-20 06:53:24,090 - INFO - Saving LS corrected precipitation...
2026-05-20 06:53:24,092 - INFO - Precip data dims: ('time', 'lat', 'lon'), shape: (275, 9, 14)
2026-05-20 06:53:24,157 - INFO - Saved Linear Scaling corrected precipitation for month 08, dekad 21 at /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_ls/bali_cli_ls_corrected_imergl_month08_dekad21.nc4
2026-05-20 06:53:24,160 - INFO - Applying Empirical Quantile Mapping (EQM) on 9x14 grid...
2026-05-20 06:53:24,276 - INFO -   EQM progress: row 9/9 (100%) | 80 land pixels done | elapsed 0s, ETA 0s
2026-05-20 06:53:24,283 - INFO - EQM complete: 80/126 grid points corrected (46 masked/ocean pixels skipped)
2026-05-20 06:53:24,284 - INFO - Saving LSEQM corrected precipitation...
2026-05-20 06:53:24,286 - INFO - Precip data dims: ('time', 'lat', 'lon'), shape: (275, 9, 14)
2026-05-20 06:53:24,347 - INFO - Saved Linear Scaling and Empirical Quantile Mapping corrected precipitation for month 08, dekad 21 at /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_lseqm/bali_cli_lseqm_corrected_imergl_month08_dekad21.nc4
2026-05-20 06:53:24,349 - INFO - Pipeline [08 d3]: Training / loading DL model...
2026-05-20 06:53:24,349 - INFO - Checking if the model file exists at: /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/trained_models/bias_correction_model_month08_dekad21.keras

2026-05-20 06:53:24,427 - INFO - Model: "sequential_23"
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
┃ Layer (type)                    ┃ Output Shape           ┃       Param # ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│ conv2d_46 (Conv2D)              │ (None, 9, 14, 32)      │           320 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ max_pooling2d_46 (MaxPooling2D) │ (None, 4, 7, 32)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_69 (Dropout)            │ (None, 4, 7, 32)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ conv2d_47 (Conv2D)              │ (None, 4, 7, 64)       │        18,496 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ max_pooling2d_47 (MaxPooling2D) │ (None, 2, 3, 64)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_70 (Dropout)            │ (None, 2, 3, 64)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ flatten_23 (Flatten)            │ (None, 384)            │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dense_46 (Dense)                │ (None, 128)            │        49,280 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_71 (Dropout)            │ (None, 128)            │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dense_47 (Dense)                │ (None, 126)            │        16,254 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ reshape_23 (Reshape)            │ (None, 9, 14)          │             0 │
└─────────────────────────────────┴────────────────────────┴───────────────┘
 Total params: 84,350 (329.49 KB)
 Trainable params: 84,350 (329.49 KB)
 Non-trainable params: 0 (0.00 B)

Epoch 1/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 2s 105ms/step - loss: 0.0527 - mae: 0.1000 - val_loss: 0.0584 - val_mae: 0.0954
Epoch 2/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 45ms/step - loss: 0.0489 - mae: 0.0987 - val_loss: 0.0550 - val_mae: 0.1002
Epoch 3/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 44ms/step - loss: 0.0461 - mae: 0.1036 - val_loss: 0.0516 - val_mae: 0.1053
Epoch 4/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 44ms/step - loss: 0.0438 - mae: 0.1111 - val_loss: 0.0485 - val_mae: 0.1116
Epoch 5/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 43ms/step - loss: 0.0430 - mae: 0.1181 - val_loss: 0.0475 - val_mae: 0.1141
Epoch 6/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step - loss: 0.0413 - mae: 0.1181 - val_loss: 0.0476 - val_mae: 0.1144
Epoch 7/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 46ms/step - loss: 0.0404 - mae: 0.1160 - val_loss: 0.0473 - val_mae: 0.1152
Epoch 8/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 45ms/step - loss: 0.0397 - mae: 0.1184 - val_loss: 0.0464 - val_mae: 0.1177
Epoch 9/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 45ms/step - loss: 0.0395 - mae: 0.1214 - val_loss: 0.0463 - val_mae: 0.1168
Epoch 10/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step - loss: 0.0386 - mae: 0.1174 - val_loss: 0.0467 - val_mae: 0.1144
Epoch 11/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step - loss: 0.0393 - mae: 0.1157 - val_loss: 0.0473 - val_mae: 0.1121
Epoch 12/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step - loss: 0.0377 - mae: 0.1101 - val_loss: 0.0471 - val_mae: 0.1117
Epoch 13/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 46ms/step - loss: 0.0377 - mae: 0.1130 - val_loss: 0.0458 - val_mae: 0.1158
Epoch 14/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 44ms/step - loss: 0.0365 - mae: 0.1166 - val_loss: 0.0450 - val_mae: 0.1187
Epoch 15/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step - loss: 0.0363 - mae: 0.1165 - val_loss: 0.0457 - val_mae: 0.1148
Epoch 16/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step - loss: 0.0360 - mae: 0.1109 - val_loss: 0.0467 - val_mae: 0.1111
Epoch 17/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step - loss: 0.0363 - mae: 0.1080 - val_loss: 0.0469 - val_mae: 0.1103
Epoch 18/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step - loss: 0.0361 - mae: 0.1062 - val_loss: 0.0464 - val_mae: 0.1106
Epoch 19/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step - loss: 0.0355 - mae: 0.1082 - val_loss: 0.0454 - val_mae: 0.1129
2026-05-20 06:53:29,141 - INFO - Final training history: {'loss': [0.052683450281620026, 0.04894439876079559, 0.04614520072937012, 0.04377656430006027, 0.04299024119973183, 0.0413011871278286, 0.04041396081447601, 0.039664506912231445, 0.03953145071864128, 0.038625895977020264, 0.039252445101737976, 0.037657175213098526, 0.037708964198827744, 0.03647177293896675, 0.036287158727645874, 0.036025919020175934, 0.036328744143247604, 0.03607558086514473, 0.03549504652619362], 'mae': [0.09995052218437195, 0.09865744411945343, 0.10361288487911224, 0.11113294214010239, 0.1181262657046318, 0.11810366064310074, 0.11597929894924164, 0.11844741553068161, 0.12140600383281708, 0.1174427717924118, 0.11565195769071579, 0.11005387455224991, 0.11295762658119202, 0.1166088879108429, 0.11653508991003036, 0.11090037971735, 0.10796243697404861, 0.10622791200876236, 0.10821817070245743], 'val_loss': [0.05842522159218788, 0.05495268478989601, 0.051591407507658005, 0.04850035160779953, 0.047529980540275574, 0.04762759804725647, 0.047324288636446, 0.04637359827756882, 0.046305328607559204, 0.04666989669203758, 0.04728473722934723, 0.047130048274993896, 0.045755647122859955, 0.045045606791973114, 0.04570969194173813, 0.0467301644384861, 0.046911388635635376, 0.046390313655138016, 0.045448604971170425], 'val_mae': [0.09536220878362656, 0.10019825398921967, 0.10528550297021866, 0.11162266880273819, 0.11413943767547607, 0.11442534625530243, 0.11524150520563126, 0.11765346676111221, 0.11679786443710327, 0.11443264037370682, 0.11209078878164291, 0.11174062639474869, 0.11584629863500595, 0.11871983855962753, 0.11482322216033936, 0.11114253848791122, 0.11031882464885712, 0.11055810004472733, 0.11287226527929306]}
2026-05-20 06:53:29,285 - INFO - Model training complete. Best model saved as /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/trained_models/bias_correction_model_month08_dekad21.keras
2026-05-20 06:53:29,287 - INFO - Pipeline [08 d3]: Loading confidence mask...
2026-05-20 06:53:29,289 - INFO - Loading existing confidence mask: /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/station_density/confidence_mask_station_density.nc4
2026-05-20 06:53:29,290 - INFO - Pipeline [08 d3]: Applying DL refinement...
2026-05-20 06:53:29,309 - INFO - Pixel-wise threshold map computed at 80th percentile. threshold_2d shape: (9, 14)
2026-05-20 06:53:29,310 - INFO - DL blending: base alpha=0.70 (LSEQM weight), 1-alpha=0.30 (DL weight)
2026-05-20 06:53:29,311 - INFO - Confidence mask active: spatial alpha modulation enabled. Confidence range: [0.000, 0.411]
2026-05-20 06:53:47,499 - INFO - DL blending complete: 275 daily slices processed, 1,801 extreme pixels blended (alpha=0.70)
2026-05-20 06:53:47,597 - INFO - Precip data dims: ('time', 'lat', 'lon'), shape: (275, 9, 14)
2026-05-20 06:53:47,641 - INFO - Saved Hybrid Deep Learning-Physical (Linear Scaling and Empirical Quantile Mapping) Approach corrected precipitation for month 08, dekad 21 at /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_lseqmdl/bali_cli_lseqmdl_corrected_imergl_month08_dekad21.nc4
2026-05-20 06:53:47,642 - INFO - Pipeline [08 d3]: Complete.
✓ month 08 dekad 3 — saved: /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_lseqmdl/bali_cli_imergl_lseqmdl_corrected_precip_month08_dekad21.nc4

============================================================
▸ month 09 dekad 1
============================================================
2026-05-20 06:53:47,643 - INFO - Pipeline [09 d1]: Running LSEQM...
2026-05-20 06:53:47,646 - INFO - Aligning IMERG and CPC datasets...
2026-05-20 06:53:47,654 - INFO - After alignment: IMERG has 9131 time steps, CPC has 9131 time steps
2026-05-20 06:53:47,655 - INFO - Creating time-based masks...
2026-05-20 06:53:47,666 - INFO - Applying time masks...
2026-05-20 06:53:47,677 - INFO - IMERG dekad data shape: (250, 9, 14)
2026-05-20 06:53:47,678 - INFO - CPC dekad data shape: (250, 9, 14)
2026-05-20 06:53:47,680 - INFO - Using native-resolution CPC parameter fitting (BCSD principle)...
2026-05-20 06:53:47,709 - INFO - CPC native dekad data: (250, 4, 6) (lat -9.25–-7.75, lon 113.75–116.25)
2026-05-20 06:53:51,560 - INFO -   Native CPC fitting: row 4/4 (100%) | 24 fitted, 0 skipped | elapsed 4s, ETA 0s
2026-05-20 06:53:51,561 - INFO - Fitted CPC params on native grid: 24/24 cells
2026-05-20 06:53:51,607 - INFO - Interpolated CPC params to IMERG grid: 126/126 valid pixels
2026-05-20 06:53:51,608 - INFO - Performing Linear Scaling (LS)...
2026-05-20 06:53:51,618 - INFO - LS using bilinearly interpolated CPC mean (smooth).
2026-05-20 06:53:51,621 - INFO - Saving LS corrected precipitation...
2026-05-20 06:53:51,625 - INFO - Precip data dims: ('time', 'lat', 'lon'), shape: (250, 9, 14)
2026-05-20 06:53:51,679 - INFO - Saved Linear Scaling corrected precipitation for month 09, dekad 01 at /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_ls/bali_cli_ls_corrected_imergl_month09_dekad01.nc4
2026-05-20 06:53:51,680 - INFO - Applying Empirical Quantile Mapping (EQM) on 9x14 grid...
2026-05-20 06:53:51,767 - INFO -   EQM progress: row 9/9 (100%) | 80 land pixels done | elapsed 0s, ETA 0s
2026-05-20 06:53:51,771 - INFO - EQM complete: 80/126 grid points corrected (46 masked/ocean pixels skipped)
2026-05-20 06:53:51,773 - INFO - Saving LSEQM corrected precipitation...
2026-05-20 06:53:51,776 - INFO - Precip data dims: ('time', 'lat', 'lon'), shape: (250, 9, 14)
2026-05-20 06:53:51,822 - INFO - Saved Linear Scaling and Empirical Quantile Mapping corrected precipitation for month 09, dekad 01 at /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_lseqm/bali_cli_lseqm_corrected_imergl_month09_dekad01.nc4
2026-05-20 06:53:51,823 - INFO - Pipeline [09 d1]: Training / loading DL model...
2026-05-20 06:53:51,824 - INFO - Checking if the model file exists at: /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/trained_models/bias_correction_model_month09_dekad01.keras

2026-05-20 06:53:51,889 - INFO - Model: "sequential_24"
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
┃ Layer (type)                    ┃ Output Shape           ┃       Param # ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│ conv2d_48 (Conv2D)              │ (None, 9, 14, 32)      │           320 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ max_pooling2d_48 (MaxPooling2D) │ (None, 4, 7, 32)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_72 (Dropout)            │ (None, 4, 7, 32)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ conv2d_49 (Conv2D)              │ (None, 4, 7, 64)       │        18,496 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ max_pooling2d_49 (MaxPooling2D) │ (None, 2, 3, 64)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_73 (Dropout)            │ (None, 2, 3, 64)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ flatten_24 (Flatten)            │ (None, 384)            │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dense_48 (Dense)                │ (None, 128)            │        49,280 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_74 (Dropout)            │ (None, 128)            │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dense_49 (Dense)                │ (None, 126)            │        16,254 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ reshape_24 (Reshape)            │ (None, 9, 14)          │             0 │
└─────────────────────────────────┴────────────────────────┴───────────────┘
 Total params: 84,350 (329.49 KB)
 Trainable params: 84,350 (329.49 KB)
 Non-trainable params: 0 (0.00 B)

Epoch 1/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 1s 94ms/step - loss: 0.0456 - mae: 0.0849 - val_loss: 0.0794 - val_mae: 0.1165
Epoch 2/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 42ms/step - loss: 0.0431 - mae: 0.0849 - val_loss: 0.0751 - val_mae: 0.1194
Epoch 3/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 41ms/step - loss: 0.0408 - mae: 0.0893 - val_loss: 0.0698 - val_mae: 0.1225
Epoch 4/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 47ms/step - loss: 0.0391 - mae: 0.0957 - val_loss: 0.0645 - val_mae: 0.1257
Epoch 5/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 42ms/step - loss: 0.0376 - mae: 0.1029 - val_loss: 0.0603 - val_mae: 0.1284
Epoch 6/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 44ms/step - loss: 0.0369 - mae: 0.1074 - val_loss: 0.0597 - val_mae: 0.1265
Epoch 7/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step - loss: 0.0359 - mae: 0.1030 - val_loss: 0.0610 - val_mae: 0.1249
Epoch 8/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step - loss: 0.0349 - mae: 0.1004 - val_loss: 0.0599 - val_mae: 0.1260
Epoch 9/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 44ms/step - loss: 0.0351 - mae: 0.1031 - val_loss: 0.0574 - val_mae: 0.1266
Epoch 10/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 42ms/step - loss: 0.0341 - mae: 0.1061 - val_loss: 0.0547 - val_mae: 0.1274
Epoch 11/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 50ms/step - loss: 0.0344 - mae: 0.1091 - val_loss: 0.0543 - val_mae: 0.1261
Epoch 12/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 44ms/step - loss: 0.0335 - mae: 0.1064 - val_loss: 0.0540 - val_mae: 0.1240
Epoch 13/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 43ms/step - loss: 0.0337 - mae: 0.1040 - val_loss: 0.0527 - val_mae: 0.1211
Epoch 14/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 39ms/step - loss: 0.0332 - mae: 0.1002 - val_loss: 0.0522 - val_mae: 0.1184
Epoch 15/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 42ms/step - loss: 0.0328 - mae: 0.0987 - val_loss: 0.0512 - val_mae: 0.1162
Epoch 16/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step - loss: 0.0324 - mae: 0.0945 - val_loss: 0.0512 - val_mae: 0.1139
Epoch 17/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 40ms/step - loss: 0.0328 - mae: 0.0955 - val_loss: 0.0487 - val_mae: 0.1126
Epoch 18/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step - loss: 0.0309 - mae: 0.0934 - val_loss: 0.0493 - val_mae: 0.1113
Epoch 19/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 42ms/step - loss: 0.0313 - mae: 0.0926 - val_loss: 0.0483 - val_mae: 0.1104
Epoch 20/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 43ms/step - loss: 0.0311 - mae: 0.0928 - val_loss: 0.0472 - val_mae: 0.1112
Epoch 21/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 45ms/step - loss: 0.0308 - mae: 0.0960 - val_loss: 0.0453 - val_mae: 0.1147
Epoch 22/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 40ms/step - loss: 0.0305 - mae: 0.1033 - val_loss: 0.0446 - val_mae: 0.1185
Epoch 23/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step - loss: 0.0305 - mae: 0.1047 - val_loss: 0.0459 - val_mae: 0.1183
Epoch 24/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step - loss: 0.0302 - mae: 0.1033 - val_loss: 0.0449 - val_mae: 0.1178
Epoch 25/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step - loss: 0.0305 - mae: 0.1027 - val_loss: 0.0463 - val_mae: 0.1146
Epoch 26/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step - loss: 0.0295 - mae: 0.0960 - val_loss: 0.0448 - val_mae: 0.1118
Epoch 27/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 41ms/step - loss: 0.0302 - mae: 0.0960 - val_loss: 0.0436 - val_mae: 0.1103
Epoch 28/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step - loss: 0.0292 - mae: 0.0942 - val_loss: 0.0444 - val_mae: 0.1104
Epoch 29/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step - loss: 0.0293 - mae: 0.0921 - val_loss: 0.0487 - val_mae: 0.1134
Epoch 30/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step - loss: 0.0288 - mae: 0.0894 - val_loss: 0.0486 - val_mae: 0.1143
Epoch 31/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step - loss: 0.0290 - mae: 0.0910 - val_loss: 0.0458 - val_mae: 0.1145
Epoch 32/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step - loss: 0.0286 - mae: 0.0932 - val_loss: 0.0447 - val_mae: 0.1140
2026-05-20 06:53:58,408 - INFO - Final training history: {'loss': [0.045557256788015366, 0.04312313720583916, 0.04083985835313797, 0.03910211846232414, 0.03760546073317528, 0.0368603840470314, 0.035860124975442886, 0.03491396829485893, 0.0350646898150444, 0.03414170816540718, 0.034404926002025604, 0.0334603413939476, 0.03366396576166153, 0.0331958569586277, 0.03278857469558716, 0.03244151175022125, 0.0328044593334198, 0.030930740758776665, 0.03130440413951874, 0.031088940799236298, 0.03076360933482647, 0.0305167343467474, 0.03049212135374546, 0.030199041590094566, 0.030508195981383324, 0.029484856873750687, 0.030195552855730057, 0.029195889830589294, 0.029283512383699417, 0.028817474842071533, 0.028979528695344925, 0.02863040380179882], 'mae': [0.08490967005491257, 0.08485931158065796, 0.08927986770868301, 0.09568033367395401, 0.10288164019584656, 0.10743315517902374, 0.10299083590507507, 0.10037574917078018, 0.10307413339614868, 0.10613051056861877, 0.10905858874320984, 0.10642068088054657, 0.10403858870267868, 0.10021980106830597, 0.09869290143251419, 0.09449458867311478, 0.09554342925548553, 0.09339774399995804, 0.09262269735336304, 0.0928344652056694, 0.09598898887634277, 0.10325462371110916, 0.10466516762971878, 0.10330292582511902, 0.10270357131958008, 0.0960417166352272, 0.09600207954645157, 0.09415534883737564, 0.09212712943553925, 0.08935093134641647, 0.09098001569509506, 0.09317238628864288], 'val_loss': [0.07938532531261444, 0.075092613697052, 0.06982868909835815, 0.06454376876354218, 0.06031987816095352, 0.05967835336923599, 0.06098480522632599, 0.05987606570124626, 0.05739022418856621, 0.054735392332077026, 0.05433342605829239, 0.053991612046957016, 0.052710190415382385, 0.05220646411180496, 0.05119461938738823, 0.051241785287857056, 0.04871862381696701, 0.049300070852041245, 0.04833843186497688, 0.04718441516160965, 0.04528304189443588, 0.04463167116045952, 0.04587622731924057, 0.04491173103451729, 0.046336326748132706, 0.044784318655729294, 0.04355756938457489, 0.04437073692679405, 0.048668503761291504, 0.04860960319638252, 0.04575659707188606, 0.04469941928982735], 'val_mae': [0.11651212722063065, 0.11938305199146271, 0.12246257066726685, 0.1257246881723404, 0.12836188077926636, 0.1265316903591156, 0.12488450855016708, 0.12603284418582916, 0.12657278776168823, 0.1274293065071106, 0.126051664352417, 0.12404938787221909, 0.12107589840888977, 0.11844882369041443, 0.11622802913188934, 0.11392375081777573, 0.11264760047197342, 0.1113375648856163, 0.11044511198997498, 0.11115732789039612, 0.11467573791742325, 0.11847969144582748, 0.11830943077802658, 0.11781205236911774, 0.11459039896726608, 0.1117839366197586, 0.11028176546096802, 0.1104186475276947, 0.1133776605129242, 0.11431824415922165, 0.1145104467868805, 0.11402354389429092]}
2026-05-20 06:53:58,549 - INFO - Model training complete. Best model saved as /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/trained_models/bias_correction_model_month09_dekad01.keras
2026-05-20 06:53:58,551 - INFO - Pipeline [09 d1]: Loading confidence mask...
2026-05-20 06:53:58,554 - INFO - Loading existing confidence mask: /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/station_density/confidence_mask_station_density.nc4
2026-05-20 06:53:58,555 - INFO - Pipeline [09 d1]: Applying DL refinement...
2026-05-20 06:53:58,571 - INFO - Pixel-wise threshold map computed at 80th percentile. threshold_2d shape: (9, 14)
2026-05-20 06:53:58,572 - INFO - DL blending: base alpha=0.70 (LSEQM weight), 1-alpha=0.30 (DL weight)
2026-05-20 06:53:58,573 - INFO - Confidence mask active: spatial alpha modulation enabled. Confidence range: [0.000, 0.411]
2026-05-20 06:54:15,579 - INFO - DL blending complete: 250 daily slices processed, 1,545 extreme pixels blended (alpha=0.70)
2026-05-20 06:54:16,527 - INFO - Precip data dims: ('time', 'lat', 'lon'), shape: (250, 9, 14)
2026-05-20 06:54:16,588 - INFO - Saved Hybrid Deep Learning-Physical (Linear Scaling and Empirical Quantile Mapping) Approach corrected precipitation for month 09, dekad 01 at /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_lseqmdl/bali_cli_lseqmdl_corrected_imergl_month09_dekad01.nc4
2026-05-20 06:54:16,589 - INFO - Pipeline [09 d1]: Complete.
✓ month 09 dekad 1 — saved: /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_lseqmdl/bali_cli_imergl_lseqmdl_corrected_precip_month09_dekad01.nc4

============================================================
▸ month 09 dekad 2
============================================================
2026-05-20 06:54:16,590 - INFO - Pipeline [09 d2]: Running LSEQM...
2026-05-20 06:54:16,593 - INFO - Aligning IMERG and CPC datasets...
2026-05-20 06:54:16,602 - INFO - After alignment: IMERG has 9131 time steps, CPC has 9131 time steps
2026-05-20 06:54:16,603 - INFO - Creating time-based masks...
2026-05-20 06:54:16,616 - INFO - Applying time masks...
2026-05-20 06:54:16,627 - INFO - IMERG dekad data shape: (250, 9, 14)
2026-05-20 06:54:16,627 - INFO - CPC dekad data shape: (250, 9, 14)
2026-05-20 06:54:16,631 - INFO - Using native-resolution CPC parameter fitting (BCSD principle)...
2026-05-20 06:54:16,661 - INFO - CPC native dekad data: (250, 4, 6) (lat -9.25–-7.75, lon 113.75–116.25)
2026-05-20 06:54:20,413 - INFO -   Native CPC fitting: row 4/4 (100%) | 24 fitted, 0 skipped | elapsed 4s, ETA 0s
2026-05-20 06:54:20,414 - INFO - Fitted CPC params on native grid: 24/24 cells
2026-05-20 06:54:20,457 - INFO - Interpolated CPC params to IMERG grid: 126/126 valid pixels
2026-05-20 06:54:20,458 - INFO - Performing Linear Scaling (LS)...
2026-05-20 06:54:20,468 - INFO - LS using bilinearly interpolated CPC mean (smooth).
2026-05-20 06:54:20,471 - INFO - Saving LS corrected precipitation...
2026-05-20 06:54:20,474 - INFO - Precip data dims: ('time', 'lat', 'lon'), shape: (250, 9, 14)
2026-05-20 06:54:20,534 - INFO - Saved Linear Scaling corrected precipitation for month 09, dekad 11 at /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_ls/bali_cli_ls_corrected_imergl_month09_dekad11.nc4
2026-05-20 06:54:20,536 - INFO - Applying Empirical Quantile Mapping (EQM) on 9x14 grid...
2026-05-20 06:54:20,616 - INFO -   EQM progress: row 9/9 (100%) | 80 land pixels done | elapsed 0s, ETA 0s
2026-05-20 06:54:20,619 - INFO - EQM complete: 80/126 grid points corrected (46 masked/ocean pixels skipped)
2026-05-20 06:54:20,621 - INFO - Saving LSEQM corrected precipitation...
2026-05-20 06:54:20,623 - INFO - Precip data dims: ('time', 'lat', 'lon'), shape: (250, 9, 14)
2026-05-20 06:54:20,669 - INFO - Saved Linear Scaling and Empirical Quantile Mapping corrected precipitation for month 09, dekad 11 at /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_lseqm/bali_cli_lseqm_corrected_imergl_month09_dekad11.nc4
2026-05-20 06:54:20,671 - INFO - Pipeline [09 d2]: Training / loading DL model...
2026-05-20 06:54:20,673 - INFO - Checking if the model file exists at: /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/trained_models/bias_correction_model_month09_dekad11.keras

2026-05-20 06:54:20,754 - INFO - Model: "sequential_25"
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
┃ Layer (type)                    ┃ Output Shape           ┃       Param # ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│ conv2d_50 (Conv2D)              │ (None, 9, 14, 32)      │           320 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ max_pooling2d_50 (MaxPooling2D) │ (None, 4, 7, 32)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_75 (Dropout)            │ (None, 4, 7, 32)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ conv2d_51 (Conv2D)              │ (None, 4, 7, 64)       │        18,496 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ max_pooling2d_51 (MaxPooling2D) │ (None, 2, 3, 64)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_76 (Dropout)            │ (None, 2, 3, 64)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ flatten_25 (Flatten)            │ (None, 384)            │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dense_50 (Dense)                │ (None, 128)            │        49,280 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_77 (Dropout)            │ (None, 128)            │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dense_51 (Dense)                │ (None, 126)            │        16,254 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ reshape_25 (Reshape)            │ (None, 9, 14)          │             0 │
└─────────────────────────────────┴────────────────────────┴───────────────┘
 Total params: 84,350 (329.49 KB)
 Trainable params: 84,350 (329.49 KB)
 Non-trainable params: 0 (0.00 B)

Epoch 1/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 2s 95ms/step - loss: 0.0596 - mae: 0.1115 - val_loss: 0.1010 - val_mae: 0.1619
Epoch 2/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 47ms/step - loss: 0.0545 - mae: 0.1071 - val_loss: 0.0926 - val_mae: 0.1600
Epoch 3/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 44ms/step - loss: 0.0502 - mae: 0.1123 - val_loss: 0.0783 - val_mae: 0.1574
Epoch 4/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 48ms/step - loss: 0.0460 - mae: 0.1222 - val_loss: 0.0668 - val_mae: 0.1545
Epoch 5/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 46ms/step - loss: 0.0443 - mae: 0.1292 - val_loss: 0.0632 - val_mae: 0.1517
Epoch 6/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step - loss: 0.0408 - mae: 0.1236 - val_loss: 0.0646 - val_mae: 0.1495
Epoch 7/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step - loss: 0.0394 - mae: 0.1185 - val_loss: 0.0653 - val_mae: 0.1480
Epoch 8/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step - loss: 0.0379 - mae: 0.1131 - val_loss: 0.0639 - val_mae: 0.1456
Epoch 9/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 44ms/step - loss: 0.0368 - mae: 0.1128 - val_loss: 0.0593 - val_mae: 0.1425
Epoch 10/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 49ms/step - loss: 0.0368 - mae: 0.1163 - val_loss: 0.0568 - val_mae: 0.1410
Epoch 11/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step - loss: 0.0357 - mae: 0.1145 - val_loss: 0.0597 - val_mae: 0.1407
Epoch 12/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step - loss: 0.0348 - mae: 0.1076 - val_loss: 0.0618 - val_mae: 0.1405
Epoch 13/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step - loss: 0.0336 - mae: 0.1038 - val_loss: 0.0594 - val_mae: 0.1388
Epoch 14/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step - loss: 0.0338 - mae: 0.1062 - val_loss: 0.0570 - val_mae: 0.1373
Epoch 15/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 42ms/step - loss: 0.0338 - mae: 0.1104 - val_loss: 0.0539 - val_mae: 0.1360
Epoch 16/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step - loss: 0.0332 - mae: 0.1105 - val_loss: 0.0544 - val_mae: 0.1351
Epoch 17/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step - loss: 0.0325 - mae: 0.1078 - val_loss: 0.0571 - val_mae: 0.1358
Epoch 18/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step - loss: 0.0332 - mae: 0.1040 - val_loss: 0.0606 - val_mae: 0.1372
Epoch 19/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step - loss: 0.0332 - mae: 0.1018 - val_loss: 0.0583 - val_mae: 0.1356
Epoch 20/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step - loss: 0.0324 - mae: 0.1032 - val_loss: 0.0546 - val_mae: 0.1334
2026-05-20 06:54:25,155 - INFO - Final training history: {'loss': [0.059617675840854645, 0.054460231214761734, 0.05022703483700752, 0.045959580689668655, 0.044316474348306656, 0.040770579129457474, 0.039400164037942886, 0.03785902261734009, 0.036818232387304306, 0.03675307333469391, 0.03568599745631218, 0.034778207540512085, 0.033586710691452026, 0.03382240608334541, 0.0337684191763401, 0.03317071497440338, 0.032471515238285065, 0.0331912524998188, 0.03320016711950302, 0.032366883009672165], 'mae': [0.11149376630783081, 0.10711850225925446, 0.1122724637389183, 0.12218839675188065, 0.12923890352249146, 0.12357473373413086, 0.11854356527328491, 0.11308985948562622, 0.1128457635641098, 0.1162806898355484, 0.11447913944721222, 0.10756674408912659, 0.10381033271551132, 0.10622890293598175, 0.11044089496135712, 0.11050760000944138, 0.10780450701713562, 0.10402468591928482, 0.10181715339422226, 0.10320603102445602], 'val_loss': [0.10103539377450943, 0.09257004410028458, 0.07832158356904984, 0.0668492540717125, 0.06320939213037491, 0.06455975025892258, 0.06529798358678818, 0.06394466757774353, 0.05930386111140251, 0.056845057755708694, 0.05969074368476868, 0.0617574006319046, 0.05937136337161064, 0.05703025683760643, 0.05386710539460182, 0.054362449795007706, 0.0570707768201828, 0.06057634949684143, 0.05826202780008316, 0.054635632783174515], 'val_mae': [0.16192300617694855, 0.15998655557632446, 0.15741214156150818, 0.15453654527664185, 0.1516793668270111, 0.1494675576686859, 0.14803162217140198, 0.14560693502426147, 0.1425386220216751, 0.14101633429527283, 0.14072087407112122, 0.1404995173215866, 0.13882727921009064, 0.13731876015663147, 0.13602286577224731, 0.13514356315135956, 0.1358080506324768, 0.13720062375068665, 0.1355734020471573, 0.13338717818260193]}
2026-05-20 06:54:25,303 - INFO - Model training complete. Best model saved as /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/trained_models/bias_correction_model_month09_dekad11.keras
2026-05-20 06:54:25,305 - INFO - Pipeline [09 d2]: Loading confidence mask...
2026-05-20 06:54:25,307 - INFO - Loading existing confidence mask: /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/station_density/confidence_mask_station_density.nc4
2026-05-20 06:54:25,308 - INFO - Pipeline [09 d2]: Applying DL refinement...
2026-05-20 06:54:25,322 - INFO - Pixel-wise threshold map computed at 80th percentile. threshold_2d shape: (9, 14)
2026-05-20 06:54:25,323 - INFO - DL blending: base alpha=0.70 (LSEQM weight), 1-alpha=0.30 (DL weight)
2026-05-20 06:54:25,324 - INFO - Confidence mask active: spatial alpha modulation enabled. Confidence range: [0.000, 0.411]
2026-05-20 06:54:43,403 - INFO - DL blending complete: 250 daily slices processed, 2,671 extreme pixels blended (alpha=0.70)
2026-05-20 06:54:43,512 - INFO - Precip data dims: ('time', 'lat', 'lon'), shape: (250, 9, 14)
2026-05-20 06:54:43,568 - INFO - Saved Hybrid Deep Learning-Physical (Linear Scaling and Empirical Quantile Mapping) Approach corrected precipitation for month 09, dekad 11 at /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_lseqmdl/bali_cli_lseqmdl_corrected_imergl_month09_dekad11.nc4
2026-05-20 06:54:43,569 - INFO - Pipeline [09 d2]: Complete.
✓ month 09 dekad 2 — saved: /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_lseqmdl/bali_cli_imergl_lseqmdl_corrected_precip_month09_dekad11.nc4

============================================================
▸ month 09 dekad 3
============================================================
2026-05-20 06:54:43,573 - INFO - Pipeline [09 d3]: Running LSEQM...
2026-05-20 06:54:43,578 - INFO - Aligning IMERG and CPC datasets...
2026-05-20 06:54:43,584 - INFO - After alignment: IMERG has 9131 time steps, CPC has 9131 time steps
2026-05-20 06:54:43,585 - INFO - Creating time-based masks...
2026-05-20 06:54:43,595 - INFO - Applying time masks...
2026-05-20 06:54:43,608 - INFO - IMERG dekad data shape: (250, 9, 14)
2026-05-20 06:54:43,609 - INFO - CPC dekad data shape: (250, 9, 14)
2026-05-20 06:54:43,611 - INFO - Using native-resolution CPC parameter fitting (BCSD principle)...
2026-05-20 06:54:43,640 - INFO - CPC native dekad data: (250, 4, 6) (lat -9.25–-7.75, lon 113.75–116.25)
2026-05-20 06:54:47,945 - INFO -   Native CPC fitting: row 4/4 (100%) | 24 fitted, 0 skipped | elapsed 4s, ETA 0s
2026-05-20 06:54:47,946 - INFO - Fitted CPC params on native grid: 24/24 cells
2026-05-20 06:54:47,990 - INFO - Interpolated CPC params to IMERG grid: 126/126 valid pixels
2026-05-20 06:54:47,990 - INFO - Performing Linear Scaling (LS)...
2026-05-20 06:54:48,000 - INFO - LS using bilinearly interpolated CPC mean (smooth).
2026-05-20 06:54:48,003 - INFO - Saving LS corrected precipitation...
2026-05-20 06:54:48,005 - INFO - Precip data dims: ('time', 'lat', 'lon'), shape: (250, 9, 14)
2026-05-20 06:54:48,060 - INFO - Saved Linear Scaling corrected precipitation for month 09, dekad 21 at /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_ls/bali_cli_ls_corrected_imergl_month09_dekad21.nc4
2026-05-20 06:54:48,061 - INFO - Applying Empirical Quantile Mapping (EQM) on 9x14 grid...
2026-05-20 06:54:48,135 - INFO -   EQM progress: row 9/9 (100%) | 80 land pixels done | elapsed 0s, ETA 0s
2026-05-20 06:54:48,139 - INFO - EQM complete: 80/126 grid points corrected (46 masked/ocean pixels skipped)
2026-05-20 06:54:48,140 - INFO - Saving LSEQM corrected precipitation...
2026-05-20 06:54:48,143 - INFO - Precip data dims: ('time', 'lat', 'lon'), shape: (250, 9, 14)
2026-05-20 06:54:48,201 - INFO - Saved Linear Scaling and Empirical Quantile Mapping corrected precipitation for month 09, dekad 21 at /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_lseqm/bali_cli_lseqm_corrected_imergl_month09_dekad21.nc4
2026-05-20 06:54:48,204 - INFO - Pipeline [09 d3]: Training / loading DL model...
2026-05-20 06:54:48,205 - INFO - Checking if the model file exists at: /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/trained_models/bias_correction_model_month09_dekad21.keras

2026-05-20 06:54:48,277 - INFO - Model: "sequential_26"
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
┃ Layer (type)                    ┃ Output Shape           ┃       Param # ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│ conv2d_52 (Conv2D)              │ (None, 9, 14, 32)      │           320 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ max_pooling2d_52 (MaxPooling2D) │ (None, 4, 7, 32)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_78 (Dropout)            │ (None, 4, 7, 32)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ conv2d_53 (Conv2D)              │ (None, 4, 7, 64)       │        18,496 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ max_pooling2d_53 (MaxPooling2D) │ (None, 2, 3, 64)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_79 (Dropout)            │ (None, 2, 3, 64)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ flatten_26 (Flatten)            │ (None, 384)            │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dense_52 (Dense)                │ (None, 128)            │        49,280 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_80 (Dropout)            │ (None, 128)            │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dense_53 (Dense)                │ (None, 126)            │        16,254 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ reshape_26 (Reshape)            │ (None, 9, 14)          │             0 │
└─────────────────────────────────┴────────────────────────┴───────────────┘
 Total params: 84,350 (329.49 KB)
 Trainable params: 84,350 (329.49 KB)
 Non-trainable params: 0 (0.00 B)

Epoch 1/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 2s 103ms/step - loss: 0.0533 - mae: 0.0953 - val_loss: 0.0880 - val_mae: 0.1361
Epoch 2/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 44ms/step - loss: 0.0495 - mae: 0.0947 - val_loss: 0.0819 - val_mae: 0.1370
Epoch 3/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 44ms/step - loss: 0.0458 - mae: 0.1002 - val_loss: 0.0739 - val_mae: 0.1374
Epoch 4/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 41ms/step - loss: 0.0421 - mae: 0.1052 - val_loss: 0.0667 - val_mae: 0.1373
Epoch 5/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 45ms/step - loss: 0.0397 - mae: 0.1097 - val_loss: 0.0623 - val_mae: 0.1367
Epoch 6/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 50ms/step - loss: 0.0382 - mae: 0.1114 - val_loss: 0.0606 - val_mae: 0.1356
Epoch 7/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 43ms/step - loss: 0.0363 - mae: 0.1094 - val_loss: 0.0611 - val_mae: 0.1343
Epoch 8/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 39ms/step - loss: 0.0357 - mae: 0.1051 - val_loss: 0.0625 - val_mae: 0.1334
Epoch 9/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 61ms/step - loss: 0.0353 - mae: 0.1041 - val_loss: 0.0603 - val_mae: 0.1324
Epoch 10/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 47ms/step - loss: 0.0337 - mae: 0.1033 - val_loss: 0.0611 - val_mae: 0.1316
Epoch 11/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 52ms/step - loss: 0.0336 - mae: 0.1010 - val_loss: 0.0613 - val_mae: 0.1307
Epoch 12/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 68ms/step - loss: 0.0326 - mae: 0.0999 - val_loss: 0.0596 - val_mae: 0.1299
Epoch 13/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 47ms/step - loss: 0.0330 - mae: 0.1010 - val_loss: 0.0599 - val_mae: 0.1294
Epoch 14/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 42ms/step - loss: 0.0323 - mae: 0.0993 - val_loss: 0.0600 - val_mae: 0.1293
Epoch 15/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 46ms/step - loss: 0.0312 - mae: 0.0980 - val_loss: 0.0601 - val_mae: 0.1289
Epoch 16/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 54ms/step - loss: 0.0308 - mae: 0.0966 - val_loss: 0.0596 - val_mae: 0.1288
Epoch 17/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 40ms/step - loss: 0.0314 - mae: 0.0974 - val_loss: 0.0607 - val_mae: 0.1285
2026-05-20 06:54:53,261 - INFO - Final training history: {'loss': [0.05326901748776436, 0.049477167427539825, 0.04584936797618866, 0.0421304851770401, 0.039698317646980286, 0.03823232278227806, 0.03630959615111351, 0.03569743037223816, 0.035346683114767075, 0.03368527069687843, 0.03362767770886421, 0.03255169093608856, 0.03301411494612694, 0.032330311834812164, 0.031170325353741646, 0.030835676938295364, 0.031421102583408356], 'mae': [0.09526127576828003, 0.09474653005599976, 0.1001855731010437, 0.10521513223648071, 0.10974914580583572, 0.11143942177295685, 0.10943304002285004, 0.10512390732765198, 0.10410098731517792, 0.10327516496181488, 0.10101645439863205, 0.09987122565507889, 0.10098633170127869, 0.09929303824901581, 0.09803888946771622, 0.09655699878931046, 0.09744459390640259], 'val_loss': [0.0879761278629303, 0.08187472075223923, 0.07391377538442612, 0.06673507392406464, 0.062285054475069046, 0.06056736409664154, 0.061072077602148056, 0.0625082403421402, 0.06034145504236221, 0.061077702790498734, 0.06134149059653282, 0.05955713242292404, 0.05993760749697685, 0.060031503438949585, 0.06014275178313255, 0.05964856967329979, 0.06070274859666824], 'val_mae': [0.13608361780643463, 0.13695211708545685, 0.13738763332366943, 0.13726657629013062, 0.13665015995502472, 0.13557296991348267, 0.1342921257019043, 0.13336244225502014, 0.13236671686172485, 0.13159741461277008, 0.13067053258419037, 0.12991304695606232, 0.12942305207252502, 0.12925077974796295, 0.1289292871952057, 0.1288449913263321, 0.12851712107658386]}
2026-05-20 06:54:53,408 - INFO - Model training complete. Best model saved as /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/trained_models/bias_correction_model_month09_dekad21.keras
2026-05-20 06:54:53,410 - INFO - Pipeline [09 d3]: Loading confidence mask...
2026-05-20 06:54:53,413 - INFO - Loading existing confidence mask: /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/station_density/confidence_mask_station_density.nc4
2026-05-20 06:54:53,414 - INFO - Pipeline [09 d3]: Applying DL refinement...
2026-05-20 06:54:53,428 - INFO - Pixel-wise threshold map computed at 80th percentile. threshold_2d shape: (9, 14)
2026-05-20 06:54:53,429 - INFO - DL blending: base alpha=0.70 (LSEQM weight), 1-alpha=0.30 (DL weight)
2026-05-20 06:54:53,431 - INFO - Confidence mask active: spatial alpha modulation enabled. Confidence range: [0.000, 0.411]
2026-05-20 06:55:09,844 - INFO - DL blending complete: 250 daily slices processed, 2,361 extreme pixels blended (alpha=0.70)
2026-05-20 06:55:09,936 - INFO - Precip data dims: ('time', 'lat', 'lon'), shape: (250, 9, 14)
2026-05-20 06:55:09,977 - INFO - Saved Hybrid Deep Learning-Physical (Linear Scaling and Empirical Quantile Mapping) Approach corrected precipitation for month 09, dekad 21 at /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_lseqmdl/bali_cli_lseqmdl_corrected_imergl_month09_dekad21.nc4
2026-05-20 06:55:09,977 - INFO - Pipeline [09 d3]: Complete.
✓ month 09 dekad 3 — saved: /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_lseqmdl/bali_cli_imergl_lseqmdl_corrected_precip_month09_dekad21.nc4

============================================================
▸ month 10 dekad 1
============================================================
2026-05-20 06:55:09,979 - INFO - Pipeline [10 d1]: Running LSEQM...
2026-05-20 06:55:09,984 - INFO - Aligning IMERG and CPC datasets...
2026-05-20 06:55:09,992 - INFO - After alignment: IMERG has 9131 time steps, CPC has 9131 time steps
2026-05-20 06:55:09,993 - INFO - Creating time-based masks...
2026-05-20 06:55:10,004 - INFO - Applying time masks...
2026-05-20 06:55:10,015 - INFO - IMERG dekad data shape: (250, 9, 14)
2026-05-20 06:55:10,016 - INFO - CPC dekad data shape: (250, 9, 14)
2026-05-20 06:55:10,019 - INFO - Using native-resolution CPC parameter fitting (BCSD principle)...
2026-05-20 06:55:10,048 - INFO - CPC native dekad data: (250, 4, 6) (lat -9.25–-7.75, lon 113.75–116.25)
2026-05-20 06:55:13,788 - INFO -   Native CPC fitting: row 4/4 (100%) | 24 fitted, 0 skipped | elapsed 4s, ETA 0s
2026-05-20 06:55:13,789 - INFO - Fitted CPC params on native grid: 24/24 cells
2026-05-20 06:55:13,834 - INFO - Interpolated CPC params to IMERG grid: 126/126 valid pixels
2026-05-20 06:55:13,835 - INFO - Performing Linear Scaling (LS)...
2026-05-20 06:55:13,844 - INFO - LS using bilinearly interpolated CPC mean (smooth).
2026-05-20 06:55:13,849 - INFO - Saving LS corrected precipitation...
2026-05-20 06:55:13,853 - INFO - Precip data dims: ('time', 'lat', 'lon'), shape: (250, 9, 14)
2026-05-20 06:55:13,905 - INFO - Saved Linear Scaling corrected precipitation for month 10, dekad 01 at /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_ls/bali_cli_ls_corrected_imergl_month10_dekad01.nc4
2026-05-20 06:55:13,906 - INFO - Applying Empirical Quantile Mapping (EQM) on 9x14 grid...
2026-05-20 06:55:13,990 - INFO -   EQM progress: row 9/9 (100%) | 80 land pixels done | elapsed 0s, ETA 0s
2026-05-20 06:55:13,994 - INFO - EQM complete: 80/126 grid points corrected (46 masked/ocean pixels skipped)
2026-05-20 06:55:13,996 - INFO - Saving LSEQM corrected precipitation...
2026-05-20 06:55:13,999 - INFO - Precip data dims: ('time', 'lat', 'lon'), shape: (250, 9, 14)
2026-05-20 06:55:14,044 - INFO - Saved Linear Scaling and Empirical Quantile Mapping corrected precipitation for month 10, dekad 01 at /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_lseqm/bali_cli_lseqm_corrected_imergl_month10_dekad01.nc4
2026-05-20 06:55:14,046 - INFO - Pipeline [10 d1]: Training / loading DL model...
2026-05-20 06:55:14,047 - INFO - Checking if the model file exists at: /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/trained_models/bias_correction_model_month10_dekad01.keras

2026-05-20 06:55:14,112 - INFO - Model: "sequential_27"
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
┃ Layer (type)                    ┃ Output Shape           ┃       Param # ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│ conv2d_54 (Conv2D)              │ (None, 9, 14, 32)      │           320 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ max_pooling2d_54 (MaxPooling2D) │ (None, 4, 7, 32)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_81 (Dropout)            │ (None, 4, 7, 32)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ conv2d_55 (Conv2D)              │ (None, 4, 7, 64)       │        18,496 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ max_pooling2d_55 (MaxPooling2D) │ (None, 2, 3, 64)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_82 (Dropout)            │ (None, 2, 3, 64)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ flatten_27 (Flatten)            │ (None, 384)            │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dense_54 (Dense)                │ (None, 128)            │        49,280 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_83 (Dropout)            │ (None, 128)            │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dense_55 (Dense)                │ (None, 126)            │        16,254 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ reshape_27 (Reshape)            │ (None, 9, 14)          │             0 │
└─────────────────────────────────┴────────────────────────┴───────────────┘
 Total params: 84,350 (329.49 KB)
 Trainable params: 84,350 (329.49 KB)
 Non-trainable params: 0 (0.00 B)

Epoch 1/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 1s 97ms/step - loss: 0.0788 - mae: 0.1399 - val_loss: 0.0943 - val_mae: 0.1531
Epoch 2/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 90ms/step - loss: 0.0706 - mae: 0.1369 - val_loss: 0.0831 - val_mae: 0.1539
Epoch 3/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 1s 69ms/step - loss: 0.0636 - mae: 0.1434 - val_loss: 0.0705 - val_mae: 0.1542
Epoch 4/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 54ms/step - loss: 0.0595 - mae: 0.1517 - val_loss: 0.0654 - val_mae: 0.1515
Epoch 5/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 40ms/step - loss: 0.0554 - mae: 0.1479 - val_loss: 0.0661 - val_mae: 0.1495
Epoch 6/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 62ms/step - loss: 0.0534 - mae: 0.1423 - val_loss: 0.0638 - val_mae: 0.1482
Epoch 7/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 69ms/step - loss: 0.0503 - mae: 0.1411 - val_loss: 0.0581 - val_mae: 0.1467
Epoch 8/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 66ms/step - loss: 0.0495 - mae: 0.1440 - val_loss: 0.0576 - val_mae: 0.1440
Epoch 9/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 33ms/step - loss: 0.0479 - mae: 0.1398 - val_loss: 0.0599 - val_mae: 0.1418
Epoch 10/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step - loss: 0.0466 - mae: 0.1332 - val_loss: 0.0610 - val_mae: 0.1410
Epoch 11/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step - loss: 0.0469 - mae: 0.1325 - val_loss: 0.0582 - val_mae: 0.1405
Epoch 12/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 43ms/step - loss: 0.0450 - mae: 0.1346 - val_loss: 0.0556 - val_mae: 0.1417
Epoch 13/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step - loss: 0.0435 - mae: 0.1366 - val_loss: 0.0557 - val_mae: 0.1411
Epoch 14/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step - loss: 0.0442 - mae: 0.1352 - val_loss: 0.0574 - val_mae: 0.1398
Epoch 15/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step - loss: 0.0429 - mae: 0.1287 - val_loss: 0.0592 - val_mae: 0.1397
Epoch 16/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 40ms/step - loss: 0.0434 - mae: 0.1299 - val_loss: 0.0555 - val_mae: 0.1411
Epoch 17/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 42ms/step - loss: 0.0427 - mae: 0.1340 - val_loss: 0.0548 - val_mae: 0.1422
Epoch 18/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step - loss: 0.0425 - mae: 0.1340 - val_loss: 0.0569 - val_mae: 0.1402
Epoch 19/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step - loss: 0.0412 - mae: 0.1256 - val_loss: 0.0614 - val_mae: 0.1400
Epoch 20/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step - loss: 0.0428 - mae: 0.1217 - val_loss: 0.0640 - val_mae: 0.1404
Epoch 21/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step - loss: 0.0429 - mae: 0.1217 - val_loss: 0.0591 - val_mae: 0.1391
Epoch 22/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 43ms/step - loss: 0.0408 - mae: 0.1259 - val_loss: 0.0548 - val_mae: 0.1415
Epoch 23/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 41ms/step - loss: 0.0424 - mae: 0.1353 - val_loss: 0.0547 - val_mae: 0.1409
Epoch 24/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step - loss: 0.0408 - mae: 0.1298 - val_loss: 0.0565 - val_mae: 0.1382
Epoch 25/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step - loss: 0.0401 - mae: 0.1241 - val_loss: 0.0569 - val_mae: 0.1367
Epoch 26/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step - loss: 0.0391 - mae: 0.1210 - val_loss: 0.0552 - val_mae: 0.1362
Epoch 27/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 41ms/step - loss: 0.0395 - mae: 0.1256 - val_loss: 0.0545 - val_mae: 0.1367
Epoch 28/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step - loss: 0.0391 - mae: 0.1237 - val_loss: 0.0561 - val_mae: 0.1353
Epoch 29/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step - loss: 0.0393 - mae: 0.1197 - val_loss: 0.0585 - val_mae: 0.1353
Epoch 30/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step - loss: 0.0381 - mae: 0.1163 - val_loss: 0.0566 - val_mae: 0.1352
Epoch 31/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step - loss: 0.0386 - mae: 0.1212 - val_loss: 0.0547 - val_mae: 0.1374
Epoch 32/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step - loss: 0.0378 - mae: 0.1225 - val_loss: 0.0560 - val_mae: 0.1380
2026-05-20 06:55:21,173 - INFO - Final training history: {'loss': [0.07877185195684433, 0.07060347497463226, 0.0636444091796875, 0.05948655679821968, 0.055363431572914124, 0.05335824936628342, 0.05027700960636139, 0.04945417493581772, 0.04790539667010307, 0.046647459268569946, 0.04692937433719635, 0.044962115585803986, 0.04352641478180885, 0.04424150288105011, 0.04294867441058159, 0.04340656101703644, 0.04273797944188118, 0.042483292520046234, 0.041241396218538284, 0.042824435979127884, 0.042893651872873306, 0.04082709178328514, 0.04243702068924904, 0.04081106185913086, 0.04011654481291771, 0.03913022577762604, 0.03954990953207016, 0.03906913846731186, 0.03926856815814972, 0.03812476620078087, 0.03862013295292854, 0.03779379650950432], 'mae': [0.1398637592792511, 0.13689838349819183, 0.143386110663414, 0.15169091522693634, 0.14785662293434143, 0.1423337459564209, 0.1411297470331192, 0.14395613968372345, 0.13983196020126343, 0.13323894143104553, 0.13251186907291412, 0.13455528020858765, 0.13660524785518646, 0.1352059245109558, 0.12874308228492737, 0.12993097305297852, 0.13397298753261566, 0.13402964174747467, 0.12560492753982544, 0.12166021019220352, 0.12166793644428253, 0.12585172057151794, 0.13530640304088593, 0.12977728247642517, 0.12409737706184387, 0.12098536640405655, 0.12564051151275635, 0.1237465962767601, 0.11974618583917618, 0.11626625806093216, 0.1211782917380333, 0.12247908860445023], 'val_loss': [0.0942917987704277, 0.08308178186416626, 0.07052161544561386, 0.06543108820915222, 0.06608022749423981, 0.06383650749921799, 0.05806504189968109, 0.05761536583304405, 0.05990125983953476, 0.061005111783742905, 0.058229535818099976, 0.05556682124733925, 0.05570846423506737, 0.05743567645549774, 0.0591556541621685, 0.055529989302158356, 0.054798342287540436, 0.05688982829451561, 0.0614473819732666, 0.06397537887096405, 0.059058934450149536, 0.054772138595581055, 0.05471380054950714, 0.0565381720662117, 0.05692733824253082, 0.05518342927098274, 0.05452406406402588, 0.05614074692130089, 0.058503951877355576, 0.05662835016846657, 0.054728418588638306, 0.05597059801220894], 'val_mae': [0.15313643217086792, 0.153941810131073, 0.15419277548789978, 0.15148776769638062, 0.14947864413261414, 0.1481587290763855, 0.1467464417219162, 0.14398038387298584, 0.14176003634929657, 0.14099207520484924, 0.1405165046453476, 0.1417093425989151, 0.14113856852054596, 0.13976013660430908, 0.13969090580940247, 0.14105316996574402, 0.14217285811901093, 0.14018863439559937, 0.13999196887016296, 0.14043028652668, 0.1390514075756073, 0.14145775139331818, 0.14093071222305298, 0.13823965191841125, 0.1366613358259201, 0.13622036576271057, 0.13670714199543, 0.13527098298072815, 0.13525110483169556, 0.1351894736289978, 0.13738641142845154, 0.1380077600479126]}
2026-05-20 06:55:21,331 - INFO - Model training complete. Best model saved as /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/trained_models/bias_correction_model_month10_dekad01.keras
2026-05-20 06:55:21,332 - INFO - Pipeline [10 d1]: Loading confidence mask...
2026-05-20 06:55:21,334 - INFO - Loading existing confidence mask: /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/station_density/confidence_mask_station_density.nc4
2026-05-20 06:55:21,335 - INFO - Pipeline [10 d1]: Applying DL refinement...
2026-05-20 06:55:21,352 - INFO - Pixel-wise threshold map computed at 80th percentile. threshold_2d shape: (9, 14)
2026-05-20 06:55:21,353 - INFO - DL blending: base alpha=0.70 (LSEQM weight), 1-alpha=0.30 (DL weight)
2026-05-20 06:55:21,354 - INFO - Confidence mask active: spatial alpha modulation enabled. Confidence range: [0.000, 0.411]
2026-05-20 06:55:37,604 - INFO - DL blending complete: 250 daily slices processed, 3,709 extreme pixels blended (alpha=0.70)
2026-05-20 06:55:37,691 - INFO - Precip data dims: ('time', 'lat', 'lon'), shape: (250, 9, 14)
2026-05-20 06:55:37,754 - INFO - Saved Hybrid Deep Learning-Physical (Linear Scaling and Empirical Quantile Mapping) Approach corrected precipitation for month 10, dekad 01 at /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_lseqmdl/bali_cli_lseqmdl_corrected_imergl_month10_dekad01.nc4
2026-05-20 06:55:37,755 - INFO - Pipeline [10 d1]: Complete.
✓ month 10 dekad 1 — saved: /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_lseqmdl/bali_cli_imergl_lseqmdl_corrected_precip_month10_dekad01.nc4

============================================================
▸ month 10 dekad 2
============================================================
2026-05-20 06:55:37,757 - INFO - Pipeline [10 d2]: Running LSEQM...
2026-05-20 06:55:37,760 - INFO - Aligning IMERG and CPC datasets...
2026-05-20 06:55:37,768 - INFO - After alignment: IMERG has 9131 time steps, CPC has 9131 time steps
2026-05-20 06:55:37,769 - INFO - Creating time-based masks...
2026-05-20 06:55:37,782 - INFO - Applying time masks...
2026-05-20 06:55:37,793 - INFO - IMERG dekad data shape: (250, 9, 14)
2026-05-20 06:55:37,794 - INFO - CPC dekad data shape: (250, 9, 14)
2026-05-20 06:55:37,799 - INFO - Using native-resolution CPC parameter fitting (BCSD principle)...
2026-05-20 06:55:37,829 - INFO - CPC native dekad data: (250, 4, 6) (lat -9.25–-7.75, lon 113.75–116.25)
2026-05-20 06:55:43,861 - INFO -   Native CPC fitting: row 4/4 (100%) | 24 fitted, 0 skipped | elapsed 6s, ETA 0s
2026-05-20 06:55:43,862 - INFO - Fitted CPC params on native grid: 24/24 cells
2026-05-20 06:55:43,908 - INFO - Interpolated CPC params to IMERG grid: 126/126 valid pixels
2026-05-20 06:55:43,908 - INFO - Performing Linear Scaling (LS)...
2026-05-20 06:55:43,918 - INFO - LS using bilinearly interpolated CPC mean (smooth).
2026-05-20 06:55:43,921 - INFO - Saving LS corrected precipitation...
2026-05-20 06:55:43,925 - INFO - Precip data dims: ('time', 'lat', 'lon'), shape: (250, 9, 14)
2026-05-20 06:55:43,982 - INFO - Saved Linear Scaling corrected precipitation for month 10, dekad 11 at /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_ls/bali_cli_ls_corrected_imergl_month10_dekad11.nc4
2026-05-20 06:55:43,983 - INFO - Applying Empirical Quantile Mapping (EQM) on 9x14 grid...
2026-05-20 06:55:44,060 - INFO -   EQM progress: row 9/9 (100%) | 80 land pixels done | elapsed 0s, ETA 0s
2026-05-20 06:55:44,063 - INFO - EQM complete: 80/126 grid points corrected (46 masked/ocean pixels skipped)
2026-05-20 06:55:44,064 - INFO - Saving LSEQM corrected precipitation...
2026-05-20 06:55:44,067 - INFO - Precip data dims: ('time', 'lat', 'lon'), shape: (250, 9, 14)
2026-05-20 06:55:44,113 - INFO - Saved Linear Scaling and Empirical Quantile Mapping corrected precipitation for month 10, dekad 11 at /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_lseqm/bali_cli_lseqm_corrected_imergl_month10_dekad11.nc4
2026-05-20 06:55:44,115 - INFO - Pipeline [10 d2]: Training / loading DL model...
2026-05-20 06:55:44,116 - INFO - Checking if the model file exists at: /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/trained_models/bias_correction_model_month10_dekad11.keras

2026-05-20 06:55:44,177 - INFO - Model: "sequential_28"
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
┃ Layer (type)                    ┃ Output Shape           ┃       Param # ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│ conv2d_56 (Conv2D)              │ (None, 9, 14, 32)      │           320 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ max_pooling2d_56 (MaxPooling2D) │ (None, 4, 7, 32)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_84 (Dropout)            │ (None, 4, 7, 32)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ conv2d_57 (Conv2D)              │ (None, 4, 7, 64)       │        18,496 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ max_pooling2d_57 (MaxPooling2D) │ (None, 2, 3, 64)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_85 (Dropout)            │ (None, 2, 3, 64)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ flatten_28 (Flatten)            │ (None, 384)            │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dense_56 (Dense)                │ (None, 128)            │        49,280 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_86 (Dropout)            │ (None, 128)            │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dense_57 (Dense)                │ (None, 126)            │        16,254 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ reshape_28 (Reshape)            │ (None, 9, 14)          │             0 │
└─────────────────────────────────┴────────────────────────┴───────────────┘
 Total params: 84,350 (329.49 KB)
 Trainable params: 84,350 (329.49 KB)
 Non-trainable params: 0 (0.00 B)

Epoch 1/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 1s 93ms/step - loss: 0.0601 - mae: 0.1130 - val_loss: 0.0909 - val_mae: 0.1465
Epoch 2/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 45ms/step - loss: 0.0552 - mae: 0.1104 - val_loss: 0.0815 - val_mae: 0.1456
Epoch 3/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 45ms/step - loss: 0.0509 - mae: 0.1156 - val_loss: 0.0706 - val_mae: 0.1432
Epoch 4/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 44ms/step - loss: 0.0473 - mae: 0.1231 - val_loss: 0.0633 - val_mae: 0.1412
Epoch 5/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 45ms/step - loss: 0.0451 - mae: 0.1282 - val_loss: 0.0599 - val_mae: 0.1404
Epoch 6/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step - loss: 0.0445 - mae: 0.1267 - val_loss: 0.0623 - val_mae: 0.1415
Epoch 7/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step - loss: 0.0430 - mae: 0.1231 - val_loss: 0.0606 - val_mae: 0.1420
Epoch 8/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 42ms/step - loss: 0.0424 - mae: 0.1233 - val_loss: 0.0586 - val_mae: 0.1416
Epoch 9/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 42ms/step - loss: 0.0417 - mae: 0.1254 - val_loss: 0.0560 - val_mae: 0.1414
Epoch 10/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 51ms/step - loss: 0.0413 - mae: 0.1263 - val_loss: 0.0555 - val_mae: 0.1411
Epoch 11/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step - loss: 0.0403 - mae: 0.1241 - val_loss: 0.0557 - val_mae: 0.1403
Epoch 12/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step - loss: 0.0400 - mae: 0.1214 - val_loss: 0.0558 - val_mae: 0.1390
Epoch 13/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 40ms/step - loss: 0.0403 - mae: 0.1201 - val_loss: 0.0538 - val_mae: 0.1381
Epoch 14/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 38ms/step - loss: 0.0394 - mae: 0.1225 - val_loss: 0.0502 - val_mae: 0.1391
Epoch 15/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step - loss: 0.0383 - mae: 0.1243 - val_loss: 0.0505 - val_mae: 0.1370
Epoch 16/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step - loss: 0.0379 - mae: 0.1200 - val_loss: 0.0539 - val_mae: 0.1358
Epoch 17/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step - loss: 0.0385 - mae: 0.1137 - val_loss: 0.0561 - val_mae: 0.1353
Epoch 18/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step - loss: 0.0369 - mae: 0.1104 - val_loss: 0.0509 - val_mae: 0.1342
Epoch 19/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 41ms/step - loss: 0.0359 - mae: 0.1148 - val_loss: 0.0476 - val_mae: 0.1362
Epoch 20/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 43ms/step - loss: 0.0380 - mae: 0.1247 - val_loss: 0.0474 - val_mae: 0.1360
Epoch 21/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step - loss: 0.0363 - mae: 0.1195 - val_loss: 0.0498 - val_mae: 0.1328
Epoch 22/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step - loss: 0.0358 - mae: 0.1120 - val_loss: 0.0518 - val_mae: 0.1325
Epoch 23/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step - loss: 0.0357 - mae: 0.1095 - val_loss: 0.0508 - val_mae: 0.1327
Epoch 24/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step - loss: 0.0341 - mae: 0.1093 - val_loss: 0.0495 - val_mae: 0.1322
Epoch 25/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step - loss: 0.0353 - mae: 0.1120 - val_loss: 0.0480 - val_mae: 0.1310
2026-05-20 06:55:49,080 - INFO - Final training history: {'loss': [0.06008393317461014, 0.0552307665348053, 0.05093305557966232, 0.04732554033398628, 0.04514576122164726, 0.044519729912281036, 0.0430450439453125, 0.04241933673620224, 0.04170806705951691, 0.041285332292318344, 0.04032624140381813, 0.04000728577375412, 0.04033735767006874, 0.03939785435795784, 0.03831653296947479, 0.03789406642317772, 0.038503725081682205, 0.03693240508437157, 0.03593670576810837, 0.03797829523682594, 0.03625626116991043, 0.03575946018099785, 0.03574793040752411, 0.03410962224006653, 0.03534657880663872], 'mae': [0.11295035481452942, 0.11040982604026794, 0.11561942100524902, 0.12307244539260864, 0.1282454878091812, 0.12673673033714294, 0.12310273945331573, 0.12329009920358658, 0.12535017728805542, 0.12631642818450928, 0.1240614503622055, 0.12141670286655426, 0.12009694427251816, 0.12247524410486221, 0.12425806373357773, 0.11997395753860474, 0.11371462047100067, 0.11035951972007751, 0.11480945348739624, 0.12466448545455933, 0.11949079483747482, 0.11199665814638138, 0.10945911705493927, 0.10933396965265274, 0.11202505975961685], 'val_loss': [0.09091813117265701, 0.08149569481611252, 0.07059366255998611, 0.06327500194311142, 0.059868112206459045, 0.06226518005132675, 0.06055671349167824, 0.05856205150485039, 0.056021977216005325, 0.055547162890434265, 0.0557301789522171, 0.05577867850661278, 0.053824231028556824, 0.0501796156167984, 0.050527140498161316, 0.053886543959379196, 0.0561058409512043, 0.05087091773748398, 0.04761843755841255, 0.047385796904563904, 0.04982520267367363, 0.051821425557136536, 0.05075281113386154, 0.04950198531150818, 0.04802544414997101], 'val_mae': [0.14648132026195526, 0.14559206366539001, 0.14315146207809448, 0.1411682367324829, 0.1403511017560959, 0.1414555311203003, 0.1419820338487625, 0.14155010879039764, 0.14139027893543243, 0.14114947617053986, 0.1403382271528244, 0.1389797180891037, 0.13806961476802826, 0.1390795260667801, 0.13695505261421204, 0.13576535880565643, 0.13527821004390717, 0.13417571783065796, 0.1362261176109314, 0.1360425502061844, 0.13277994096279144, 0.13250957429409027, 0.13270917534828186, 0.13218306005001068, 0.13098573684692383]}
2026-05-20 06:55:49,228 - INFO - Model training complete. Best model saved as /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/trained_models/bias_correction_model_month10_dekad11.keras
2026-05-20 06:55:49,229 - INFO - Pipeline [10 d2]: Loading confidence mask...
2026-05-20 06:55:49,231 - INFO - Loading existing confidence mask: /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/station_density/confidence_mask_station_density.nc4
2026-05-20 06:55:49,232 - INFO - Pipeline [10 d2]: Applying DL refinement...
2026-05-20 06:55:49,247 - INFO - Pixel-wise threshold map computed at 80th percentile. threshold_2d shape: (9, 14)
2026-05-20 06:55:49,248 - INFO - DL blending: base alpha=0.70 (LSEQM weight), 1-alpha=0.30 (DL weight)
2026-05-20 06:55:49,250 - INFO - Confidence mask active: spatial alpha modulation enabled. Confidence range: [0.000, 0.411]
2026-05-20 06:56:05,506 - INFO - DL blending complete: 250 daily slices processed, 3,425 extreme pixels blended (alpha=0.70)
2026-05-20 06:56:05,593 - INFO - Precip data dims: ('time', 'lat', 'lon'), shape: (250, 9, 14)
2026-05-20 06:56:05,635 - INFO - Saved Hybrid Deep Learning-Physical (Linear Scaling and Empirical Quantile Mapping) Approach corrected precipitation for month 10, dekad 11 at /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_lseqmdl/bali_cli_lseqmdl_corrected_imergl_month10_dekad11.nc4
2026-05-20 06:56:05,636 - INFO - Pipeline [10 d2]: Complete.
✓ month 10 dekad 2 — saved: /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_lseqmdl/bali_cli_imergl_lseqmdl_corrected_precip_month10_dekad11.nc4

============================================================
▸ month 10 dekad 3
============================================================
2026-05-20 06:56:05,641 - INFO - Pipeline [10 d3]: Running LSEQM...
2026-05-20 06:56:05,645 - INFO - Aligning IMERG and CPC datasets...
2026-05-20 06:56:05,652 - INFO - After alignment: IMERG has 9131 time steps, CPC has 9131 time steps
2026-05-20 06:56:05,653 - INFO - Creating time-based masks...
2026-05-20 06:56:05,664 - INFO - Applying time masks...
2026-05-20 06:56:05,679 - INFO - IMERG dekad data shape: (275, 9, 14)
2026-05-20 06:56:05,682 - INFO - CPC dekad data shape: (275, 9, 14)
2026-05-20 06:56:05,686 - INFO - Using native-resolution CPC parameter fitting (BCSD principle)...
2026-05-20 06:56:05,741 - INFO - CPC native dekad data: (275, 4, 6) (lat -9.25–-7.75, lon 113.75–116.25)
2026-05-20 06:56:09,014 - INFO -   Native CPC fitting: row 4/4 (100%) | 24 fitted, 0 skipped | elapsed 3s, ETA 0s
2026-05-20 06:56:09,015 - INFO - Fitted CPC params on native grid: 24/24 cells
2026-05-20 06:56:09,062 - INFO - Interpolated CPC params to IMERG grid: 126/126 valid pixels
2026-05-20 06:56:09,063 - INFO - Performing Linear Scaling (LS)...
2026-05-20 06:56:09,073 - INFO - LS using bilinearly interpolated CPC mean (smooth).
2026-05-20 06:56:09,077 - INFO - Saving LS corrected precipitation...
2026-05-20 06:56:09,079 - INFO - Precip data dims: ('time', 'lat', 'lon'), shape: (275, 9, 14)
2026-05-20 06:56:09,135 - INFO - Saved Linear Scaling corrected precipitation for month 10, dekad 21 at /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_ls/bali_cli_ls_corrected_imergl_month10_dekad21.nc4
2026-05-20 06:56:09,137 - INFO - Applying Empirical Quantile Mapping (EQM) on 9x14 grid...
2026-05-20 06:56:09,226 - INFO -   EQM progress: row 9/9 (100%) | 80 land pixels done | elapsed 0s, ETA 0s
2026-05-20 06:56:09,229 - INFO - EQM complete: 80/126 grid points corrected (46 masked/ocean pixels skipped)
2026-05-20 06:56:09,229 - INFO - Saving LSEQM corrected precipitation...
2026-05-20 06:56:09,233 - INFO - Precip data dims: ('time', 'lat', 'lon'), shape: (275, 9, 14)
2026-05-20 06:56:09,288 - INFO - Saved Linear Scaling and Empirical Quantile Mapping corrected precipitation for month 10, dekad 21 at /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_lseqm/bali_cli_lseqm_corrected_imergl_month10_dekad21.nc4
2026-05-20 06:56:09,290 - INFO - Pipeline [10 d3]: Training / loading DL model...
2026-05-20 06:56:09,292 - INFO - Checking if the model file exists at: /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/trained_models/bias_correction_model_month10_dekad21.keras

2026-05-20 06:56:09,375 - INFO - Model: "sequential_29"
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
┃ Layer (type)                    ┃ Output Shape           ┃       Param # ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│ conv2d_58 (Conv2D)              │ (None, 9, 14, 32)      │           320 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ max_pooling2d_58 (MaxPooling2D) │ (None, 4, 7, 32)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_87 (Dropout)            │ (None, 4, 7, 32)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ conv2d_59 (Conv2D)              │ (None, 4, 7, 64)       │        18,496 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ max_pooling2d_59 (MaxPooling2D) │ (None, 2, 3, 64)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_88 (Dropout)            │ (None, 2, 3, 64)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ flatten_29 (Flatten)            │ (None, 384)            │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dense_58 (Dense)                │ (None, 128)            │        49,280 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_89 (Dropout)            │ (None, 128)            │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dense_59 (Dense)                │ (None, 126)            │        16,254 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ reshape_29 (Reshape)            │ (None, 9, 14)          │             0 │
└─────────────────────────────────┴────────────────────────┴───────────────┘
 Total params: 84,350 (329.49 KB)
 Trainable params: 84,350 (329.49 KB)
 Non-trainable params: 0 (0.00 B)

Epoch 1/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 2s 101ms/step - loss: 0.0786 - mae: 0.1447 - val_loss: 0.0868 - val_mae: 0.1502
Epoch 2/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 44ms/step - loss: 0.0683 - mae: 0.1398 - val_loss: 0.0717 - val_mae: 0.1494
Epoch 3/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 42ms/step - loss: 0.0606 - mae: 0.1477 - val_loss: 0.0589 - val_mae: 0.1478
Epoch 4/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 46ms/step - loss: 0.0567 - mae: 0.1500 - val_loss: 0.0563 - val_mae: 0.1427
Epoch 5/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 43ms/step - loss: 0.0516 - mae: 0.1433 - val_loss: 0.0545 - val_mae: 0.1408
Epoch 6/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 41ms/step - loss: 0.0486 - mae: 0.1405 - val_loss: 0.0500 - val_mae: 0.1394
Epoch 7/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 44ms/step - loss: 0.0468 - mae: 0.1424 - val_loss: 0.0463 - val_mae: 0.1366
Epoch 8/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 43ms/step - loss: 0.0452 - mae: 0.1407 - val_loss: 0.0454 - val_mae: 0.1346
Epoch 9/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step - loss: 0.0450 - mae: 0.1384 - val_loss: 0.0475 - val_mae: 0.1336
Epoch 10/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step - loss: 0.0437 - mae: 0.1344 - val_loss: 0.0457 - val_mae: 0.1326
Epoch 11/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step - loss: 0.0437 - mae: 0.1344 - val_loss: 0.0459 - val_mae: 0.1318
Epoch 12/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 46ms/step - loss: 0.0412 - mae: 0.1307 - val_loss: 0.0442 - val_mae: 0.1308
Epoch 13/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step - loss: 0.0414 - mae: 0.1309 - val_loss: 0.0456 - val_mae: 0.1308
Epoch 14/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 45ms/step - loss: 0.0416 - mae: 0.1306 - val_loss: 0.0440 - val_mae: 0.1307
Epoch 15/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 44ms/step - loss: 0.0413 - mae: 0.1309 - val_loss: 0.0438 - val_mae: 0.1302
Epoch 16/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step - loss: 0.0411 - mae: 0.1315 - val_loss: 0.0441 - val_mae: 0.1298
Epoch 17/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step - loss: 0.0406 - mae: 0.1284 - val_loss: 0.0449 - val_mae: 0.1300
Epoch 18/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step - loss: 0.0399 - mae: 0.1252 - val_loss: 0.0460 - val_mae: 0.1297
Epoch 19/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step - loss: 0.0390 - mae: 0.1221 - val_loss: 0.0443 - val_mae: 0.1291
Epoch 20/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 46ms/step - loss: 0.0398 - mae: 0.1271 - val_loss: 0.0431 - val_mae: 0.1291
Epoch 21/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step - loss: 0.0388 - mae: 0.1238 - val_loss: 0.0451 - val_mae: 0.1277
Epoch 22/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 42ms/step - loss: 0.0385 - mae: 0.1212 - val_loss: 0.0427 - val_mae: 0.1271
Epoch 23/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step - loss: 0.0389 - mae: 0.1246 - val_loss: 0.0433 - val_mae: 0.1273
Epoch 24/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step - loss: 0.0370 - mae: 0.1199 - val_loss: 0.0452 - val_mae: 0.1275
Epoch 25/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step - loss: 0.0363 - mae: 0.1169 - val_loss: 0.0431 - val_mae: 0.1265
Epoch 26/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step - loss: 0.0382 - mae: 0.1227 - val_loss: 0.0429 - val_mae: 0.1261
Epoch 27/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 35ms/step - loss: 0.0358 - mae: 0.1166 - val_loss: 0.0461 - val_mae: 0.1259
2026-05-20 06:56:15,777 - INFO - Final training history: {'loss': [0.07859811186790466, 0.06833048909902573, 0.06061331182718277, 0.05668221414089203, 0.05159769952297211, 0.04863608255982399, 0.04679586738348007, 0.04516185075044632, 0.04501824826002121, 0.043700993061065674, 0.04365229606628418, 0.041175320744514465, 0.04139929264783859, 0.04162811487913132, 0.04129773750901222, 0.04109833016991615, 0.04058264568448067, 0.039927247911691666, 0.038969818502664566, 0.03976041078567505, 0.03880302235484123, 0.038481421768665314, 0.03893505781888962, 0.037046607583761215, 0.036321014165878296, 0.03815653920173645, 0.035789940506219864], 'mae': [0.14466539025306702, 0.139840230345726, 0.14768527448177338, 0.15003758668899536, 0.14330178499221802, 0.14053837954998016, 0.14240103960037231, 0.1407356709241867, 0.13841691613197327, 0.1344147026538849, 0.13437242805957794, 0.13069507479667664, 0.13088826835155487, 0.13058428466320038, 0.13085252046585083, 0.13150711357593536, 0.12837938964366913, 0.12518653273582458, 0.12212513387203217, 0.12706419825553894, 0.12384582310914993, 0.12120663374662399, 0.12464939802885056, 0.1199280396103859, 0.1169460117816925, 0.1227494329214096, 0.11656299978494644], 'val_loss': [0.08683072775602341, 0.07170918583869934, 0.058932606130838394, 0.0563044548034668, 0.05448870733380318, 0.050027213990688324, 0.04633679240942001, 0.04544999822974205, 0.047507792711257935, 0.04569133743643761, 0.045925483107566833, 0.04422806575894356, 0.045642413198947906, 0.044016748666763306, 0.04377652332186699, 0.044148679822683334, 0.044903505593538284, 0.04600239917635918, 0.04434258118271828, 0.043067771941423416, 0.045113738626241684, 0.0426991730928421, 0.04333950951695442, 0.04516805708408356, 0.04311192408204079, 0.04286530613899231, 0.046057797968387604], 'val_mae': [0.15023542940616608, 0.1493598222732544, 0.1478208601474762, 0.1427467316389084, 0.14079649746418, 0.13938985764980316, 0.13661137223243713, 0.13455961644649506, 0.13364267349243164, 0.13260556757450104, 0.13181428611278534, 0.13081195950508118, 0.13084058463573456, 0.13072530925273895, 0.1302371323108673, 0.1297520101070404, 0.12996815145015717, 0.129736989736557, 0.12911126017570496, 0.12913289666175842, 0.1276615709066391, 0.12707668542861938, 0.12729626893997192, 0.12754809856414795, 0.1264977753162384, 0.12610602378845215, 0.1259448379278183]}
2026-05-20 06:56:15,922 - INFO - Model training complete. Best model saved as /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/trained_models/bias_correction_model_month10_dekad21.keras
2026-05-20 06:56:15,924 - INFO - Pipeline [10 d3]: Loading confidence mask...
2026-05-20 06:56:15,925 - INFO - Loading existing confidence mask: /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/station_density/confidence_mask_station_density.nc4
2026-05-20 06:56:15,926 - INFO - Pipeline [10 d3]: Applying DL refinement...
2026-05-20 06:56:15,941 - INFO - Pixel-wise threshold map computed at 80th percentile. threshold_2d shape: (9, 14)
2026-05-20 06:56:15,942 - INFO - DL blending: base alpha=0.70 (LSEQM weight), 1-alpha=0.30 (DL weight)
2026-05-20 06:56:15,943 - INFO - Confidence mask active: spatial alpha modulation enabled. Confidence range: [0.000, 0.411]
2026-05-20 06:56:36,609 - INFO - DL blending complete: 275 daily slices processed, 4,380 extreme pixels blended (alpha=0.70)
2026-05-20 06:56:36,716 - INFO - Precip data dims: ('time', 'lat', 'lon'), shape: (275, 9, 14)
2026-05-20 06:56:36,765 - INFO - Saved Hybrid Deep Learning-Physical (Linear Scaling and Empirical Quantile Mapping) Approach corrected precipitation for month 10, dekad 21 at /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_lseqmdl/bali_cli_lseqmdl_corrected_imergl_month10_dekad21.nc4
2026-05-20 06:56:36,766 - INFO - Pipeline [10 d3]: Complete.
✓ month 10 dekad 3 — saved: /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_lseqmdl/bali_cli_imergl_lseqmdl_corrected_precip_month10_dekad21.nc4

============================================================
▸ month 11 dekad 1
============================================================
2026-05-20 06:56:36,768 - INFO - Pipeline [11 d1]: Running LSEQM...
2026-05-20 06:56:36,772 - INFO - Aligning IMERG and CPC datasets...
2026-05-20 06:56:36,778 - INFO - After alignment: IMERG has 9131 time steps, CPC has 9131 time steps
2026-05-20 06:56:36,779 - INFO - Creating time-based masks...
2026-05-20 06:56:36,789 - INFO - Applying time masks...
2026-05-20 06:56:36,800 - INFO - IMERG dekad data shape: (250, 9, 14)
2026-05-20 06:56:36,801 - INFO - CPC dekad data shape: (250, 9, 14)
2026-05-20 06:56:36,804 - INFO - Using native-resolution CPC parameter fitting (BCSD principle)...
2026-05-20 06:56:36,835 - INFO - CPC native dekad data: (250, 4, 6) (lat -9.25–-7.75, lon 113.75–116.25)
2026-05-20 06:56:38,864 - INFO -   Native CPC fitting: row 4/4 (100%) | 24 fitted, 0 skipped | elapsed 2s, ETA 0s
2026-05-20 06:56:38,865 - INFO - Fitted CPC params on native grid: 24/24 cells
2026-05-20 06:56:38,909 - INFO - Interpolated CPC params to IMERG grid: 126/126 valid pixels
2026-05-20 06:56:38,909 - INFO - Performing Linear Scaling (LS)...
2026-05-20 06:56:38,919 - INFO - LS using bilinearly interpolated CPC mean (smooth).
2026-05-20 06:56:38,923 - INFO - Saving LS corrected precipitation...
2026-05-20 06:56:38,925 - INFO - Precip data dims: ('time', 'lat', 'lon'), shape: (250, 9, 14)
2026-05-20 06:56:38,979 - INFO - Saved Linear Scaling corrected precipitation for month 11, dekad 01 at /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_ls/bali_cli_ls_corrected_imergl_month11_dekad01.nc4
2026-05-20 06:56:38,981 - INFO - Applying Empirical Quantile Mapping (EQM) on 9x14 grid...
2026-05-20 06:56:39,067 - INFO -   EQM progress: row 9/9 (100%) | 80 land pixels done | elapsed 0s, ETA 0s
2026-05-20 06:56:39,072 - INFO - EQM complete: 80/126 grid points corrected (46 masked/ocean pixels skipped)
2026-05-20 06:56:39,073 - INFO - Saving LSEQM corrected precipitation...
2026-05-20 06:56:39,076 - INFO - Precip data dims: ('time', 'lat', 'lon'), shape: (250, 9, 14)
2026-05-20 06:56:39,134 - INFO - Saved Linear Scaling and Empirical Quantile Mapping corrected precipitation for month 11, dekad 01 at /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_lseqm/bali_cli_lseqm_corrected_imergl_month11_dekad01.nc4
2026-05-20 06:56:39,135 - INFO - Pipeline [11 d1]: Training / loading DL model...
2026-05-20 06:56:39,137 - INFO - Checking if the model file exists at: /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/trained_models/bias_correction_model_month11_dekad01.keras

2026-05-20 06:56:39,207 - INFO - Model: "sequential_30"
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
┃ Layer (type)                    ┃ Output Shape           ┃       Param # ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│ conv2d_60 (Conv2D)              │ (None, 9, 14, 32)      │           320 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ max_pooling2d_60 (MaxPooling2D) │ (None, 4, 7, 32)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_90 (Dropout)            │ (None, 4, 7, 32)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ conv2d_61 (Conv2D)              │ (None, 4, 7, 64)       │        18,496 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ max_pooling2d_61 (MaxPooling2D) │ (None, 2, 3, 64)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_91 (Dropout)            │ (None, 2, 3, 64)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ flatten_30 (Flatten)            │ (None, 384)            │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dense_60 (Dense)                │ (None, 128)            │        49,280 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_92 (Dropout)            │ (None, 128)            │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dense_61 (Dense)                │ (None, 126)            │        16,254 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ reshape_30 (Reshape)            │ (None, 9, 14)          │             0 │
└─────────────────────────────────┴────────────────────────┴───────────────┘
 Total params: 84,350 (329.49 KB)
 Trainable params: 84,350 (329.49 KB)
 Non-trainable params: 0 (0.00 B)

Epoch 1/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 2s 93ms/step - loss: 0.1038 - mae: 0.1835 - val_loss: 0.1444 - val_mae: 0.2285
Epoch 2/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 42ms/step - loss: 0.0913 - mae: 0.1745 - val_loss: 0.1218 - val_mae: 0.2182
Epoch 3/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 43ms/step - loss: 0.0806 - mae: 0.1794 - val_loss: 0.0939 - val_mae: 0.2024
Epoch 4/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 44ms/step - loss: 0.0709 - mae: 0.1803 - val_loss: 0.0825 - val_mae: 0.1926
Epoch 5/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 50ms/step - loss: 0.0649 - mae: 0.1765 - val_loss: 0.0767 - val_mae: 0.1873
Epoch 6/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 45ms/step - loss: 0.0624 - mae: 0.1747 - val_loss: 0.0760 - val_mae: 0.1842
Epoch 7/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step - loss: 0.0601 - mae: 0.1668 - val_loss: 0.0785 - val_mae: 0.1834
Epoch 8/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 50ms/step - loss: 0.0580 - mae: 0.1645 - val_loss: 0.0709 - val_mae: 0.1794
Epoch 9/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 45ms/step - loss: 0.0554 - mae: 0.1654 - val_loss: 0.0695 - val_mae: 0.1776
Epoch 10/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step - loss: 0.0543 - mae: 0.1621 - val_loss: 0.0725 - val_mae: 0.1775
Epoch 11/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 42ms/step - loss: 0.0528 - mae: 0.1572 - val_loss: 0.0737 - val_mae: 0.1778
Epoch 12/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step - loss: 0.0518 - mae: 0.1540 - val_loss: 0.0750 - val_mae: 0.1778
Epoch 13/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step - loss: 0.0523 - mae: 0.1543 - val_loss: 0.0729 - val_mae: 0.1758
Epoch 14/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 45ms/step - loss: 0.0505 - mae: 0.1545 - val_loss: 0.0678 - val_mae: 0.1731
Epoch 15/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step - loss: 0.0508 - mae: 0.1564 - val_loss: 0.0707 - val_mae: 0.1737
Epoch 16/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step - loss: 0.0494 - mae: 0.1499 - val_loss: 0.0761 - val_mae: 0.1764
Epoch 17/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 44ms/step - loss: 0.0505 - mae: 0.1477 - val_loss: 0.0765 - val_mae: 0.1761
Epoch 18/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 46ms/step - loss: 0.0493 - mae: 0.1459 - val_loss: 0.0685 - val_mae: 0.1713
Epoch 19/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 60ms/step - loss: 0.0500 - mae: 0.1528 - val_loss: 0.0648 - val_mae: 0.1693
Epoch 20/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 56ms/step - loss: 0.0485 - mae: 0.1521 - val_loss: 0.0683 - val_mae: 0.1710
Epoch 21/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 49ms/step - loss: 0.0480 - mae: 0.1469 - val_loss: 0.0736 - val_mae: 0.1739
Epoch 22/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 64ms/step - loss: 0.0471 - mae: 0.1421 - val_loss: 0.0701 - val_mae: 0.1716
Epoch 23/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 81ms/step - loss: 0.0472 - mae: 0.1474 - val_loss: 0.0647 - val_mae: 0.1686
Epoch 24/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 50ms/step - loss: 0.0477 - mae: 0.1517 - val_loss: 0.0677 - val_mae: 0.1694
Epoch 25/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 45ms/step - loss: 0.0454 - mae: 0.1418 - val_loss: 0.0770 - val_mae: 0.1754
Epoch 26/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 57ms/step - loss: 0.0466 - mae: 0.1395 - val_loss: 0.0691 - val_mae: 0.1699
Epoch 27/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 75ms/step - loss: 0.0442 - mae: 0.1441 - val_loss: 0.0625 - val_mae: 0.1659
Epoch 28/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 44ms/step - loss: 0.0455 - mae: 0.1475 - val_loss: 0.0657 - val_mae: 0.1650
Epoch 29/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step - loss: 0.0451 - mae: 0.1393 - val_loss: 0.0729 - val_mae: 0.1685
Epoch 30/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step - loss: 0.0463 - mae: 0.1341 - val_loss: 0.0738 - val_mae: 0.1697
Epoch 31/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 44ms/step - loss: 0.0438 - mae: 0.1346 - val_loss: 0.0622 - val_mae: 0.1648
Epoch 32/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step - loss: 0.0448 - mae: 0.1445 - val_loss: 0.0628 - val_mae: 0.1638
Epoch 33/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step - loss: 0.0396 - mae: 0.1315 - val_loss: 0.0680 - val_mae: 0.1659
Epoch 34/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step - loss: 0.0411 - mae: 0.1324 - val_loss: 0.0652 - val_mae: 0.1652
Epoch 35/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 44ms/step - loss: 0.0409 - mae: 0.1370 - val_loss: 0.0615 - val_mae: 0.1644
Epoch 36/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step - loss: 0.0409 - mae: 0.1380 - val_loss: 0.0656 - val_mae: 0.1656
Epoch 37/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step - loss: 0.0408 - mae: 0.1358 - val_loss: 0.0655 - val_mae: 0.1651
Epoch 38/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step - loss: 0.0392 - mae: 0.1337 - val_loss: 0.0661 - val_mae: 0.1650
Epoch 39/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step - loss: 0.0401 - mae: 0.1293 - val_loss: 0.0687 - val_mae: 0.1659
Epoch 40/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 41ms/step - loss: 0.0381 - mae: 0.1279 - val_loss: 0.0610 - val_mae: 0.1639
Epoch 41/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step - loss: 0.0381 - mae: 0.1331 - val_loss: 0.0619 - val_mae: 0.1635
Epoch 42/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step - loss: 0.0378 - mae: 0.1288 - val_loss: 0.0668 - val_mae: 0.1644
Epoch 43/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step - loss: 0.0377 - mae: 0.1230 - val_loss: 0.0690 - val_mae: 0.1651
Epoch 44/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step - loss: 0.0371 - mae: 0.1196 - val_loss: 0.0653 - val_mae: 0.1632
Epoch 45/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step - loss: 0.0354 - mae: 0.1225 - val_loss: 0.0637 - val_mae: 0.1631
2026-05-20 06:56:48,060 - INFO - Final training history: {'loss': [0.10375805199146271, 0.09133224189281464, 0.0806044414639473, 0.07093512266874313, 0.064891017973423, 0.0623551569879055, 0.06006322056055069, 0.05797964707016945, 0.055398128926754, 0.0543331652879715, 0.05284234508872032, 0.051847003400325775, 0.05227921903133392, 0.050546903163194656, 0.05084121227264404, 0.049382880330085754, 0.05051715672016144, 0.04931201413273811, 0.049970224499702454, 0.048482008278369904, 0.04796044901013374, 0.047087229788303375, 0.047217439860105515, 0.04766864702105522, 0.045374952256679535, 0.04662345349788666, 0.0442010834813118, 0.04547761753201485, 0.04507628083229065, 0.04625100642442703, 0.04380277171730995, 0.04476509243249893, 0.03955195099115372, 0.041084274649620056, 0.04091621935367584, 0.040938712656497955, 0.04080282151699066, 0.03918987140059471, 0.04006281495094299, 0.03809458389878273, 0.03805375099182129, 0.03775780275464058, 0.03773096576333046, 0.03705164045095444, 0.035433173179626465], 'mae': [0.18352869153022766, 0.1745448261499405, 0.17942211031913757, 0.18033504486083984, 0.17653732001781464, 0.17467431724071503, 0.16684606671333313, 0.16448663175106049, 0.16538859903812408, 0.16209222376346588, 0.15718241035938263, 0.15395423769950867, 0.15425431728363037, 0.15449130535125732, 0.15641790628433228, 0.14993873238563538, 0.14767463505268097, 0.14590390026569366, 0.15278001129627228, 0.15214799344539642, 0.14689600467681885, 0.1421457976102829, 0.14739370346069336, 0.15166634321212769, 0.1417812705039978, 0.13949033617973328, 0.14409375190734863, 0.14746670424938202, 0.13931205868721008, 0.13413597643375397, 0.13455060124397278, 0.14453181624412537, 0.1314675658941269, 0.13238579034805298, 0.1369812786579132, 0.13803882896900177, 0.1358298361301422, 0.13367362320423126, 0.12925446033477783, 0.12793436646461487, 0.1331193894147873, 0.12876325845718384, 0.12298406660556793, 0.11956777423620224, 0.12252528220415115], 'val_loss': [0.14437685906887054, 0.12179510295391083, 0.09386292099952698, 0.08248574286699295, 0.07665248960256577, 0.07598163187503815, 0.07846371084451675, 0.07089116424322128, 0.06952967494726181, 0.07252774387598038, 0.07374541461467743, 0.07498516142368317, 0.07285358011722565, 0.06783793866634369, 0.07073789089918137, 0.07607278972864151, 0.07646681368350983, 0.06846948713064194, 0.06477293372154236, 0.06833180040121078, 0.07364527881145477, 0.07007253915071487, 0.06466685980558395, 0.06766942888498306, 0.07698929309844971, 0.06910867244005203, 0.062487971037626266, 0.06570709496736526, 0.07293383777141571, 0.0737907811999321, 0.06224904954433441, 0.06283682584762573, 0.06798897683620453, 0.06517109274864197, 0.061466529965400696, 0.0655856654047966, 0.06547395139932632, 0.06608836352825165, 0.06873834878206253, 0.060959283262491226, 0.06192952021956444, 0.06682810187339783, 0.06900516152381897, 0.06532829999923706, 0.06373186409473419], 'val_mae': [0.22845050692558289, 0.21820318698883057, 0.20239877700805664, 0.19264638423919678, 0.18726368248462677, 0.18418999016284943, 0.18344518542289734, 0.1794341653585434, 0.1776096671819687, 0.17753636837005615, 0.17778082191944122, 0.17780208587646484, 0.17580372095108032, 0.17312105000019073, 0.17372512817382812, 0.17638948559761047, 0.17607517540454865, 0.17125341296195984, 0.16929851472377777, 0.17098623514175415, 0.1739082932472229, 0.1716020703315735, 0.16855356097221375, 0.16937226057052612, 0.17543640732765198, 0.1698581874370575, 0.16592109203338623, 0.16500160098075867, 0.16852474212646484, 0.1696920543909073, 0.16477569937705994, 0.1638367474079132, 0.1659100353717804, 0.16521857678890228, 0.1643698811531067, 0.1656268686056137, 0.165059894323349, 0.16495540738105774, 0.16591037809848785, 0.1638837456703186, 0.16349487006664276, 0.1644199937582016, 0.16510416567325592, 0.1631712019443512, 0.16309747099876404]}
2026-05-20 06:56:48,196 - INFO - Model training complete. Best model saved as /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/trained_models/bias_correction_model_month11_dekad01.keras
2026-05-20 06:56:48,198 - INFO - Pipeline [11 d1]: Loading confidence mask...
2026-05-20 06:56:48,200 - INFO - Loading existing confidence mask: /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/station_density/confidence_mask_station_density.nc4
2026-05-20 06:56:48,200 - INFO - Pipeline [11 d1]: Applying DL refinement...
2026-05-20 06:56:48,215 - INFO - Pixel-wise threshold map computed at 80th percentile. threshold_2d shape: (9, 14)
2026-05-20 06:56:48,216 - INFO - DL blending: base alpha=0.70 (LSEQM weight), 1-alpha=0.30 (DL weight)
2026-05-20 06:56:48,217 - INFO - Confidence mask active: spatial alpha modulation enabled. Confidence range: [0.000, 0.411]
2026-05-20 06:57:04,645 - INFO - DL blending complete: 250 daily slices processed, 3,998 extreme pixels blended (alpha=0.70)
2026-05-20 06:57:04,736 - INFO - Precip data dims: ('time', 'lat', 'lon'), shape: (250, 9, 14)
2026-05-20 06:57:04,784 - INFO - Saved Hybrid Deep Learning-Physical (Linear Scaling and Empirical Quantile Mapping) Approach corrected precipitation for month 11, dekad 01 at /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_lseqmdl/bali_cli_lseqmdl_corrected_imergl_month11_dekad01.nc4
2026-05-20 06:57:04,785 - INFO - Pipeline [11 d1]: Complete.
✓ month 11 dekad 1 — saved: /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_lseqmdl/bali_cli_imergl_lseqmdl_corrected_precip_month11_dekad01.nc4

============================================================
▸ month 11 dekad 2
============================================================
2026-05-20 06:57:04,787 - INFO - Pipeline [11 d2]: Running LSEQM...
2026-05-20 06:57:04,792 - INFO - Aligning IMERG and CPC datasets...
2026-05-20 06:57:04,803 - INFO - After alignment: IMERG has 9131 time steps, CPC has 9131 time steps
2026-05-20 06:57:04,804 - INFO - Creating time-based masks...
2026-05-20 06:57:04,815 - INFO - Applying time masks...
2026-05-20 06:57:04,827 - INFO - IMERG dekad data shape: (250, 9, 14)
2026-05-20 06:57:04,828 - INFO - CPC dekad data shape: (250, 9, 14)
2026-05-20 06:57:04,831 - INFO - Using native-resolution CPC parameter fitting (BCSD principle)...
2026-05-20 06:57:04,860 - INFO - CPC native dekad data: (250, 4, 6) (lat -9.25–-7.75, lon 113.75–116.25)
2026-05-20 06:57:07,153 - INFO -   Native CPC fitting: row 4/4 (100%) | 24 fitted, 0 skipped | elapsed 2s, ETA 0s
2026-05-20 06:57:07,154 - INFO - Fitted CPC params on native grid: 24/24 cells
2026-05-20 06:57:07,201 - INFO - Interpolated CPC params to IMERG grid: 126/126 valid pixels
2026-05-20 06:57:07,202 - INFO - Performing Linear Scaling (LS)...
2026-05-20 06:57:07,213 - INFO - LS using bilinearly interpolated CPC mean (smooth).
2026-05-20 06:57:07,216 - INFO - Saving LS corrected precipitation...
2026-05-20 06:57:07,219 - INFO - Precip data dims: ('time', 'lat', 'lon'), shape: (250, 9, 14)
2026-05-20 06:57:07,303 - INFO - Saved Linear Scaling corrected precipitation for month 11, dekad 11 at /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_ls/bali_cli_ls_corrected_imergl_month11_dekad11.nc4
2026-05-20 06:57:07,305 - INFO - Applying Empirical Quantile Mapping (EQM) on 9x14 grid...
2026-05-20 06:57:07,389 - INFO -   EQM progress: row 9/9 (100%) | 80 land pixels done | elapsed 0s, ETA 0s
2026-05-20 06:57:07,391 - INFO - EQM complete: 80/126 grid points corrected (46 masked/ocean pixels skipped)
2026-05-20 06:57:07,392 - INFO - Saving LSEQM corrected precipitation...
2026-05-20 06:57:07,397 - INFO - Precip data dims: ('time', 'lat', 'lon'), shape: (250, 9, 14)
2026-05-20 06:57:07,446 - INFO - Saved Linear Scaling and Empirical Quantile Mapping corrected precipitation for month 11, dekad 11 at /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_lseqm/bali_cli_lseqm_corrected_imergl_month11_dekad11.nc4
2026-05-20 06:57:07,448 - INFO - Pipeline [11 d2]: Training / loading DL model...
2026-05-20 06:57:07,449 - INFO - Checking if the model file exists at: /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/trained_models/bias_correction_model_month11_dekad11.keras

2026-05-20 06:57:07,519 - INFO - Model: "sequential_31"
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
┃ Layer (type)                    ┃ Output Shape           ┃       Param # ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│ conv2d_62 (Conv2D)              │ (None, 9, 14, 32)      │           320 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ max_pooling2d_62 (MaxPooling2D) │ (None, 4, 7, 32)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_93 (Dropout)            │ (None, 4, 7, 32)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ conv2d_63 (Conv2D)              │ (None, 4, 7, 64)       │        18,496 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ max_pooling2d_63 (MaxPooling2D) │ (None, 2, 3, 64)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_94 (Dropout)            │ (None, 2, 3, 64)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ flatten_31 (Flatten)            │ (None, 384)            │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dense_62 (Dense)                │ (None, 128)            │        49,280 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_95 (Dropout)            │ (None, 128)            │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dense_63 (Dense)                │ (None, 126)            │        16,254 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ reshape_31 (Reshape)            │ (None, 9, 14)          │             0 │
└─────────────────────────────────┴────────────────────────┴───────────────┘
 Total params: 84,350 (329.49 KB)
 Trainable params: 84,350 (329.49 KB)
 Non-trainable params: 0 (0.00 B)

Epoch 1/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 2s 142ms/step - loss: 0.1166 - mae: 0.2078 - val_loss: 0.1309 - val_mae: 0.2363
Epoch 2/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 63ms/step - loss: 0.1011 - mae: 0.1961 - val_loss: 0.1047 - val_mae: 0.2159
Epoch 3/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 58ms/step - loss: 0.0887 - mae: 0.1986 - val_loss: 0.0807 - val_mae: 0.1942
Epoch 4/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 62ms/step - loss: 0.0832 - mae: 0.2000 - val_loss: 0.0718 - val_mae: 0.1788
Epoch 5/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 81ms/step - loss: 0.0754 - mae: 0.1891 - val_loss: 0.0699 - val_mae: 0.1738
Epoch 6/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 64ms/step - loss: 0.0699 - mae: 0.1826 - val_loss: 0.0624 - val_mae: 0.1676
Epoch 7/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 64ms/step - loss: 0.0661 - mae: 0.1835 - val_loss: 0.0565 - val_mae: 0.1611
Epoch 8/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step - loss: 0.0633 - mae: 0.1796 - val_loss: 0.0605 - val_mae: 0.1627
Epoch 9/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step - loss: 0.0607 - mae: 0.1725 - val_loss: 0.0591 - val_mae: 0.1616
Epoch 10/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 46ms/step - loss: 0.0578 - mae: 0.1713 - val_loss: 0.0517 - val_mae: 0.1544
Epoch 11/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 44ms/step - loss: 0.0578 - mae: 0.1756 - val_loss: 0.0513 - val_mae: 0.1519
Epoch 12/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step - loss: 0.0566 - mae: 0.1709 - val_loss: 0.0578 - val_mae: 0.1574
Epoch 13/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step - loss: 0.0555 - mae: 0.1664 - val_loss: 0.0560 - val_mae: 0.1556
Epoch 14/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step - loss: 0.0556 - mae: 0.1686 - val_loss: 0.0546 - val_mae: 0.1543
Epoch 15/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step - loss: 0.0559 - mae: 0.1663 - val_loss: 0.0590 - val_mae: 0.1583
Epoch 16/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step - loss: 0.0546 - mae: 0.1634 - val_loss: 0.0519 - val_mae: 0.1516
2026-05-20 06:57:12,260 - INFO - Final training history: {'loss': [0.11658474057912827, 0.10107901692390442, 0.08874712139368057, 0.0832381322979927, 0.0754210352897644, 0.06992066651582718, 0.06614238023757935, 0.06327182054519653, 0.060701027512550354, 0.05778523534536362, 0.05781859531998634, 0.056587133556604385, 0.05545840412378311, 0.05563177913427353, 0.05589287355542183, 0.054643414914608], 'mae': [0.20777815580368042, 0.19608014822006226, 0.19855466485023499, 0.20003589987754822, 0.18910308182239532, 0.18260766565799713, 0.18352748453617096, 0.17963238060474396, 0.17249803245067596, 0.1713070273399353, 0.17558808624744415, 0.17092110216617584, 0.16636310517787933, 0.16863402724266052, 0.16628094017505646, 0.1633545160293579], 'val_loss': [0.13094408810138702, 0.10467842221260071, 0.08074001967906952, 0.07175838202238083, 0.06987687200307846, 0.06240537017583847, 0.05652602016925812, 0.06054824963212013, 0.05910893902182579, 0.051652297377586365, 0.05127174034714699, 0.057838987559080124, 0.05599038302898407, 0.0546068400144577, 0.05897819995880127, 0.05187022686004639], 'val_mae': [0.2362709492444992, 0.21590785682201385, 0.19416148960590363, 0.17881831526756287, 0.17384013533592224, 0.16757924854755402, 0.16105644404888153, 0.16268110275268555, 0.16157424449920654, 0.15437519550323486, 0.15193426609039307, 0.15744593739509583, 0.15563227236270905, 0.1542988270521164, 0.15831363201141357, 0.15159215033054352]}
2026-05-20 06:57:12,416 - INFO - Model training complete. Best model saved as /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/trained_models/bias_correction_model_month11_dekad11.keras
2026-05-20 06:57:12,417 - INFO - Pipeline [11 d2]: Loading confidence mask...
2026-05-20 06:57:12,422 - INFO - Loading existing confidence mask: /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/station_density/confidence_mask_station_density.nc4
2026-05-20 06:57:12,422 - INFO - Pipeline [11 d2]: Applying DL refinement...
2026-05-20 06:57:12,441 - INFO - Pixel-wise threshold map computed at 80th percentile. threshold_2d shape: (9, 14)
2026-05-20 06:57:12,441 - INFO - DL blending: base alpha=0.70 (LSEQM weight), 1-alpha=0.30 (DL weight)
2026-05-20 06:57:12,442 - INFO - Confidence mask active: spatial alpha modulation enabled. Confidence range: [0.000, 0.411]
2026-05-20 06:57:29,024 - INFO - DL blending complete: 250 daily slices processed, 4,000 extreme pixels blended (alpha=0.70)
2026-05-20 06:57:29,106 - INFO - Precip data dims: ('time', 'lat', 'lon'), shape: (250, 9, 14)
2026-05-20 06:57:29,148 - INFO - Saved Hybrid Deep Learning-Physical (Linear Scaling and Empirical Quantile Mapping) Approach corrected precipitation for month 11, dekad 11 at /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_lseqmdl/bali_cli_lseqmdl_corrected_imergl_month11_dekad11.nc4
2026-05-20 06:57:29,148 - INFO - Pipeline [11 d2]: Complete.
✓ month 11 dekad 2 — saved: /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_lseqmdl/bali_cli_imergl_lseqmdl_corrected_precip_month11_dekad11.nc4

============================================================
▸ month 11 dekad 3
============================================================
2026-05-20 06:57:29,153 - INFO - Pipeline [11 d3]: Running LSEQM...
2026-05-20 06:57:29,157 - INFO - Aligning IMERG and CPC datasets...
2026-05-20 06:57:29,164 - INFO - After alignment: IMERG has 9131 time steps, CPC has 9131 time steps
2026-05-20 06:57:29,165 - INFO - Creating time-based masks...
2026-05-20 06:57:29,178 - INFO - Applying time masks...
2026-05-20 06:57:29,188 - INFO - IMERG dekad data shape: (250, 9, 14)
2026-05-20 06:57:29,190 - INFO - CPC dekad data shape: (250, 9, 14)
2026-05-20 06:57:29,194 - INFO - Using native-resolution CPC parameter fitting (BCSD principle)...
2026-05-20 06:57:29,225 - INFO - CPC native dekad data: (250, 4, 6) (lat -9.25–-7.75, lon 113.75–116.25)
2026-05-20 06:57:31,431 - INFO -   Native CPC fitting: row 4/4 (100%) | 24 fitted, 0 skipped | elapsed 2s, ETA 0s
2026-05-20 06:57:31,432 - INFO - Fitted CPC params on native grid: 24/24 cells
2026-05-20 06:57:31,475 - INFO - Interpolated CPC params to IMERG grid: 126/126 valid pixels
2026-05-20 06:57:31,476 - INFO - Performing Linear Scaling (LS)...
2026-05-20 06:57:31,486 - INFO - LS using bilinearly interpolated CPC mean (smooth).
2026-05-20 06:57:31,490 - INFO - Saving LS corrected precipitation...
2026-05-20 06:57:31,493 - INFO - Precip data dims: ('time', 'lat', 'lon'), shape: (250, 9, 14)
2026-05-20 06:57:31,536 - INFO - Saved Linear Scaling corrected precipitation for month 11, dekad 21 at /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_ls/bali_cli_ls_corrected_imergl_month11_dekad21.nc4
2026-05-20 06:57:31,537 - INFO - Applying Empirical Quantile Mapping (EQM) on 9x14 grid...
2026-05-20 06:57:31,626 - INFO -   EQM progress: row 9/9 (100%) | 80 land pixels done | elapsed 0s, ETA 0s
2026-05-20 06:57:31,630 - INFO - EQM complete: 80/126 grid points corrected (46 masked/ocean pixels skipped)
2026-05-20 06:57:31,632 - INFO - Saving LSEQM corrected precipitation...
2026-05-20 06:57:31,633 - INFO - Precip data dims: ('time', 'lat', 'lon'), shape: (250, 9, 14)
2026-05-20 06:57:31,685 - INFO - Saved Linear Scaling and Empirical Quantile Mapping corrected precipitation for month 11, dekad 21 at /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_lseqm/bali_cli_lseqm_corrected_imergl_month11_dekad21.nc4
2026-05-20 06:57:31,686 - INFO - Pipeline [11 d3]: Training / loading DL model...
2026-05-20 06:57:31,687 - INFO - Checking if the model file exists at: /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/trained_models/bias_correction_model_month11_dekad21.keras

2026-05-20 06:57:31,756 - INFO - Model: "sequential_32"
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
┃ Layer (type)                    ┃ Output Shape           ┃       Param # ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│ conv2d_64 (Conv2D)              │ (None, 9, 14, 32)      │           320 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ max_pooling2d_64 (MaxPooling2D) │ (None, 4, 7, 32)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_96 (Dropout)            │ (None, 4, 7, 32)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ conv2d_65 (Conv2D)              │ (None, 4, 7, 64)       │        18,496 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ max_pooling2d_65 (MaxPooling2D) │ (None, 2, 3, 64)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_97 (Dropout)            │ (None, 2, 3, 64)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ flatten_32 (Flatten)            │ (None, 384)            │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dense_64 (Dense)                │ (None, 128)            │        49,280 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_98 (Dropout)            │ (None, 128)            │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dense_65 (Dense)                │ (None, 126)            │        16,254 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ reshape_32 (Reshape)            │ (None, 9, 14)          │             0 │
└─────────────────────────────────┴────────────────────────┴───────────────┘
 Total params: 84,350 (329.49 KB)
 Trainable params: 84,350 (329.49 KB)
 Non-trainable params: 0 (0.00 B)

Epoch 1/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 2s 107ms/step - loss: 0.1464 - mae: 0.2467 - val_loss: 0.1556 - val_mae: 0.2543
Epoch 2/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 82ms/step - loss: 0.1239 - mae: 0.2302 - val_loss: 0.1135 - val_mae: 0.2276
Epoch 3/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 69ms/step - loss: 0.0994 - mae: 0.2207 - val_loss: 0.0780 - val_mae: 0.1995
Epoch 4/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 83ms/step - loss: 0.0874 - mae: 0.2161 - val_loss: 0.0710 - val_mae: 0.1845
Epoch 5/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 46ms/step - loss: 0.0749 - mae: 0.1968 - val_loss: 0.0722 - val_mae: 0.1849
Epoch 6/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 59ms/step - loss: 0.0704 - mae: 0.1902 - val_loss: 0.0610 - val_mae: 0.1754
Epoch 7/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 67ms/step - loss: 0.0655 - mae: 0.1894 - val_loss: 0.0565 - val_mae: 0.1697
Epoch 8/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 47ms/step - loss: 0.0607 - mae: 0.1816 - val_loss: 0.0593 - val_mae: 0.1702
Epoch 9/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 62ms/step - loss: 0.0581 - mae: 0.1760 - val_loss: 0.0554 - val_mae: 0.1653
Epoch 10/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 75ms/step - loss: 0.0567 - mae: 0.1761 - val_loss: 0.0539 - val_mae: 0.1630
Epoch 11/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 42ms/step - loss: 0.0550 - mae: 0.1719 - val_loss: 0.0595 - val_mae: 0.1677
Epoch 12/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 35ms/step - loss: 0.0554 - mae: 0.1687 - val_loss: 0.0615 - val_mae: 0.1695
Epoch 13/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 40ms/step - loss: 0.0542 - mae: 0.1669 - val_loss: 0.0539 - val_mae: 0.1620
Epoch 14/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 42ms/step - loss: 0.0536 - mae: 0.1713 - val_loss: 0.0533 - val_mae: 0.1626
Epoch 15/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step - loss: 0.0564 - mae: 0.1747 - val_loss: 0.0538 - val_mae: 0.1605
Epoch 16/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step - loss: 0.0496 - mae: 0.1604 - val_loss: 0.0591 - val_mae: 0.1656
Epoch 17/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step - loss: 0.0513 - mae: 0.1616 - val_loss: 0.0535 - val_mae: 0.1593
Epoch 18/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 42ms/step - loss: 0.0504 - mae: 0.1619 - val_loss: 0.0513 - val_mae: 0.1570
Epoch 19/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step - loss: 0.0499 - mae: 0.1623 - val_loss: 0.0521 - val_mae: 0.1570
Epoch 20/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step - loss: 0.0501 - mae: 0.1595 - val_loss: 0.0527 - val_mae: 0.1574
Epoch 21/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 47ms/step - loss: 0.0477 - mae: 0.1559 - val_loss: 0.0524 - val_mae: 0.1567
Epoch 22/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step - loss: 0.0466 - mae: 0.1549 - val_loss: 0.0517 - val_mae: 0.1557
Epoch 23/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 51ms/step - loss: 0.0479 - mae: 0.1569 - val_loss: 0.0511 - val_mae: 0.1548
Epoch 24/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 49ms/step - loss: 0.0457 - mae: 0.1540 - val_loss: 0.0511 - val_mae: 0.1539
Epoch 25/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 33ms/step - loss: 0.0477 - mae: 0.1544 - val_loss: 0.0529 - val_mae: 0.1549
Epoch 26/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 44ms/step - loss: 0.0466 - mae: 0.1512 - val_loss: 0.0519 - val_mae: 0.1542
Epoch 27/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step - loss: 0.0456 - mae: 0.1488 - val_loss: 0.0533 - val_mae: 0.1559
Epoch 28/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 49ms/step - loss: 0.0467 - mae: 0.1510 - val_loss: 0.0509 - val_mae: 0.1541
Epoch 29/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step - loss: 0.0460 - mae: 0.1519 - val_loss: 0.0516 - val_mae: 0.1549
Epoch 30/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step - loss: 0.0449 - mae: 0.1491 - val_loss: 0.0521 - val_mae: 0.1554
Epoch 31/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 36ms/step - loss: 0.0451 - mae: 0.1483 - val_loss: 0.0518 - val_mae: 0.1546
Epoch 32/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 46ms/step - loss: 0.0436 - mae: 0.1461 - val_loss: 0.0503 - val_mae: 0.1535
Epoch 33/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 50ms/step - loss: 0.0460 - mae: 0.1517 - val_loss: 0.0498 - val_mae: 0.1515
Epoch 34/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 52ms/step - loss: 0.0434 - mae: 0.1457 - val_loss: 0.0492 - val_mae: 0.1509
Epoch 35/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step - loss: 0.0433 - mae: 0.1460 - val_loss: 0.0492 - val_mae: 0.1508
Epoch 36/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step - loss: 0.0431 - mae: 0.1440 - val_loss: 0.0504 - val_mae: 0.1522
Epoch 37/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step - loss: 0.0427 - mae: 0.1440 - val_loss: 0.0495 - val_mae: 0.1525
Epoch 38/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 42ms/step - loss: 0.0419 - mae: 0.1447 - val_loss: 0.0497 - val_mae: 0.1525
Epoch 39/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step - loss: 0.0439 - mae: 0.1474 - val_loss: 0.0497 - val_mae: 0.1518
2026-05-20 06:57:40,692 - INFO - Final training history: {'loss': [0.14637897908687592, 0.12386930733919144, 0.09941360354423523, 0.08741290122270584, 0.07486118376255035, 0.0703708827495575, 0.0654510036110878, 0.06069140508770943, 0.05812019854784012, 0.05673680827021599, 0.05501486733555794, 0.055392373353242874, 0.05417224392294884, 0.053627997636795044, 0.05635685846209526, 0.04959850385785103, 0.051303524523973465, 0.0503988042473793, 0.04990990087389946, 0.05011986568570137, 0.04769665375351906, 0.046562403440475464, 0.04789974167943001, 0.04571681469678879, 0.047692667692899704, 0.04661929979920387, 0.045573025941848755, 0.046650420874357224, 0.046031370759010315, 0.044896773993968964, 0.04514588415622711, 0.04358348250389099, 0.04598651081323624, 0.04338361695408821, 0.04326537624001503, 0.04312434047460556, 0.04269828647375107, 0.04186122864484787, 0.04386705905199051], 'mae': [0.24668116867542267, 0.23020009696483612, 0.22074958682060242, 0.21606674790382385, 0.19683416187763214, 0.19017358124256134, 0.18940375745296478, 0.18161751329898834, 0.17598646879196167, 0.1760786771774292, 0.1719338297843933, 0.16869987547397614, 0.16685760021209717, 0.1713477075099945, 0.17471958696842194, 0.16043168306350708, 0.16162912547588348, 0.16190561652183533, 0.1623096466064453, 0.1594696193933487, 0.15592840313911438, 0.15487150847911835, 0.1569041758775711, 0.15401975810527802, 0.1543969213962555, 0.15117521584033966, 0.14879566431045532, 0.1509714275598526, 0.15188339352607727, 0.14906121790409088, 0.148295596241951, 0.14612388610839844, 0.15166252851486206, 0.14570067822933197, 0.1459888219833374, 0.14403288066387177, 0.1439567506313324, 0.14473631978034973, 0.14740091562271118], 'val_loss': [0.15559424459934235, 0.1134670227766037, 0.07803048193454742, 0.07095550745725632, 0.07221394032239914, 0.06103922054171562, 0.05652314051985741, 0.05925801768898964, 0.05538132041692734, 0.05392031371593475, 0.05947279930114746, 0.06153831630945206, 0.05389127880334854, 0.0532834567129612, 0.05375676974654198, 0.059142909944057465, 0.053545884788036346, 0.051275648176670074, 0.052076950669288635, 0.05266270786523819, 0.052396465092897415, 0.05171719565987587, 0.05109267309308052, 0.05108712986111641, 0.05289442837238312, 0.05191418528556824, 0.05331065505743027, 0.05094055086374283, 0.0515533909201622, 0.05205850303173065, 0.0518382228910923, 0.05025766044855118, 0.04981400445103645, 0.04918632656335831, 0.04924510046839714, 0.05039825290441513, 0.04947013780474663, 0.04971887543797493, 0.049732305109500885], 'val_mae': [0.2543329894542694, 0.2276294082403183, 0.1995287537574768, 0.1844521015882492, 0.18487165868282318, 0.1753837615251541, 0.16969628632068634, 0.17019334435462952, 0.1652645468711853, 0.16295704245567322, 0.16766446828842163, 0.16950851678848267, 0.16202832758426666, 0.16258643567562103, 0.16048818826675415, 0.16559205949306488, 0.15934762358665466, 0.1569758653640747, 0.15698209404945374, 0.1573759913444519, 0.15668538212776184, 0.1557442843914032, 0.15477444231510162, 0.1539236456155777, 0.15485833585262299, 0.15422813594341278, 0.1558568924665451, 0.15411116182804108, 0.1549397110939026, 0.1553599238395691, 0.15463298559188843, 0.1535324603319168, 0.151457741856575, 0.15087220072746277, 0.15084044635295868, 0.15216393768787384, 0.1525300294160843, 0.15245354175567627, 0.15183520317077637]}
2026-05-20 06:57:40,856 - INFO - Model training complete. Best model saved as /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/trained_models/bias_correction_model_month11_dekad21.keras
2026-05-20 06:57:40,859 - INFO - Pipeline [11 d3]: Loading confidence mask...
2026-05-20 06:57:40,861 - INFO - Loading existing confidence mask: /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/station_density/confidence_mask_station_density.nc4
2026-05-20 06:57:40,862 - INFO - Pipeline [11 d3]: Applying DL refinement...
2026-05-20 06:57:40,881 - INFO - Pixel-wise threshold map computed at 80th percentile. threshold_2d shape: (9, 14)
2026-05-20 06:57:40,882 - INFO - DL blending: base alpha=0.70 (LSEQM weight), 1-alpha=0.30 (DL weight)
2026-05-20 06:57:40,885 - INFO - Confidence mask active: spatial alpha modulation enabled. Confidence range: [0.000, 0.411]
2026-05-20 06:57:58,408 - INFO - DL blending complete: 250 daily slices processed, 4,000 extreme pixels blended (alpha=0.70)
2026-05-20 06:57:58,510 - INFO - Precip data dims: ('time', 'lat', 'lon'), shape: (250, 9, 14)
2026-05-20 06:57:58,554 - INFO - Saved Hybrid Deep Learning-Physical (Linear Scaling and Empirical Quantile Mapping) Approach corrected precipitation for month 11, dekad 21 at /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_lseqmdl/bali_cli_lseqmdl_corrected_imergl_month11_dekad21.nc4
2026-05-20 06:57:58,555 - INFO - Pipeline [11 d3]: Complete.
✓ month 11 dekad 3 — saved: /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_lseqmdl/bali_cli_imergl_lseqmdl_corrected_precip_month11_dekad21.nc4

============================================================
▸ month 12 dekad 1
============================================================
2026-05-20 06:57:58,556 - INFO - Pipeline [12 d1]: Running LSEQM...
2026-05-20 06:57:58,560 - INFO - Aligning IMERG and CPC datasets...
2026-05-20 06:57:58,577 - INFO - After alignment: IMERG has 9131 time steps, CPC has 9131 time steps
2026-05-20 06:57:58,579 - INFO - Creating time-based masks...
2026-05-20 06:57:58,591 - INFO - Applying time masks...
2026-05-20 06:57:58,608 - INFO - IMERG dekad data shape: (250, 9, 14)
2026-05-20 06:57:58,609 - INFO - CPC dekad data shape: (250, 9, 14)
2026-05-20 06:57:58,612 - INFO - Using native-resolution CPC parameter fitting (BCSD principle)...
2026-05-20 06:57:58,656 - INFO - CPC native dekad data: (250, 4, 6) (lat -9.25–-7.75, lon 113.75–116.25)
2026-05-20 06:58:01,755 - INFO -   Native CPC fitting: row 4/4 (100%) | 24 fitted, 0 skipped | elapsed 3s, ETA 0s
2026-05-20 06:58:01,756 - INFO - Fitted CPC params on native grid: 24/24 cells
2026-05-20 06:58:01,802 - INFO - Interpolated CPC params to IMERG grid: 126/126 valid pixels
2026-05-20 06:58:01,803 - INFO - Performing Linear Scaling (LS)...
2026-05-20 06:58:01,812 - INFO - LS using bilinearly interpolated CPC mean (smooth).
2026-05-20 06:58:01,817 - INFO - Saving LS corrected precipitation...
2026-05-20 06:58:01,821 - INFO - Precip data dims: ('time', 'lat', 'lon'), shape: (250, 9, 14)
2026-05-20 06:58:01,889 - INFO - Saved Linear Scaling corrected precipitation for month 12, dekad 01 at /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_ls/bali_cli_ls_corrected_imergl_month12_dekad01.nc4
2026-05-20 06:58:01,890 - INFO - Applying Empirical Quantile Mapping (EQM) on 9x14 grid...
2026-05-20 06:58:01,978 - INFO -   EQM progress: row 9/9 (100%) | 80 land pixels done | elapsed 0s, ETA 0s
2026-05-20 06:58:01,981 - INFO - EQM complete: 80/126 grid points corrected (46 masked/ocean pixels skipped)
2026-05-20 06:58:01,982 - INFO - Saving LSEQM corrected precipitation...
2026-05-20 06:58:01,985 - INFO - Precip data dims: ('time', 'lat', 'lon'), shape: (250, 9, 14)
2026-05-20 06:58:02,033 - INFO - Saved Linear Scaling and Empirical Quantile Mapping corrected precipitation for month 12, dekad 01 at /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_lseqm/bali_cli_lseqm_corrected_imergl_month12_dekad01.nc4
2026-05-20 06:58:02,034 - INFO - Pipeline [12 d1]: Training / loading DL model...
2026-05-20 06:58:02,035 - INFO - Checking if the model file exists at: /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/trained_models/bias_correction_model_month12_dekad01.keras

2026-05-20 06:58:02,110 - INFO - Model: "sequential_33"
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
┃ Layer (type)                    ┃ Output Shape           ┃       Param # ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│ conv2d_66 (Conv2D)              │ (None, 9, 14, 32)      │           320 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ max_pooling2d_66 (MaxPooling2D) │ (None, 4, 7, 32)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_99 (Dropout)            │ (None, 4, 7, 32)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ conv2d_67 (Conv2D)              │ (None, 4, 7, 64)       │        18,496 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ max_pooling2d_67 (MaxPooling2D) │ (None, 2, 3, 64)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_100 (Dropout)           │ (None, 2, 3, 64)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ flatten_33 (Flatten)            │ (None, 384)            │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dense_66 (Dense)                │ (None, 128)            │        49,280 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_101 (Dropout)           │ (None, 128)            │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dense_67 (Dense)                │ (None, 126)            │        16,254 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ reshape_33 (Reshape)            │ (None, 9, 14)          │             0 │
└─────────────────────────────────┴────────────────────────┴───────────────┘
 Total params: 84,350 (329.49 KB)
 Trainable params: 84,350 (329.49 KB)
 Non-trainable params: 0 (0.00 B)

Epoch 1/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 1s 97ms/step - loss: 0.1696 - mae: 0.2840 - val_loss: 0.1754 - val_mae: 0.2803
Epoch 2/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 43ms/step - loss: 0.1420 - mae: 0.2639 - val_loss: 0.1348 - val_mae: 0.2510
Epoch 3/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 42ms/step - loss: 0.1185 - mae: 0.2536 - val_loss: 0.1026 - val_mae: 0.2222
Epoch 4/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 43ms/step - loss: 0.1031 - mae: 0.2422 - val_loss: 0.0951 - val_mae: 0.2089
Epoch 5/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 44ms/step - loss: 0.0877 - mae: 0.2205 - val_loss: 0.0912 - val_mae: 0.2031
Epoch 6/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 45ms/step - loss: 0.0817 - mae: 0.2134 - val_loss: 0.0838 - val_mae: 0.1958
Epoch 7/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 46ms/step - loss: 0.0738 - mae: 0.2052 - val_loss: 0.0783 - val_mae: 0.1906
Epoch 8/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step - loss: 0.0695 - mae: 0.1989 - val_loss: 0.0791 - val_mae: 0.1905
Epoch 9/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 40ms/step - loss: 0.0668 - mae: 0.1947 - val_loss: 0.0779 - val_mae: 0.1887
Epoch 10/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 51ms/step - loss: 0.0632 - mae: 0.1891 - val_loss: 0.0736 - val_mae: 0.1839
Epoch 11/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 43ms/step - loss: 0.0620 - mae: 0.1887 - val_loss: 0.0719 - val_mae: 0.1819
Epoch 12/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step - loss: 0.0610 - mae: 0.1850 - val_loss: 0.0789 - val_mae: 0.1870
Epoch 13/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step - loss: 0.0608 - mae: 0.1809 - val_loss: 0.0791 - val_mae: 0.1870
Epoch 14/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step - loss: 0.0597 - mae: 0.1803 - val_loss: 0.0719 - val_mae: 0.1810
Epoch 15/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 43ms/step - loss: 0.0580 - mae: 0.1799 - val_loss: 0.0712 - val_mae: 0.1801
Epoch 16/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step - loss: 0.0558 - mae: 0.1760 - val_loss: 0.0722 - val_mae: 0.1810
Epoch 17/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step - loss: 0.0562 - mae: 0.1758 - val_loss: 0.0726 - val_mae: 0.1813
Epoch 18/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step - loss: 0.0546 - mae: 0.1731 - val_loss: 0.0726 - val_mae: 0.1811
Epoch 19/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step - loss: 0.0532 - mae: 0.1698 - val_loss: 0.0714 - val_mae: 0.1799
Epoch 20/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step - loss: 0.0550 - mae: 0.1732 - val_loss: 0.0714 - val_mae: 0.1795
2026-05-20 06:58:06,468 - INFO - Final training history: {'loss': [0.1696031391620636, 0.1420111209154129, 0.11850155889987946, 0.10308666527271271, 0.0876702144742012, 0.08166635781526566, 0.07384110987186432, 0.06951603293418884, 0.066753089427948, 0.06319283694028854, 0.0619516484439373, 0.06098174676299095, 0.060818299651145935, 0.05974338576197624, 0.05796949565410614, 0.05575023964047432, 0.056192606687545776, 0.05464734882116318, 0.053153958171606064, 0.05504487827420235], 'mae': [0.28397950530052185, 0.2638658583164215, 0.25362616777420044, 0.24216081202030182, 0.22045931220054626, 0.21342268586158752, 0.20518003404140472, 0.19889715313911438, 0.19466575980186462, 0.18912555277347565, 0.18871845304965973, 0.18495534360408783, 0.18086771667003632, 0.18032515048980713, 0.1798768788576126, 0.1760382056236267, 0.17576618492603302, 0.17314960062503815, 0.16978514194488525, 0.1732139140367508], 'val_loss': [0.17542003095149994, 0.13481110334396362, 0.10256704688072205, 0.0951295793056488, 0.09116010367870331, 0.083806112408638, 0.07831178605556488, 0.07906921207904816, 0.07786817103624344, 0.0736066922545433, 0.0718502402305603, 0.07886878401041031, 0.079136423766613, 0.07191335409879684, 0.07115032523870468, 0.07219410687685013, 0.07264978438615799, 0.07263756543397903, 0.07135149836540222, 0.07142360508441925], 'val_mae': [0.280328631401062, 0.25099337100982666, 0.2221730798482895, 0.20889395475387573, 0.20314958691596985, 0.195846825838089, 0.1906382441520691, 0.1904507279396057, 0.1887224316596985, 0.18392254412174225, 0.18186496198177338, 0.18703077733516693, 0.1870124191045761, 0.18095146119594574, 0.18012304604053497, 0.18099932372570038, 0.18131858110427856, 0.18112899363040924, 0.17988114058971405, 0.17951345443725586]}
2026-05-20 06:58:06,618 - INFO - Model training complete. Best model saved as /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/trained_models/bias_correction_model_month12_dekad01.keras
2026-05-20 06:58:06,621 - INFO - Pipeline [12 d1]: Loading confidence mask...
2026-05-20 06:58:06,624 - INFO - Loading existing confidence mask: /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/station_density/confidence_mask_station_density.nc4
2026-05-20 06:58:06,624 - INFO - Pipeline [12 d1]: Applying DL refinement...
2026-05-20 06:58:06,640 - INFO - Pixel-wise threshold map computed at 80th percentile. threshold_2d shape: (9, 14)
2026-05-20 06:58:06,641 - INFO - DL blending: base alpha=0.70 (LSEQM weight), 1-alpha=0.30 (DL weight)
2026-05-20 06:58:06,642 - INFO - Confidence mask active: spatial alpha modulation enabled. Confidence range: [0.000, 0.411]
2026-05-20 06:58:28,594 - INFO - DL blending complete: 250 daily slices processed, 3,999 extreme pixels blended (alpha=0.70)
2026-05-20 06:58:28,687 - INFO - Precip data dims: ('time', 'lat', 'lon'), shape: (250, 9, 14)
2026-05-20 06:58:28,736 - INFO - Saved Hybrid Deep Learning-Physical (Linear Scaling and Empirical Quantile Mapping) Approach corrected precipitation for month 12, dekad 01 at /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_lseqmdl/bali_cli_lseqmdl_corrected_imergl_month12_dekad01.nc4
2026-05-20 06:58:28,737 - INFO - Pipeline [12 d1]: Complete.
✓ month 12 dekad 1 — saved: /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_lseqmdl/bali_cli_imergl_lseqmdl_corrected_precip_month12_dekad01.nc4

============================================================
▸ month 12 dekad 2
============================================================
2026-05-20 06:58:28,738 - INFO - Pipeline [12 d2]: Running LSEQM...
2026-05-20 06:58:28,743 - INFO - Aligning IMERG and CPC datasets...
2026-05-20 06:58:28,754 - INFO - After alignment: IMERG has 9131 time steps, CPC has 9131 time steps
2026-05-20 06:58:28,754 - INFO - Creating time-based masks...
2026-05-20 06:58:28,766 - INFO - Applying time masks...
2026-05-20 06:58:28,779 - INFO - IMERG dekad data shape: (250, 9, 14)
2026-05-20 06:58:28,781 - INFO - CPC dekad data shape: (250, 9, 14)
2026-05-20 06:58:28,785 - INFO - Using native-resolution CPC parameter fitting (BCSD principle)...
2026-05-20 06:58:28,816 - INFO - CPC native dekad data: (250, 4, 6) (lat -9.25–-7.75, lon 113.75–116.25)
2026-05-20 06:58:31,015 - INFO -   Native CPC fitting: row 4/4 (100%) | 24 fitted, 0 skipped | elapsed 2s, ETA 0s
2026-05-20 06:58:31,016 - INFO - Fitted CPC params on native grid: 24/24 cells
2026-05-20 06:58:31,062 - INFO - Interpolated CPC params to IMERG grid: 126/126 valid pixels
2026-05-20 06:58:31,062 - INFO - Performing Linear Scaling (LS)...
2026-05-20 06:58:31,071 - INFO - LS using bilinearly interpolated CPC mean (smooth).
2026-05-20 06:58:31,075 - INFO - Saving LS corrected precipitation...
2026-05-20 06:58:31,083 - INFO - Precip data dims: ('time', 'lat', 'lon'), shape: (250, 9, 14)
2026-05-20 06:58:31,138 - INFO - Saved Linear Scaling corrected precipitation for month 12, dekad 11 at /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_ls/bali_cli_ls_corrected_imergl_month12_dekad11.nc4
2026-05-20 06:58:31,139 - INFO - Applying Empirical Quantile Mapping (EQM) on 9x14 grid...
2026-05-20 06:58:31,232 - INFO -   EQM progress: row 9/9 (100%) | 80 land pixels done | elapsed 0s, ETA 0s
2026-05-20 06:58:31,236 - INFO - EQM complete: 80/126 grid points corrected (46 masked/ocean pixels skipped)
2026-05-20 06:58:31,236 - INFO - Saving LSEQM corrected precipitation...
2026-05-20 06:58:31,239 - INFO - Precip data dims: ('time', 'lat', 'lon'), shape: (250, 9, 14)
2026-05-20 06:58:31,289 - INFO - Saved Linear Scaling and Empirical Quantile Mapping corrected precipitation for month 12, dekad 11 at /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_lseqm/bali_cli_lseqm_corrected_imergl_month12_dekad11.nc4
2026-05-20 06:58:31,291 - INFO - Pipeline [12 d2]: Training / loading DL model...
2026-05-20 06:58:31,292 - INFO - Checking if the model file exists at: /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/trained_models/bias_correction_model_month12_dekad11.keras

2026-05-20 06:58:31,379 - INFO - Model: "sequential_34"
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
┃ Layer (type)                    ┃ Output Shape           ┃       Param # ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│ conv2d_68 (Conv2D)              │ (None, 9, 14, 32)      │           320 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ max_pooling2d_68 (MaxPooling2D) │ (None, 4, 7, 32)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_102 (Dropout)           │ (None, 4, 7, 32)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ conv2d_69 (Conv2D)              │ (None, 4, 7, 64)       │        18,496 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ max_pooling2d_69 (MaxPooling2D) │ (None, 2, 3, 64)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_103 (Dropout)           │ (None, 2, 3, 64)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ flatten_34 (Flatten)            │ (None, 384)            │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dense_68 (Dense)                │ (None, 128)            │        49,280 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_104 (Dropout)           │ (None, 128)            │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dense_69 (Dense)                │ (None, 126)            │        16,254 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ reshape_34 (Reshape)            │ (None, 9, 14)          │             0 │
└─────────────────────────────────┴────────────────────────┴───────────────┘
 Total params: 84,350 (329.49 KB)
 Trainable params: 84,350 (329.49 KB)
 Non-trainable params: 0 (0.00 B)

Epoch 1/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 2s 105ms/step - loss: 0.2010 - mae: 0.3237 - val_loss: 0.1908 - val_mae: 0.2958
Epoch 2/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 47ms/step - loss: 0.1636 - mae: 0.2931 - val_loss: 0.1507 - val_mae: 0.2672
Epoch 3/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 58ms/step - loss: 0.1373 - mae: 0.2741 - val_loss: 0.1150 - val_mae: 0.2346
Epoch 4/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 45ms/step - loss: 0.1146 - mae: 0.2538 - val_loss: 0.0947 - val_mae: 0.2135
Epoch 5/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 44ms/step - loss: 0.0988 - mae: 0.2362 - val_loss: 0.0898 - val_mae: 0.2089
Epoch 6/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 47ms/step - loss: 0.0871 - mae: 0.2227 - val_loss: 0.0753 - val_mae: 0.1954
Epoch 7/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 42ms/step - loss: 0.0813 - mae: 0.2188 - val_loss: 0.0735 - val_mae: 0.1939
Epoch 8/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step - loss: 0.0761 - mae: 0.2107 - val_loss: 0.0785 - val_mae: 0.1993
Epoch 9/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 44ms/step - loss: 0.0731 - mae: 0.2062 - val_loss: 0.0721 - val_mae: 0.1918
Epoch 10/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 45ms/step - loss: 0.0714 - mae: 0.2051 - val_loss: 0.0696 - val_mae: 0.1879
Epoch 11/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step - loss: 0.0664 - mae: 0.1971 - val_loss: 0.0701 - val_mae: 0.1877
Epoch 12/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 45ms/step - loss: 0.0650 - mae: 0.1938 - val_loss: 0.0696 - val_mae: 0.1863
Epoch 13/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 47ms/step - loss: 0.0634 - mae: 0.1903 - val_loss: 0.0654 - val_mae: 0.1807
Epoch 14/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 43ms/step - loss: 0.0629 - mae: 0.1905 - val_loss: 0.0627 - val_mae: 0.1765
Epoch 15/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step - loss: 0.0617 - mae: 0.1882 - val_loss: 0.0674 - val_mae: 0.1818
Epoch 16/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step - loss: 0.0625 - mae: 0.1875 - val_loss: 0.0704 - val_mae: 0.1851
Epoch 17/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 46ms/step - loss: 0.0609 - mae: 0.1854 - val_loss: 0.0591 - val_mae: 0.1704
Epoch 18/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 59ms/step - loss: 0.0597 - mae: 0.1828 - val_loss: 0.0691 - val_mae: 0.1827
Epoch 19/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 57ms/step - loss: 0.0591 - mae: 0.1802 - val_loss: 0.0692 - val_mae: 0.1824
Epoch 20/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 55ms/step - loss: 0.0569 - mae: 0.1780 - val_loss: 0.0594 - val_mae: 0.1700
Epoch 21/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 41ms/step - loss: 0.0560 - mae: 0.1772 - val_loss: 0.0633 - val_mae: 0.1751
Epoch 22/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 57ms/step - loss: 0.0581 - mae: 0.1784 - val_loss: 0.0687 - val_mae: 0.1816
2026-05-20 06:58:37,243 - INFO - Final training history: {'loss': [0.20104536414146423, 0.16363900899887085, 0.13728414475917816, 0.11464142054319382, 0.09879805892705917, 0.08712001144886017, 0.08134286105632782, 0.07610350847244263, 0.07306022197008133, 0.07139366865158081, 0.066438227891922, 0.06500431895256042, 0.06342727690935135, 0.06293780356645584, 0.06174610182642937, 0.06247720122337341, 0.06092995032668114, 0.059704914689064026, 0.059108667075634, 0.05691252276301384, 0.055980805307626724, 0.058084845542907715], 'mae': [0.3236854672431946, 0.29307231307029724, 0.2741231620311737, 0.2537694573402405, 0.2361602932214737, 0.22272175550460815, 0.21878011524677277, 0.21072787046432495, 0.20615120232105255, 0.2050563395023346, 0.19707190990447998, 0.19380460679531097, 0.19028858840465546, 0.19047555327415466, 0.1881982982158661, 0.18750885128974915, 0.18544359505176544, 0.18277940154075623, 0.18017223477363586, 0.178045392036438, 0.17718668282032013, 0.17837141454219818], 'val_loss': [0.19082704186439514, 0.1507447361946106, 0.11498957872390747, 0.09465388208627701, 0.0897870734333992, 0.0752611830830574, 0.07351095974445343, 0.07852756977081299, 0.07207057625055313, 0.06958694010972977, 0.0701165422797203, 0.06955045461654663, 0.06541985273361206, 0.06271921098232269, 0.06736274808645248, 0.07037296891212463, 0.05908212810754776, 0.06909916549921036, 0.06916802376508713, 0.05939219892024994, 0.06328025460243225, 0.06868589669466019], 'val_mae': [0.29575738310813904, 0.26717740297317505, 0.23459947109222412, 0.21350997686386108, 0.2089277058839798, 0.19536766409873962, 0.19386456906795502, 0.19930942356586456, 0.191828653216362, 0.18794970214366913, 0.1877155750989914, 0.1862809807062149, 0.18068061769008636, 0.17651115357875824, 0.1818287968635559, 0.18509510159492493, 0.1703776866197586, 0.18265043199062347, 0.18238180875778198, 0.16995956003665924, 0.1750556379556656, 0.18163004517555237]}
2026-05-20 06:58:37,447 - INFO - Model training complete. Best model saved as /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/trained_models/bias_correction_model_month12_dekad11.keras
2026-05-20 06:58:37,449 - INFO - Pipeline [12 d2]: Loading confidence mask...
2026-05-20 06:58:37,452 - INFO - Loading existing confidence mask: /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/station_density/confidence_mask_station_density.nc4
2026-05-20 06:58:37,453 - INFO - Pipeline [12 d2]: Applying DL refinement...
2026-05-20 06:58:37,477 - INFO - Pixel-wise threshold map computed at 80th percentile. threshold_2d shape: (9, 14)
2026-05-20 06:58:37,478 - INFO - DL blending: base alpha=0.70 (LSEQM weight), 1-alpha=0.30 (DL weight)
2026-05-20 06:58:37,479 - INFO - Confidence mask active: spatial alpha modulation enabled. Confidence range: [0.000, 0.411]
2026-05-20 06:58:55,387 - INFO - DL blending complete: 250 daily slices processed, 4,000 extreme pixels blended (alpha=0.70)
2026-05-20 06:58:55,479 - INFO - Precip data dims: ('time', 'lat', 'lon'), shape: (250, 9, 14)
2026-05-20 06:58:55,522 - INFO - Saved Hybrid Deep Learning-Physical (Linear Scaling and Empirical Quantile Mapping) Approach corrected precipitation for month 12, dekad 11 at /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_lseqmdl/bali_cli_lseqmdl_corrected_imergl_month12_dekad11.nc4
2026-05-20 06:58:55,523 - INFO - Pipeline [12 d2]: Complete.
✓ month 12 dekad 2 — saved: /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_lseqmdl/bali_cli_imergl_lseqmdl_corrected_precip_month12_dekad11.nc4

============================================================
▸ month 12 dekad 3
============================================================
2026-05-20 06:58:55,527 - INFO - Pipeline [12 d3]: Running LSEQM...
2026-05-20 06:58:55,530 - INFO - Aligning IMERG and CPC datasets...
2026-05-20 06:58:55,538 - INFO - After alignment: IMERG has 9131 time steps, CPC has 9131 time steps
2026-05-20 06:58:55,538 - INFO - Creating time-based masks...
2026-05-20 06:58:55,550 - INFO - Applying time masks...
2026-05-20 06:58:55,561 - INFO - IMERG dekad data shape: (275, 9, 14)
2026-05-20 06:58:55,563 - INFO - CPC dekad data shape: (275, 9, 14)
2026-05-20 06:58:55,566 - INFO - Using native-resolution CPC parameter fitting (BCSD principle)...
2026-05-20 06:58:55,597 - INFO - CPC native dekad data: (275, 4, 6) (lat -9.25–-7.75, lon 113.75–116.25)
2026-05-20 06:58:58,137 - INFO -   Native CPC fitting: row 4/4 (100%) | 24 fitted, 0 skipped | elapsed 3s, ETA 0s
2026-05-20 06:58:58,138 - INFO - Fitted CPC params on native grid: 24/24 cells
2026-05-20 06:58:58,189 - INFO - Interpolated CPC params to IMERG grid: 126/126 valid pixels
2026-05-20 06:58:58,189 - INFO - Performing Linear Scaling (LS)...
2026-05-20 06:58:58,201 - INFO - LS using bilinearly interpolated CPC mean (smooth).
2026-05-20 06:58:58,204 - INFO - Saving LS corrected precipitation...
2026-05-20 06:58:58,208 - INFO - Precip data dims: ('time', 'lat', 'lon'), shape: (275, 9, 14)
2026-05-20 06:58:58,281 - INFO - Saved Linear Scaling corrected precipitation for month 12, dekad 21 at /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_ls/bali_cli_ls_corrected_imergl_month12_dekad21.nc4
2026-05-20 06:58:58,284 - INFO - Applying Empirical Quantile Mapping (EQM) on 9x14 grid...
2026-05-20 06:58:58,399 - INFO -   EQM progress: row 9/9 (100%) | 80 land pixels done | elapsed 0s, ETA 0s
2026-05-20 06:58:58,402 - INFO - EQM complete: 80/126 grid points corrected (46 masked/ocean pixels skipped)
2026-05-20 06:58:58,404 - INFO - Saving LSEQM corrected precipitation...
2026-05-20 06:58:58,406 - INFO - Precip data dims: ('time', 'lat', 'lon'), shape: (275, 9, 14)
2026-05-20 06:58:58,464 - INFO - Saved Linear Scaling and Empirical Quantile Mapping corrected precipitation for month 12, dekad 21 at /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_lseqm/bali_cli_lseqm_corrected_imergl_month12_dekad21.nc4
2026-05-20 06:58:58,465 - INFO - Pipeline [12 d3]: Training / loading DL model...
2026-05-20 06:58:58,467 - INFO - Checking if the model file exists at: /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/trained_models/bias_correction_model_month12_dekad21.keras

2026-05-20 06:58:58,541 - INFO - Model: "sequential_35"
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
┃ Layer (type)                    ┃ Output Shape           ┃       Param # ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│ conv2d_70 (Conv2D)              │ (None, 9, 14, 32)      │           320 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ max_pooling2d_70 (MaxPooling2D) │ (None, 4, 7, 32)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_105 (Dropout)           │ (None, 4, 7, 32)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ conv2d_71 (Conv2D)              │ (None, 4, 7, 64)       │        18,496 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ max_pooling2d_71 (MaxPooling2D) │ (None, 2, 3, 64)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_106 (Dropout)           │ (None, 2, 3, 64)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ flatten_35 (Flatten)            │ (None, 384)            │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dense_70 (Dense)                │ (None, 128)            │        49,280 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_107 (Dropout)           │ (None, 128)            │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dense_71 (Dense)                │ (None, 126)            │        16,254 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ reshape_35 (Reshape)            │ (None, 9, 14)          │             0 │
└─────────────────────────────────┴────────────────────────┴───────────────┘
 Total params: 84,350 (329.49 KB)
 Trainable params: 84,350 (329.49 KB)
 Non-trainable params: 0 (0.00 B)

Epoch 1/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 2s 94ms/step - loss: 0.2071 - mae: 0.3325 - val_loss: 0.1793 - val_mae: 0.2843
Epoch 2/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 43ms/step - loss: 0.1742 - mae: 0.3085 - val_loss: 0.1347 - val_mae: 0.2531
Epoch 3/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 43ms/step - loss: 0.1399 - mae: 0.2826 - val_loss: 0.0963 - val_mae: 0.2194
Epoch 4/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 46ms/step - loss: 0.1177 - mae: 0.2614 - val_loss: 0.0816 - val_mae: 0.2006
Epoch 5/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 71ms/step - loss: 0.0967 - mae: 0.2384 - val_loss: 0.0789 - val_mae: 0.1969
Epoch 6/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 72ms/step - loss: 0.0858 - mae: 0.2231 - val_loss: 0.0701 - val_mae: 0.1886
Epoch 7/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 70ms/step - loss: 0.0769 - mae: 0.2131 - val_loss: 0.0668 - val_mae: 0.1836
Epoch 8/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 50ms/step - loss: 0.0712 - mae: 0.2054 - val_loss: 0.0687 - val_mae: 0.1853
Epoch 9/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 58ms/step - loss: 0.0674 - mae: 0.1985 - val_loss: 0.0680 - val_mae: 0.1856
Epoch 10/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 67ms/step - loss: 0.0639 - mae: 0.1934 - val_loss: 0.0656 - val_mae: 0.1822
Epoch 11/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 50ms/step - loss: 0.0614 - mae: 0.1888 - val_loss: 0.0676 - val_mae: 0.1831
Epoch 12/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 57ms/step - loss: 0.0588 - mae: 0.1834 - val_loss: 0.0648 - val_mae: 0.1795
Epoch 13/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 88ms/step - loss: 0.0569 - mae: 0.1806 - val_loss: 0.0633 - val_mae: 0.1771
Epoch 14/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step - loss: 0.0582 - mae: 0.1828 - val_loss: 0.0642 - val_mae: 0.1776
Epoch 15/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step - loss: 0.0548 - mae: 0.1745 - val_loss: 0.0661 - val_mae: 0.1795
Epoch 16/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 43ms/step - loss: 0.0546 - mae: 0.1745 - val_loss: 0.0620 - val_mae: 0.1742
Epoch 17/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step - loss: 0.0520 - mae: 0.1707 - val_loss: 0.0626 - val_mae: 0.1746
Epoch 18/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step - loss: 0.0528 - mae: 0.1717 - val_loss: 0.0628 - val_mae: 0.1747
Epoch 19/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step - loss: 0.0518 - mae: 0.1695 - val_loss: 0.0622 - val_mae: 0.1738
Epoch 20/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 33ms/step - loss: 0.0521 - mae: 0.1693 - val_loss: 0.0623 - val_mae: 0.1738
Epoch 21/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 43ms/step - loss: 0.0508 - mae: 0.1668 - val_loss: 0.0615 - val_mae: 0.1725
Epoch 22/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step - loss: 0.0504 - mae: 0.1661 - val_loss: 0.0629 - val_mae: 0.1739
Epoch 23/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 40ms/step - loss: 0.0499 - mae: 0.1645 - val_loss: 0.0610 - val_mae: 0.1712
Epoch 24/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step - loss: 0.0491 - mae: 0.1629 - val_loss: 0.0611 - val_mae: 0.1712
Epoch 25/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 43ms/step - loss: 0.0483 - mae: 0.1622 - val_loss: 0.0607 - val_mae: 0.1708
Epoch 26/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step - loss: 0.0493 - mae: 0.1634 - val_loss: 0.0618 - val_mae: 0.1724
Epoch 27/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step - loss: 0.0483 - mae: 0.1602 - val_loss: 0.0627 - val_mae: 0.1735
Epoch 28/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step - loss: 0.0496 - mae: 0.1633 - val_loss: 0.0613 - val_mae: 0.1716
Epoch 29/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step - loss: 0.0483 - mae: 0.1607 - val_loss: 0.0642 - val_mae: 0.1755
Epoch 30/50
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step - loss: 0.0480 - mae: 0.1594 - val_loss: 0.0613 - val_mae: 0.1719
2026-05-20 06:59:05,909 - INFO - Final training history: {'loss': [0.20710492134094238, 0.17419464886188507, 0.13989318907260895, 0.11774739623069763, 0.09671374410390854, 0.08582458645105362, 0.07690256088972092, 0.0712321549654007, 0.06740462779998779, 0.06391874700784683, 0.06141659617424011, 0.05875856801867485, 0.056922122836112976, 0.0581967830657959, 0.05477337911725044, 0.05455882474780083, 0.052033036947250366, 0.05283452197909355, 0.051819294691085815, 0.052074190229177475, 0.050782568752765656, 0.05044933781027794, 0.04989024996757507, 0.04906707629561424, 0.04831878840923309, 0.049326635897159576, 0.04827515780925751, 0.04958038777112961, 0.04830646514892578, 0.048034824430942535], 'mae': [0.3324962258338928, 0.3085423409938812, 0.28260335326194763, 0.2613578140735626, 0.2383819967508316, 0.22307367622852325, 0.21312054991722107, 0.20537123084068298, 0.19848820567131042, 0.1933641880750656, 0.1887696385383606, 0.18336787819862366, 0.18062588572502136, 0.18278367817401886, 0.17445872724056244, 0.17448295652866364, 0.17073418200016022, 0.17167675495147705, 0.16951671242713928, 0.1693335771560669, 0.16675259172916412, 0.1661226749420166, 0.1645289957523346, 0.16289611160755157, 0.16219337284564972, 0.16343954205513, 0.16015802323818207, 0.16329263150691986, 0.1606842577457428, 0.15939101576805115], 'val_loss': [0.17926520109176636, 0.13468027114868164, 0.09633959084749222, 0.08162637054920197, 0.07889936119318008, 0.07005398720502853, 0.06675973534584045, 0.06865527480840683, 0.06799622625112534, 0.06556710600852966, 0.0675530880689621, 0.06480791419744492, 0.06326468288898468, 0.06418289989233017, 0.06611692160367966, 0.0620000921189785, 0.06259161233901978, 0.06284815818071365, 0.06222088634967804, 0.062258027493953705, 0.061502546072006226, 0.06290280073881149, 0.06096390634775162, 0.061142995953559875, 0.060722485184669495, 0.061753347516059875, 0.0627223402261734, 0.061327315866947174, 0.06424163281917572, 0.06134744733572006], 'val_mae': [0.2843087911605835, 0.25305867195129395, 0.21937422454357147, 0.20061393082141876, 0.19689252972602844, 0.18856048583984375, 0.18357643485069275, 0.18534110486507416, 0.18559710681438446, 0.18220899999141693, 0.18307587504386902, 0.1795201152563095, 0.17709410190582275, 0.17760701477527618, 0.17951858043670654, 0.17418712377548218, 0.17458729445934296, 0.17471946775913239, 0.17378287017345428, 0.1738131195306778, 0.17250068485736847, 0.17390798032283783, 0.1711757779121399, 0.17117425799369812, 0.17077824473381042, 0.17239253222942352, 0.17349675297737122, 0.17156900465488434, 0.1754867136478424, 0.17185941338539124]}
2026-05-20 06:59:06,058 - INFO - Model training complete. Best model saved as /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/trained_models/bias_correction_model_month12_dekad21.keras
2026-05-20 06:59:06,059 - INFO - Pipeline [12 d3]: Loading confidence mask...
2026-05-20 06:59:06,061 - INFO - Loading existing confidence mask: /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/station_density/confidence_mask_station_density.nc4
2026-05-20 06:59:06,062 - INFO - Pipeline [12 d3]: Applying DL refinement...
2026-05-20 06:59:06,077 - INFO - Pixel-wise threshold map computed at 80th percentile. threshold_2d shape: (9, 14)
2026-05-20 06:59:06,078 - INFO - DL blending: base alpha=0.70 (LSEQM weight), 1-alpha=0.30 (DL weight)
2026-05-20 06:59:06,079 - INFO - Confidence mask active: spatial alpha modulation enabled. Confidence range: [0.000, 0.411]
2026-05-20 06:59:23,900 - INFO - DL blending complete: 275 daily slices processed, 4,400 extreme pixels blended (alpha=0.70)
2026-05-20 06:59:23,998 - INFO - Precip data dims: ('time', 'lat', 'lon'), shape: (275, 9, 14)
2026-05-20 06:59:24,045 - INFO - Saved Hybrid Deep Learning-Physical (Linear Scaling and Empirical Quantile Mapping) Approach corrected precipitation for month 12, dekad 21 at /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_lseqmdl/bali_cli_lseqmdl_corrected_imergl_month12_dekad21.nc4
2026-05-20 06:59:24,047 - INFO - Pipeline [12 d3]: Complete.
✓ month 12 dekad 3 — saved: /content/drive/MyDrive/hybrid-bias-correction/data/example_bali/output/corrected_lseqmdl/bali_cli_imergl_lseqmdl_corrected_precip_month12_dekad21.nc4

============================================================
Batch complete: 36 periods done, 0 skipped.
============================================================

End of Code

Back to top