int jmi_init_opt_dh(jmi_init_opt_t *jmi_init_opt, jmi_real_t *jac) { jmi_t* jmi; int retval; if (jmi_init_opt->jmi->init == NULL || jmi_init_opt->jmi->dae == NULL) { return -1; } jmi = jmi_init_opt->jmi; /* Copy values into jmi->z */ /* Copy free paramters */ copy_p(jmi_init_opt); /* Copy variables */ copy_v(jmi_init_opt); /* Evaluate jacobian */ retval = jmi_init_dF0 (jmi, jmi_init_opt->der_eval_alg, JMI_DER_SPARSE, JMI_DER_PI | JMI_DER_PD | JMI_DER_DX | JMI_DER_X | JMI_DER_W, jmi_init_opt->der_mask_v, jac); if (jmi_init_opt->stat==1 && jmi_init_opt->jmi->opt->Ffdp->n_eq_F>0) { jmi_opt_dFfdp (jmi, jmi_init_opt->der_eval_alg, JMI_DER_SPARSE, JMI_DER_PI | JMI_DER_PD | JMI_DER_DX | JMI_DER_X | JMI_DER_W, jmi_init_opt->der_mask_v, jac + jmi_init_opt->dF0_n_nz); } return retval; }
int jmi_init_opt_h(jmi_init_opt_t *jmi_init_opt, jmi_real_t *res) { int retval; if (jmi_init_opt->jmi->init == NULL || jmi_init_opt->jmi->dae == NULL) { return -1; } /*int i; */ /* Copy values into jmi->z */ /* Copy free paramters */ copy_p(jmi_init_opt); /* Copy variables */ copy_v(jmi_init_opt); /* for (i=0;i<jmi_init_opt->n_x;i++) { printf("%f\n",jmi_init_opt->x[i]); } */ retval = jmi_init_F0(jmi_init_opt->jmi, res); if (jmi_init_opt->stat==1 && jmi_init_opt->jmi->opt->Ffdp->n_eq_F>0) { retval = jmi_opt_Ffdp(jmi_init_opt->jmi, res+jmi_init_opt->jmi->init->F0->n_eq_F); } /* printf("F0\n"); for (i=0;i<jmi_init_opt->jmi->init->F1->n_eq_F;i++) { printf("%f\n",res[i]); } */ return retval; }
int jmi_init_opt_f(jmi_init_opt_t *jmi_init_opt, jmi_real_t *f) { int i; int retval; if (jmi_init_opt->jmi->init == NULL) { return -1; } /* Copy values into jmi->z */ /* Copy free paramters */ copy_p(jmi_init_opt); /* Copy variables */ copy_v(jmi_init_opt); *f = 0.0; if (jmi_init_opt->stat==1) { retval = jmi_opt_J(jmi_init_opt->jmi, f); } else { retval = jmi_init_F1(jmi_init_opt->jmi, jmi_init_opt->res_F1); if (retval<0) { return retval; } for (i=0;i<jmi_init_opt->jmi->init->F1->n_eq_F;i++) { /* Call cost function evaluation */ *f += 0.5*jmi_init_opt->res_F1[i]*jmi_init_opt->res_F1[i]; } } return retval; }
int jmi_init_opt_df(jmi_init_opt_t *jmi_init_opt, jmi_real_t *df) { int i; int retval; jmi_t* jmi; if (jmi_init_opt->jmi->init == NULL) { return -1; } jmi = jmi_init_opt->jmi; /* Copy values into jmi->z */ /* Copy free paramters */ copy_p(jmi_init_opt); /* Copy variables */ copy_v(jmi_init_opt); for (i=0;i<jmi_init_opt->n_x;i++) { df[i] = 0; /*printf("%f\n",jmi_init_opt->x[i]); */ } if (jmi_init_opt->stat==1) { retval = jmi_opt_dJ(jmi_init_opt->jmi, jmi_init_opt->der_eval_alg, JMI_DER_DENSE_COL_MAJOR, JMI_DER_PI | JMI_DER_PD | JMI_DER_DX | JMI_DER_X | JMI_DER_W, jmi_init_opt->der_mask_v,df); } else { /* Evaluate jacobian */ retval = jmi_init_dF1(jmi, jmi_init_opt->der_eval_alg, JMI_DER_SPARSE, JMI_DER_PI | JMI_DER_PD | JMI_DER_DX | JMI_DER_X | JMI_DER_W, jmi_init_opt->der_mask_v, jmi_init_opt->dF1_dv); if (retval<0) { return retval; } /* printf("dF1\n"); for (i=0;i<jmi_init_opt->dF1_dv_n_nz;i++) { printf("%f\n",jmi_init_opt->dF1_dv[i]); } */ /* Evaluate residual */ retval = jmi_init_F1(jmi, jmi_init_opt->res_F1); if (retval<0) { return retval; } /* Initialize the gradient vector */ for (i=0;i<jmi_init_opt->n_x;i++) { df[i] = 0.; } /* Compute gradient */ for (i=0;i<jmi_init_opt->dF1_dv_n_nz;i++) { df[jmi_init_opt->dF1_dv_icol[i]-1] += jmi_init_opt->dF1_dv[i]* jmi_init_opt->res_F1[jmi_init_opt->dF1_dv_irow[i]-1]; /* printf("** %d %d %d %f %f \n",i,jmi_init_opt->dF1_dv_irow[i],jmi_init_opt->dF1_dv_icol[i],jmi_init_opt->dF1_dv[i],jmi_init_opt->res_F1[jmi_init_opt->dF1_dv_irow[i]-1]); */ } /* for(i=0;i<jmi_init_opt->n_x;i++) { printf("%f\n",df[i]); } */ } return retval; }
void mexFunction(int nlhs, mxArray * plhs[], int nrhs, const mxArray * prhs[]) { int buflen, status; char *input_buf; if (nrhs<1){ mexErrMsgTxt("Input 1 must be a row vector string"); } /* 1. input must be a string and row vector */ if (mxIsChar(prhs[0]) && (mxGetM(prhs[0]) == 1)) { /* get the length of the input string */ buflen = mxGetN(prhs[0]) + 1; /* allocate memory for input and output strings */ input_buf=mxCalloc(buflen, sizeof(char)); /* copy the string data from prhs[0] into a C string input_ buf. */ status = mxGetString(prhs[0], input_buf, buflen); if (strcmp(input_buf,"hull\0") == 0) { hull(nlhs, plhs, nrhs -1, prhs + 1); return; } if (strcmp(input_buf,"extreme\0") == 0) { extreme(nlhs, plhs, nrhs -1, prhs + 1); return; } if (strcmp(input_buf,"reduce_h\0") == 0) { reduce_h(nlhs, plhs, nrhs -1, prhs + 1); return; } if (strcmp(input_buf,"reduce_v\0") == 0) { reduce_v(nlhs, plhs, nrhs -1, prhs + 1); return; } if (strcmp(input_buf,"copy_v\0") == 0) { copy_v(nlhs, plhs, nrhs -1, prhs + 1); return; } if (strcmp(input_buf,"copy_h\0") == 0) { copy_h(nlhs, plhs, nrhs -1, prhs + 1); return; } if (strcmp(input_buf,"v_hull_extreme\0") == 0) { v_hull_extreme(nlhs, plhs, nrhs -1, prhs + 1); return; } if (strcmp(input_buf,"adj_extreme\0") == 0) { adj_extreme(nlhs, plhs, nrhs -1, prhs + 1); return; } if (strcmp(input_buf,"solve_lp\0") == 0) { solve_lp(nlhs, plhs, nrhs -1, prhs + 1); return; } if (strcmp(input_buf,"solve_lp_DS\0") == 0) { solve_lp_DS(nlhs, plhs, nrhs -1, prhs + 1); return; } if (strcmp(input_buf,"find_interior\0") == 0) { find_interior(nlhs, plhs, nrhs -1, prhs + 1); return; } if (strcmp(input_buf,"find_interior_DS\0") == 0) { find_interior_DS(nlhs, plhs, nrhs -1, prhs + 1); return; } if (strcmp(input_buf,"version\0") == 0) { printf("Version %s\n", CDDMEX_VERSION); return; } mexErrMsgTxt("Unknown function"); } else { mexErrMsgTxt("Input 1 must be a row vector string"); } }
static void copy_v(void* dst, const S* src, int n, Rest&&... rest) { SkASSERTF(((uintptr_t)dst & (alignof(S)-1)) == 0, "Expected %p to be aligned for at least %zu bytes.", dst, alignof(S)); sk_careful_memcpy(dst, src, n*sizeof(S)); copy_v(SkTAddOffset<void>(dst, n*sizeof(S)), std::forward<Rest>(rest)...); }