# Semana 14: NP-completitud. Reducciones desde SAT y 3-SAT, gadgets, suma de subconjuntos y la
# frontera entre lo fácil y lo difícil. 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   mide la programación dinámica en instancias que salen de la reducción, con -O2
#   make solver  pasa fórmulas 3-SAT al azar y el principio del palomar por minisat
#   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 = cnf.h graph.h three_sat.h independent_set.h coloring.h subset_sum.h knapsack_search.h two_sat.h frontier.h
PROGRAMS = three_sat_demo is_demo coloring_demo subset_demo knapsack_demo two_sat_demo frontier_demo test_examples
BENCHES = subset_bench random_3sat pigeonhole

.PHONY: all test bench solver 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: $(BUILD)/subset_bench
	$(BUILD)/subset_bench

solver: $(BUILD)/random_3sat $(BUILD)/pigeonhole
	bash solver_runs.sh

clean:
	rm -rf $(BUILD)
