MODELS_DIR := models
OUT_DIR := out
DATA_PATH := ../data
DATA := $(DATA_PATH)/X_train.bin $(DATA_PATH)/X_test.bin $(DATA_PATH)/y_train.bin $(DATA_PATH)/y_test.bin

.PHONY: all
all: venv

$(DATA):
	@echo 'Missing $(DATA) files, use downloader first' && exit 1

.PHONY: venv
venv:
	@sh -c '. ./activate.sh'

.PHONY: start
start: $(DATA) | venv check-python-works
	@sh -c '. ./activate.sh && python projet.py'

.PHONY: debug
debug: $(DATA) | venv check-python-works check-pudb-works
	@bash -c 'source activate.sh && pudb projet.py'

.PHONY: profile
profile: $(DATA) | venv check-python-works check-gprof2dot-works check-dot-works
	@bash -c 'source activate.sh && python -m cProfile -o prof.out projet.py && gprof2dot -f pstats prof.out | dot -T png -o output.png'

.PHONY: log
log: $(DATA) reset | venv
	@sed -i 's/GPU_BOOSTED: Final = False/GPU_BOOSTED: Final = True/;s/COMPILE_WITH_C: Final = False/COMPILE_WITH_C: Final = True/' config.py
	@echo 'Logging GPU'
	@make -s start > log_gpu
	@sed -i 's/GPU_BOOSTED: Final = True/GPU_BOOSTED: Final = False/' config.py
	@echo 'Logging CPU'
	@make -s start > log_cpu
	@sed -i 's/GPU_BOOSTED: Final = False/GPU_BOOSTED: Final = True/;s/COMPILE_WITH_C: Final = True/COMPILE_WITH_C: Final = False/' config.py
	@echo 'Logging PGPU'
	@make -s start > log_pgpu
	@sed -i 's/GPU_BOOSTED: Final = True/GPU_BOOSTED: Final = False/' config.py
	@echo 'Logging PY'
	@make -s start > log_py
	@echo 'Cleaning up'
	@make -s reset

.PHONY: reset
reset:
	@echo 'Deleting generated states and models'
	@rm -frv $(OUT_DIR)/* $(MODELS_DIR)/*
#@ln -sv /mnt/pierre_stuffs/ViolaJones/python/models .
#@ln -sv /mnt/pierre_stuffs/ViolaJones/python/out .

.PHONY: clean
clean:
	@rm -fv log_gpu log_cpu log_gpu log_py

.PHONY: mrproper
mrproper: clean
	@rm -rfv __pycache__ venv

.PHONY: help
help:
	@echo "Available targets:"
	@echo "\tall: alias for start, (default target)"
	@echo "\tvenv: Create python virtual environnement."
	@echo "\tstart: Start the ViolaJones algorithm, require data beforehand downloaded by the downloader."
	@echo "\tdebug: Debug the ViolaJones algorithm, require data beforehand downloaded by the downloader."
	@echo "\tprofile: Profile the ViolaJones algorithm functions timestamps, require data beforehand downloaded by the downloader."
	@echo "\treset: Will delete any saved models and processed data made by ViolaJones."
	@echo "\tmrproper: Will remove cpp binary files. Will execute reset target beforehand."

.PHONY: check-python-works
check-python-works:
	@python --version >/dev/null 2>&1 || (echo 'Please install Python.' && exit 1)

.PHONY: check-pudb-works
check-pudb-works:
	@pudb --version >/dev/null 2>&1 || (echo 'Please install pudb.' && exit 1)

.PHONY: check-gprof2dot-works
check-gprof2dot-works:
	@gprof2dot --help >/dev/null 2>&1 || (echo 'Please install gprof2dot.' && exit 1)

.PHONY: check-dot-works
check-dot-works:
	@dot --version >/dev/null 2>&1 || (echo 'Please install dot from graphviz.' && exit 1)