LATEXMK := latexmk SRCDIR := paper/src BUILDDIR := build TEX := main.tex JOBNAME := main PDF := paper/$(BUILDDIR)/$(JOBNAME).pdf VENV := .venv PYTHON := $(VENV)/bin/python PIP := $(VENV)/bin/pip PYTEST := $(VENV)/bin/pytest NX := npx nx SWEEP_ENV_FILE ?= .env.sweep WANDB_ENTITY ?= WANDB_PROJECT ?= capstone SWEEP_ID ?= LOCAL_TRAIN_ARGS ?= --algo ppo --total-timesteps 50000 LOCAL_BENCHMARK_ARGS ?= --tiers static,surge,linear,qtable,ppo --alpha-values 0.0,0.3 --episodes 3 --total-timesteps 3000 --max-steps 40 --device cpu BENCHMARK_AGENT_ARGS ?= AGENT_COUNT ?= 0 REPO_URL ?= BRANCH ?= main WORKDIR ?= $(HOME)/PHANTOM-agent AGENT_LOOP ?= 1 RETRY_SECONDS ?= 20 TRAIN_IMAGE_REF := us-central1-docker.pkg.dev/phantom-trc/phantom/phantom-trainer TPU_NAME ?= TPU_ZONE ?= us-central2-b TPU_PROJECT ?= phantom-trc TPU_REPO_DIR ?= /tmp/PHANTOM SWEEP_ENV_LOAD = set -a; [ -f "$(SWEEP_ENV_FILE)" ] && . "$(SWEEP_ENV_FILE)" || true; set +a .DEFAULT_GOAL := help .PHONY: help help: @echo "pdf.build pdf.watch pdf.clean pdf.genpop pdf.genpop.watch | test.backend test.e2e test.all | web.dev | install | train | benchmark | benchmark.agent | train.agent | train.bootstrap | train.tpu.pod | train.tpu.vm | train.tpu.vm.sweep | stats.lines" @echo "backend.server backend.provider backend.worker | platform.up platform.down platform.logs | docker.train.publish" @echo "" @echo "Build general public version:" @echo " make pdf.genpop" @echo "" @echo "Local wandb run:" @echo " make train LOCAL_TRAIN_ARGS='--algo ppo --total-timesteps 50000'" @echo "" @echo "Local benchmark run:" @echo " make benchmark LOCAL_BENCHMARK_ARGS='--tiers static,surge,linear --alpha-values 0.0,0.3 --episodes 3 --no-wandb'" @echo "" @echo "Local sweep agent from this repo:" @echo " make train.agent SWEEP_ID=entity/project/id AGENT_COUNT=5" @echo "" @echo "Bootstrap private repo worker from anywhere:" @echo " make train.bootstrap REPO_URL=https://github.com/org/repo.git BRANCH=main SWEEP_ID=entity/project/id" @echo "" @echo "Config source: $(SWEEP_ENV_FILE) (auto-loaded)" $(BUILDDIR): mkdir -p paper/$(BUILDDIR) .PHONY: pdf.build pdf.build: @$(NX) run paper:build .PHONY: pdf.watch pdf.watch: @$(NX) run paper:watch .PHONY: pdf.clean pdf.clean: @$(NX) run paper:clean .PHONY: pdf.genpop pdf.genpop: @bash scripts/nx_paper.sh build-genpop .PHONY: pdf.genpop.watch pdf.genpop.watch: @bash scripts/nx_paper.sh watch-genpop .PHONY: test.backend test.backend: @$(NX) run research:test .PHONY: test.e2e test.e2e: @$(NX) run e2e:test .PHONY: test.all test.all: @$(NX) run-many -t test --projects=research,e2e --parallel=1 .PHONY: web.dev web.dev: @$(NX) run web:dev $(VENV): python3 -m venv $(VENV) $(PIP) install --upgrade pip .PHONY: install install: @$(NX) run research:install .PHONY: train train: @WANDB_ENTITY="$(WANDB_ENTITY)" WANDB_PROJECT="$(WANDB_PROJECT)" SWEEP_ENV_FILE="$(SWEEP_ENV_FILE)" LOCAL_TRAIN_ARGS="$(LOCAL_TRAIN_ARGS)" $(NX) run research:train .PHONY: benchmark benchmark: @WANDB_ENTITY="$(WANDB_ENTITY)" WANDB_PROJECT="$(WANDB_PROJECT)" SWEEP_ENV_FILE="$(SWEEP_ENV_FILE)" LOCAL_BENCHMARK_ARGS="$(LOCAL_BENCHMARK_ARGS)" $(NX) run research:benchmark .PHONY: benchmark.agent benchmark.agent: @WANDB_ENTITY="$(WANDB_ENTITY)" WANDB_PROJECT="$(WANDB_PROJECT)" SWEEP_ENV_FILE="$(SWEEP_ENV_FILE)" SWEEP_ID="$(SWEEP_ID)" AGENT_COUNT="$(AGENT_COUNT)" BENCHMARK_AGENT_ARGS="$(BENCHMARK_AGENT_ARGS)" $(NX) run research:benchmark-agent .PHONY: train.agent train.agent: @WANDB_ENTITY="$(WANDB_ENTITY)" WANDB_PROJECT="$(WANDB_PROJECT)" SWEEP_ENV_FILE="$(SWEEP_ENV_FILE)" SWEEP_ID="$(SWEEP_ID)" AGENT_COUNT="$(AGENT_COUNT)" $(NX) run research:train-agent .PHONY: train.bootstrap train.bootstrap: @WANDB_ENTITY="$(WANDB_ENTITY)" WANDB_PROJECT="$(WANDB_PROJECT)" SWEEP_ENV_FILE="$(SWEEP_ENV_FILE)" REPO_URL="$(REPO_URL)" BRANCH="$(BRANCH)" WORKDIR="$(WORKDIR)" SWEEP_ID="$(SWEEP_ID)" AGENT_COUNT="$(AGENT_COUNT)" AGENT_LOOP="$(AGENT_LOOP)" RETRY_SECONDS="$(RETRY_SECONDS)" $(NX) run research:train-bootstrap .PHONY: stats.lines stats.lines: @$(NX) run research:stats .PHONY: wordcount wordcount: @$(NX) run paper:wordcount .PHONY: docker.train.publish docker.train.publish: @TRAIN_IMAGE_REF="$(TRAIN_IMAGE_REF)" $(NX) run research:docker-train-publish .PHONY: train.tpu.pod train.tpu.pod: @TPU_NAME="$(TPU_NAME)" TPU_ZONE="$(TPU_ZONE)" TPU_PROJECT="$(TPU_PROJECT)" SWEEP_ENV_FILE="$(SWEEP_ENV_FILE)" SWEEP_ID="$(SWEEP_ID)" AGENT_COUNT="$(AGENT_COUNT)" $(NX) run research:train-tpu-pod .PHONY: train.tpu.vm.prepare train.tpu.vm.prepare: @TPU_NAME="$(TPU_NAME)" TPU_ZONE="$(TPU_ZONE)" TPU_PROJECT="$(TPU_PROJECT)" TPU_REPO_DIR="$(TPU_REPO_DIR)" $(NX) run research:train-tpu-vm-prepare .PHONY: train.tpu.vm.run train.tpu.vm.run: @TPU_NAME="$(TPU_NAME)" TPU_ZONE="$(TPU_ZONE)" TPU_PROJECT="$(TPU_PROJECT)" TPU_REPO_DIR="$(TPU_REPO_DIR)" SWEEP_ENV_FILE="$(SWEEP_ENV_FILE)" LOCAL_TRAIN_ARGS="$(LOCAL_TRAIN_ARGS)" $(NX) run research:train-tpu-vm-run .PHONY: train.tpu.vm train.tpu.vm: @TPU_NAME="$(TPU_NAME)" TPU_ZONE="$(TPU_ZONE)" TPU_PROJECT="$(TPU_PROJECT)" TPU_REPO_DIR="$(TPU_REPO_DIR)" SWEEP_ENV_FILE="$(SWEEP_ENV_FILE)" LOCAL_TRAIN_ARGS="$(LOCAL_TRAIN_ARGS)" $(NX) run research:train-tpu-vm .PHONY: train.tpu.vm.sweep train.tpu.vm.sweep: @TPU_NAME="$(TPU_NAME)" TPU_ZONE="$(TPU_ZONE)" TPU_PROJECT="$(TPU_PROJECT)" TPU_REPO_DIR="$(TPU_REPO_DIR)" SWEEP_ENV_FILE="$(SWEEP_ENV_FILE)" SWEEP_ID="$(SWEEP_ID)" AGENT_COUNT="$(AGENT_COUNT)" $(NX) run research:train-tpu-vm-sweep .PHONY: backend.server backend.provider backend.worker platform.up platform.down platform.logs backend.server: @$(NX) run backend-server:dev backend.provider: @$(NX) run pricing-provider:dev backend.worker: @$(NX) run backend-worker:dev platform.up: @$(NX) run platform:up platform.down: @$(NX) run platform:down platform.logs: @$(NX) run platform:logs .PHONY: pdf clean watch run.webapp test count-lines all pdf: @$(NX) run paper:build clean: @$(NX) run paper:clean watch: @$(NX) run paper:watch run.webapp: @$(NX) run web:dev test: @$(NX) run research:test count-lines: @$(NX) run research:stats all: @$(NX) run paper:build