# Public data, analysis, figure, and results-report build.

.DEFAULT_GOAL := all

LATEXMK       ?= latexmk
LATEXMK_FLAGS := -pdf -interaction=nonstopmode -halt-on-error
UV            ?= uv

OUT_DIR       := out
REPORT_OUT    := $(OUT_DIR)/results
DATA_OUTPUT   := $(OUT_DIR)/data

UV_PROJECT             := code
UV_PROJECT_ENVIRONMENT := $(abspath $(OUT_DIR)/venv)
UV_CACHE_DIR           ?= $(abspath $(OUT_DIR)/uv-cache)
PYTHONPYCACHEPREFIX    := $(abspath $(OUT_DIR)/pycache)
export UV_PROJECT_ENVIRONMENT UV_CACHE_DIR PYTHONPYCACHEPREFIX

PYTHON          := $(OUT_DIR)/venv/bin/python
CODE_PYTHON     := PYTHONPATH="$(abspath code)" $(PYTHON)
FIGURE_TOOL     := $(CODE_PYTHON) -m utils.figures
PUBLIC_FIGURES  := learning replay observations model-size zero-flow \
	rl.comparison rl.long rl.legend

.PHONY: all setup data figures report check clean

all: report

setup:
	mkdir -p "$(OUT_DIR)"
	@if [ ! -x "$(PYTHON)" ]; then \
		$(UV) sync --project "$(UV_PROJECT)" --locked; \
	fi

# Rebuild every published numerical and figure-data interface from the archive.
data: setup
	$(CODE_PYTHON) -m checks.verify_experiment_archive
	$(CODE_PYTHON) -m paper.build_scientific_constants --data-root data
	$(CODE_PYTHON) -m paper.build_protocol_constants
	$(CODE_PYTHON) -m main_results.build_figure_data --data-root data
	$(CODE_PYTHON) -m appendix_d.build_ablation_data --data-root data
	$(CODE_PYTHON) -m main_results.build_replay_data --data-root data
	$(CODE_PYTHON) -m appendix_e.build_temporal_structure --data-root data
	$(CODE_PYTHON) -m paper.build_baseline_data --data-root data
	$(CODE_PYTHON) -m appendix_d.build_algorithm_ablation_data --data-root data
	$(CODE_PYTHON) -m appendix_d.build_extended_sac_data --data-root data
	$(CODE_PYTHON) -m appendix_c.build_inverse_response --data-root data
	$(CODE_PYTHON) -m utils.publish_figure_data
	$(CODE_PYTHON) -m paper.build_paper_numbers --data-root data

# Render the sixteen plots and legends whose inputs are generated from the data.
figures: data
	$(FIGURE_TOOL) render $(PUBLIC_FIGURES) --baselines both \
		--data-overlay "$(DATA_OUTPUT)/figures" \
		--require-data-overlay --publish

report: figures
	mkdir -p "$(REPORT_OUT)"
	$(LATEXMK) $(LATEXMK_FLAGS) \
		-outdir="$(abspath $(REPORT_OUT))" main.tex

check: report
	$(CODE_PYTHON) -m checks.verify_experiment_archive
	$(CODE_PYTHON) -m paper.build_protocol_constants --check
	$(CODE_PYTHON) -m paper.build_paper_numbers --data-root data --check
	$(CODE_PYTHON) -m utils.publish_figure_data --check
	$(FIGURE_TOOL) check
	@test -s "$(REPORT_OUT)/main.pdf"
	@echo "Validated public results report: $(REPORT_OUT)/main.pdf"

clean:
	PYTHONDONTWRITEBYTECODE=1 PYTHONPATH="$(abspath code)" \
		python3 -m utils.figures clean --quiet
	$(RM) -r "$(OUT_DIR)" "out" "generated"
	find code -type d -name __pycache__ -prune -exec $(RM) -r {} +
