int main(void) { VariationalInequality vi; variationalInequality_clear(&vi); vi.size=1; //vi.Callback = (CallbackVI *)malloc(sizeof(CallbackVI)); vi.env = &vi; vi.F = &Ftest; vi.ProjectionOnX = &PXtest ; /* Call the callback */ double x[1], F[1], PX[1]; int i, n=1; for (i =0; i< n ; i++) { x[i] = i-5; } vi.F(&vi,n,x,F); vi.ProjectionOnX(&vi,x,PX); for (i =0; i< n ; i++) { printf("x[%i]=%f\t",i,x[i]); printf("F[%i]=%f\t",i,F[i]); printf("PX[%i]=%f\n",i,PX[i]); } NumericsOptions global_options; setDefaultNumericsOptions(&global_options); global_options.verboseMode = 1; // turn verbose mode to off by default SolverOptions * options = (SolverOptions *) malloc(sizeof(SolverOptions)); int info = variationalInequality_setDefaultSolverOptions(options, SICONOS_VI_HP); options->dparam[0]=1e-10; options->iparam[0]=50000000; info = variationalInequality_driver(&vi, x, F, options, &global_options); for (i =0; i< n ; i++) { printf("x[%i]=%f\t",i,x[i]); printf("w[%i]=F[%i]=%f\n",i,i,F[i]); } deleteSolverOptions(options); free(options); return info; }
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); }
int main(void) { VariationalInequality vi; variationalInequality_clear(&vi); //vi.env = &vi; vi.F = &Ftest; vi.ProjectionOnX = &PXtest; vi.normVI = 0.0; vi.istheNormVIset = 0; vi.set = NULL; vi.nabla_F = NULL; NumericsOptions global_options; setDefaultNumericsOptions(&global_options); global_options.verboseMode = 1; // turn verbose mode to off by default SolverOptions * options = (SolverOptions *) malloc(sizeof(SolverOptions)); int info = variationalInequality_setDefaultSolverOptions(options, SICONOS_VI_FPP); options->dparam[0]=1e-8; FILE * finput = fopen("./data/Example1_Fc3D_SBM.dat", "r"); FrictionContactProblem* problem = (FrictionContactProblem *)malloc(sizeof(FrictionContactProblem)); info = frictionContact_newFromFile(problem, finput); // frictionContact_display(problem); Problems *pb= (Problems *)malloc(sizeof(Problems)); vi.env = pb; pb->vi = &vi; pb->fc3d = problem; frictionContact_display(pb->fc3d); int n = problem->numberOfContacts * problem->dimension; vi.size=n; double *x = (double*)calloc(n, sizeof(double)); double *w = (double*)calloc(n, sizeof(double)); PXtest(&vi, x,w); info = variationalInequality_driver(&vi, x, w, options, &global_options); int i =0; for (i =0; i< n ; i++) { printf("x[%i]=%f\t",i,x[i]); printf("w[%i]=F[%i]=%f\n",i,i,w[i]); } deleteSolverOptions(options); free(options); free(problem); free(x); free(w); return info; }
void frictionContact3D_VI_FixedPointProjection(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_FPP); 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 frictionContact3D_VI_FixedPointProjection\n"); } if (dsize != vi_dsize ) { printf("size prolem in frictionContact3D_VI_FixedPointProjection\n"); } 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_FixedPointProjection(vi, reaction, velocity , info , visolver_options); /* **** Criterium convergence **** */ FrictionContact3D_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->dparam[3] = visolver_options->dparam[3]; options->iparam[7] = iter; if (verbose > 0) { printf("----------------------------------- FC3D - VI Fixed Point Projection (VI_FPP) - #Iteration %i Final Error = %14.7e\n", iter, error); } free(vi); deleteSolverOptions(visolver_options); free(visolver_options); free(fc3d_as_vi); }
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); }