From a4edd40c35e2784691936662a8a89463cc434f9a Mon Sep 17 00:00:00 2001 From: Your Name Date: Tue, 21 Jul 2026 10:20:48 -0700 Subject: Spires feeding into SPICE crossbar --- src/spires_interface.c | 80 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 src/spires_interface.c (limited to 'src/spires_interface.c') diff --git a/src/spires_interface.c b/src/spires_interface.c new file mode 100644 index 0000000..c920c33 --- /dev/null +++ b/src/spires_interface.c @@ -0,0 +1,80 @@ +#include "spires_interface.h" +#include + +#include +#include +#include + +int collect_reservoir_states( + const spires_reservoir *reservoir, + const double *input_series, + size_t series_length, + Reservoir_State_Matrix *result +) { + //error checking + //RIP + + //clear the result first + // + result->num_samples = 0; + result->num_features = 0; + result->states = NULL; + + const size_t num_inputs = spires_num_inputs(reservoir); + + const size_t num_neurons = spires_num_neurons(reservoir); + + if (series_length > SIZE_MAX / num_neurons || series_length * num_neurons + > SIZE_MAX / sizeof(double)) { + fprintf(stderr, "matrix size overloaded!!"); + return -1; + } + + double *states = malloc(num_neurons * series_length * sizeof(*states)); + if (!states) { + fprintf(stderr, "failed to allocate memory for states"); + return -1; + } + + spires_status status = spires_reservoir_reset(reservoir); + if (status != SPIRES_OK) { + fprintf(stderr, "reservoir reset error"); + free(states); + return -1; + } + + // build state_matrix + for (size_t i = 0; i < series_length; i++) { + const double *current_input = &input_series[i * num_inputs]; + status = spires_step(reservoir, current_input); + if (status != SPIRES_OK){ + free(states); + return -1; + } + + double *current_state = &states[i * num_neurons]; + status = spires_read_reservoir_state(reservoir, current_state); + if (status != SPIRES_OK){ + free(states); + return -1; + } + } + + result->num_samples = series_length; + result->num_features = num_neurons; + result->states = states; + + return 0; +} + +void free_reservoir_state_matrix(Reservoir_State_Matrix *matrix) { + if (!matrix) { + return; + } + + free(matrix->states); + + matrix->states = NULL; + matrix->num_samples = 0; + matrix->num_features = 0; +} -- cgit v1.2.3