Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 38 additions & 0 deletions .github/workflows/submit_bpz_31temps.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
---
# This workflow will install Python dependencies and run tests

name: Unit test and code coverage

on:
push:
branches: [main]
pull_request:
branches: [main]

jobs:
build:

runs-on: ubuntu-latest
strategy:
matrix:
python-version: ['3.13']
submission: ['bpz_31temps']

steps:
- uses: actions/checkout@v3
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v4
with:
python-version: ${{ matrix.python-version }}
- name: Install dependencies
run: |
sudo apt-get update
sudo apt install libbz2-dev
python -m pip install --upgrade pip
pip install wheel
pip install .
pip install .[dev]
if [ -f requirements_${{ matrix.submission }}.txt ]; then pip install -r requirements_${{ matrix.submission }}.txt; fi
- name: Run unit tests with pytest
run: |
python -m pytest tests/test_${{ matrix.submission }}.py
5 changes: 5 additions & 0 deletions requirements_bpz_31temps.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
pz-rail-base>=2.0.0
pz-rail-bpz>=2.0.1
desc-bpz>=0.3.3
qp-prob>=1.0.0
tables_io>=1.0.0
277 changes: 277 additions & 0 deletions tests/test_bpz_31temps.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,277 @@
import os
from pathlib import Path
import pytest

# Put needed import here
from rail.estimation.algos.bpz_lite import BPZliteInformer, BPZliteEstimator
from rail.core.data import TableHandle
from rail.utils import catalog_utils


# These are used by test scripts
from pz_data_challenge.taskset_1 import run_taskset_1
from pz_data_challenge.taskset_2 import run_taskset_2
from pz_data_challenge import submit_utils

xbands = ['u','g','r','i','z','y']
errbands = []
for band in xbands:
errbands.append(f"mag_{band}_lsst_err")


# Change these to match the name of the submission
# and a URL to download the sumission data files
# and needed model files
SUBMISSION_NAME: str = "bpz_31temps"
SUBMISSION_URL: str = "https://portal.nersc.gov/cfs/lsst/PZ/submit_bpz_31temps.tgz"

# don't change these
SUBMIT_DIR: str = f"submissions/{SUBMISSION_NAME}"
PUBLIC_AREA: str = "tests/public"


@pytest.fixture(name="setup_submit_area", scope="module")
def setup_submit_area(request: pytest.FixtureRequest) -> int:
"""
A pytest fixture to download the submission data

If all the submission data are in a tar file with the
proper structure you should not need to change this function.
"""

if not os.path.exists(SUBMIT_DIR):
if not SUBMISSION_URL:
raise ValueError(f"SUBMISSION_URL in tests/test_{SUBMISSION_NAME}.py has not been set")
submit_utils.download_and_extract_tar(SUBMISSION_URL, SUBMIT_DIR)

def teardown_submit_area() -> None:
if not os.environ.get("NO_TEARDOWN"):
os.system(f"\\rm -rf {SUBMIT_DIR}")

try:
os.makedirs(os.path.join(SUBMIT_DIR, "outputs_2"))
except Exception:
pass

try:
os.makedirs(os.path.join(SUBMIT_DIR, "outputs_3"))
except Exception:
pass

request.addfinalizer(teardown_submit_area)

return 0


def run_taskset_1_estimation_only(
model_file: str | Path,
test_file: str | Path,
output_file: str | Path,
) -> None:
"""
User supplied function to run estimation for task set 1

This function should use a model stored in model_file, which
is downloaded as part of the submission tar file.

This function should write output data to output_file in qp
format.

Parameters
----------
model_file:
Path to the model. This should be part of the submission
tar file.
test_file:
Path to the test file contains the photometric test data on
which the PZ estimation will be run
output_file:
Path to write the output data to. The output data should
be written in qp format.
"""
test_data = TableHandle("test", path=test_file)
estimator = BPZliteEstimator.make_stage(
name="estimate",
hdf5_groupname="",
model=model_file,
spectra_file="COSMOS_seds.list",
err_bands=errbands,
)
pz_out = estimator.estimate(test_data)
pz_out.data.ancil["object_id"] = test_data()["object_id"].astype(int)
pz_out.path = output_file
pz_out.write()


def run_taskset_1_training_and_estimation(
train_file: str | Path,
test_file: str | Path,
output_file: str | Path,
) -> None:
"""
User supplied function to run training and estimation for task set 1

This function should train a model and use it.

This function should write output data to output_file in qp
format.

Parameters
----------
train_file:
Path to the test file contains the photometric test data on
which the PZ estimation will be trained
test_file:
Path to the test file contains the photometric test data on
which the PZ estimation will be run
output_file:
Path to write the output data to. The output data should
be written in qp format.
"""
train_data = TableHandle("train", path=train_file)
test_data = TableHandle("test", path=test_file)

informer = BPZliteInformer.make_stage(
name="inform",
output_HDFN=True,
nt_array=[10,9,12],
)
model = informer.inform(train_data)

estimator = BPZliteEstimator.make_stage(
name="estimate",
model=model,
hdf5_groupname="",
spectra_file="COSMOS_seds.list",
err_bands=errbands,
)
pz_out = estimator.estimate(test_data)
pz_out.data.ancil["object_id"] = test_data()["object_id"].astype(int)
pz_out.path = output_file
pz_out.write()


def run_taskset_2_estimation_only(
model_file: str | Path,
test_file: str | Path,
output_file: str | Path,
) -> None:
"""
User supplied function to run estimation for task set 1

This function should use a model stored in model_file, which
is downloaded as part of the submission tar file.

This function should write output data to output_file in qp
format.

Parameters
----------
model_file:
Path to the model. This should be part of the submission
tar file.
test_file:
Path to the test file contains the photometric test data on
which the PZ estimation will be run
output_file:
Path to write the output data to. The output data should
be written in qp format.
"""
test_data = TableHandle("test", path=test_file)
estimator = BPZliteEstimator.make_stage(
name="estimate",
model=model_file,
hdf5_groupname="",
spectra_file="COSMOS_seds.list",
err_bands=errbands,
)
pz_out = estimator.estimate(test_data)
pz_out.data.ancil["object_id"] = test_data()["object_id"].astype(int)
pz_out.path = output_file
pz_out.write()


def run_taskset_2_training_and_estimation(
train_file: str | Path,
test_file: str | Path,
output_file: str | Path,
) -> None:
"""
User supplied function to run training and estimation for task set 1

This function should train a model and use it.

This function should write output data to output_file in qp
format.

Parameters
----------
test_file:
Path to the test file contains the photometric test data on
which the PZ estimation will be run
output_file:
Path to write the output data to. The output data should
be written in qp format.
"""
train_data = TableHandle("train", path=train_file)
test_data = TableHandle("test", path=test_file)

informer = BPZliteInformer.make_stage(
name="inform",
output_hdfn=True,
nt_array=[10,9,12],
)
model = informer.inform(train_data)

estimator = BPZliteEstimator.make_stage(
name="estimate",
model=model,
hdf5_groupname="",
spectra_file="COSMOS_seds.list",
err_bands=errbands,
)
pz_out = estimator.estimate(test_data)
pz_out.data.ancil["object_id"] = test_data()["object_id"].astype(int)
pz_out.path = output_file
pz_out.write()

def test_example_taskset_1(
setup_public_area: int,
setup_submit_area: int,
) -> None:
"""
Test fuction to validate a submisson for Taskset 1

You should not need to change this function
"""

assert setup_public_area == 0
assert setup_submit_area == 0

run_taskset_1(
PUBLIC_AREA,
SUBMISSION_NAME,
run_taskset_1_estimation_only,
run_taskset_1_training_and_estimation,
)


def test_example_taskset_2(
setup_public_area: int,
setup_submit_area: int,
) -> None:
"""
Test fuction to validate a submisson for Taskset 2

You should not need to change this function
"""

assert setup_public_area == 0
assert setup_submit_area == 0

run_taskset_2(
PUBLIC_AREA,
SUBMISSION_NAME,
run_taskset_2_estimation_only,
run_taskset_2_training_and_estimation,
)
Loading