real obj1val_ASL(ASL *a, int i, real *X, fint *nerror) { ASL_fg *asl; Jmp_buf err_jmp0; cde *d; expr *e1; expr_v *V; int ij; ograd *gr; real f; NNOBJ_chk(a, i, "obj1val"); asl = (ASL_fg*)a; if (nerror && *nerror >= 0) { err_jmp = &err_jmp0; ij = __builtin_setjmp(err_jmp0.jb); if (ij) { *nerror = err_jmp0.err; f = 0.; goto done; } } want_deriv = want_derivs; errno = 0; /* in case f77 set errno opening files */ if (!asl->i.x_known) x0_check_ASL(asl,X); if (!asl->i.noxval) asl->i.noxval = (int*)M1zapalloc(n_obj*sizeof(int)); co_index = -(i + 1); if (!(x0kind & ASL_have_objcom)) { if (ncom0 > combc) comeval_ASL(asl, combc, ncom0); if (comc1 < ncom1) com1eval_ASL(asl, comc1, ncom1); x0kind |= ASL_have_objcom; } d = obj_de + i; gr = Ograd[i]; e1 = d->e; f = (*e1->op)(e1 C_ASL); asl->i.noxval[i] = asl->i.nxval; if (asl->i.vmap || asl->i.vscale) for(V = var_e; gr; gr = gr->next) f += gr->coef * V[gr->varno].v; else for(; gr; gr = gr->next) f += gr->coef * X[gr->varno]; done: err_jmp = 0; return f; }
int x0_check_ASL(ASL_fg *asl, real *X) { expr_v *V; int *vm; real *vscale, *Xe; if (x0kind == ASL_first_x || memcmp(Lastx, X, x0len)) { if (asl->i.Derrs) deriv_errclear_ASL(&asl->i); want_deriv = want_derivs; memcpy(Lastx, X, x0len); asl->i.nxval++; V = var_e; Xe = X + n_var; vscale = asl->i.vscale; if ((vm = asl->i.vmap)) { if (vscale) while(X < Xe) V[*vm++].v = *vscale++ * *X++; else while(X < Xe) V[*vm++].v = *X++; } else { if (vscale) while(X < Xe) (V++)->v = *vscale++ * *X++; else while(X < Xe) (V++)->v = *X++; } x0kind = 0; if (comb) comeval_ASL(asl, 0, comb); return 1; } return 0; }
static real cival(ASL_fg *asl, int i, real *X, fint *nerror) { Jmp_buf err_jmp0; expr *e; int ij, nc; real f; if (nerror && *nerror >= 0) { err_jmp = &err_jmp0; ij = setjmp(err_jmp0.jb); if ((*nerror = ij)) return 0.; } want_deriv = want_derivs; errno = 0; /* in case f77 set errno opening files */ if (!asl->i.x_known) x0_check_ASL(asl,X); if (!asl->i.ncxval) asl->i.ncxval = (int*)M1zapalloc(nclcon*sizeof(int)); if (!(x0kind & ASL_have_concom)) { if (comb < combc) comeval_ASL(asl, comb, combc); if (comc1) com1eval_ASL(asl, 0,comc1); x0kind |= ASL_have_concom; } asl->i.ncxval[i] = asl->i.nxval; co_index = i; if (i >= (nc = asl->i.n_con0)) e = lcon_de[i-nc].e; else e = con_de[i].e; f = (*e->op)(e C_ASL); err_jmp = 0; return f; }