################################################################################# # GLOBALS # ################################################################################# PROJECT_NAME = lnp-ml PYTHON_VERSION = 3.8 PYTHON_INTERPRETER = python ################################################################################# # COMMANDS # ################################################################################# ## Install Python dependencies .PHONY: requirements requirements: pixi install ## Delete all compiled Python files .PHONY: clean clean: find . -type f -name "*.py[co]" -delete find . -type d -name "__pycache__" -delete ## Lint using ruff (use `make format` to do formatting) .PHONY: lint lint: ruff format --check ruff check ## Format source code with ruff .PHONY: format format: ruff check --fix ruff format ## Set up Python interpreter environment .PHONY: create_environment create_environment: @echo ">>> Pixi environment will be created when running 'make requirements'" @echo ">>> Activate with:\npixi shell" ################################################################################# # PROJECT RULES # ################################################################################# ## Clean raw data (raw -> interim) .PHONY: clean_data clean_data: requirements $(PYTHON_INTERPRETER) scripts/data_cleaning.py ## Process dataset (interim -> processed) .PHONY: data data: requirements $(PYTHON_INTERPRETER) scripts/process_data.py ## Process external data for pretrain (external -> processed) .PHONY: data_pretrain data_pretrain: requirements $(PYTHON_INTERPRETER) scripts/process_external.py # MPNN 支持:使用 USE_MPNN=1 启用 MPNN encoder # 例如:make pretrain USE_MPNN=1 MPNN_FLAG = $(if $(USE_MPNN),--use-mpnn,) # Backbone 冻结:使用 FREEZE_BACKBONE=1 冻结 backbone,只训练 heads # 例如:make finetune FREEZE_BACKBONE=1 FREEZE_FLAG = $(if $(FREEZE_BACKBONE),--freeze-backbone,) ## Pretrain on external data (delivery only) .PHONY: pretrain pretrain: requirements $(PYTHON_INTERPRETER) -m lnp_ml.modeling.pretrain $(MPNN_FLAG) ## Train model (multi-task, from scratch) .PHONY: train train: requirements $(PYTHON_INTERPRETER) -m lnp_ml.modeling.train $(MPNN_FLAG) ## Finetune from pretrained checkpoint (use FREEZE_BACKBONE=1 to freeze backbone) .PHONY: finetune finetune: requirements $(PYTHON_INTERPRETER) -m lnp_ml.modeling.train --init-from-pretrain models/pretrain_delivery.pt $(FREEZE_FLAG) $(MPNN_FLAG) ## Train with hyperparameter tuning .PHONY: tune tune: requirements $(PYTHON_INTERPRETER) -m lnp_ml.modeling.train --tune $(MPNN_FLAG) ## Run predictions .PHONY: predict predict: requirements $(PYTHON_INTERPRETER) -m lnp_ml.modeling.predict ## Test model on test set (with detailed metrics) .PHONY: test test: requirements $(PYTHON_INTERPRETER) -m lnp_ml.modeling.predict test ################################################################################# # Self Documenting Commands # ################################################################################# .DEFAULT_GOAL := help define PRINT_HELP_PYSCRIPT import re, sys; \ lines = '\n'.join([line for line in sys.stdin]); \ matches = re.findall(r'\n## (.*)\n[\s\S]+?\n([a-zA-Z_-]+):', lines); \ print('Available rules:\n'); \ print('\n'.join(['{:25}{}'.format(*reversed(match)) for match in matches])) endef export PRINT_HELP_PYSCRIPT help: @$(PYTHON_INTERPRETER) -c "${PRINT_HELP_PYSCRIPT}" < $(MAKEFILE_LIST)