int variationalInequality_driver(VariationalInequality* problem, double *x, double *w, SolverOptions* options) { if (options == NULL) numerics_error("variationalInequality_driver", "null input for solver and/or global options"); assert(options->isSet); if (verbose > 0) solver_options_print(options); /* Solver name */ /*char * name = options->solverName;*/ int info = -1 ; /* Check for trivial case */ info = checkTrivialCase_vi(problem, x, w, options); if (info == 0){ double error; variationalInequality_computeError(problem, x , w, options->dparam[0], options, &error); printf("variationalInequality_driver. error = %8.4e\n", error); return info; } switch (options->solverId) { /* Non Smooth Gauss Seidel (NSGS) */ /* Extra Gradient algorithm */ case SICONOS_VI_EG: { numerics_printf_verbose(1, " ========================== Call ExtraGradient (EG) solver for VI problem ==========================\n"); variationalInequality_ExtraGradient(problem, x , w , &info , options); break; } case SICONOS_VI_FPP: { numerics_printf_verbose(1, " ========================== Call Fixed Point Projection (FPP) solver for VI problem ==========================\n"); variationalInequality_FixedPointProjection(problem, x , w , &info , options); break; } case SICONOS_VI_HP: { numerics_printf_verbose(1, " ========================== Call Hyperplane Projection (HP) solver for VI problem ==========================\n"); variationalInequality_HyperplaneProjection(problem, x , w , &info , options); break; } case SICONOS_VI_BOX_QI: { variationalInequality_box_newton_QiLSA(problem, x, w, &info, options); break; } case SICONOS_VI_BOX_AVI_LSA: { vi_box_AVI_LSA(problem, x, w, &info, options); break; } case SICONOS_VI_BOX_PATH: { vi_box_path(problem, x, w, &info, options); break; } default: { fprintf(stderr, "Numerics, variationalInequality_driver failed. Unknown solver.\n"); exit(EXIT_FAILURE); } } return info; }
void convexQP_VI_solver(ConvexQP* problem, double *z, double *w, int* info, SolverOptions* options) { NumericsMatrix* A = problem->A; if (A) { numerics_error("ConvexQP_VI_Solver", "This solver does not support a specific matrix A different from the identity"); } /* Dimension of the problem */ int n = problem->size; VariationalInequality *vi = (VariationalInequality *)malloc(sizeof(VariationalInequality)); //vi.self = &vi; vi->F = &Function_VI_CQP; vi->ProjectionOnX = &Projection_VI_CQP; int iter=0; double error=1e24; ConvexQP_as_VI *convexQP_as_vi= (ConvexQP_as_VI*)malloc(sizeof(ConvexQP_as_VI)); vi->env =convexQP_as_vi ; vi->size = n; /*set the norm of the VI to the norm of problem->q */ double norm_q = cblas_dnrm2(n, problem->q , 1); vi->normVI= norm_q; vi->istheNormVIset=1; convexQP_as_vi->vi = vi; convexQP_as_vi->cqp = problem; SolverOptions * visolver_options = (SolverOptions *) malloc(sizeof(SolverOptions)); if (options->solverId==SICONOS_CONVEXQP_VI_FPP) { variationalInequality_setDefaultSolverOptions(visolver_options, SICONOS_VI_FPP); } else if (options->solverId==SICONOS_CONVEXQP_VI_EG) { variationalInequality_setDefaultSolverOptions(visolver_options, SICONOS_VI_EG); } int isize = options->iSize; int dsize = options->dSize; int vi_isize = visolver_options->iSize; int vi_dsize = visolver_options->dSize; if (isize != vi_isize ) { printf("Warning: options->iSize in convexQP_VI_solver is not consitent with options->iSize in VI solver\n"); } if (dsize != vi_dsize ) { printf("Warning: options->iSize in convexQP_VI_solver is not consitent with options->iSize in VI solver\n"); } int i; for (i = 0; i < min(isize,vi_isize); i++) { if (options->iparam[i] != 0 ) visolver_options->iparam[i] = options->iparam[i] ; } for (i = 0; i < min(dsize,vi_dsize); i++) { if (fabs(options->dparam[i]) >= 1e-24 ) visolver_options->dparam[i] = options->dparam[i] ; } if (options->solverId==SICONOS_CONVEXQP_VI_FPP) { variationalInequality_FixedPointProjection(vi, z, w , info , visolver_options); } else if (options->solverId==SICONOS_CONVEXQP_VI_EG) { variationalInequality_ExtraGradient(vi, z, w , info , visolver_options); } /* **** Criterium convergence **** */ convexQP_compute_error_reduced(problem, z , w, options->dparam[0], options, norm_q, &error); /* for (i =0; i< n ; i++) */ /* { */ /* printf("reaction[%i]=%f\t",i,reaction[i]); printf("velocity[%i]=F[%i]=%f\n",i,i,velocity[i]); */ /* } */ error = visolver_options->dparam[SICONOS_DPARAM_RESIDU]; iter = visolver_options->iparam[SICONOS_IPARAM_ITER_DONE]; options->dparam[SICONOS_DPARAM_RESIDU] = error; options->dparam[3] = visolver_options->dparam[SICONOS_VI_EG_DPARAM_RHO]; options->iparam[SICONOS_IPARAM_ITER_DONE] = iter; if (verbose > 0) { if (options->solverId==SICONOS_CONVEXQP_VI_FPP) { printf("--------------- CONVEXQP - VI solver (VI_FPP) - #Iteration %i Final Residual = %14.7e\n", iter, error); } else if (options->solverId==SICONOS_CONVEXQP_VI_EG) { printf("--------------- CONVEXQP - VI solver (VI_EG) - #Iteration %i Final Residual = %14.7e\n", iter, error); } } free(vi); solver_options_delete(visolver_options); free(visolver_options); free(convexQP_as_vi); }
void soclcp_VI_ExtraGradient(SecondOrderConeLinearComplementarityProblem* problem, double *reaction, double *velocity, int* info, SolverOptions* options) { /* Dimension of the problem */ int n = problem->n; VariationalInequality *vi = (VariationalInequality *)malloc(sizeof(VariationalInequality)); //vi.self = &vi; vi->F = &Function_VI_SOCLCP; vi->ProjectionOnX = &Projection_VI_SOCLCP; int iter=0; double error=1e24; SecondOrderConeLinearComplementarityProblem_as_VI *soclcp_as_vi= (SecondOrderConeLinearComplementarityProblem_as_VI*)malloc(sizeof(SecondOrderConeLinearComplementarityProblem_as_VI)); vi->env =soclcp_as_vi ; vi->size = n; /*Set the norm of the VI to the norm of problem->q */ vi->normVI= cblas_dnrm2(n , problem->q , 1); vi->istheNormVIset=1; soclcp_as_vi->vi = vi; soclcp_as_vi->soclcp = problem; /* soclcp_display(fc3d_as_vi->fc3d); */ SolverOptions * visolver_options = (SolverOptions *) malloc(sizeof(SolverOptions)); variationalInequality_setDefaultSolverOptions(visolver_options, SICONOS_VI_EG); int isize = options->iSize; int dsize = options->dSize; int vi_isize = visolver_options->iSize; int vi_dsize = visolver_options->dSize; if (isize != vi_isize ) { printf("size problem in soclcp_VI_ExtraGradient\n"); } if (dsize != vi_dsize ) { printf("size problem in soclcp_VI_ExtraGradient\n"); } int i; for (i = 0; i < min(isize,vi_isize); i++) { if (options->iparam[i] != 0 ) visolver_options->iparam[i] = options->iparam[i] ; } for (i = 0; i < min(dsize,vi_dsize); i++) { if (fabs(options->dparam[i]) >= 1e-24 ) visolver_options->dparam[i] = options->dparam[i] ; } variationalInequality_ExtraGradient(vi, reaction, velocity , info , visolver_options); /* **** Criterium convergence **** */ soclcp_compute_error(problem, reaction , velocity, options->dparam[0], options, &error); /* for (i =0; i< n ; i++) */ /* { */ /* printf("reaction[%i]=%f\t",i,reaction[i]); printf("velocity[%i]=F[%i]=%f\n",i,i,velocity[i]); */ /* } */ error = visolver_options->dparam[SICONOS_DPARAM_RESIDU]; iter = visolver_options->iparam[SICONOS_IPARAM_ITER_DONE]; options->dparam[SICONOS_DPARAM_RESIDU] = error; options->dparam[SICONOS_VI_EG_DPARAM_RHO] = visolver_options->dparam[SICONOS_VI_EG_DPARAM_RHO]; options->iparam[SICONOS_IPARAM_ITER_DONE] = iter; if (verbose > 0) { printf("--------------- SOCLCP - VI Extra Gradient (VI_EG) - #Iteration %i Final Residual = %14.7e\n", iter, error); } free(vi); solver_options_delete(visolver_options); free(visolver_options); visolver_options=NULL; free(soclcp_as_vi); }
void fc3d_VI_ExtraGradient(FrictionContactProblem* problem, double *reaction, double *velocity, int* info, SolverOptions* options) { /* Number of contacts */ int nc = problem->numberOfContacts; /* Dimension of the problem */ int n = 3 * nc; VariationalInequality *vi = (VariationalInequality *)malloc(sizeof(VariationalInequality)); //vi.self = &vi; vi->F = &Function_VI_FC3D; vi->ProjectionOnX = &Projection_VI_FC3D; int iter=0; double error=1e24; FrictionContactProblem_as_VI *fc3d_as_vi= (FrictionContactProblem_as_VI*)malloc(sizeof(FrictionContactProblem_as_VI)); vi->env =fc3d_as_vi ; vi->size = n; /*Set the norm of the VI to the norm of problem->q */ vi->normVI= cblas_dnrm2(n , problem->q , 1); vi->istheNormVIset=1; fc3d_as_vi->vi = vi; fc3d_as_vi->fc3d = problem; /* frictionContact_display(fc3d_as_vi->fc3d); */ SolverOptions * visolver_options = (SolverOptions *) malloc(sizeof(SolverOptions)); variationalInequality_setDefaultSolverOptions(visolver_options, SICONOS_VI_EG); int isize = options->iSize; int dsize = options->dSize; int vi_isize = visolver_options->iSize; int vi_dsize = visolver_options->dSize; if (isize != vi_isize ) { printf("size prolem in fc3d_VI_ExtraGradient\n"); } if (dsize != vi_dsize ) { printf("size prolem in fc3d_VI_ExtraGradient\n"); } /* int i; */ /* for (i = 0; i < isize; i++) */ /* { */ /* visolver_options->iparam[i] = options->iparam[i] ; */ /* } */ /* for (i = 0; i < dsize; i++) */ /* { */ /* visolver_options->dparam[i] = options->dparam[i] ; */ /* } */ int i; for (i = 0; i < isize; i++) { if (options->iparam[i] != 0 ) visolver_options->iparam[i] = options->iparam[i] ; } for (i = 0; i < dsize; i++) { if (fabs(options->dparam[i]) >= 1e-24 ) visolver_options->dparam[i] = options->dparam[i] ; } variationalInequality_ExtraGradient(vi, reaction, velocity , info , visolver_options); /* **** Criterium convergence **** */ fc3d_compute_error(problem, reaction , velocity, options->dparam[0], options, &error); /* for (i =0; i< n ; i++) */ /* { */ /* printf("reaction[%i]=%f\t",i,reaction[i]); printf("velocity[%i]=F[%i]=%f\n",i,i,velocity[i]); */ /* } */ error = visolver_options->dparam[1]; iter = visolver_options->iparam[7]; options->dparam[1] = error; options->iparam[7] = iter; if (verbose > 0) { printf("----------------------------------- FC3D - VI Extra Gradient (VI_EG) - #Iteration %i Final Residual = %14.7e\n", iter, error); } free(vi); deleteSolverOptions(visolver_options); free(visolver_options); visolver_options=NULL; free(fc3d_as_vi); }