diff --git a/Makefile b/Makefile index 4d98524..c67678d 100644 --- a/Makefile +++ b/Makefile @@ -9,18 +9,22 @@ VAL_DIR = validator INC_DIR = include CHK_DIR = checker +TEST_DIR = src/test + BUILD_DIR = build BUILD_TARGET_DIR = $(BUILD_DIR)/target BUILD_GEN_DIR = $(BUILD_DIR)/gen BUILD_VAL_DIR = $(BUILD_DIR)/val BUILD_CHK_DIR = $(BUILD_DIR)/chk +BUILD_TEST_DIR = $(BUILD_DIR)/test LOG_DIR = $(BUILD_DIR)/logs BUILD_IN_DIR = $(BUILD_DIR)/input BUILD_OUT_A_DIR = $(BUILD_DIR)/$(SOL_A)_out BUILD_OUT_B_DIR = $(BUILD_DIR)/$(SOL_B)_out -DIRS = $(BUILD_DIR) $(BUILD_TARGET_DIR) $(BUILD_GEN_DIR) $(BUILD_VAL_DIR) $(BUILD_CHK_DIR) $(LOG_DIR) $(BUILD_IN_DIR) $(BUILD_OUT_A_DIR) $(BUILD_OUT_B_DIR) + +DIRS = $(BUILD_DIR) $(BUILD_TARGET_DIR) $(BUILD_GEN_DIR) $(BUILD_VAL_DIR) $(BUILD_CHK_DIR) $(LOG_DIR) $(BUILD_IN_DIR) $(BUILD_OUT_A_DIR) $(BUILD_OUT_B_DIR) $(BUILD_TEST_DIR) CXXFLAGS = -Wall -O2 -std=c++2a GENFLAGS = -N $(N) -M $(M) -pm $(pm) @@ -56,7 +60,7 @@ pm ?= 0.1 all: $(SOLS_EXE) $(GENS_EXE) $(VAL_EXE) $(CHK_EXE) $(DIRS) @echo "All executables compiled in $(BUILD_DIR)/" -$(BUILD_DIR) $(BUILD_TARGET_DIR) $(BUILD_GEN_DIR) $(BUILD_VAL_DIR) $(BUILD_CHK_DIR) $(LOG_DIR) $(BUILD_IN_DIR) $(BUILD_OUT_A_DIR) $(BUILD_OUT_B_DIR): +$(BUILD_DIR) $(BUILD_TARGET_DIR) $(BUILD_GEN_DIR) $(BUILD_VAL_DIR) $(BUILD_CHK_DIR) $(LOG_DIR) $(BUILD_IN_DIR) $(BUILD_OUT_A_DIR) $(BUILD_OUT_B_DIR) $(BUILD_TEST_DIR): @echo "Creating directory: $@" @mkdir -p $@ @@ -83,6 +87,10 @@ $(BUILD_IN_DIR)/input%: $(GEN_TO_RUN) | $(BUILD_IN_DIR) echo "Using Seed: $$SEED" >&2; \ ./$(GEN_TO_RUN) $(GENFLAGS) "$$SEED" > $@ +$(BUILD_TEST_DIR)/%: $(TEST_DIR)/%.cpp | $(BUILD_TEST_DIR) + @echo "Compiling Unit Test $< -> $@" + $(CXX) $(CXXFLAGS) -I$(INC_DIR) -I$(SRC_DIR)/bsb -o $@ $< -lgtest -lgtest_main -pthread + .PHONY: force force: @@ -152,10 +160,18 @@ else @echo "OK: ID=$(id) outputs match!" endif +UNIT_TEST_SRCS = $(wildcard $(TEST_DIR)/*.cpp) +UNIT_TEST_NAMES = $(patsubst $(TEST_DIR)/%.cpp, %, $(UNIT_TEST_SRCS)) .PHONY: test test: all $(LOG_DIR) $(BUILD_OUT_A_DIR) $(BUILD_OUT_B_DIR) -ifeq ($(id),) +ifdef target + @# Case 1: Unit Test 실행 (예: make test target=L33) + @echo "--- Running Unit Test Target: [$(target)] ---" + @$(MAKE) --no-print-directory $(BUILD_TEST_DIR)/$(target) + @echo "-------------------------------------------" + @./$(BUILD_TEST_DIR)/$(target) +else ifeq ($(id),) @echo "--- Running $(TEST_COUNT) tests (Comparing $(SOL_A) vs $(SOL_B)) ---" @echo "--- Using Generator [$(gen)] (N=$(N), M=$(M)) ---" @LOG_FILE=$(LOG_DIR)/test_run_$$(date +%Y%m%d_%H%M%S).log; \ @@ -194,6 +210,10 @@ else @$(MAKE) --no-print-directory check id=$(id) gen=$(gen) SOL_A=$(SOL_A) SOL_B=$(SOL_B) N=$(N) M=$(M) endif +.PHONY: $(UNIT_TEST_NAMES) +$(UNIT_TEST_NAMES): + @$(MAKE) --no-print-directory test target=$@ + .PHONY: bench bench: all ifeq ($(id),) diff --git a/generator/gen1.cpp b/generator/gen1.cpp index a5cef47..972e9d3 100644 --- a/generator/gen1.cpp +++ b/generator/gen1.cpp @@ -20,8 +20,7 @@ int main(int argc, char *argv[]) { vector cnt(n + 1, 0); for (ll i = 0; i < m; ++i) { ll s = rnd.next(1uLL, n); - if(cnt[s] == n-1) - { + if (cnt[s] == n - 1) { i--; continue; } diff --git a/src/bsb/bsb.hpp b/src/bsb/L33.hpp similarity index 94% rename from src/bsb/bsb.hpp rename to src/bsb/L33.hpp index 0c08dc3..368148e 100644 --- a/src/bsb/bsb.hpp +++ b/src/bsb/L33.hpp @@ -5,10 +5,10 @@ #include #include #include -#include #include #include #include +#include #include #include #include @@ -329,6 +329,26 @@ class L33 { return {x, s}; } bool empty() const { return ptr.empty(); } + + void _debug(ostream& os) + { + os<<"D0: "< #include -#include "bsb.hpp" +#include "L33.hpp" using namespace std; using namespace GMS; diff --git a/src/test/L33-test1.cpp b/src/test/L33-test1.cpp new file mode 100644 index 0000000..2f77c3c --- /dev/null +++ b/src/test/L33-test1.cpp @@ -0,0 +1,93 @@ +#include + +#include +// #include +#include + +TEST(L33_test, debug_small) { + const unsigned seed = 998244353; + const uint N = 10, M = 1, MX = 1e9; + + std::mt19937 gen(seed); + std::uniform_int_distribution dis(1, MX); + + GMS::L33 D(M, MX); + std::map mp; + + std::vector keys; + for(int i=1;i<=N;i++) keys.push_back(i); + + std::shuffle(keys.begin(), keys.end(), gen); + + for(auto key:keys) + { + int val = dis(gen); + std::cerr< dis(1, MX); + std::uniform_real_distribution valdis(-inf, inf); + + GMS::L33 D(M, inf); + + std::vector vec; + for (int i = 1; i <= N; i++) vec.push_back(i); + + std::shuffle(vec.begin(), vec.end(), gen); + + for (int i = 0; i < N; i++) { + D.Insert(vec[i], valdis(gen)); + } + + int cnt = 0; double bef = -inf; + + while(!D.empty()) + { + auto [B, v] = D.Pull(); + // std::cerr<