void lcp_path(LinearComplementarityProblem* problem, double *z, double *w, int *info , SolverOptions* options) { *info = 1; #ifdef HAVE_PATHFERRIS /* matrix M/vector q of the lcp */ double * M = problem->M->matrix0; double * q = problem->q; int nnz, i, j, dim; /* size of the LCP */ int n = problem->size; double tol = options->dparam[0]; MCP_Termination termination; nnz = nbNonNulElems(n, M, 1.0e-18); int * m_i = (int *)calloc(nnz + 1, sizeof(int)); int * m_j = (int *)calloc(nnz + 1, sizeof(int)); double * m_ij = (double *)calloc(nnz + 1, sizeof(double)); double * lb = (double *)calloc(n + 1, sizeof(double)); double * ub = (double *)calloc(n + 1, sizeof(double)); double err, val; FortranToPathSparse(n, M, 1.0e-18, m_i, m_j, m_ij); for (i = 0; i < n; i++) { lb[i] = 0.; ub[i] = 1.e20; } SimpleLCP(n, nnz, m_i, m_j, m_ij, q, lb, ub, &termination, z); if (termination == MCP_Error) { *info = 1; if (verbose > 0) printf("PATH : Error in the solution.\n"); } else if (termination == MCP_Solved) { for (i = 0; i < n; i++) { val = q[i]; for (j = 0; j < n; j++) { val += M[i + j * n] * z[j]; } w[i] = val; } *info = 0; /* **** Criterium convergence **** */ lcp_compute_error(problem, z, w, tol, &err); if (verbose > 0) printf("PATH : LCP Solved, error %10.7f.\n", err); } else { if (verbose > 0) printf("PATH : Other error: %d\n", termination); } free(m_i); free(m_j); free(m_ij); free(lb); free(ub); #endif /*HAVE_PATHFERRIS*/ return; }
void relay_path(RelayProblem* problem, double *z, double *w, int *info , SolverOptions* options) { *info = 1; #ifdef HAVE_PATHFERRIS /* matrix M/vector q of the relay */ if (!problem->M->matrix0) { printf("relay_path only implemented for dense storage\n"); // return info; } double * M = problem->M->matrix0; double * q = problem->q; int nnz, i, j; /* size of the RELAY */ int n = problem->size; // double tol = options->dparam[0]; MCP_Termination termination; nnz = nbNonNulElems(n, M, 1.0e-18); int * m_i = (int *)calloc(nnz + 1, sizeof(int)); int * m_j = (int *)calloc(nnz + 1, sizeof(int)); double * m_ij = (double *)calloc(nnz + 1, sizeof(double)); double * lb = (double *)calloc(n + 1, sizeof(double)); double * ub = (double *)calloc(n + 1, sizeof(double)); double err=1e24, val; FortranToPathSparse(n, M, 1.0e-18, m_i, m_j, m_ij); for (i = 0; i < n; i++) { lb[i] = problem->lb[i]; ub[i] = problem->ub[i]; } /* for (i=0;i<n;i++){ */ /* printf(" problem->lb[%i] = %e",i, problem->lb[i]); */ /* printf(" problem->ub[%i] = %e",i, problem->ub[i]); */ /* } */ SimpleLCP(n, nnz, m_i, m_j, m_ij, q, lb, ub, &termination, z); /* printLCP(n, nnz, m_i, m_j, m_ij, q, lb, ub); */ if (termination == MCP_Error) { *info = 1; if (verbose > 0) printf("PATH : Error in the solution.\n"); } else if (termination == MCP_Solved) { for (i = 0; i < n; i++) { val = q[i]; for (j = 0; j < n; j++) { val += M[i + j * n] * z[j]; } w[i] = val; } *info = 0; /* **** Criterium convergence **** */ //relay_compute_error(problem,z,w,tol,&err); if (verbose > 0) printf("PATH : RELAY Solved, error %10.7f.\n", err); } else { if (verbose > 0) printf("PATH : Other error: %d\n", termination); } free(m_i); free(m_j); free(m_ij); free(lb); free(ub); #endif /*HAVE_PATHFERRIS*/ return; }
void mlcp_path(MixedLinearComplementarityProblem* problem, double *z, double *w, int *info, SolverOptions* options) { *info = 1; #ifdef HAVE_PATHFERRIS *info = 0; MCP_Termination termination; double tol = options->dparam[0]; double * M = problem->M->matrix0; double * q = problem->q; int nnz, i, j, n, m, dim, numLine; n = problem->n; m = problem->m; dim = m + n; /* if (verbose){ printf("initial values for z:\n"); for (int i=0;i<dim;i++) printf("%.15e\n", z[i]); printf("initial values for w:\n"); for (int i=0;i<dim;i++) printf("%.15e\n", w[i]); }*/ nnz = nbNonNulElems(dim, M, 1.0e-18); int * m_i = (int *)calloc(nnz + 1, sizeof(int)); int * m_j = (int *)calloc(nnz + 1, sizeof(int)); double * m_ij = (double *)calloc(nnz + 1, sizeof(double)); double * lb = (double *)calloc(dim + 1, sizeof(double)); double * ub = (double *)calloc(dim + 1, sizeof(double)); // double * u = z; // double * v = z+n; double err; FortranToPathSparse(dim, M, 1.0e-18, m_i, m_j, m_ij); if (problem->blocksRows) { int numBlock = 0; while (problem->blocksRows[numBlock] < n + m) { if (!problem->blocksIsComp[numBlock]) { for (numLine = problem->blocksRows[numBlock] ; numLine < problem->blocksRows[numBlock + 1]; numLine++) { lb[numLine] = -1e20; ub[numLine] = 1e20; } } else { for (numLine = problem->blocksRows[numBlock] ; numLine < problem->blocksRows[numBlock + 1]; numLine++) { lb[numLine] = 0; ub[numLine] = 1e20; } } numBlock++; } } else { printf("DEPRECED MLCP INTERFACE\n"); for (i = 0; i < n; i++) { lb[i] = -1e20; ub[i] = 1e20; } for (i = n; i < n + m; i++) { lb[i] = 0; ub[i] = 1e20; } } if (verbose) printLCP(dim, nnz, m_i, m_j, m_ij, q, lb, ub); SimpleLCP(dim, nnz, m_i, m_j, m_ij, q, lb, ub, &termination, z); if (termination == MCP_Error) { *info = 1; if (verbose) printf("PATH : Error in the solution.\n"); } else if (termination == MCP_Solved) { /* for (i=0;i<n;i++){ */ /* u[i]=z[i]; */ /* } */ if (problem->blocksRows) { int numBlock = 0; while (problem->blocksRows[numBlock] < n + m) { if (!problem->blocksIsComp[numBlock]) { for (numLine = problem->blocksRows[numBlock] ; numLine < problem->blocksRows[numBlock + 1]; numLine++) { w[numLine] = 0; } } else { for (numLine = problem->blocksRows[numBlock] ; numLine < problem->blocksRows[numBlock + 1]; numLine++) { w[numLine] = -q[numLine]; for (int jj = 0; jj < n + m; jj++) { w[numLine] += M[numLine + dim * jj] * z[jj]; } } } numBlock++; } } else { for (i = 0; i < n; i++) w[i] = 0; for (i = n; i < n + m; i++) { w[i] = -q[i]; for (j = 0; j < n + m; j++) { w[i] += M[i + dim * j] * z[j]; } } } /*1e-7 because it is the default tol of path.*/ mlcp_compute_error(problem, z, w, tol, &err); if (err > 1e-7) { printf("PATH : MLCP Solved, error %10.7f.\n", err); //*info = 1; } if (problem->blocksRows) { int numBlock = 0; while (problem->blocksRows[numBlock] < n + m) { if (problem->blocksIsComp[numBlock]) { for (numLine = problem->blocksRows[numBlock] ; numLine < problem->blocksRows[numBlock + 1]; numLine++) { if (z[numLine] > w[numLine]) w[numLine] = 0; } } numBlock++; } } else { for (i = 0; i < m; i++) { if (z[n + i] > w[n + i]) w[n + i] = 0; } } if (verbose) printf("PATH : MLCP Solved, error %10.7f.\n", err); } else { if (verbose) printf("PATH : MLCP Other error: %d\n", termination); } free(m_i); free(m_j); free(m_ij); free(lb); free(ub); #endif /*HAVE_PATHFERRIS*/ return; }