From d74aacefc927a48ff9b574adddbb86648309a027 Mon Sep 17 00:00:00 2001 From: Antonio Date: Fri, 21 Nov 2025 15:24:29 +0100 Subject: [PATCH 1/3] feat(evaltune): Add command-line argument parsing --- src/evaltune_main.cpp | 103 +++++++++++++++++++++++++++++++++++++++--- 1 file changed, 97 insertions(+), 6 deletions(-) diff --git a/src/evaltune_main.cpp b/src/evaltune_main.cpp index 0568a660..80cef941 100644 --- a/src/evaltune_main.cpp +++ b/src/evaltune_main.cpp @@ -18,12 +18,102 @@ #include #include #include +#include #include #include using namespace Clockwork; -int main() { +typedef struct { + double learning_rate; + double beta1; + double beta2; + double weight_decay; +} AdamWParams; + +void print_help(char** argv) { + printf("Usage: %s [options]\n\n", argv[0]); + printf("Options:\n"); + printf(" -h, --help Show this help message and exit.\n"); + printf( + " -t, --threads Number of threads to use (type: uint32_t, default: %u).\n", + std::thread::hardware_concurrency() / 2); + printf( + " -e, --epochs Number of training epochs (type: int32_t, default: 1000).\n"); + printf(" -b, --batch Batch size for training (type: size_t, default: %zu).\n", + static_cast(16 * 16384)); + printf( + " -d, --decay Learning rate decay factor per epoch (type: double, default: 0.91).\n"); + printf("\nAdamW Optimizer Parameters:\n"); + printf(" --lr Learning rate (type: double, default: 10.0).\n"); + printf(" --beta1 Beta1 parameter (type: double, default: 0.9).\n"); + printf(" --beta2 Beta2 parameter (type: double, default: 0.999).\n"); + printf(" --weight_decay Weight decay (type: double, default: 0.0).\n"); +} + +int main(int argc, char** argv) { + + //Default params + + uint32_t thread_count_p = std::thread::hardware_concurrency() / 2; + int32_t epochs_p = 1000; + size_t batch_size_p = 16 * 16384; + double decay_p = 0.91; + + AdamWParams adam = {.learning_rate = 10.0, .beta1 = 0.9, .beta2 = 0.999, .weight_decay = 0.0}; + + //Args parsing + for (int i = 1; i < argc; ++i) { + std::string_view arg = argv[i]; + + if (arg == "--help" || arg == "-h") { + print_help(argv); + return 0; + } + + // Thread Count check + if ((arg == "--threads" || arg == "-t") && i + 1 < argc) { + thread_count_p = static_cast(std::stoul(argv[++i])); + } + // Epochs check + else if ((arg == "--epochs" || arg == "-e") && i + 1 < argc) { + epochs_p = static_cast(std::stoi(argv[++i])); + } + // Batch Size check + else if ((arg == "--batch" || arg == "-b") && i + 1 < argc) { + batch_size_p = static_cast(std::stoull(argv[++i])); + } + // AdamW Params check + else if (arg == "--lr" && i + 1 < argc) { + adam.learning_rate = std::stod(argv[++i]); + } else if (arg == "--beta1" && i + 1 < argc) { + adam.beta1 = std::stod(argv[++i]); + } else if (arg == "--beta2" && i + 1 < argc) { + adam.beta2 = std::stod(argv[++i]); + } else if (arg == "--weight_decay" && i + 1 < argc) { + adam.weight_decay = std::stod(argv[++i]); + } + + //Decay check + else if ((arg == "--decay" || arg == "-d") && i + 1 < argc) { + decay_p = std::stod(argv[++i]); + } else { + // Check if it's a flag without a value or an unknown flag + if (arg.rfind("--", 0) == 0 || arg.rfind("-", 0) == 0) { + if (i + 1 >= argc || (argv[i + 1][0] == '-' && !std::isdigit(argv[i + 1][1]))) { + printf( + "Warning! Argument '%s' has a missing value.\n Run %s --help to list all arguments.", + argv[i], argv[0]); + exit(-1); + } else { + printf( + "Warning! Arg not recognized: '%s'\n Run %s --help to list all arguments.\n", + argv[i], argv[0]); + exit(-1); + } + } + } + } // Load fens from multiple files. std::vector positions; @@ -35,7 +125,7 @@ int main() { }; // Number of threads to use, default to half available - const u32 thread_count = std::max(1, std::thread::hardware_concurrency() / 2); + const u32 thread_count = std::max(1, thread_count_p); std::cout << "Running on " << thread_count << " threads" << std::endl; @@ -95,11 +185,12 @@ int main() { const ParameterCountInfo parameter_count = Globals::get().get_parameter_counts(); Parameters current_parameter_values = Graph::get().get_all_parameter_values(); - AdamW optim(parameter_count, 10, 0.9, 0.999, 1e-8, 0.0); + AdamW optim(parameter_count, adam.learning_rate, adam.beta1, adam.beta2, 1e-8, + adam.weight_decay); - const i32 epochs = 1000; + const i32 epochs = epochs_p; const f64 K = 1.0 / 400; - const size_t batch_size = 16 * 16384; // Set batch size here + const size_t batch_size = batch_size_p; // Set batch size here std::mt19937 rng(std::random_device{}()); // Random number generator for shuffling @@ -342,7 +433,7 @@ int main() { << "s" << std::endl; if (epoch > 5) { - optim.set_lr(optim.get_lr() * 0.91); + optim.set_lr(optim.get_lr() * decay_p); } } From e77ad695abe165d061132a82c65e39337bbd974c Mon Sep 17 00:00:00 2001 From: Antonio Date: Fri, 21 Nov 2025 15:46:46 +0100 Subject: [PATCH 2/3] feat(evaltune): printf converted to std::cout --- src/evaltune_main.cpp | 53 ++++++++++++++++++++----------------------- 1 file changed, 25 insertions(+), 28 deletions(-) diff --git a/src/evaltune_main.cpp b/src/evaltune_main.cpp index 80cef941..c98b9597 100644 --- a/src/evaltune_main.cpp +++ b/src/evaltune_main.cpp @@ -25,30 +25,29 @@ using namespace Clockwork; typedef struct { - double learning_rate; - double beta1; - double beta2; - double weight_decay; + f64 learning_rate; + f64 beta1; + f64 beta2; + f64 weight_decay; } AdamWParams; void print_help(char** argv) { - printf("Usage: %s [options]\n\n", argv[0]); - printf("Options:\n"); - printf(" -h, --help Show this help message and exit.\n"); - printf( - " -t, --threads Number of threads to use (type: uint32_t, default: %u).\n", - std::thread::hardware_concurrency() / 2); - printf( - " -e, --epochs Number of training epochs (type: int32_t, default: 1000).\n"); - printf(" -b, --batch Batch size for training (type: size_t, default: %zu).\n", - static_cast(16 * 16384)); - printf( - " -d, --decay Learning rate decay factor per epoch (type: double, default: 0.91).\n"); - printf("\nAdamW Optimizer Parameters:\n"); - printf(" --lr Learning rate (type: double, default: 10.0).\n"); - printf(" --beta1 Beta1 parameter (type: double, default: 0.9).\n"); - printf(" --beta2 Beta2 parameter (type: double, default: 0.999).\n"); - printf(" --weight_decay Weight decay (type: double, default: 0.0).\n"); + std::cout << "Usage: " << argv[0] << " [options]\n\n"; + std::cout << "Options:\n"; + std::cout << " -h, --help Show this help message and exit.\n"; + std::cout << " -t, --threads Number of threads to use (type: uint32_t, default: " + << std::thread::hardware_concurrency() / 2 << ".\n"; + std::cout + << " -e, --epochs Number of training epochs (type: int32_t, default: 1000).\n"; + std::cout << " -b, --batch Batch size for training (type: size_t, default: " + << static_cast(16 * 16384) << ").\n"; + std::cout + << " -d, --decay Learning rate decay factor per epoch (type: double, default: 0.91).\n"; + std::cout << "\nAdamW Optimizer Parameters:\n"; + std::cout << " --lr Learning rate (type: double, default: 10.0).\n"; + std::cout << " --beta1 Beta1 parameter (type: double, default: 0.9).\n"; + std::cout << " --beta2 Beta2 parameter (type: double, default: 0.999).\n"; + std::cout << " --weight_decay Weight decay (type: double, default: 0.0).\n"; } int main(int argc, char** argv) { @@ -58,7 +57,7 @@ int main(int argc, char** argv) { uint32_t thread_count_p = std::thread::hardware_concurrency() / 2; int32_t epochs_p = 1000; size_t batch_size_p = 16 * 16384; - double decay_p = 0.91; + f64 decay_p = 0.91; AdamWParams adam = {.learning_rate = 10.0, .beta1 = 0.9, .beta2 = 0.999, .weight_decay = 0.0}; @@ -101,14 +100,12 @@ int main(int argc, char** argv) { // Check if it's a flag without a value or an unknown flag if (arg.rfind("--", 0) == 0 || arg.rfind("-", 0) == 0) { if (i + 1 >= argc || (argv[i + 1][0] == '-' && !std::isdigit(argv[i + 1][1]))) { - printf( - "Warning! Argument '%s' has a missing value.\n Run %s --help to list all arguments.", - argv[i], argv[0]); + std::cout << "Warning! Argument '" << argv[i] << "' has a missing value.\n Run " + << argv[0] << " --help to list all arguments."; exit(-1); } else { - printf( - "Warning! Arg not recognized: '%s'\n Run %s --help to list all arguments.\n", - argv[i], argv[0]); + std::cout << "Warning! Arg not recognized: '" << argv[i] << "'\n Run " + << argv[0] << " --help to list all arguments.\n"; exit(-1); } } From e86b184df8eba0f2b9a0b0e1284c6ccb6ac4bdfb Mon Sep 17 00:00:00 2001 From: Antonio Date: Fri, 21 Nov 2025 16:04:03 +0100 Subject: [PATCH 3/3] feat(evaltune): typedef struct converted to struct --- src/evaltune_main.cpp | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/src/evaltune_main.cpp b/src/evaltune_main.cpp index c98b9597..0e99dfbe 100644 --- a/src/evaltune_main.cpp +++ b/src/evaltune_main.cpp @@ -24,12 +24,12 @@ using namespace Clockwork; -typedef struct { - f64 learning_rate; - f64 beta1; - f64 beta2; - f64 weight_decay; -} AdamWParams; +struct AdamWParams { + f64 learning_rate{10.0}; + f64 beta1{0.9}; + f64 beta2{0.999}; + f64 weight_decay{0.0}; +}; void print_help(char** argv) { std::cout << "Usage: " << argv[0] << " [options]\n\n"; @@ -59,7 +59,7 @@ int main(int argc, char** argv) { size_t batch_size_p = 16 * 16384; f64 decay_p = 0.91; - AdamWParams adam = {.learning_rate = 10.0, .beta1 = 0.9, .beta2 = 0.999, .weight_decay = 0.0}; + AdamWParams adam_p; //Args parsing for (int i = 1; i < argc; ++i) { @@ -84,13 +84,13 @@ int main(int argc, char** argv) { } // AdamW Params check else if (arg == "--lr" && i + 1 < argc) { - adam.learning_rate = std::stod(argv[++i]); + adam_p.learning_rate = std::stod(argv[++i]); } else if (arg == "--beta1" && i + 1 < argc) { - adam.beta1 = std::stod(argv[++i]); + adam_p.beta1 = std::stod(argv[++i]); } else if (arg == "--beta2" && i + 1 < argc) { - adam.beta2 = std::stod(argv[++i]); + adam_p.beta2 = std::stod(argv[++i]); } else if (arg == "--weight_decay" && i + 1 < argc) { - adam.weight_decay = std::stod(argv[++i]); + adam_p.weight_decay = std::stod(argv[++i]); } //Decay check @@ -182,8 +182,8 @@ int main(int argc, char** argv) { const ParameterCountInfo parameter_count = Globals::get().get_parameter_counts(); Parameters current_parameter_values = Graph::get().get_all_parameter_values(); - AdamW optim(parameter_count, adam.learning_rate, adam.beta1, adam.beta2, 1e-8, - adam.weight_decay); + AdamW optim(parameter_count, adam_p.learning_rate, adam_p.beta1, adam_p.beta2, 1e-8, + adam_p.weight_decay); const i32 epochs = epochs_p; const f64 K = 1.0 / 400;