Beispiel #1
0
void C_piiA(int* m_ptr, int* p_ptr,
	double* covariates,
	int* distancesincluded,
	double* transpar,
	int* v,
	double* pii,
	double* A)
	{
	unsigned int p = *p_ptr, m = *m_ptr;
	// unsigned int q = 1+2+p;
	double p0, p1;
	p0 = transpar(0,0);
	p1 = transpar(1,0);
	for (unsigned int j=0; j<p; j++){
		p0 += transpar(0,3+j) * covariates(0,j);
		p1 += transpar(1,3+j) * covariates(0,j);
	}
	pii[0] = exp(p0) / (exp(p0)+exp(p1));
	pii[1] = 1 - pii[0];
	
	double num11 = exp(transpar(0,1));
	double num21 = exp(transpar(0,2));
	for (unsigned int k=0; k<m-1; k++){
		double denom12 = 0.;
		for (unsigned int j=0; j<p; j++){
			denom12 += transpar(1,3+j) * covariates(k+1,j);
		}
		double denom22 = denom12;
		if (*distancesincluded){
			denom22 -= transpar(1,3) * covariates(k+1,0); // undo plus
			denom22 -= transpar(1,3) * covariates(k+1,0); // and minus
		}
		double num12 = exp(transpar(1,1) + denom12);
		double num22 = exp(transpar(1,2) + denom22);
		A(0,0,k) = num11/(num11 + num12);
		A(0,1,k) = num12/(num11 + num12);
		A(1,0,k) = num21/(num21 + num22);
		A(1,1,k) = num22/(num21 + num22);
}
}
Beispiel #2
0
void C_ComputeGradient(int* m_ptr, int* p_ptr,
	double* covariates,
	int* distancesincluded,
	double* dgammA,
	double* gammA,
	double* transpar,
	int* v,
	double* pii,
	double* A,
	double* gradient)
{
	unsigned int p = *p_ptr, m = *m_ptr;
	C_piiA(m_ptr, p_ptr, covariates, distancesincluded, transpar, v, pii, A);
	gradient[0] = gammA(0,1) - pii[1];
	for (unsigned int k=0; k<m-1; k++){
		gradient[1] += dgammA(0,1,k) - gammA(k,0)*A(0,1,k);
		gradient[2] += dgammA(1,1,k) - gammA(k,1)*A(1,1,k);
	}
	double* tmp = new double[m-1];
	for (unsigned int k=0; k<m-1; k++){
		tmp[k] = gammA(k+1,1) - (gammA(k,0)*A(0,1,k) + gammA(k,1)*A(1,1,k));
	}
	unsigned int first = 0;
	if (*distancesincluded){
		first = 1; // gradient[3] not concerned
	}
	for (unsigned int j=first; j<p; j++){
		gradient[3+j] =(gammA(0,1) - pii[1])*covariates(0,j);
		for (unsigned int k=0; k<m-1; k++){
			gradient[3+j] += tmp[k]*covariates(k+1,j);
		}
	}
	delete[] tmp;
	if (*distancesincluded){
		gradient[3] =(gammA(0,1) - pii[1])*covariates(0,0);
		for (unsigned int k=0; k<m-1; k++){
			gradient[3] += dgammA(0,1,k) * covariates(k+1,0)
				- dgammA(1,1,k) * covariates(k+1,0)
				- gammA(k,0)*A(0,1,k)*covariates(k+1,0)
				+ gammA(k,1)*A(1,1,k)*covariates(k+1,0);
		}
	}
	for (unsigned int k=0; k < 3+p; k++)
	{
		gradient[k] = -gradient[k];
	}
}
Beispiel #3
0
void Kernel::createKernelFromDiscreteCovariates(std::string fn, int useColumn)
{
  Covariate covariates(fn, "", std::vector<std::string>(), false);
  
  std::vector<int> categories;
  this->randomVarNames.clear();
  
  if( communicator->mpiRoot == false)
  {
    if( covariates.rawCovars.size() < 1 )
    {
      misc.error("Error: File [ " + fn + " ] is empty.", 0);
    }
    
    if( useColumn >= covariates.rawCovars[0].size() )
    {
      misc.error("Error: Unable to get the column " + i2s(useColumn) + " from file [ " + fn + " ].", 0);
    }
    
    for(int i = 0; i < covariates.rawCovars.size(); i++)
    {
      std::string value = covariates.rawCovars[ i ][ useColumn ];
      int idx = covariates.covarCategories[ useColumn ][ value ];
      categories.push_back(idx);
    }
    
    for(std::map<std::string, int>::iterator it = covariates.covarCategories[ useColumn ].begin(); it != covariates.covarCategories[ useColumn ].end(); ++it)
    {
      this->randomVarNames.push_back(it->first);
    }
  }
  
  if(this->kernel != NULL)
  {
    delete this->kernel;
  }
  if(this->N != NULL)
  {
    delete this->N;
  }
  this->kernel = new Matrix();
  this->kernel->makeIntersectionMatrix(categories);
}
Beispiel #4
0
void C_LineSearch(int* m_ptr, int* p_ptr,
	double* covariates,
	int* distancesincluded,
	double* dgammA,
	double* gammA,
	double* transpar,
	double* phi,
	int* iterCG,
	double* ptol,
	int* v,
	int* allright,
	double* nu,
	double* pii,
	double* A)
{
	unsigned int p = *p_ptr, m = *m_ptr;
	int i, j;
	unsigned int n, k;
	int niter = 0;
	double difference = 1.0;
	double dQ, dQ2, tmp, dQ2_tmp;
	
	double* transparnew = new double[2*(3+p)];
	for (j=0; j < 2; j++)
	{
		for (k=0; k < 3+p; k++)
		{
			transparnew(j,k) = transpar(j,k);
		}
	}
	
	while (difference > *ptol && niter < *iterCG)
	{
		niter++;
		C_piiA( m_ptr, p_ptr, covariates, distancesincluded, transparnew, v, pii, A);
				
		// dQ
		dQ = 0.0;
		for (j=0; j < 2; j++)
		{
			tmp = 0.0;
			for (k=3; k < p+3; k++)
			{
				if (*distancesincluded && k == 3)
					tmp += 0;
				else
					tmp += phi(j,k) * covariates(0,k-3);
			}
			dQ += (phi(j,0) + tmp) * (gammA(0,j) - pii[j]);
		}
		//Rprintf("tmp : %f\n", dQ);
		
		for (i=0; i < 2; i++)
		{
			for (j=0; j < 2; j++)
			{
				for (n = 0; n < m-1; n++)
				{
					tmp = 0.0;
					for (k=3; k < p+3; k++)
					{
						if (*distancesincluded && k == 3 && i == 1)
							tmp += (-phi(j,k)) * covariates(n+1, k-3);
						else
							tmp += phi(j,k) * covariates(n+1, k-3);
					}
					dQ += (phi(j,i+1) + tmp) * (dgammA(i,j,n) - (gammA(n,i) * A(i,j,n)));
				}
			}
		}
		//Rprintf("dQ : %f\n", dQ);
		
		// dQ2
		dQ2 = 0.0;
		for (j=0; j < 2; j++)
		{
			tmp = 0.0;
			for (k=3; k < p+3; k++)
			{
				if (*distancesincluded && k == 3)
					tmp += 0;
				else
					tmp += phi(j,k) * covariates(0,k-3);
			}
			dQ2 += (phi(j,0) + tmp) * (phi(j,0) + tmp) * pii[j] * (1 - pii[j]);
		}
		dQ2 = -dQ2;
		//Rprintf("dQ2_tmp : %f\n", dQ2);
		
		for (i=0; i < 2; i++)
		{
			for (j=0; j < 2; j++)
			{
				dQ2_tmp = 0.0;
				for (n = 0; n < m-1; n++)
				{
					tmp = 0.0;
					for (k=3; k < p+3; k++)
					{
						if (*distancesincluded && k == 3 && i == 1)
							tmp += (-phi(j,k)) * covariates(n+1, k-3);
						else
							tmp += phi(j,k) * covariates(n+1, k-3);
					}
					dQ2_tmp += ((phi(j,i+1) + tmp) * (phi(j,i+1) + tmp)) * gammA(n,i) * A(i,j,n) * (1 - A(i,j,n));
				}
				dQ2 -= dQ2_tmp;
			}
		}
		//Rprintf("dQ2 : %f\n", dQ2);
		
		if (dQ2 == 0)
		{
			difference = *ptol;
			niter = *iterCG;
			*nu = 0;
			for (j=0; j < 2; j++)
			{
				for (k=0; k < 3+p; k++)
				{
					transparnew(j,k) = transpar(j,k);
				}
			}
			*allright = false;
		}
		else
		{
			*nu = *nu - dQ / dQ2;
			difference = fabs(dQ/ dQ2);
			for (j=0; j < 2; j++)
			{
				for (k=0; k < 3+p; k++)
				{
					transparnew(j,k) = transpar(j,k) + *nu * phi(j,k);
				}
			}
		}
		
	}
	for (j=0; j < 2; j++)
	{
		for (k=0; k < 3+p; k++)
		{
			transpar(j,k) = transparnew(j,k);
		}
	}
	delete[] transparnew;
}