/* SPDX-License-Identifier: AGPL-3.0-or-later */ /* Copyright (C) 2026 David (Corey) Herrera */ /* * ternarize-sweep: Stream forward+backward through all layers. * Saves activation snapshots + gradient stats per layer. * * Usage: * ternarize-sweep --workdir ./work --calib calib.bin [--batch-size 128] */ #include "../ternarize/ternarize.h" #include #include #include static void usage(const char *prog) { fprintf(stderr, "Usage: %s --workdir --calib [options]\n", prog); fprintf(stderr, "\nOptions:\n"); fprintf(stderr, " --workdir Work directory (from ternarize-split)\n"); fprintf(stderr, " --calib Calibration data binary file\n"); fprintf(stderr, " --config Path to config.json (re-parse architecture)\n"); fprintf(stderr, " --batch-size Batch size for forward/backward (default: 128)\n"); } int main(int argc, char **argv) { ft_config cfg = ft_config_defaults(); const char *workdir = NULL; const char *calib_path = NULL; const char *config_path = NULL; for (int i = 1; i < argc; i++) { if (strcmp(argv[i], "--workdir") == 0 && i + 1 < argc) { workdir = argv[++i]; } else if (strcmp(argv[i], "--calib") == 0 && i + 1 < argc) { calib_path = argv[++i]; } else if (strcmp(argv[i], "--config") == 0 && i + 1 < argc) { config_path = argv[++i]; } else if (strcmp(argv[i], "--batch-size") == 0 && i + 1 < argc) { cfg.batch_size = atoi(argv[++i]); } else if (strcmp(argv[i], "--help") == 0 || strcmp(argv[i], "-h") == 0) { usage(argv[0]); return 0; } else { fprintf(stderr, "Unknown option: %s\n", argv[i]); usage(argv[0]); return 1; } } if (!workdir || !calib_path) { usage(argv[0]); return 1; } /* Load config from workdir status or re-parse */ if (config_path) { if (!ft_config_from_json(&cfg, config_path)) { fprintf(stderr, "ERROR: failed to parse %s\n", config_path); return 1; } } snprintf(cfg.workdir, sizeof(cfg.workdir), "%s", workdir); snprintf(cfg.calib_path, sizeof(cfg.calib_path), "%s", calib_path); /* Read status to get n_layers if not parsed from config */ if (cfg.n_layers == 0) { ft_status st = ft_status_read(&cfg); cfg.n_layers = st.n_layers; } fprintf(stderr, "ternarize-sweep\n"); fprintf(stderr, " Workdir: %s\n", workdir); fprintf(stderr, " Calib: %s\n", calib_path); fprintf(stderr, " Batch size: %d\n", cfg.batch_size); fprintf(stderr, " Layers: %d\n", cfg.n_layers); if (!ft_sweep(&cfg)) { fprintf(stderr, "ERROR: sweep failed\n"); return 1; } return 0; }