From b8e11e44135cc891ddd6ec909d3eef839bb58cf9 Mon Sep 17 00:00:00 2001 From: Dave Woodruff Date: Thu, 19 Mar 2026 14:49:36 -0700 Subject: [PATCH 1/4] ci: run workflows on bitrot and allow manual dispatch --- .github/workflows/expl_heuristic.yml | 5 +++-- .github/workflows/fullstat_allplot.yml | 5 +++-- .github/workflows/sub20x20.yml | 5 +++-- .github/workflows/testReadme1.yml | 5 +++-- .github/workflows/test_datagenerator.yml | 5 +++-- .github/workflows/test_dogrib.yml | 5 +++-- .github/workflows/test_h1.yml | 5 +++-- .github/workflows/test_h2.yml | 5 +++-- .github/workflows/test_h3.yml | 5 +++-- .github/workflows/test_randweather.yml | 5 +++-- .github/workflows/test_readspot.yml | 5 +++-- 11 files changed, 33 insertions(+), 22 deletions(-) diff --git a/.github/workflows/expl_heuristic.yml b/.github/workflows/expl_heuristic.yml index 7dddc5f1..512e6c66 100644 --- a/.github/workflows/expl_heuristic.yml +++ b/.github/workflows/expl_heuristic.yml @@ -3,10 +3,11 @@ name: expl_heuristic # Kotaro Yama # dropped the Docker container use (DLW April 2025) on: + workflow_dispatch: push: - branches: [main] + branches: [main, bitrot] pull_request: - branches: [main] + branches: [main, bitrot] defaults: run: diff --git a/.github/workflows/fullstat_allplot.yml b/.github/workflows/fullstat_allplot.yml index 7f6c4720..d595ffec 100644 --- a/.github/workflows/fullstat_allplot.yml +++ b/.github/workflows/fullstat_allplot.yml @@ -2,10 +2,11 @@ name: fullstat_allplot # Kotaro Yama # dropped the Docker container use (DLW April 2025) on: + workflow_dispatch: push: - branches: [main] + branches: [main, bitrot] pull_request: - branches: [main] + branches: [main, bitrot] defaults: run: diff --git a/.github/workflows/sub20x20.yml b/.github/workflows/sub20x20.yml index 45277503..6135eb61 100644 --- a/.github/workflows/sub20x20.yml +++ b/.github/workflows/sub20x20.yml @@ -2,10 +2,11 @@ name: sub20x20 # Test2_zonghan # dropped the Docker container use (DLW April 2025) on: + workflow_dispatch: push: - branches: [main] + branches: [main, bitrot] pull_request: - branches: [main] + branches: [main, bitrot] defaults: run: diff --git a/.github/workflows/testReadme1.yml b/.github/workflows/testReadme1.yml index 27eade58..5c15ec42 100644 --- a/.github/workflows/testReadme1.yml +++ b/.github/workflows/testReadme1.yml @@ -2,10 +2,11 @@ name: Test First Readme Example # dropped the Docker container use (DLW April 2025) on: + workflow_dispatch: push: - branches: [main] + branches: [main, bitrot] pull_request: - branches: [main] + branches: [main, bitrot] defaults: run: diff --git a/.github/workflows/test_datagenerator.yml b/.github/workflows/test_datagenerator.yml index f3cc420f..244351ec 100644 --- a/.github/workflows/test_datagenerator.yml +++ b/.github/workflows/test_datagenerator.yml @@ -1,10 +1,11 @@ name: test_datagenerator on: + workflow_dispatch: push: - branches: [main] + branches: [main, bitrot] pull_request: - branches: [main] + branches: [main, bitrot] defaults: run: diff --git a/.github/workflows/test_dogrib.yml b/.github/workflows/test_dogrib.yml index 5330977d..cb2e50f9 100644 --- a/.github/workflows/test_dogrib.yml +++ b/.github/workflows/test_dogrib.yml @@ -2,10 +2,11 @@ name: dogrib # dropped the Docker container use (DLW April 2025) on: + workflow_dispatch: push: - branches: [main] + branches: [main, bitrot] pull_request: - branches: [main] + branches: [main, bitrot] defaults: run: diff --git a/.github/workflows/test_h1.yml b/.github/workflows/test_h1.yml index 0c1d6a44..fb8069c0 100644 --- a/.github/workflows/test_h1.yml +++ b/.github/workflows/test_h1.yml @@ -2,10 +2,11 @@ name: test_h1 # Kotaro Yama # dropped the Docker container use (DLW April 2025) on: + workflow_dispatch: push: - branches: [main] + branches: [main, bitrot] pull_request: - branches: [main] + branches: [main, bitrot] defaults: run: diff --git a/.github/workflows/test_h2.yml b/.github/workflows/test_h2.yml index f6130f0c..17710c1e 100644 --- a/.github/workflows/test_h2.yml +++ b/.github/workflows/test_h2.yml @@ -2,10 +2,11 @@ name: test_h2 # Kotaro Yama # dropped the Docker container use (DLW April 2025) on: + workflow_dispatch: push: - branches: [main] + branches: [main, bitrot] pull_request: - branches: [main] + branches: [main, bitrot] defaults: run: diff --git a/.github/workflows/test_h3.yml b/.github/workflows/test_h3.yml index ddea068c..fbe2481c 100644 --- a/.github/workflows/test_h3.yml +++ b/.github/workflows/test_h3.yml @@ -2,10 +2,11 @@ name: test_h3 # Kotaro Yama # dropped the Docker container use (DLW April 2025) on: + workflow_dispatch: push: - branches: [main] + branches: [main, bitrot] pull_request: - branches: [main] + branches: [main, bitrot] defaults: run: diff --git a/.github/workflows/test_randweather.yml b/.github/workflows/test_randweather.yml index 7616e0d0..b8d6c5ad 100644 --- a/.github/workflows/test_randweather.yml +++ b/.github/workflows/test_randweather.yml @@ -2,10 +2,11 @@ name: randweather # dropped the Docker container use (DLW April 2025) on: + workflow_dispatch: push: - branches: [main] + branches: [main, bitrot] pull_request: - branches: [main] + branches: [main, bitrot] defaults: run: diff --git a/.github/workflows/test_readspot.yml b/.github/workflows/test_readspot.yml index 4bba6513..2e436d25 100644 --- a/.github/workflows/test_readspot.yml +++ b/.github/workflows/test_readspot.yml @@ -2,10 +2,11 @@ name: test_readspot # dropped the Docker container use (DLW April 2025) on: + workflow_dispatch: push: - branches: [main] + branches: [main, bitrot] pull_request: - branches: [main] + branches: [main, bitrot] defaults: run: From 7e8faaeeadb41f4ae32ade602c206504b6eb45a2 Mon Sep 17 00:00:00 2001 From: Dave Woodruff Date: Thu, 19 Mar 2026 14:55:26 -0700 Subject: [PATCH 2/4] ci: set PYTHONPATH for workflow jobs --- .github/workflows/expl_heuristic.yml | 2 ++ .github/workflows/fullstat_allplot.yml | 2 ++ .github/workflows/sub20x20.yml | 2 ++ .github/workflows/testReadme1.yml | 2 ++ .github/workflows/test_datagenerator.yml | 2 ++ .github/workflows/test_dogrib.yml | 2 ++ .github/workflows/test_h1.yml | 2 ++ .github/workflows/test_h2.yml | 2 ++ .github/workflows/test_h3.yml | 2 ++ .github/workflows/test_randweather.yml | 2 ++ .github/workflows/test_readspot.yml | 2 ++ 11 files changed, 22 insertions(+) diff --git a/.github/workflows/expl_heuristic.yml b/.github/workflows/expl_heuristic.yml index 512e6c66..9807b7b3 100644 --- a/.github/workflows/expl_heuristic.yml +++ b/.github/workflows/expl_heuristic.yml @@ -18,6 +18,8 @@ jobs: name: expl_heuristic runs-on: ubuntu-latest timeout-minutes: 60 + env: + PYTHONPATH: ${{ github.workspace }} steps: - uses: actions/checkout@v3 - uses: conda-incubator/setup-miniconda@v2 diff --git a/.github/workflows/fullstat_allplot.yml b/.github/workflows/fullstat_allplot.yml index d595ffec..bbb21eec 100644 --- a/.github/workflows/fullstat_allplot.yml +++ b/.github/workflows/fullstat_allplot.yml @@ -17,6 +17,8 @@ jobs: name: fullStatAllPlot runs-on: ubuntu-latest timeout-minutes: 60 + env: + PYTHONPATH: ${{ github.workspace }} steps: - uses: actions/checkout@v3 - uses: conda-incubator/setup-miniconda@v2 diff --git a/.github/workflows/sub20x20.yml b/.github/workflows/sub20x20.yml index 6135eb61..0e521c92 100644 --- a/.github/workflows/sub20x20.yml +++ b/.github/workflows/sub20x20.yml @@ -17,6 +17,8 @@ jobs: name: sub20x20 runs-on: ubuntu-latest timeout-minutes: 60 + env: + PYTHONPATH: ${{ github.workspace }} steps: - uses: actions/checkout@v3 - uses: conda-incubator/setup-miniconda@v2 diff --git a/.github/workflows/testReadme1.yml b/.github/workflows/testReadme1.yml index 5c15ec42..4d44c13e 100644 --- a/.github/workflows/testReadme1.yml +++ b/.github/workflows/testReadme1.yml @@ -17,6 +17,8 @@ jobs: name: readme1 runs-on: ubuntu-latest timeout-minutes: 60 + env: + PYTHONPATH: ${{ github.workspace }} steps: - uses: actions/checkout@v3 - uses: conda-incubator/setup-miniconda@v2 diff --git a/.github/workflows/test_datagenerator.yml b/.github/workflows/test_datagenerator.yml index 244351ec..448d7cb4 100644 --- a/.github/workflows/test_datagenerator.yml +++ b/.github/workflows/test_datagenerator.yml @@ -16,6 +16,8 @@ jobs: name: test_datagenerator runs-on: ubuntu-latest timeout-minutes: 60 + env: + PYTHONPATH: ${{ github.workspace }} steps: - uses: actions/checkout@v3 - uses: conda-incubator/setup-miniconda@v2 diff --git a/.github/workflows/test_dogrib.yml b/.github/workflows/test_dogrib.yml index cb2e50f9..3c689704 100644 --- a/.github/workflows/test_dogrib.yml +++ b/.github/workflows/test_dogrib.yml @@ -17,6 +17,8 @@ jobs: name: test_dogrib runs-on: ubuntu-latest timeout-minutes: 60 + env: + PYTHONPATH: ${{ github.workspace }} steps: - uses: actions/checkout@v3 - uses: conda-incubator/setup-miniconda@v2 diff --git a/.github/workflows/test_h1.yml b/.github/workflows/test_h1.yml index fb8069c0..b5c2bc4a 100644 --- a/.github/workflows/test_h1.yml +++ b/.github/workflows/test_h1.yml @@ -17,6 +17,8 @@ jobs: name: test_h1 runs-on: ubuntu-latest timeout-minutes: 60 + env: + PYTHONPATH: ${{ github.workspace }} steps: - uses: actions/checkout@v3 - uses: conda-incubator/setup-miniconda@v2 diff --git a/.github/workflows/test_h2.yml b/.github/workflows/test_h2.yml index 17710c1e..4fd1112b 100644 --- a/.github/workflows/test_h2.yml +++ b/.github/workflows/test_h2.yml @@ -17,6 +17,8 @@ jobs: name: test_h2 runs-on: ubuntu-latest timeout-minutes: 60 + env: + PYTHONPATH: ${{ github.workspace }} steps: - uses: actions/checkout@v3 - uses: conda-incubator/setup-miniconda@v2 diff --git a/.github/workflows/test_h3.yml b/.github/workflows/test_h3.yml index fbe2481c..2503f5cd 100644 --- a/.github/workflows/test_h3.yml +++ b/.github/workflows/test_h3.yml @@ -17,6 +17,8 @@ jobs: name: test_h3 runs-on: ubuntu-latest timeout-minutes: 60 + env: + PYTHONPATH: ${{ github.workspace }} steps: - uses: actions/checkout@v3 - uses: conda-incubator/setup-miniconda@v2 diff --git a/.github/workflows/test_randweather.yml b/.github/workflows/test_randweather.yml index b8d6c5ad..0f01a37d 100644 --- a/.github/workflows/test_randweather.yml +++ b/.github/workflows/test_randweather.yml @@ -17,6 +17,8 @@ jobs: name: random weather runs-on: ubuntu-latest timeout-minutes: 60 + env: + PYTHONPATH: ${{ github.workspace }} steps: - uses: actions/checkout@v3 diff --git a/.github/workflows/test_readspot.yml b/.github/workflows/test_readspot.yml index 2e436d25..1cee7026 100644 --- a/.github/workflows/test_readspot.yml +++ b/.github/workflows/test_readspot.yml @@ -17,6 +17,8 @@ jobs: name: test_readspot runs-on: ubuntu-latest timeout-minutes: 60 + env: + PYTHONPATH: ${{ github.workspace }} steps: - uses: actions/checkout@v3 - uses: conda-incubator/setup-miniconda@v2 From e2c969c6dbf9aed01af7dd79b646ace5b6e6cf7c Mon Sep 17 00:00:00 2001 From: Dave Woodruff Date: Thu, 19 Mar 2026 15:48:07 -0700 Subject: [PATCH 3/4] test: add SpreadRad regression tests and workflow --- .github/workflows/test_spread_radius.yml | 57 +++++++++++++++++++ tests/test_spread_radius.py | 70 ++++++++++++++++++++++++ 2 files changed, 127 insertions(+) create mode 100644 .github/workflows/test_spread_radius.yml create mode 100644 tests/test_spread_radius.py diff --git a/.github/workflows/test_spread_radius.yml b/.github/workflows/test_spread_radius.yml new file mode 100644 index 00000000..77b706bb --- /dev/null +++ b/.github/workflows/test_spread_radius.yml @@ -0,0 +1,57 @@ +name: test_spread_radius + +on: + workflow_dispatch: + push: + branches: [main, bitrot] + pull_request: + branches: [main, bitrot] + +defaults: + run: + shell: bash -l {0} + +jobs: + build: + name: test_spread_radius + runs-on: ubuntu-latest + timeout-minutes: 60 + env: + PYTHONPATH: ${{ github.workspace }} + steps: + - uses: actions/checkout@v3 + - uses: conda-incubator/setup-miniconda@v2 + with: + activate-environment: test_env + python-version: 3.12 + auto-activate-base: false + + - name: Install Boost + run: sudo apt-get update && sudo apt-get install -y libboost-all-dev + - name: Install Eigen + run: sudo apt-get update && sudo apt-get install -y libeigen3-dev + + - name: make C++ + run: | + cd cell2fire/Cell2FireC + make + + - name: install dependencies + run: | + pip install -r requirements.txt + pip install flake8 + pip install pytest + + - name: setup the program + run: | + pip install -e . + + - name: Lint with flake8 + run: | + flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics + flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics + + - name: run tests + run: | + cd tests + pytest test_spread_radius.py diff --git a/tests/test_spread_radius.py b/tests/test_spread_radius.py new file mode 100644 index 00000000..a6b06570 --- /dev/null +++ b/tests/test_spread_radius.py @@ -0,0 +1,70 @@ +import re +import subprocess +from pathlib import Path + + +def _repo_root() -> Path: + return Path(__file__).resolve().parents[1] + + +def _binary_path() -> Path: + return _repo_root() / "cell2fire" / "Cell2FireC" / "Cell2Fire" + + +def _run_case(output_folder: Path, spread_radius: int | None) -> str: + binary = _binary_path() + assert binary.exists(), f"Cell2Fire binary not found at {binary}" + + cmd = [ + str(binary), + "--input-instance-folder", + str(_repo_root() / "data" / "dogrib") + "/", + "--output-folder", + str(output_folder), + "--weather", + "rows", + "--nweathers", + "1", + "--sim-years", + "1", + "--nsims", + "1", + "--Fire-Period-Length", + "1.0", + "--max-fire-periods", + "60", + "--seed", + "123", + "--ignitions", + "--no-output", + ] + if spread_radius is not None: + cmd.extend(["--SpreadRad", str(spread_radius)]) + + completed = subprocess.run(cmd, capture_output=True, text=True, check=True) + return completed.stdout + + +def _parse_burned_count(stdout: str) -> int: + match = re.search(r"Total Burnt Cells:\s+(\d+)", stdout) + assert match is not None, f"Could not parse burnt cells from output:\n{stdout}" + return int(match.group(1)) + + +def test_spreadrad_default_matches_spreadrad_1(tmp_path: Path) -> None: + default_out = _run_case(tmp_path / "default", None) + spread_1_out = _run_case(tmp_path / "spread_1", 1) + + assert _parse_burned_count(default_out) == _parse_burned_count(spread_1_out) + assert "SpreadRadius: 1" in spread_1_out + + +def test_spreadrad_2_increases_burned_cells_on_regression_case(tmp_path: Path) -> None: + spread_1_out = _run_case(tmp_path / "spread_1", 1) + spread_2_out = _run_case(tmp_path / "spread_2", 2) + + burned_1 = _parse_burned_count(spread_1_out) + burned_2 = _parse_burned_count(spread_2_out) + + assert "SpreadRadius: 2" in spread_2_out + assert burned_2 > burned_1, f"Expected SpreadRad=2 to burn more than SpreadRad=1, got {burned_2} <= {burned_1}" From 9a67ea1dbe7a3f54e3a74787fd17b33163161567 Mon Sep 17 00:00:00 2001 From: Dave Woodruff Date: Thu, 19 Mar 2026 16:24:38 -0700 Subject: [PATCH 4/4] chore: remove SpreadRad test files from bitrot PR --- .github/workflows/test_spread_radius.yml | 57 ------------------- tests/test_spread_radius.py | 70 ------------------------ 2 files changed, 127 deletions(-) delete mode 100644 .github/workflows/test_spread_radius.yml delete mode 100644 tests/test_spread_radius.py diff --git a/.github/workflows/test_spread_radius.yml b/.github/workflows/test_spread_radius.yml deleted file mode 100644 index 77b706bb..00000000 --- a/.github/workflows/test_spread_radius.yml +++ /dev/null @@ -1,57 +0,0 @@ -name: test_spread_radius - -on: - workflow_dispatch: - push: - branches: [main, bitrot] - pull_request: - branches: [main, bitrot] - -defaults: - run: - shell: bash -l {0} - -jobs: - build: - name: test_spread_radius - runs-on: ubuntu-latest - timeout-minutes: 60 - env: - PYTHONPATH: ${{ github.workspace }} - steps: - - uses: actions/checkout@v3 - - uses: conda-incubator/setup-miniconda@v2 - with: - activate-environment: test_env - python-version: 3.12 - auto-activate-base: false - - - name: Install Boost - run: sudo apt-get update && sudo apt-get install -y libboost-all-dev - - name: Install Eigen - run: sudo apt-get update && sudo apt-get install -y libeigen3-dev - - - name: make C++ - run: | - cd cell2fire/Cell2FireC - make - - - name: install dependencies - run: | - pip install -r requirements.txt - pip install flake8 - pip install pytest - - - name: setup the program - run: | - pip install -e . - - - name: Lint with flake8 - run: | - flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics - flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics - - - name: run tests - run: | - cd tests - pytest test_spread_radius.py diff --git a/tests/test_spread_radius.py b/tests/test_spread_radius.py deleted file mode 100644 index a6b06570..00000000 --- a/tests/test_spread_radius.py +++ /dev/null @@ -1,70 +0,0 @@ -import re -import subprocess -from pathlib import Path - - -def _repo_root() -> Path: - return Path(__file__).resolve().parents[1] - - -def _binary_path() -> Path: - return _repo_root() / "cell2fire" / "Cell2FireC" / "Cell2Fire" - - -def _run_case(output_folder: Path, spread_radius: int | None) -> str: - binary = _binary_path() - assert binary.exists(), f"Cell2Fire binary not found at {binary}" - - cmd = [ - str(binary), - "--input-instance-folder", - str(_repo_root() / "data" / "dogrib") + "/", - "--output-folder", - str(output_folder), - "--weather", - "rows", - "--nweathers", - "1", - "--sim-years", - "1", - "--nsims", - "1", - "--Fire-Period-Length", - "1.0", - "--max-fire-periods", - "60", - "--seed", - "123", - "--ignitions", - "--no-output", - ] - if spread_radius is not None: - cmd.extend(["--SpreadRad", str(spread_radius)]) - - completed = subprocess.run(cmd, capture_output=True, text=True, check=True) - return completed.stdout - - -def _parse_burned_count(stdout: str) -> int: - match = re.search(r"Total Burnt Cells:\s+(\d+)", stdout) - assert match is not None, f"Could not parse burnt cells from output:\n{stdout}" - return int(match.group(1)) - - -def test_spreadrad_default_matches_spreadrad_1(tmp_path: Path) -> None: - default_out = _run_case(tmp_path / "default", None) - spread_1_out = _run_case(tmp_path / "spread_1", 1) - - assert _parse_burned_count(default_out) == _parse_burned_count(spread_1_out) - assert "SpreadRadius: 1" in spread_1_out - - -def test_spreadrad_2_increases_burned_cells_on_regression_case(tmp_path: Path) -> None: - spread_1_out = _run_case(tmp_path / "spread_1", 1) - spread_2_out = _run_case(tmp_path / "spread_2", 2) - - burned_1 = _parse_burned_count(spread_1_out) - burned_2 = _parse_burned_count(spread_2_out) - - assert "SpreadRadius: 2" in spread_2_out - assert burned_2 > burned_1, f"Expected SpreadRad=2 to burn more than SpreadRad=1, got {burned_2} <= {burned_1}"