diff --git a/sm/lib/egsl/egsl.c b/sm/lib/egsl/egsl.c index bfecfdc55fddf8fa73bd30b708b6443290856ccc..5a57f13a67988519bd25057c7e6bf718bbe0b477 100644 --- a/sm/lib/egsl/egsl.c +++ b/sm/lib/egsl/egsl.c @@ -190,12 +190,33 @@ val egsl_alloc(size_t rows, size_t columns) { } val egsl_alloc_in_context(int context, size_t rows, size_t columns) { - egsl_total_allocations++; - struct egsl_context *c = egsl_contexts+context; + struct egsl_context*c = egsl_contexts+context; + + if(c->nvars>=MAX_VALS) { + fprintf(stderr,"Limit reached, in context %d, nvars is %d\n",context,c->nvars); + egsl_error(); + } int index = c->nvars; - c->vars[index].gsl_m = gsl_matrix_alloc((size_t)rows,(size_t)columns); - c->nvars++; - return assemble_val(context,index,c->vars[index].gsl_m); + if(index<c->nallocated) { + gsl_matrix*m = c->vars[index].gsl_m; + if(m->size1 == rows && m->size2 == columns) { + egsl_cache_hits++; + c->nvars++; + return assemble_val(context,index,c->vars[index].gsl_m); + } else { + gsl_matrix_free(m); + egsl_total_allocations++; + c->vars[index].gsl_m = gsl_matrix_alloc((size_t)rows,(size_t)columns); + c->nvars++; + return assemble_val(context,index,c->vars[index].gsl_m); + } + } else { + egsl_total_allocations++; + c->vars[index].gsl_m = gsl_matrix_alloc((size_t)rows,(size_t)columns); + c->nvars++; + c->nallocated++; + return assemble_val(context,index,c->vars[index].gsl_m); + } } /** Creates a copy of v in the previous context. */