int runOptimizer(DATA* data, SOLVER_INFO* solverInfo) { OptData *optData, optData_; solverInfo->solverData = &optData_; pickUpModelData(data, solverInfo); optData = (OptData*) solverInfo->solverData; initial_guess_optimizer(optData, solverInfo); allocate_der_struct(&optData->s, &optData->dim ,data, optData); optimizationWithIpopt(optData); res2file(optData, solverInfo, optData->ipop.vopt); freeOptimizerData(optData); return 0; }
/*! * start main optimization step * author: Vitalij Ruge **/ int startIpopt(DATA* data, SOLVER_INFO* solverInfo, int flag) { int i; int j,k,l; double obj; int res; char *cflags; IpoptProblem nlp = NULL; IPOPT_DATA_ *iData = ((IPOPT_DATA_*)solverInfo->solverData); iData->current_var = 0; iData->current_time = 0; iData->data = data; iData->mayer = mayer(data, &obj); iData->lagrange = lagrange(data, &obj); iData->numObject = 2 - iData->mayer -iData->lagrange; iData->matrixA = initialAnalyticJacobianA((void*) iData->data); iData->matrixB = initialAnalyticJacobianB((void*) iData->data); /* iData->matrixC = initialAnalyticJacobianC((void*) iData->data); iData->matrixD = initialAnalyticJacobianD((void*) iData->data); */ loadDAEmodel(data, iData); iData->index_debug_iter=0; iData->degub_step = 10; iData->index_debug_next=0; cflags = omc_flagValue[FLAG_LS_IPOPT]; if(!cflags) cflags = "mumps"; /*ToDo*/ for(i=0; i<(*iData).nx; i++) { iData->Vmin[i] = (*iData).Vmax[i] = (*iData).x0[i]*iData->scalVar[i]; iData->v[i] = iData->Vmin[i]; if(ACTIVE_STREAM(LOG_IPOPT)) { printf("\nx[%i] = %s = %g",i, iData->data->modelData.realVarsData[i].info.name,iData->v[i]); } } initial_guess_ipopt(iData,solverInfo); if(ACTIVE_STREAM(LOG_IPOPT)) { for(; i<iData->nv; ++i) printf("\nu[%i] = %s = %g",i, iData->data->modelData.realVarsData[iData->index_u + i-iData->nx].info.name,iData->v[i]); } ipoptDebuge(iData,iData->v); if(flag == 5) { nlp = CreateIpoptProblem((*iData).NV, (*iData).Vmin, (*iData).Vmax, (*iData).NRes, (*iData).gmin, (*iData).gmax, (*iData).njac, NULL, 0, &evalfF, &evalfG, &evalfDiffF, &evalfDiffG, &ipopt_h); AddIpoptNumOption(nlp, "tol", iData->data->simulationInfo.tolerance); if(ACTIVE_STREAM(LOG_IPOPT)) { AddIpoptIntOption(nlp, "print_level", 5); AddIpoptIntOption(nlp, "file_print_level", 0); } else if(ACTIVE_STREAM(LOG_STATS)) { AddIpoptIntOption(nlp, "print_level", 3); AddIpoptIntOption(nlp, "file_print_level", 0); } else { AddIpoptIntOption(nlp, "print_level", 2); AddIpoptIntOption(nlp, "file_print_level", 0); } AddIpoptStrOption(nlp, "mu_strategy", "adaptive"); AddIpoptStrOption(nlp, "hessian_approximation", "limited-memory"); if(cflags) AddIpoptStrOption(nlp, "linear_solver", cflags); else AddIpoptStrOption(nlp, "linear_solver", "mumps"); /* AddIpoptStrOption(nlp, "derivative_test", "second-order"); */ /* AddIpoptStrOption(nlp, "derivative_test_print_all", "yes"); */ /* AddIpoptNumOption(nlp,"derivative_test_perturbation",1e-6); */ AddIpoptIntOption(nlp, "max_iter", 5000); res = IpoptSolve(nlp, (*iData).v, NULL, &obj, (*iData).mult_g, (*iData).mult_x_L, (*iData).mult_x_U, (void*)iData); FreeIpoptProblem(nlp); if(ACTIVE_STREAM(LOG_IPOPT)) { for(i =0; i<iData->nv;i++) if(iData->pFile[i]) fclose(iData->pFile[i]); if(iData->pFile) free(iData->pFile); } iData->current_var = 0; res2file(iData,solverInfo); } return 0; }