# Semana 9: más programación dinámica. El DAG de subproblemas, camino más largo, subsecuencia
# creciente más larga, cadena de matrices, árboles de búsqueda óptimos y programación dinámica
# sobre árboles. 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, con -O2
#   make deep   muestra la recursión profunda que agota la pila, con -O2
#   make clean  borra lo generado
#
# Los problemas de lab/ tienen su propio Makefile y no entran aquí.

CXX = g++
CXXFLAGS = -Wall -Wextra -std=c++20 -g -fsanitize=address,undefined
BENCHFLAGS = -Wall -Wextra -std=c++20 -O2
BUILD = build
HEADERS = dag_dp.h lis.h interval_dp.h tree_dp.h
PROGRAMS = dag_demo lis_demo chain_demo bst_demo tree_demo test_examples
BENCHES = lis_bench chain_bench deep_chain

.PHONY: all test bench deep clean

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

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

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

$(BUILD):
	mkdir -p $@

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

bench: $(BUILD)/lis_bench $(BUILD)/chain_bench
	$(BUILD)/lis_bench
	$(BUILD)/chain_bench

deep: $(BUILD)/deep_chain
	-bash -c '$(BUILD)/deep_chain 100000; echo "código de salida: $$?"' 2>&1
	-bash -c '$(BUILD)/deep_chain 1000000; echo "código de salida: $$?"' 2>&1

clean:
	rm -rf $(BUILD)
