/*--------------------------------------------------------------------------*/ fint hov_forward_(fint* ftag, fint* fm, fint* fn, fint* fd, fint* fp, fdouble* fbase, fdouble* fx, fdouble* fvalue, fdouble* fy) { int rc= -1; int tag=*ftag, m=*fm, n=*fn, d=*fd, p=*fp; double* base = myalloc1(n); double* value = myalloc1(m); double*** X = myalloc3(n,p,d); double*** Y = myalloc3(m,p,d); spread1(n,fbase,base); spread3(n,p,d,fx,X); rc= hov_forward(tag,m,n,d,p,base,X,value,Y); pack3(m,p,d,Y,fy); pack1(m,value,fvalue); free((char*)**X); free((char*)*X); free((char*)X); free((char*)**Y); free((char*)*Y); free((char*)Y); free((char*)base); free((char*)value); return rc; }
int tensor_eval( int tag, int m, int n, int d, int p, double* x, double **tensor, double **S ) { static int bd,dim; static int dold,pold; static struct item *coeff_list; int i,j,k,dimten,ctr; int **jm, jmbd=0; int *it = (int*) malloc(d*sizeof(int)); double *y = (double*) malloc(m*sizeof(double)); double*** X; double*** Y; struct item *ptr[10]; int rc = 3; dimten=binomi(p+d,d); for (i=0; i<m; i++) for (j=0; j<dimten; j++) tensor[i][j] = 0; if (d == 0) { MINDEC(rc,zos_forward(1,m,n,0,x,y)); } else { if ((d != dold) || (p != pold)) { if (pold) { dim = binomi(pold+dold-1,dold); freecoefflist(dim,coeff_list); free((char*) coeff_list); } dim = binomi(p+d-1,d); if (dim < 10) bd = dim; else bd = 10; coeff_list = (struct item *) malloc(sizeof(struct item)*dim); coeff(p,d, coeff_list); dold = d; pold = p; } jmbd = bd; jm = (int **) malloc(jmbd*sizeof(int*)); for (i=0; i<jmbd; i++) jm[i] = (int *) malloc(p*sizeof(int)); if (d == 1) { X = myalloc3(1,n,bd); Y = myalloc3(1,m,bd); ctr = 0; it[0] = 0; for (i=0; i<dim; i++) /* sum over all multiindices jm with |jm| = d */ { it[0] = it[0]+1; convert(p,d,it,jm[ctr]); ptr[ctr] = &coeff_list[i]; if (ctr < bd-1) ctr += 1; else { multma2vec2(n,p,bd,X[0],S,jm); MINDEC(rc,fov_forward(tag,m,n,bd,x,X[0],y,Y[0])); for (k=0; k<bd; k++) do { for (j=0; j<m; j++) tensor[j][ptr[k]->a] += Y[0][j][k]*ptr[k]->c; ptr[k] = ptr[k]->next; } while (ptr[k] != NULL); if (dim-i < bd) bd = dim-i-1; ctr = 0; } } } else { X = myalloc3(n,bd,d); Y = myalloc3(m,bd,d); ctr = 0; for (i=0; i<d-1; i++) it[i] = 1; it[d-1] = 0; for (i=0; i<dim; i++) /* sum over all multiindices jm with |jm| = d */ { it[d-1] = it[d-1]+1; for (j=d-2; j>=0; j--) it[j] = it[j] + it[j+1]/(p+1); for (j=1; j<d; j++) if (it[j] > p) it[j] = it[j-1]; convert(p,d,it,jm[ctr]); ptr[ctr] = &coeff_list[i]; if (ctr < bd-1) ctr += 1; else { multma3vec2(n,p,d,bd,X,S,jm); MINDEC(rc,hov_forward(tag,m,n,d,bd,x,X,y,Y)); for (k=0; k<bd; k++) do { for (j=0; j<m; j++) tensor[j][ptr[k]->a] += Y[j][k][ptr[k]->b-1]*ptr[k]->c; ptr[k] = ptr[k]->next; } while (ptr[k] != NULL); if (dim-i < bd) bd = dim-i-1; ctr = 0; } } } for (i=0; i<jmbd; i++) free((char*) *(jm+i)); free((char*) jm); free((char*) **X); free((char*) *X); free((char*) X); free((char*) **Y); free((char*) *Y); free((char*) Y); } for(i=0;i<m;i++) tensor[i][0] = y[i]; bd = jmbd; free((char*) y); free((char*) it); return rc; }