Version support is not available for this paste.

Pasted by fd as cpp at 2006-03-29 20:17:04 MSK and set expiration to 2006-03-30 20:17:04 MSK.
Edited by fd as cpp at 2006-03-29 23:07:42 MSK and set expiration to never.

Paste will expire never.

  1. CLCPLemkeSolver::ELCPErr CLCPLemkeSolver::Solve(CMatrixN &LCPMat, CVectorN &LCPVec, CVectorN &y, CVectorN &w)
  2. {
  3. //  __int64 Time0 = GetCPUClock();;
  4.     unsigned long start_index = 0;
  5.     double minimum = LCPVec.Get(0);
  6.     mpBasis[0].index = 0;
  7.     mpBasis[0].type = LEMKE_VAR_W;
  8.  
  9.     for(unsigned long i = 1; i < mSize; i++)
  10.     {
  11.         if(LCPVec.Get(i) < minimum)
  12.         {
  13.             minimum = LCPVec.Get(i);
  14.             start_index = i;
  15.         }
  16.         mpBasis[i].index = i;
  17.         mpBasis[i].type = LEMKE_VAR_W;
  18.     }
  19.     if(minimum >= 0)
  20.     {
  21.         y.MakeZero();
  22.         w = LCPVec;
  23.         return LCPERR_OK;
  24.     }
  25.  
  26.     mpBasis[start_index].type = LEMKE_VAR_Z0;
  27.    
  28.     ZeroMemory(mpInvbasmat,mSize * mSize * sizeof(double));
  29.     for(unsigned long j = 0; j < mSize; j++)
  30.     {
  31.         mpInvbasmat[j * mSize + j] = 1.0;
  32.         mpInvbasmat[j * mSize + start_index] = -1.0;
  33.     }
  34.    
  35.     SLemkeVar entering_varible, temp_varible;
  36.     unsigned long departing_varible;
  37.     entering_varible.index = start_index;
  38.     entering_varible.type = LEMKE_VAR_Y;
  39.     unsigned long cycle_count = 0;
  40.     while(true)
  41.     {
  42.         cycle_count++ ;
  43.         if(cycle_count > 1000)
  44.         {
  45. /*DEBUG*/   assert("Overcycling in Lemke" && false);
  46.             return LCPERR_OVERCYCLING;
  47.         }
  48.     //  __int64 Time1 = GetCPUClock();
  49.         if(!FindDeparting(LCPMat, LCPVec, entering_varible, departing_varible))
  50.         {
  51. /*DEBUG*/   assert("Lemeke failed!" && false);
  52.             printf("\n\n");
  53.             for(unsigned long i = 0; i < mSize; i++)
  54.             {
  55.                 printf("%f ",mpTransformedC[i]);
  56.             }
  57.             printf("\n\n");
  58.             for(unsigned long i = 0; i < mSize; i++)
  59.             {
  60.                 printf("%f ",mpTransformedQ[i]);
  61.             }
  62.             printf("\n\n");
  63.             for(unsigned long i = 0; i < mSize; i++)
  64.             {
  65.                 printf("%f ",mpTransformedQ[i] / mpTransformedC[i]);
  66.             }
  67.             return LCPERR_CANTSOLVE;
  68.         }
  69.        
  70.         if(!FastInverseMatrix(departing_varible))
  71.         {
  72. /*DEBUG*/   assert(false && "Basis unfeasable!");
  73.             return LCPERR_CANTINVERT;
  74.         }
  75.    
  76.         bool bEnd = mpBasis[departing_varible].type == LEMKE_VAR_Z0;
  77.         temp_varible = entering_varible;
  78.         entering_varible.index = mpBasis[departing_varible].index;
  79.         entering_varible.type = !(mpBasis[departing_varible].type);
  80.    
  81.         mpBasis[departing_varible] = temp_varible;
  82.         if(bEnd)
  83.         {
  84.             break;
  85.         }
  86.     }
  87.     w.MakeZero();
  88.     y.MakeZero();
  89.     double temp;
  90.     for(unsigned long i = 0; i < mSize; ++i)
  91.     {
  92.         temp = 0.0;
  93.         for(unsigned long j = 0; j < mSize; ++j)
  94.         {
  95.             temp += mpInvbasmat[i * mSize +j] * LCPVec.Get(j);
  96.         }
  97.         if(mpBasis[i].type == LEMKE_VAR_Y)
  98.         {
  99.             y[mpBasis[i].index] = temp;
  100.         }
  101.         else
  102.         {
  103.             w[mpBasis[i].index] = temp;
  104.         }
  105.  
  106.     }
  107.        
  108.     return LCPERR_OK;
  109. }
  110.  
  111.  


Editing of pre-version support pastes is disabled.