From 09c8f740da0b833c08c78fa30f80e3dc04e218c4 Mon Sep 17 00:00:00 2001 From: Your Name Date: Mon, 27 Jul 2026 20:34:44 -0700 Subject: Trained software weights with ridge regression --- references/spires_tutorial.c | 80 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 references/spires_tutorial.c (limited to 'references/spires_tutorial.c') diff --git a/references/spires_tutorial.c b/references/spires_tutorial.c new file mode 100644 index 0000000..f4eba10 --- /dev/null +++ b/references/spires_tutorial.c @@ -0,0 +1,80 @@ +#include <../src/neurons/lif_discrete.h> +#include +#include +#include +#include + +#define N_TRAIN 500 +#define N_TEST 100 +#define PI 3.14159265358979323846 + +int main(void) { + /* 1. Configure the reservoir */ + double lif_cfg[] = {0.0, 1.0, 0.2, 0.5}; + + spires_reservoir_config cfg = { + .num_neurons = 400, + .num_inputs = 1, + .num_outputs = 1, + .spectral_radius = 0.95, + .ei_ratio = 0.8, + .input_strength = 0.1, + .connectivity = 0.1, + .dt = 1.0, + .connectivity_type = SPIRES_CONN_RANDOM, + .neuron_type = SPIRES_NEURON_LIF_DISCRETE, + .neuron_params = lif_cfg, + }; + + /* 2. Create the reservoir */ + spires_reservoir *r = NULL; + spires_status s = spires_reservoir_create(&cfg, &r); + if (s != SPIRES_OK) { + fprintf(stderr, "Failed to create reservoir: %d\n", s); + return 1; + } + + /* 3. Generate training data — predict sin(t+1) from sin(t) */ + double input_train[N_TRAIN]; + double target_train[N_TRAIN]; + for (int i = 0; i < N_TRAIN; i++) { + input_train[i] = sin(2.0 * PI * i / 50.0); + target_train[i] = sin(2.0 * PI * (i + 1) / 50.0); + } + + /* 4. Train with ridge regression */ + s = spires_train_ridge(r, input_train, target_train, N_TRAIN, 1e-6); + + if (s != SPIRES_OK) { + fprintf(stderr, "Training failed: %d\n", s); + spires_reservoir_destroy(r); + return 1; + } + + /* 5. Generate test input */ + double input_test[N_TEST]; + for (int i = 0; i < N_TEST; i++) { + input_test[i] = sin(2.0 * PI * (N_TRAIN + i) / 50.0); + } + + /* 6. Run inference */ + double *predictions = spires_run(r, input_test, N_TEST); + if (!predictions) { + fprintf(stderr, "Inference failed\n"); + spires_reservoir_destroy(r); + return 1; + } + + /* 7. Print a few predictions vs. expected values */ + printf("Step | Predicted | Expected\n"); + printf("-----+-----------+---------\n"); + for (int i = 0; i < 10; i++) { + double expected = sin(2.0 * PI * (N_TRAIN + i + 1) / 50.0); + printf("%4d | %+.5f | %+.5f\n", i, predictions[i], expected); + } + + /* 8. Clean up */ + free(predictions); + spires_reservoir_destroy(r); + return 0; +} -- cgit v1.2.3