示例#1
0
void soclcp_unitary_compute_and_add_error(double *z , double *w, unsigned int dim, double mu, double * error,
                                          double * worktmp)
{

  double rho = 1.0;
  for (unsigned int i =0; i < dim; ++i)
  {
    worktmp[i] = z[i] - rho * w[i];
  }
  /* printf("mu = %f\n", mu); */
  /* for (int i=0; i < dim; i++ ) */
  /* { */
  /*   printf("-- worktmp[%i]=%e\t\t\t",i,(worktmp)[i]); */
  /*   printf("z[%i]=%e\n",i,(z)[i]); */
  /* } */
  projectionOnSecondOrderCone(worktmp, mu, dim);
  /* for (int i=0; i < dim; i++ ) */
  /* { */
  /*   printf("-- worktmp[%i]=%e\t\t\n",i,(worktmp)[i]); */
  /* } */

  for (unsigned int i =0; i < dim; ++i)
  {
    worktmp[i] = z[i] -  worktmp[i];
    *error +=  worktmp[i] * worktmp[i];
  }
}
示例#2
0
int soclcp_compute_error_v(SecondOrderConeLinearComplementarityProblem* problem, double *z , double *w, double tolerance, SolverOptions *options, double * error)
{
  /* Checks inputs */
  if(problem == NULL || z == NULL || w == NULL)
    numericsError("soclcp_compute_error", "null input for problem and/or z and/or w");

  /* Computes w = Mz + q */
  int incx = 1, incy = 1;
  int nc = problem->nc;
  int n = problem->n;
  double *mu = problem->mu;

  double invmu = 0.0;
  cblas_dcopy(n , problem->q , incx , z , incy); // z <-q

  // Compute the current reaction
  prodNumericsMatrix(n, n, 1.0, problem->M, w, 1.0, z);

  *error = 0.;
  double rho = 1.0;
  for(int ic = 0 ; ic < nc ; ic++)
  {
    int dim = problem->coneIndex[ic+1]-problem->coneIndex[ic];
    double * worktmp = (double *)malloc(dim*sizeof(double)) ;
    int nic = problem->coneIndex[ic];
    for (int i=0; i < dim; i++)
    {
      worktmp[i] = w[nic+i] - rho * z[nic+i];
    }
    invmu = 1.0 / mu[ic];
    projectionOnSecondOrderCone(worktmp, invmu, dim);
    for (int i=0; i < dim; i++)
    {
      worktmp[i] = w[nic+i] - worktmp[i];
      *error +=  worktmp[i] * worktmp[i];
    }
    free(worktmp);
  }
  *error = sqrt(*error);

  /* Computes error */
  double normq = cblas_dnrm2(n , problem->q , incx);
  *error = *error / (normq + 1.0);
  if(*error > tolerance)
  {
    /*      if (verbose > 0) printf(" Numerics - soclcp_compute_error_velocity failed: error = %g > tolerance = %g.\n",*error, tolerance); */
    return 1;
  }
  else
    return 0;
}
void Projection_VI_SOCLCP(void *viIn, double *x, double *PX)
{
  DEBUG_PRINT("Projection_VI_SOCLCP(void *viIn, double *x, double *PX)\n")

  VariationalInequality * vi = (VariationalInequality *) viIn;
  SecondOrderConeLinearComplementarityProblem_as_VI* pb = (SecondOrderConeLinearComplementarityProblem_as_VI*)vi->env;
  SecondOrderConeLinearComplementarityProblem * soclcp = pb->soclcp;
  //SecondOrderConeLinearComplementarityProblem_display(soclcp);

  int cone =0;
  int n = soclcp->n;
  cblas_dcopy(n , x , 1 , PX, 1);
  int dim;
  for (cone = 0 ; cone < soclcp->nc  ; ++cone)
  {
    dim=soclcp->coneIndex[cone+1]-soclcp->coneIndex[cone];
    projectionOnSecondOrderCone(&PX[soclcp->coneIndex[cone]], soclcp->tau[cone], dim);
  }
}