# Semana 10: caminos mínimos con programación dinámica. Bellman-Ford, ciclos negativos,
# Floyd-Warshall y Held-Karp. Se usa dentro del entorno del curso.
#
#   make        compila los ejemplos en build/
#   make test   corre las pruebas de los ejemplos, con sanitizers
#   make bench  corre las mediciones de tiempo, con -O2
#   make clean  borra lo generado
#
# El problema de lab/ tiene su propio Makefile y no entra aquí.

CXX = g++
CXXFLAGS = -Wall -Wextra -std=c++20 -g -fsanitize=address,undefined
BENCHFLAGS = -Wall -Wextra -std=c++20 -O2
BUILD = build
HEADERS = shortest_paths.h all_pairs.h held_karp.h rates.h
PROGRAMS = bf_demo cycle_demo infinity_demo rates_demo fw_demo decision_demo held_karp_demo test_examples
BENCHES = all_pairs_bench held_karp_bench

.PHONY: all test bench clean

all: $(PROGRAMS:%=$(BUILD)/%) $(BENCHES:%=$(BUILD)/%)

$(PROGRAMS:%=$(BUILD)/%): $(BUILD)/%: %.cpp $(HEADERS) | $(BUILD)
	$(CXX) $(CXXFLAGS) $< -o $@

# Lo que mide tiempos va con -O2 y sin sanitizers.
$(BENCHES:%=$(BUILD)/%): $(BUILD)/%: %.cpp $(HEADERS) | $(BUILD)
	$(CXX) $(BENCHFLAGS) $< -o $@

$(BUILD):
	mkdir -p $@

test: $(BUILD)/test_examples
	$(BUILD)/test_examples

bench: $(BENCHES:%=$(BUILD)/%)
	$(BUILD)/all_pairs_bench
	$(BUILD)/held_karp_bench

clean:
	rm -rf $(BUILD)
