Esempio n. 1
0
/* x are the indipendent value of the polynomial equation
   y are the dependent value
 */
void OrdinaryLeastSquares(matrix *x, dvector *y, dvector *coefficients)
{
  /*y->size = x->row 
   * 
   * Z' = n  x m => n = x->col; m = x->row
   * 
   * Z'Z = m x n * n x m  =  m x m  => m = x->row 
   * 
   * Z'y = 
   * 
   * 
   */
  matrix *x_t; /* Z' that is x transposed */
  matrix *x_x_t; /* Z'*Z is the product between x and x_t */
  matrix *x_x_t_i; /* x_x_t_i inverted matrix  (Z' * Z')^-1 */
  dvector *x_t_y; /* Z'* y  = x->col */
    
  /* transpose x to x_t*/
  NewMatrix(&x_t, x->col, x->row);
  MatrixTranspose(x, x_t);

  /* Z'*Z */
  NewMatrix(&x_x_t, x->col, x->col);
  MatrixDotProduct(x_t, x, x_x_t);

  /* (Z'*Z)^-1 */
  initMatrix(&x_x_t_i);
  MatrixInversion(x_x_t, &x_x_t_i);
  
  /* create a vector for store the results of Z'y */
  NewDVector(&x_t_y, x->col);
  
  /* Z'y */
  MatrixDVectorDotProduct(x_t, y, x_t_y);
  
  /* final data coefficient value */
  DVectorResize(&coefficients, x->col);
  MatrixDVectorDotProduct(x_x_t_i, x_t_y, coefficients);

  /*
  for(i = 0; i < 10; i++)
    printf("%f\n", coefficients->data[i]);
  */
  DelDVector(&x_t_y);
  DelMatrix(&x_x_t_i);
  DelMatrix(&x_x_t);
  DelMatrix(&x_t);
}
Esempio n. 2
0
void test3()
{
  matrix *m; /* Data matrix */
  PCAMODEL *model;
  int run = SIGSCIENTIFICRUN;

  NewMatrix(&m, 10, 2);


  m->data[0][0] = 2.2;  m->data[0][1] = 3.3;
  m->data[1][0] = 2.9;  m->data[1][1] = 4.5;
  m->data[2][0] = 4.0;  m->data[2][1] = 3.5;
  m->data[3][0] = 4.500;  m->data[3][1] = 4.7;
  m->data[4][0] = 5.1;  m->data[4][1] = 6.0;
  m->data[5][0] = 5.5;  m->data[5][1] = 4.5;
  m->data[6][0] = 6.5000;  m->data[6][1] = 6.4;
  m->data[7][0] = 7.2;  m->data[7][1] = 6.2;
  m->data[8][0] = 8.8;  m->data[8][1] = 3.9;
  m->data[9][0] = 10;  m->data[9][1] = 6.2;


  NewPCAModel(&model);

  printf("Test PCA 3\n");
  PCA(m, 1, 5, model, &run);

  PrintPCA(model);

  DelPCAModel(&model);
  DelMatrix(&m);
}
Esempio n. 3
0
void AMatrix_base::MakeArrayBigger(const int RowIndex, const int ColIndex) {
//-------------------------------------------------------------
// if m_Array is big enough, return true.
// if m_Array is too small, make it bigger and return false.
//-------------------------------------------------------------
  // make an array that's big enough (don't let either dimension shrink)
  int  NumRows = Max(m_NumRows, RowIndex+1);
  int  NumCols = Max(m_NumCols, ColIndex+1);
  AMatrix_base  NewMatrix(NumRows, NumCols);

  // copy old array into new array
  NewMatrix.SlowCopy(*this);

  // free the old array
  DeAllocate();

  // save new array in place of old array
  m_Array = NewMatrix.m_Array;
  m_ColumnFlags = NewMatrix.m_ColumnFlags;
  m_NumRows = NewMatrix.m_NumRows;
  m_NumCols = NewMatrix.m_NumCols;

  // pretend new array has been freed
  // (so that new array isn't freed when leaving this routine)
  NewMatrix.m_Array = NULL;
  NewMatrix.m_ColumnFlags = NULL;
  NewMatrix.m_NumRows = 0;
  NewMatrix.m_NumCols = 0;
}
Esempio n. 4
0
void test1()
{
  matrix *mx, *u, *v;
  dvector *w;
  NewMatrix(&mx, 4, 5);
  MatrixSet(mx, 0.f);
  mx->data[0][0] = 1;  mx->data[0][4] = 2;
  mx->data[1][2] = 3;
  mx->data[3][1] = 4;
  
  PrintMatrix(mx);
  
  initMatrix(&u);
  initMatrix(&v);
  initDVector(&w);
  svd(mx, &u, &w, &v);
  
  puts("U");
  PrintMatrix(u);
  puts("W");
  PrintDVector(w);
  puts("V");
  PrintMatrix(v);
  
  DelMatrix(&u);
  DelMatrix(&v);
  DelDVector(&w);
  DelMatrix(&mx);
}
Esempio n. 5
0
void AminoacidData::FillAminoacidMatrixFromDNA(const NucleotideData *dnaData, GeneticCode *code){
	//first we need to convert the nucleotide data to codons, and then translate the codons to AA's
	//codons are ordered AAA, AAC, AAG, AAT, ACA, ... TTT
	short pos1, pos2, pos3;

	nChar = dnaData->NChar()/3;
	nTax = dnaData->NTax();
	if(dnaData->NChar() % 3 != 0) throw ErrorException("Codon to Aminoacid translation specified, but number of nucleotides not divisible by 3!");  
	NewMatrix(nTax, nChar);

	//this will just map from the bitwise format to the index format (A, C, G, T = 0, 1, 2, 3)
	//partial ambiguity is mapped to total ambiguity currently
	short bitwiseToIndexFormat[16] = {15,0,1,15,2,15,15,15,3,15,15,15,15,15,15,15};
	
	int tax=0, thisCodonNum;
	for(int tax=0;tax<NTax();tax++){
		bool firstAmbig = true;
		for(int cod=0;cod<nChar;cod++){
			short p1 = dnaData->Matrix(tax, cod*3);
			short p2 = dnaData->Matrix(tax, cod*3+1);
			short p3 = dnaData->Matrix(tax, cod*3+2);

			pos1 = bitwiseToIndexFormat[p1];
			pos2 = bitwiseToIndexFormat[p2];
			pos3 = bitwiseToIndexFormat[p3];
			
			thisCodonNum=(pos1)*16 + (pos2)*4 + pos3;
			
			if(pos1==15||pos2==15||pos3==15){//check for gaps
				if(pos1+pos2+pos3 != 45){
					//warn about gaps or ambiguity in codons
					if(firstAmbig){
						outman.UserMessageNoCR("Gaps or ambiguity codes found within codon for taxon %s.\n\tAminoacids coded as missing for that taxon: ", dnaData->TaxonLabel(tax));
						firstAmbig = false;
						}
					outman.UserMessageNoCR("%d ", cod+1);
					}
				thisCodonNum=64;
				}

			char prot;
			//note that a return code of 20 from the codon lookup indicates a stop codon, but a protein code of 20 generally means total ambiguity
			if(thisCodonNum != 64){
				prot = code->CodonLookup(thisCodonNum);
				if(prot == 20){
					string c;
					char b[4]={'A','C','G','T'};
					c += b[pos1];
					c += b[pos2];
					c += b[pos3];
					throw ErrorException("stop codon %s found at codon site %d (nuc site %d) in taxon %s.  Bailing out.", c.c_str(), cod+1, cod*3+1,  dnaData->TaxonLabel(tax));
					}
				}
			else prot = 20;

			matrix[tax][cod] = prot;
			}
		if(firstAmbig == false) outman.UserMessage("");
		}	
	}
Esempio n. 6
0
void AddArrayMatrix(array **t, size_t row, size_t col)
{
   if((*t)->order > 0){
    /*if((*t)->m[(*t)->order-1]->row != row){
      fprintf(stderr, "Error while appending matrix to array! Object size differ: matrix: %u;  array: %u", (unsigned int)row, (unsigned int)(*t)->m[(*t)->order-1]->row);
      abort();
    }
    else{*/
      (*t)->order += 1;
      (*t)->m = xrealloc((*t)->m, sizeof(matrix*)*(*t)->order);
      NewMatrix(&(*t)->m[(*t)->order-1], row, col);
/*     }*/
  }
  else{
    (*t)->order = 1;
    (*t)->m = xmalloc(sizeof(matrix*)*1);
    NewMatrix(&(*t)->m[0], row, col);
  } 
}
Esempio n. 7
0
void ArrayAppendMatrix(array **tdst, matrix *msrc)
{
  if((*tdst)->order > 0){
    if((*tdst)->m[(*tdst)->order-1]->row != msrc->row){
      fprintf(stderr, "Error while appending matrix to array! Object size differ: matrix: %u;  array: %u", (unsigned int)msrc->row, (unsigned int)(*tdst)->m[(*tdst)->order-1]->row);
      abort();
    }
    else{
      (*tdst)->order += 1;
      (*tdst)->m = xrealloc((*tdst)->m, sizeof(matrix*)*(*tdst)->order);
      NewMatrix(&(*tdst)->m[(*tdst)->order-1], msrc->row, msrc->col);
      MatrixCopy(msrc, &(*tdst)->m[(*tdst)->order-1]);
    }
  }
  else{
    (*tdst)->order = 1;
    (*tdst)->m = xmalloc(sizeof(matrix*)*1);
    NewMatrix(&(*tdst)->m[0], msrc->row, msrc->col);
    MatrixCopy(msrc, &(*tdst)->m[0]);
  }
}
Esempio n. 8
0
void CallFunction(FunctionCall fc)
{
	int function = GetFunction(fc->function);
	
	switch (function)
	{
		case VAR : NewVariable(fc); break;
		case NMX : NewMatrix(fc); break;
		case ADD : Addition(fc); break;
		case SUB : Substraction(fc); break;
		case MUL : Multiplication(fc); break;
		case MSC : Scalar_Mult(fc); break;
		case EXP : Exponentiation(fc); break;
		case TRA : Transpose(fc); break;
		case DET : Determinant(fc); break;
		case DLU : Decomposition(fc); break;
		case SOL : Solve(fc); break;
		case INV : Inversion(fc); break;
		case RNK : Rank(fc); break;
		case DSP : Display(fc); break;
		case NOF : // default
		default :
		{
			if (GetFunction(fc->name)==SPT) SpeedTest(fc);
			else if (IndexVariable(fc->function)!=-1) NewVariable(fc);
			else if (IndexMatrix(fc->function)!=-1) NewMatrix(fc);
			else
			{
				printf("\t%s : Function Not Implemented\n", fc->function);
				fni++;
			}
			break;
		}
	}
	
	if (function!=NOF && function !=VAR) fni = 0;
}
Esempio n. 9
0
void NewArrayMatrix(array **t, size_t order, size_t row, size_t col)
{
  if((*t)->order != 0){
    if(order < (*t)->order){
      NewMatrix(&(*t)->m[order], row, col);
    }
    else{
      fprintf(stderr, "Error! Order not in range order. order: %u > ordersize: %u\n", (unsigned int)order, (unsigned int)(*t)->order);
    }
  }
  else{
    fprintf(stderr, "Error! Order Array not Defined! Please create Array with NewArray(array **t, size_t order);\n");
    abort();
  }
}
Esempio n. 10
0
void ArrayCopy(array* asrc, array** adst)
{
  size_t i, j, k;
  if((*adst)->m == NULL){
    (*adst)->order = asrc->order;
    
    (*adst)->m = xmalloc(sizeof(matrix*)*asrc->order);
  
    for(k = 0; k < asrc->order; k++){
      NewMatrix(&((*adst)->m[k]), asrc->m[k]->row, asrc->m[k]->col);
    }
  }
  else{
    if(asrc->order != (*adst)->order){
      /* resize  the order */
      (*adst)->m = xrealloc((*adst)->m, sizeof(array*)*asrc->order);
    }

    /*chek and resize the matrix for each order if is necessary */
    for(k = 0; k < asrc->order; k++){
      if(asrc->m[k]->row != (*adst)->m[k]->row || asrc->m[k]->col != (*adst)->m[k]->col){
        
        (*adst)->m[k]->row = asrc->m[k]->row;
        (*adst)->m[k]->col = asrc->m[k]->col;

        (*adst)->m[k]->data = xrealloc((*adst)->m[k]->data, sizeof(double*)*asrc->m[k]->row);
        
        for(i = 0; i < asrc->m[k]->row; i++){
          (*adst)->m[k]->data[i] = xrealloc((*adst)->m[k]->data[i], sizeof(double)*asrc->m[k]->col);
        }
      }
    }
    
  }
  
  /*copy the data...*/
  for(k = 0; k < asrc->order; k++){
    for(i = 0; i < asrc->m[k]->row; i++){
      for(j = 0; j < asrc->m[k]->col; j++){
        setArrayValue((*adst), k, i, j, getArrayValue(asrc, k, i, j));
      }
    }
  }

}
Esempio n. 11
0
void test1()
{
  matrix *dmx;
  NewMatrix(&dmx, 4, 4);
  G *graph;

  dmx->data[0][1] = dmx->data[1][0] = 0.3;
  dmx->data[0][2] = dmx->data[2][0] = 0.4;
  dmx->data[0][3] = dmx->data[3][0] = 0.7;
  dmx->data[1][2] = dmx->data[2][1] = 0.9;
  dmx->data[1][3] = dmx->data[3][1] = 0.2;
  dmx->data[2][3] = dmx->data[3][2] = 0.1;
  PrintMatrix(dmx);
  NewGraph(&graph);
  GenerateAdjMX(dmx, 0.8, &graph);
  PrintGraph(graph);
  DelMatrix(&dmx);
  DelGraph(&graph);
}
Esempio n. 12
0
void MpView::NewDataSet (int dataset_index, int graph_index)
{
    if (dataset_index < 0) return;

    for (MpViewGraphMap::iterator i = Graphs.begin(); i != Graphs.end(); ++i) {
        int grf = i->first;
        if (dataset_index == i->second.iset
                && (graph_index < 0 || graph_index == grf)) {
            MpViewGraphData *G = &GD(grf);
            if (DataSetExists(dataset_index)) {
                switch (G->DS().GetDataType()) {
                case MpViewDataSet::a_EmptySet:
                    // nothing to do
                    break;
                case MpViewDataSet::a_Matrix:
                    NewMatrix(G);
                    break;
                case MpViewDataSet::a_Matrix3d:
                    NewVolume(G);
                    break;
                case MpViewDataSet::a_ComplexMatrix:
                    NewComplexMatrix(G,G->DS().C);
                    break;
                case MpViewDataSet::a_Scene:
                    NewScene(G);
                    break;
                case MpViewDataSet::a_XYZSet:
                    NewXYZSet(G);
                    break;
                case MpViewDataSet::a_Image:
                    cerr<<"MpView::NewDataSet: IMAGE - can't happen"<<endl;
                    break;
                default:
                    cerr<<"MpView::NewDataSet: found illegal data set type" << endl;
                    break;
                }
            } else {
                // data set doesn't exist (e.g. was deleted) -> unlink
                G->iset = -1;
            }
        }
    }
}
Esempio n. 13
0
void test6()
{
  matrix *m;
  PCAMODEL *model;

  NewMatrix(&m, 3,3);

  m->data[0][0] = 7; m->data[0][1] = 4; m->data[0][2] = 4;
  m->data[1][0] = 4; m->data[1][1] = 4; m->data[1][2] = 4;
  m->data[2][0] = 1; m->data[2][1] = 4; m->data[2][2] = 7;

  PrintMatrix(m);

  NewPCAModel(&model);

  PCA(m, 0, 5, model, NULL);

  PrintPCA(model);

  DelPCAModel(&model);
  DelMatrix(&m);
}
Esempio n. 14
0
void test4()
{
  matrix *m; /* Data matrix */
  PCAMODEL *model;
  int run = SIGSCIENTIFICRUN;
  NewMatrix(&m, 3, 2);

  setMatrixValue(m, 0, 0, 0.424264);  setMatrixValue(m, 0, 1, 0.565685);
  setMatrixValue(m, 1, 0, 0.565685);  setMatrixValue(m, 1, 1, 0.424264);
  setMatrixValue(m, 2, 0, 0.707101);  setMatrixValue(m, 2, 1, 0.707101);

  NewPCAModel(&model);


  printf("Test PCA 4\n");
  PCA(m, 1, 5, model, &run);

  PrintPCA(model);

  DelPCAModel(&model);
  DelMatrix(&m);
}
Esempio n. 15
0
void test5()
{
  matrix *m; /* Data matrix */
  PCAMODEL *model;

  NewMatrix(&m, 3, 4);

  setMatrixValue(m, 0, 0, 0.424264);  setMatrixValue(m, 0, 1, 0.565685);  setMatrixValue(m, 0, 2, 0.565685);  setMatrixValue(m, 0, 3, 0.424264);
  setMatrixValue(m, 1, 0, 0.565685);  setMatrixValue(m, 1, 1, 0.424264);  setMatrixValue(m, 1, 2, 0.424264);  setMatrixValue(m, 1, 3, 0.565685);
  setMatrixValue(m, 2, 0, 0.707101);  setMatrixValue(m, 2, 1, 0.707101);  setMatrixValue(m, 2, 2, 0.707101);  setMatrixValue(m, 2, 3, 0.707101);


  NewPCAModel(&model);

  printf("Test PCA 5\n");
  PCA(m, 1, 5, model, NULL);

  PrintPCA(model);

  DelPCAModel(&model);
  DelMatrix(&m);
}
Esempio n. 16
0
void test7()
{
  matrix *m;
  PCAMODEL *model;

  int nobj = 200;
  int nvars = 32000;
  NewMatrix(&m, nobj, nvars);

  srand(nobj);
  for(size_t i = 0; i < nobj; i++){
    for(size_t j = 0; j < nvars; j++){
      m->data[i][j] = randDouble(0,20);
    }
  }

  NewPCAModel(&model);

  PCA(m, 1, 5, model, NULL);

  DelPCAModel(&model);
  DelMatrix(&m);
}
Esempio n. 17
0
void test2()
{
  size_t i;
  matrix *m; /* Data matrix */
  dvector *R;
  int run = SIGSCIENTIFICSTOP;
  NewMatrix(&m, 14, 7);

  m->data[0][0] = 4.0000;  m->data[0][1] = 4.0000;  m->data[0][2] = 1.0000;  m->data[0][3] = 84.1400;  m->data[0][4] = 1.0500;  m->data[0][5] = 235.1500;  m->data[0][6] = 357.1500;
  m->data[1][0] = 5.0000;  m->data[1][1] = 5.0000;  m->data[1][2] = 1.0000;  m->data[1][3] = 79.1000;  m->data[1][4] = 0.9780;  m->data[1][5] = 1.5090;  m->data[1][6] = 231.0000;
  m->data[2][0] = 4.0000;  m->data[2][1] = 5.0000;  m->data[2][2] = 1.0000;  m->data[2][3] = 67.0900;  m->data[2][4] = 0.9700;  m->data[2][5] = 249.0000;  m->data[2][6] = 403.0000;
  m->data[3][0] = 4.0000;  m->data[3][1] = 4.0000;  m->data[3][2] = 1.0000;  m->data[3][3] = 68.0700;  m->data[3][4] = 0.9360;  m->data[3][5] = 187.3500;  m->data[3][6] = 304.5500;
  m->data[4][0] = 3.0000;  m->data[4][1] = 4.0000;  m->data[4][2] = 2.0000;  m->data[4][3] = 68.0800;  m->data[4][4] = 1.0300;  m->data[4][5] = 363.0000;  m->data[4][6] = 529.0000;
  m->data[5][0] = 9.0000;  m->data[5][1] = 7.0000;  m->data[5][2] = 1.0000;  m->data[5][3] = 129.1600;  m->data[5][4] = 1.0900;  m->data[5][5] = 258.0000;  m->data[5][6] = 510.0000;
  m->data[6][0] = 10.0000;  m->data[6][1] = 8.0000;  m->data[6][2] = 0.0000;  m->data[6][3] = 128.1600;  m->data[6][4] = 1.1500;  m->data[6][5] = 352.0000;  m->data[6][6] = 491.0000;
  m->data[7][0] = 6.0000;  m->data[7][1] = 6.0000;  m->data[7][2] = 0.0000;  m->data[7][3] = 78.1118;  m->data[7][4] = 0.8765;  m->data[7][5] = 278.6400;  m->data[7][6] = 353.3000;
  m->data[8][0] = 16.0000;  m->data[8][1] = 10.0000;  m->data[8][2] = 0.0000;  m->data[8][3] = 202.2550;  m->data[8][4] = 1.2710;  m->data[8][5] = 429.1500;  m->data[8][6] = 666.6500;
  m->data[9][0] = 6.0000;  m->data[9][1] = 12.0000;  m->data[9][2] = 0.0000;  m->data[9][3] = 84.1600;  m->data[9][4] = 0.7800;  m->data[9][5] = 279.0000;  m->data[9][6] = 354.0000;
  m->data[10][0] = 4.0000;  m->data[10][1] = 8.0000;  m->data[10][2] = 1.0000;  m->data[10][3] = 72.1100;  m->data[10][4] = 0.8900;  m->data[10][5] = 164.5000;  m->data[10][6] = 339.0000;
  m->data[11][0] = 4.0000;  m->data[11][1] = 9.0000;  m->data[11][2] = 1.0000;  m->data[11][3] = 71.1100;  m->data[11][4] = 0.8660;  m->data[11][5] = 210.0000;  m->data[11][6] = 360.0000;
  m->data[12][0] = 5.0000;  m->data[12][1] = 11.0000;  m->data[12][2] = 1.0000;  m->data[12][3] = 85.1500;  m->data[12][4] = 0.8620;  m->data[12][5] = 266.0000;  m->data[12][6] = 379.0000;
  m->data[13][0] = 5.0000;  m->data[13][1] = 10.0000;  m->data[13][2] = 1.0000;  m->data[13][3] = 86.1300;  m->data[13][4] = 0.8800;  m->data[13][5] = 228.0000;  m->data[13][6] = 361.0000;

  puts("Test 2");
  initDVector(&R);

  PCARankValidation(m, 5, 1, 3, 20, &R, &run);

  puts("-----------------");
  puts("PC\t R^2");
  for(i = 0; i < R->size; i++)
    printf("%zu\t%f\n", i+1, getDVectorValue(R, i));
  puts("-----------------");

  DelDVector(&R);
  DelMatrix(&m);
}
Esempio n. 18
0
void test1()
{
  matrix *m; /* Data matrix */
  PCAMODEL *model;
  int run = SIGSCIENTIFICRUN;

  NewMatrix(&m, 14, 7);


  m->data[0][0] = 4.0000;  m->data[0][1] = 4.0000;  m->data[0][2] = 1.0000;  m->data[0][3] = 84.1400;  m->data[0][4] = 1.0500;  m->data[0][5] = 235.1500;  m->data[0][6] = 357.1500;
  m->data[1][0] = 5.0000;  m->data[1][1] = 5.0000;  m->data[1][2] = 1.0000;  m->data[1][3] = 79.1000;  m->data[1][4] = 0.9780;  m->data[1][5] = 1.5090;  m->data[1][6] = 231.0000;
  m->data[2][0] = 4.0000;  m->data[2][1] = 5.0000;  m->data[2][2] = 1.0000;  m->data[2][3] = 67.0900;  m->data[2][4] = 0.9700;  m->data[2][5] = 249.0000;  m->data[2][6] = 403.0000;
  m->data[3][0] = 4.0000;  m->data[3][1] = 4.0000;  m->data[3][2] = 1.0000;  m->data[3][3] = 68.0700;  m->data[3][4] = 0.9360;  m->data[3][5] = 187.3500;  m->data[3][6] = 304.5500;
  m->data[4][0] = 3.0000;  m->data[4][1] = 4.0000;  m->data[4][2] = 2.0000;  m->data[4][3] = 68.0800;  m->data[4][4] = 1.0300;  m->data[4][5] = 363.0000;  m->data[4][6] = 529.0000;
  m->data[5][0] = 9.0000;  m->data[5][1] = 7.0000;  m->data[5][2] = 1.0000;  m->data[5][3] = 129.1600;  m->data[5][4] = 1.0900;  m->data[5][5] = 258.0000;  m->data[5][6] = 510.0000;
  m->data[6][0] = 10.0000;  m->data[6][1] = 8.0000;  m->data[6][2] = 0.0000;  m->data[6][3] = 128.1600;  m->data[6][4] = 1.1500;  m->data[6][5] = 352.0000;  m->data[6][6] = 491.0000;
  m->data[7][0] = 6.0000;  m->data[7][1] = 6.0000;  m->data[7][2] = 0.0000;  m->data[7][3] = 78.1118;  m->data[7][4] = 0.8765;  m->data[7][5] = 278.6400;  m->data[7][6] = 353.3000;
  m->data[8][0] = 16.0000;  m->data[8][1] = 10.0000;  m->data[8][2] = 0.0000;  m->data[8][3] = 202.2550;  m->data[8][4] = 1.2710;  m->data[8][5] = 429.1500;  m->data[8][6] = 666.6500;
  m->data[9][0] = 6.0000;  m->data[9][1] = 12.0000;  m->data[9][2] = 0.0000;  m->data[9][3] = 84.1600;  m->data[9][4] = 0.7800;  m->data[9][5] = 279.0000;  m->data[9][6] = 354.0000;
  m->data[10][0] = 4.0000;  m->data[10][1] = 8.0000;  m->data[10][2] = 1.0000;  m->data[10][3] = 72.1100;  m->data[10][4] = 0.8900;  m->data[10][5] = 164.5000;  m->data[10][6] = 339.0000;
  m->data[11][0] = 4.0000;  m->data[11][1] = 9.0000;  m->data[11][2] = 1.0000;  m->data[11][3] = 71.1100;  m->data[11][4] = 0.8660;  m->data[11][5] = 210.0000;  m->data[11][6] = 360.0000;
  m->data[12][0] = 5.0000;  m->data[12][1] = 11.0000;  m->data[12][2] = 1.0000;  m->data[12][3] = 85.1500;  m->data[12][4] = 0.8620;  m->data[12][5] = 266.0000;  m->data[12][6] = 379.0000;
  m->data[13][0] = 5.0000;  m->data[13][1] = 10.0000;  m->data[13][2] = 1.0000;  m->data[13][3] = 86.1300;  m->data[13][4] = 0.8800;  m->data[13][5] = 228.0000;  m->data[13][6] = 361.0000;


  NewPCAModel(&model);


  printf("Test PCA 1\n");
  PCA(m, 1, 5, model, &run);

  PrintPCA(model);

  DelPCAModel(&model);
  DelMatrix(&m);
}
Esempio n. 19
0
/* last column must be an integer column which define the classes */
void LDA(matrix *mx, uivector *y, LDAMODEL *lda)
{
  size_t i, j, l, k, cc, imin, imax;
  array *classes;
  array *S;
  matrix *X, *X_T, *Sb, *Sw, *InvSw_Sb;
  dvector *mutot;
  dvector *classmu;
  dvector *evect_, *ldfeature;
  matrix *covmx;
  
  
  lda->nclass = 0;
  
  
  imin = imax = y->data[0];
  
  for(i = 1; i < y->size; i++){
    if(y->data[i] > imax){
      imax = y->data[i];
    }
    
    if(y->data[i] < imin){
      imin = y->data[i];
    }
  }
  
  /* get the number of classes */
  if(imin == 0){
    lda->class_start = 0;
    lda->nclass = imax + 1;
  }
  else{
    lda->class_start = 1;
    lda->nclass = imax;
  }
  
  /*printf("nclass %d\n", (int)lda->nclass);*/
  
  /* Copy data */
  NewMatrix(&X, mx->row, mx->col);
  MatrixCopy(mx, &X);
  MatrixCheck(X);
  /*
  for(j = 0; j < mx->col-1; j++){
    for(i = 0; i < mx->row; i++){
      X->data[i][j] = mx->data[i][j];
    }
  }
  */
  
  /*create classes of objects */
  NewArray(&classes, lda->nclass);
  UIVectorResize(&lda->classid, mx->row);
  j = 0;
  if(imin == 0){
    for(k = 0; k < lda->nclass; k++){
      cc = 0;
      for(i = 0; i < X->row; i++){
        if(y->data[i] == k)
          cc++;
        else
          continue;
      }
      NewArrayMatrix(&classes, k, cc, X->col);
      
      cc = 0;
      for(i = 0; i < X->row; i++){
        if(y->data[i] == k){
          for(l = 0; l < X->col; l++){
            classes->m[k]->data[cc][l] = X->data[i][l];
          }
          lda->classid->data[j] = i;
          j++;
          cc++;
        }
        else{
          continue;
        }
      }
    }
  }
  else{
    for(k = 0; k < lda->nclass; k++){
      cc = 0;
      for(i = 0; i < X->row; i++){
        if(y->data[i] == k+1)
          cc++;
        else
          continue;
      }
      NewArrayMatrix(&classes, k, cc, X->col);
      
      cc = 0;
      for(i = 0; i < X->row; i++){
        if(y->data[i] == k+1){
          for(l = 0; l < X->col; l++){
            classes->m[k]->data[cc][l] = X->data[i][l];
          }
          lda->classid->data[j] = i;
          j++;
          cc++;
        }
        else{
          continue;
        }
      }
    }
  }
  
  /*puts("Classes"); PrintArray(classes);*/
  
  /* Compute the prior probability */
  for(k = 0; k < classes->order; k++){
    DVectorAppend(&lda->pprob, (classes->m[k]->row/(double)X->row));
  }
  
  /*
  puts("Prior Probability"); 
  PrintDVector(lda->pprob);
  */
  
  /*Compute the mean of each class*/
  for(k = 0; k < classes->order; k++){
    initDVector(&classmu);
    MatrixColAverage(classes->m[k], &classmu);

    MatrixAppendRow(&lda->mu, classmu);

    DelDVector(&classmu);
  }
  
  /*puts("Class Mu");
  FindNan(lda->mu);
  PrintMatrix(lda->mu);*/
  
  /*Calculate the total mean of samples..*/
  initDVector(&mutot);
  MatrixColAverage(X, &mutot);
  
  /*puts("Mu tot");
  PrintDVector(mutot);*/
  
  /*NewDVector(&mutot, mu->col);
  
  for(k = 0; k < mu->row; k++){
    for(i = 0; i < mu->col; i++){
      mutot->data[i] += mu->data[k][i];
    }
  }
  
  for(i = 0; i < mutot->size; i++){
    mutot->data[i] /= nclasses;
  }*/
  
  
  /*Centering data before computing the scatter matrix*/
  for(k = 0; k < classes->order; k++){
    for(i = 0; i < classes->m[k]->row; i++){
      for(j = 0; j < classes->m[k]->col; j++){
        classes->m[k]->data[i][j] -= mutot->data[j];
      }
    }
  }
  
  /*
  puts("Classes");
  for(i = 0; i < classes->order; i++){
    FindNan(classes->m[i]);
  }
   PrintArray(classes);
  */
  /*Compute the scatter matrix
   * S = nobj - 1 * covmx
   */
  initArray(&S);
  NewMatrix(&covmx, X->col, X->col);
  for(k = 0; k < classes->order; k++){
    matrix *m_T;
    NewMatrix(&m_T, classes->m[k]->col, classes->m[k]->row);
    MatrixTranspose(classes->m[k], m_T);
    
    MatrixDotProduct(m_T, classes->m[k], covmx);
    
    for(i = 0; i < covmx->row; i++){
      for(j = 0; j < covmx->col; j++){
        covmx->data[i][j] /= classes->m[k]->row;
      }
    }
    ArrayAppendMatrix(&S, covmx);
    MatrixSet(covmx, 0.f);
    DelMatrix(&m_T);
  }
  /*
  puts("Scatter Matrix");
  for(i = 0; i < S->order; i++)
    FindNan(S->m[i]);

  PrintArray(S);*/
  
  /* Compute the class scatter which represent the covariance matrix */
  NewMatrix(&Sw, X->col, X->col);
  
  for(k = 0; k < S->order; k++){
    for(i = 0; i  < S->m[k]->row; i++){
      for(j = 0; j  < S->m[k]->col; j++){
        Sw->data[i][j] += (double)(classes->m[k]->row/(double)X->row) *  S->m[k]->data[i][j];
      }
    }
  }
  /*
  puts("Class scatter matrix Sw");
  FindNan(Sw);
  PrintMatrix(Sw);
  */
  /*Compute the between class scatter matrix Sb*/
  NewMatrix(&Sb, X->col, X->col);
  for(k = 0; k < lda->mu->row; k++){ /*for each class of object*/
    cc = classes->m[k]->row;
    for(i = 0; i < Sb->row; i++){
      for(j = 0; j < Sb->col; j++){
        Sb->data[i][j] += cc * (lda->mu->data[k][i] - mutot->data[i]) * (lda->mu->data[k][j] - mutot->data[j]);
      }
    }
  }

  /*
  puts("Between class scatter matrix Sb");
  FindNan(Sb);
  PrintMatrix(Sb); */
  
  /* Computing the LDA projection */
  /*puts("Compute Matrix Inversion");*/
  MatrixInversion(Sw, &lda->inv_cov);

  double ss = 0.f;
  for(i = 0; i < lda->inv_cov->row; i++){
    for(j = 0; j < lda->inv_cov->col; j++){
      ss += square(lda->inv_cov->data[i][j]);
    }
    if(_isnan_(ss))
      break;
  }
  
  if(FLOAT_EQ(ss, 0.f, EPSILON) || _isnan_(ss)){
    /*Do SVD as pseudoinversion accordin to Liu et al. because matrix is nonsingular
     *
     * JUN LIU et al, Int. J. Patt. Recogn. Artif. Intell. 21, 1265 (2007). DOI: 10.1142/S0218001407005946
     * EFFICIENT PSEUDOINVERSE LINEAR DISCRIMINANT ANALYSIS AND ITS NONLINEAR FORM FOR FACE RECOGNITION
     *
     *
     * Sw`^-1 = Q * G^-1 * Q_T
     * Q G AND Q_T come from SVD
     */
    MatrixPseudoinversion(Sw, &lda->inv_cov);

    /*
    NewMatrix(&A_T, Sw->col, Sw->row);
    MatrixInversion(Sw, &A_T);
    NewMatrix(&A_T_Sw, A_T->row, Sw->col);
    MatrixDotProduct(A_T, Sw, A_T_Sw);
    
    initMatrix(&A_T_Sw_inv);
    MatrixInversion(A_T_Sw, &A_T_Sw_inv);
    
    MatrixDotProduct(A_T_Sw_inv, A_T, lda->inv_cov);
    DelMatrix(&A_T);
    DelMatrix(&A_T_Sw);
    DelMatrix(&A_T_Sw_inv);
    */
  }

  /*puts("Inverted Covariance Matrix from Sw");
   FindNan(lda->inv_cov);
   PrintMatrix(lda->inv_cov);
  */
  /*puts("Compute Matrix Dot Product");*/
  NewMatrix(&InvSw_Sb, lda->inv_cov->row, Sb->col);
  MatrixDotProduct(lda->inv_cov, Sb, InvSw_Sb);
  
  /*puts("InvSw_Sb"); PrintMatrix(InvSw_Sb);*/
  /*puts("Compute Eigenvectors");*/
  EVectEval(InvSw_Sb, &lda->eval, &lda->evect);
  /*EvectEval3(InvSw_Sb, InvSw_Sb->row, &lda->eval, &lda->evect);*/
  /*EVectEval(InvSw_Sb, &lda->eval, &lda->evect); */
  
  /* Calculate the new projection in the feature space 
   * 
   * and the multivariate normal distribution
   */
/*       Remove centering data   */
  for(k = 0; k < classes->order; k++){
    for(i = 0; i < classes->m[k]->row; i++){
      for(j = 0; j < classes->m[k]->col; j++){
        classes->m[k]->data[i][j] += mutot->data[j];
      }
    }
  }
    
  initMatrix(&X_T);
  
  for(k = 0; k < classes->order; k++){
    /*printf("row %d  col %d\n", (int)classes->m[k]->row, (int)classes->m[k]->col);*/
    AddArrayMatrix(&lda->features, classes->m[k]->row, classes->m[k]->col);
    AddArrayMatrix(&lda->mnpdf, classes->m[k]->row, classes->m[k]->col);
  }
  
  NewDVector(&evect_, lda->evect->row);
  initDVector(&ldfeature);
  
  ResizeMatrix(&lda->fmean, classes->order, lda->evect->col);
  ResizeMatrix(&lda->fsdev, classes->order, lda->evect->col);
  
  for(l = 0; l < lda->evect->col; l++){
    
    for(i = 0; i < lda->evect->row; i++){
      evect_->data[i] = lda->evect->data[i][l];
    }
    
    for(k = 0; k < classes->order; k++){
      
      ResizeMatrix(&X_T, classes->m[k]->col, classes->m[k]->row);
      MatrixTranspose(classes->m[k], X_T);
      DVectorResize(&ldfeature, classes->m[k]->row);
      
      DVectorMatrixDotProduct(X_T, evect_, ldfeature);
      
      for(i = 0; i < ldfeature->size; i++){
        lda->features->m[k]->data[i][l] = ldfeature->data[i];
      }
      
/*        Calculate the multivariate normal distribution  */
      double mean = 0.f, sdev = 0.f;
      DVectorMean(ldfeature, &mean);
      DVectorSDEV(ldfeature, &sdev);
      
      lda->fmean->data[k][l] = mean;
      lda->fsdev->data[k][l] = sdev;
      for(i = 0; i < ldfeature->size; i++){
        lda->mnpdf->m[k]->data[i][l] = 1./sqrt(2 * pi* sdev) * exp(-square((ldfeature->data[i] - mean)/sdev)/2.f);
      }
    }
  }
  
  DelDVector(&evect_);
  DelMatrix(&covmx);
  DelDVector(&ldfeature);
  DelDVector(&mutot);
  DelMatrix(&Sb);
  DelMatrix(&InvSw_Sb);
  DelArray(&classes);
  DelArray(&S);
  DelMatrix(&Sw);
  DelMatrix(&X_T);
  DelMatrix(&X);
}
Esempio n. 20
0
void LDAPrediction(matrix *mx, LDAMODEL *lda, matrix **pfeatures, matrix **probability, matrix **mnpdf, uivector **classprediction)
{
  /* probability function:
   * f = mu_class * inv_cov * mx.T  - 1/2. * mu_class * inv_cov * mu_class.T + ln(prior_probability_class)
   */
  size_t i, j, argmax, id;
  matrix *mx_T;
  dvector *x, *mu, *C_x_T, *C_mu_T, *ldfeature, *evect_;
  
  NewMatrix(&mx_T, mx->col, mx->row);
  MatrixTranspose(mx, mx_T);
  
  NewDVector(&C_x_T, lda->inv_cov->row);
  NewDVector(&C_mu_T, lda->inv_cov->row);
  
  ResizeMatrix(probability, mx->row, lda->nclass);
  
  for(i = 0; i < mx_T->col; i++){
    x = getMatrixColumn(mx_T, i); /* object k*/
    for(j = 0; j < lda->nclass; j++){
      mu = getMatrixRow(lda->mu, j); /*each row correspond to a class of objects*/
      MatrixDVectorDotProduct(lda->inv_cov, x, C_x_T);
      MatrixDVectorDotProduct(lda->inv_cov, mu, C_mu_T);
      (*probability)->data[i][j] = DVectorDVectorDotProd(mu, C_x_T) - (0.5 * DVectorDVectorDotProd(mu, C_mu_T)) + log(lda->pprob->data[j]);
      DVectorSet(C_x_T, 0.f);
      DVectorSet(C_mu_T, 0.f);
      DelDVector(&mu);
    }
    DelDVector(&x);
  }
  
  for(i = 0; i < (*probability)->row; i++){
    argmax = 0;
    for(j = 1; j < (*probability)->col; j++){
      if((*probability)->data[i][j] > (*probability)->data[i][argmax]){
        argmax = j;
      }
      else{
        continue;
      }
    }
    
    if(lda->class_start  == 0){
      UIVectorAppend(classprediction, argmax);
    }
    else{
      UIVectorAppend(classprediction, argmax+1);
    }
  }
  
  /* Predict the the new projection in the feature space */
  ResizeMatrix(mnpdf, mx->row, lda->evect->col);
  NewDVector(&ldfeature, mx->row);
  for(i = 0; i < lda->evect->col; i++){
    evect_ = getMatrixColumn(lda->evect, i);
    DVectorMatrixDotProduct(mx_T, evect_, ldfeature);
    DelDVector(&evect_);
    MatrixAppendCol(pfeatures, ldfeature);
    
    for(j = 0; j < ldfeature->size; j++){
      id = (*classprediction)->data[j];
      if(lda->class_start == 1)
        id -= 1;
      
      (*mnpdf)->data[j][i] = 1./sqrt(2 * pi* lda->fsdev->data[id][i]) * exp(-square((ldfeature->data[j] - lda->fmean->data[id][i])/lda->fsdev->data[id][i])/2.f);
    }
    
    DVectorSet(ldfeature, 0.f);
  }

  DelDVector(&ldfeature);
  DelMatrix(&mx_T);
  DelDVector(&C_x_T);
  DelDVector(&C_mu_T);
}
Esempio n. 21
0
void *LDARandomGroupCVModel(void *arg_)
{
  size_t i, j, k, n, g;
  lda_rgcv_th_arg *arg;
  matrix *gid; /* randomization and storing id for each random group into a matrix */  
  
  /* Matrix for compute the PLS models for groups */
  matrix *subX;
  uivector *subY;
  LDAMODEL *subm;
  
  /*matrix to predict*/
  matrix *predictX;
  uivector *realY;
  
  
  dvector *sens, *spec, *ppv, *npv, *acc;
  
  initDVector(&sens);
  initDVector(&spec);
  initDVector(&ppv);
  initDVector(&npv);
  initDVector(&acc);
  
  arg = (lda_rgcv_th_arg*) arg_;
  
  NewMatrix(&gid, arg->group, (size_t)ceil(arg->mx->row/(double)arg->group));

  /* Divide in group  all the Dataset */
  MatrixSet(gid, -1);

  /* step 1 generate the random groups */
  k = 0;
  for(i = 0; i <  gid->row; i++){
    for(j = 0; j <  gid->col; j++){
      do{
        /*n = randInt(0, arg->mx->row);*/
        n = (size_t)myrand_r(&arg->srand_init) % (arg->mx->row);
      } while(ValInMatrix(gid, n) == 1 && k < (arg->mx->row));
      if(k < arg->mx->row){
        gid->data[i][j] = n;
        k++;
      }
      else
        continue;
    }
  }
  
  /*
  puts("Gid Matrix");
  PrintMatrix(gid);
  */
      /*
    printf("Excuded the group number %u\n", (unsigned int)g);
    puts("Sub Model\nX:");
    PrintArray(subX);
    puts("Y:");
    PrintArray(subY);
    
    puts("\n\nPredict Group\nX:");
    PrintArray(predictX);
    puts("RealY:");
    PrintArray(realY);
    */
  /*step 2*/
  for(g = 0; g < gid->row; g++){ /*For aeach group */ 
    /* Estimate how many objects are inside the sub model without the group "g" */
    n = 0;
    for(i = 0; i < gid->row; i++){
      if(i != g){
        for(j = 0; j < gid->col; j++){
          if((int)gid->data[i][j] != -1)
            n++;
          else
            continue; 
        }
      }
      else
        continue;
    }
    
    /*Allocate the submodel*/
    NewMatrix(&subX, n, arg->mx->col);
    NewUIVector(&subY, n);
    
    /* Estimate how many objects are inside the group "g" to predict*/
    n = 0;
    for(j = 0; j < gid->col; j++){
      if((int)gid->data[g][j] != -1)
        n++;
      else
        continue; 
    }
    
    
    /*Allocate the */
    NewMatrix(&predictX, n, arg->mx->col);
    NewUIVector(&realY, n);

    /* copy the submodel values */
    
    for(i = 0, k = 0; i < gid->row; i++){
      if(i != g){
        for(j = 0; j < gid->col; j++){
          size_t a =  (size_t)gid->data[i][j]; /* get the row index */
          if(a != -1){
            for(n = 0; n < arg->mx->col; n++){
              /*setMatrixValue(subX, k, n, getMatrixValue(arg->mx, a, n));*/
              subX->data[k][n] = arg->mx->data[a][n];
            }
            subY->data[k] = arg->my->data[a];
            k++;
          }
          else{
            continue;
          }
        }
      }
      else{
        continue;
      }
    }
    
    /* copy the objects to predict into predictmx*/
    for(j = 0, k = 0; j < gid->col; j++){
      size_t a = (size_t)gid->data[g][j];
      if(a != -1){
        for(n = 0; n < arg->mx->col; n++){
          predictX->data[k][n] = arg->mx->data[a][n];
        }
        realY->data[k] = arg->my->data[a];
        k++;
      }
      else{
        continue;
      }
    }
    
    NewLDAModel(&subm);
    
    LDA(subX, subY, subm);
    
    LDAError(predictX, realY, subm, &sens, &spec, &ppv, &npv, &acc);
    
    if(arg->sens->size == 0){
      DVectorCopy(sens, &arg->sens);
    }
    else{
      for(i = 0; i < sens->size; i++){
        arg->sens->data[i] += sens->data[i];
      }
    }
    
    if(arg->spec->size == 0){
      DVectorCopy(spec, &arg->spec);
    }
    else{
      for(i = 0; i < spec->size; i++){
        arg->spec->data[i] += spec->data[i];
      }
    }
    
    if(arg->ppv->size == 0){
      DVectorCopy(ppv, &arg->ppv);
    }
    else{
      for(i = 0; i < ppv->size; i++){
        arg->ppv->data[i] += ppv->data[i];
      }
    }
    
    if(arg->npv->size == 0){
      DVectorCopy(npv, &arg->npv);
    }
    else{
      for(i = 0; i < npv->size; i++){
        arg->npv->data[i] += npv->data[i];
      }
    }
        
    if(arg->acc->size == 0){
      DVectorCopy(acc, &arg->acc);
    }
    else{
      for(i = 0; i < acc->size; i++){
        arg->acc->data[i] += acc->data[i];
      }
    }
    
    DelLDAModel(&subm);
    DelMatrix(&subX);
    DelUIVector(&subY);
    DelMatrix(&predictX);
    DelUIVector(&realY);
  }
  
  DelDVector(&acc);
  DelDVector(&sens);
  DelDVector(&spec);
  DelDVector(&ppv);
  DelDVector(&npv);
  DelMatrix(&gid);
  return 0;
}
Esempio n. 22
0
/**
 * @brief Used to create and initialise a new instance of the Matrix3d struct
 * @return A pointer to the new Matrix3d* instance
 */
Matrix3d* CreateMatrix() {
	return NewMatrix(CreateVector(), CreateVector(), CreateVector());
}
Esempio n. 23
0
void LDALOOCV(matrix* mx, uivector* my, dvector** sens, dvector** spec, dvector** ppv, dvector** npv, dvector **acc, size_t nthreads, ssignal *s)
{
 if(mx->row == my->size){
    size_t i, j, k, l, th, model;
    pthread_t *threads;
    lda_loocv_th_arg *arg;

    threads = xmalloc(sizeof(pthread_t)*nthreads);
    arg = xmalloc(sizeof(lda_loocv_th_arg)*nthreads);
    
    /* initialize threads arguments.. */
    for(th = 0; th < nthreads; th++){
      NewMatrix(&arg[th].submx, mx->row-1, mx->col);
      NewUIVector(&arg[th].submy, my->size-1);
      NewMatrix(&arg[th].predmx, 1, mx->col);
      NewUIVector(&arg[th].predmy, 1);
      initDVector(&arg[th].sens);
      initDVector(&arg[th].spec);
      initDVector(&arg[th].ppv);
      initDVector(&arg[th].npv);
      initDVector(&arg[th].acc);
    }
    
    
    for(model = 0; model < mx->row; model += nthreads){ /* we compute mx->row models  */
      if(s != NULL && (*s) == SIGSCIENTIFICSTOP){
        break;
      }
      else{
        
        /* copy data into subX, subY, predictX and predictY for each thread argument
         * and run the thread
         */
        for(th = 0; th < nthreads; th++){
          if(th+model < mx->row){
            l = 0;
            for(j = 0; j < mx->row; j++){
              if(j != model+th){
                for(k = 0; k  < mx->col; k++){
                  /*setMatrixValue(arg[th].submx, l, k, getMatrixValue(mx, j, k));*/
                  arg[th].submx->data[l][k] = mx->data[j][k];
                }
                arg[th].submy->data[l] = my->data[j];
                l++;
              }
              else{
                for(k = 0; k < mx->col; k++){
                  arg[th].predmx->data[0][k] = mx->data[j][k];
                }
                arg[th].predmy->data[0] = my->data[j];
              }
            }
            
            pthread_create(&threads[th], NULL, LDALOOModel, (void*) &arg[th]);
          }
          else{
            continue;
          }
        }
        
        /* Wait till threads are complete before main continues. Unless we  */
        /* wait we run the risk of executing an exit which will terminate   */
        /* the process and all threads before the threads have completed.   */
        for(th = 0; th < nthreads; th++){
          if(th+model < mx->row){
            pthread_join(threads[th], NULL);
          }
          else{
            continue;
          }
        }

        /*Collapse the threads output*/
        for(th = 0; th < nthreads; th++){
          if((*sens)->size == 0){
            DVectorCopy(arg[th].sens, sens);
          }
          else{
            for(i = 0; i < arg[th].sens->size; i++){
              (*sens)->data[i] += arg[th].sens->data[i];
            }
          }
          
          if((*spec)->size == 0){
            DVectorCopy(arg[th].spec, spec);
          }
          else{
            for(i = 0; i < arg[th].spec->size; i++){
              (*spec)->data[i] += arg[th].spec->data[i];
            }
          }
          
          if((*ppv)->size == 0){
            DVectorCopy(arg[th].ppv, ppv);
          }
          else{
            for(i = 0; i < arg[th].ppv->size; i++){
              (*ppv)->data[i] += arg[th].ppv->data[i];
            }
          }
          
          if((*npv)->size == 0){
            DVectorCopy(arg[th].npv, npv);
          }
          else{
            for(i = 0; i < arg[th].npv->size; i++){
              (*npv)->data[i] += arg[th].npv->data[i];
            }
          }
          
          if((*acc)->size == 0){
            DVectorCopy(arg[th].acc, acc);
          }
          else{
            for(i = 0; i < arg[th].acc->size; i++){
              (*acc)->data[i] += arg[th].acc->data[i];
            }
          }
        }
      }
    }
    
    /*Delete thread arguments*/
    
    for(th = 0; th < nthreads; th++){
      DelMatrix(&arg[th].submx);
      DelUIVector(&arg[th].submy);
      DelMatrix(&arg[th].predmx);
      DelUIVector(&arg[th].predmy);
      DelDVector(&arg[th].sens);
      DelDVector(&arg[th].spec);
      DelDVector(&arg[th].ppv);
      DelDVector(&arg[th].npv);
      DelDVector(&arg[th].acc);
    }
    
    /*Finalize the output by dividing for the number of models*/
    for(i = 0; i < (*sens)->size; i++){
      (*sens)->data[i] /= mx->row;
      (*spec)->data[i] /= mx->row;
      (*ppv)->data[i] /= mx->row;
      (*npv)->data[i] /= mx->row;
      (*acc)->data[i] /= mx->row;
    }
    xfree(arg);
    xfree(threads);
  }
  else{
    fprintf(stderr, "Error!! Unable to compute LDA Leave One Out Validation!!\n");
  }
}
Esempio n. 24
0
void CodonData::FillCodonMatrixFromDNA(const NucleotideData *dnaData){
	//first we need to convert the nucleotide data to codons numbered 0-60 or 61 and assign them back to the terminals
	//codons are ordered AAA, AAC, AAG, AAT, ACA, ... TTT
	short pos1, pos2, pos3;

	nChar = dnaData->NChar()/3;
	nTax = dnaData->NTax();
	if(dnaData->NChar() % 3 != 0) throw ErrorException("Codon datatype specified, but number of nucleotides not divisible by 3!");  
	NewMatrix(nTax, nChar);

	//this will just map from the bitwise format to the index format (A, C, G, T = 0, 1, 2, 3)
	//partial ambiguity is mapped to total ambiguity currently
	short bitwiseToIndexFormat[16] = {15,0,1,15,2,15,15,15,3,15,15,15,15,15,15,15};

	//keep track of the empirical base freqs at the codon positions, for possible use 
	//in the F1x4 or F3x4 methods of calculating the equilibrium codon freqs
	empBaseFreqsPos1[0]=empBaseFreqsPos1[1]=empBaseFreqsPos1[2]=empBaseFreqsPos1[3]=ZERO_POINT_ZERO;
	empBaseFreqsPos2[0]=empBaseFreqsPos2[1]=empBaseFreqsPos2[2]=empBaseFreqsPos2[3]=ZERO_POINT_ZERO;
	empBaseFreqsPos3[0]=empBaseFreqsPos3[1]=empBaseFreqsPos3[2]=empBaseFreqsPos3[3]=ZERO_POINT_ZERO;

	FLOAT_TYPE total = ZERO_POINT_ZERO;

	int tax=0, thisCodonNum;
	for(int tax=0;tax<NTax();tax++){
		bool firstAmbig = true;
		for(int cod=0;cod<nChar;cod++){
			short p1 = dnaData->Matrix(tax, cod*3);
			short p2 = dnaData->Matrix(tax, cod*3+1);
			short p3 = dnaData->Matrix(tax, cod*3+2);

			pos1 = bitwiseToIndexFormat[p1];
			pos2 = bitwiseToIndexFormat[p2];
			pos3 = bitwiseToIndexFormat[p3];
			
			thisCodonNum=(pos1)*16 + (pos2)*4 + pos3;
			
			if(pos1==15||pos2==15||pos3==15){//check for gaps or ambiguity
				if(pos1+pos2+pos3 != 45){
					//warn about gaps or ambiguity in codons
					if(firstAmbig){
						outman.UserMessageNoCR("Gaps or ambiguity codes found within codon for taxon %s.\n\tCodons coded as missing for that taxon: ", dnaData->TaxonLabel(tax));
						firstAmbig = false;
						}
					outman.UserMessageNoCR("%d ", cod+1);
					}
				thisCodonNum=64;
				}
			else{
				empBaseFreqsPos1[pos1] += ONE_POINT_ZERO;
				empBaseFreqsPos2[pos2] += ONE_POINT_ZERO;
				empBaseFreqsPos3[pos3] += ONE_POINT_ZERO;
				total += ONE_POINT_ZERO;
				}

			char prot;
			//note that a return code of 20 from the codon lookup indicates a stop codon, but a protein code of 20 generally means total ambiguity
			if(thisCodonNum != 64){
				prot = code.CodonLookup(thisCodonNum);
				if(prot == 20){
					string c;
					char b[4]={'A','C','G','T'};
					c += b[pos1];
					c += b[pos2];
					c += b[pos3];
					throw ErrorException("stop codon %s found at codon site %d (nuc site %d) in taxon %s.  Bailing out.", c.c_str(), cod+1, cod*3+1,  dnaData->TaxonLabel(tax));
					}
				}

			if(thisCodonNum == 64)//missing or ambiguous 
				matrix[tax][cod] = maxNumStates;
			else 
				matrix[tax][cod] = code.Map64stateToNonStops(thisCodonNum);
			}
		if(firstAmbig == false) outman.UserMessage("");
		}
	for(int b=0;b<4;b++){
		empBaseFreqsAllPos[b] = (empBaseFreqsPos1[b] + empBaseFreqsPos2[b] + empBaseFreqsPos3[b]) / (3.0 * total);

		empBaseFreqsPos1[b] /= total;
		empBaseFreqsPos2[b] /= total;
		empBaseFreqsPos3[b] /= total;
		}
	}
bool PrimitivesTypedValuesUseFunction::runStep(const openfluid::base::SimulationStatus* SimStatus)
{
  openfluid::core::Unit* TU;
  unsigned int TUID;
  unsigned int CurStep;

  double RefDouble;
  long RefLong;
  bool RefBool;
  std::string RefString;
  unsigned long RefVectorSize = 40;
  unsigned long RefMatrixColsNb = 4;
  unsigned long RefMatrixRowsNb = 3;

  double VarDouble;
  long VarLong;
  bool VarBool;
  std::string VarString;
  openfluid::core::VectorValue VarVectorVal;
  openfluid::core::MatrixValue VarMatrixVal;
  openfluid::core::MapValue VarMapVal;

  double NewDouble;
  long NewLong;
  bool NewBool;
  std::string NewString;
  unsigned long NewVectorSize = 5;
  unsigned long NewMatrixColsNb = RefMatrixColsNb + 1;
  unsigned long NewMatrixRowsNb = RefMatrixRowsNb + 1;

  DECLARE_UNITS_ORDERED_LOOP(1);


  BEGIN_UNITS_ORDERED_LOOP(1,"TestUnits",TU)


  TUID = TU->getID();
  CurStep = SimStatus->getCurrentStep();

  RefDouble = (double)TUID/10;
  RefLong = TUID;
  RefBool = (TUID%2 == 0);
  RefString = Glib::ustring::compose("ID %1",TUID);

  NewDouble = TUID*CurStep*0.1;
  NewLong = TUID*CurStep*10;
  NewBool = ((TUID*CurStep)%2 == 0);
  NewString = Glib::ustring::compose("%1 %2x%3","strvalue",TUID,CurStep);



  // double

  OPENFLUID_GetVariable(TU,"tests.double",CurStep,VarDouble);
  if (!openfluid::tools::IsCloseEnough(VarDouble,RefDouble,0.00001))
    OPENFLUID_RaiseError("tests.primitivestypedvalues.use","incorrect double value (tests.double) get by reference");

  OPENFLUID_SetVariable(TU,"tests.double",CurStep,NewDouble);

  OPENFLUID_GetVariable(TU,"tests.double",CurStep,VarDouble);
  if (!openfluid::tools::IsCloseEnough(VarDouble,NewDouble,0.00001))
    OPENFLUID_RaiseError("tests.primitivestypedvalues.use","incorrect double value after update (tests.double)");

  if (!OPENFLUID_IsTypedVariableExist(TU,"tests.double",openfluid::core::Value::DOUBLE))
    OPENFLUID_RaiseError("tests.primitivestypedvalues.use","incorrect OPENFLUID_IsTypedVariableExist (tests.double, DOUBLE)");


  // long

  OPENFLUID_GetVariable(TU,"tests.integer",CurStep,VarLong);
  if (VarLong != RefLong)
    OPENFLUID_RaiseError("tests.primitivestypedvalues.use","incorrect long value (tests.integer) get by reference");

  OPENFLUID_SetVariable(TU,"tests.integer",CurStep,NewLong);

  OPENFLUID_GetVariable(TU,"tests.integer",CurStep,VarLong);
  if (VarLong != NewLong)
    OPENFLUID_RaiseError("tests.primitivestypedvalues.use","incorrect long value after update (tests.integer)");

  if (!OPENFLUID_IsTypedVariableExist(TU,"tests.integer",openfluid::core::Value::INTEGER))
    OPENFLUID_RaiseError("tests.primitivestypedvalues.use","incorrect OPENFLUID_IsTypedVariableExist (tests.integer, INTEGER)");


  // bool

  OPENFLUID_GetVariable(TU,"tests.bool",CurStep,VarBool);
  if (VarBool != RefBool)
    OPENFLUID_RaiseError("tests.primitivestypedvalues.use","incorrect bool value (tests.bool) get by reference");

  OPENFLUID_SetVariable(TU,"tests.bool",CurStep,NewBool);

  OPENFLUID_GetVariable(TU,"tests.bool",CurStep,VarBool);
  if (VarBool != NewBool)
    OPENFLUID_RaiseError("tests.primitivestypedvalues.use","incorrect bool value after update (tests.bool)");

  if (!OPENFLUID_IsTypedVariableExist(TU,"tests.bool",openfluid::core::Value::BOOLEAN))
    OPENFLUID_RaiseError("tests.primitivestypedvalues.use","incorrect OPENFLUID_IsTypedVariableExist (tests.bool, BOOLEAN)");


  // string

  OPENFLUID_GetVariable(TU,"tests.string",CurStep,VarString);
  if (VarString != RefString)
    OPENFLUID_RaiseError("tests.primitivestypedvalues.use","incorrect string value (tests.string) get by reference");

  OPENFLUID_SetVariable(TU,"tests.string",CurStep,NewString);

  OPENFLUID_GetVariable(TU,"tests.string",CurStep,VarString);
  if (VarString != NewString)
    OPENFLUID_RaiseError("tests.primitivestypedvalues.use","incorrect string value after update (tests.string)");

  if (!OPENFLUID_IsTypedVariableExist(TU,"tests.string",openfluid::core::Value::STRING))
    OPENFLUID_RaiseError("tests.primitivestypedvalues.use","incorrect OPENFLUID_IsTypedVariableExist (tests.string, STRING)");


  // vector

  OPENFLUID_GetVariable(TU,"tests.vector",CurStep,VarVectorVal);
  if (VarVectorVal.getSize() != RefVectorSize)
      OPENFLUID_RaiseError("tests.primitivestypedvalues.use","incorrect vector size get by reference");

  openfluid::core::VectorValue NewVect(NewVectorSize,NewDouble);
  OPENFLUID_SetVariable(TU,"tests.vector",CurStep,NewVect);

  OPENFLUID_GetVariable(TU,"tests.vector",CurStep,VarVectorVal);
  if (VarVectorVal.getSize() != NewVectorSize)
    OPENFLUID_RaiseError("tests.primitivestypedvalues.use","incorrect vector size after update");
  if (!openfluid::tools::IsCloseEnough(VarVectorVal[0],NewDouble,0.00001))
    OPENFLUID_RaiseError("tests.primitivestypedvalues.use","incorrect vector value at index 0 after update");
  if (!openfluid::tools::IsCloseEnough(VarVectorVal[4],NewDouble,0.00001))
    OPENFLUID_RaiseError("tests.primitivestypedvalues.use","incorrect vector value at index 4 after update");

  if (!OPENFLUID_IsTypedVariableExist(TU,"tests.vector",openfluid::core::Value::VECTOR))
    OPENFLUID_RaiseError("tests.primitivestypedvalues.use","incorrect OPENFLUID_IsTypedVariableExist (tests.vector, VECTOR)");


  // old style vector

  VarVectorVal.clear();
  OPENFLUID_GetVariable(TU,"tests.oldvector",CurStep,VarVectorVal);
  if (VarVectorVal.getSize() != RefVectorSize)
      OPENFLUID_RaiseError("tests.primitivestypedvalues.use","incorrect oldvector size get by reference");

  OPENFLUID_SetVariable(TU,"tests.oldvector",CurStep,NewVect);

  OPENFLUID_GetVariable(TU,"tests.oldvector",CurStep,VarVectorVal);
  if (VarVectorVal.getSize() != NewVectorSize)
    OPENFLUID_RaiseError("tests.primitivestypedvalues.use","incorrect oldvector size after update");
  if (!openfluid::tools::IsCloseEnough(VarVectorVal[0],NewDouble,0.00001))
    OPENFLUID_RaiseError("tests.primitivestypedvalues.use","incorrect oldvector value at index 0 after update");
  if (!openfluid::tools::IsCloseEnough(VarVectorVal[4],NewDouble,0.00001))
    OPENFLUID_RaiseError("tests.primitivestypedvalues.use","incorrect oldvector value at index 4 after update");

  if (!OPENFLUID_IsTypedVariableExist(TU,"tests.oldvector",openfluid::core::Value::VECTOR))
    OPENFLUID_RaiseError("tests.primitivestypedvalues.use","incorrect OPENFLUID_IsTypedVariableExist (tests.oldvector, VECTOR)");


  // matrix

  OPENFLUID_GetVariable(TU,"tests.matrix",CurStep,VarMatrixVal);
  if (VarMatrixVal.getColsNbr() != RefMatrixColsNb)
    OPENFLUID_RaiseError("tests.primitivestypedvalues.use","incorrect matrix cols nb get by reference");
  if (VarMatrixVal.getRowsNbr() != RefMatrixRowsNb)
    OPENFLUID_RaiseError("tests.primitivestypedvalues.use","incorrect matrix rows nb get by reference");

  openfluid::core::MatrixValue NewMatrix(NewMatrixColsNb,NewMatrixRowsNb,NewDouble);
  OPENFLUID_SetVariable(TU,"tests.matrix",CurStep,NewMatrix);

  OPENFLUID_GetVariable(TU,"tests.matrix",CurStep,VarMatrixVal);
  if (VarMatrixVal.getColsNbr() != NewMatrixColsNb)
    OPENFLUID_RaiseError("tests.primitivestypedvalues.use","incorrect matrix cols nb after update");
  if (VarMatrixVal.getRowsNbr() != NewMatrixRowsNb)
    OPENFLUID_RaiseError("tests.primitivestypedvalues.use","incorrect matrix rows nb after update");
  if (!openfluid::tools::IsCloseEnough(VarMatrixVal.get(0,0),NewDouble,0.00001))
    OPENFLUID_RaiseError("tests.primitivestypedvalues.use","incorrect matrix value at index 0,0 after update");
  if (!openfluid::tools::IsCloseEnough(VarMatrixVal.get(4,3),NewDouble,0.00001))
    OPENFLUID_RaiseError("tests.primitivestypedvalues.use","incorrect matrix value at index 4,3 after update");

  if (!OPENFLUID_IsTypedVariableExist(TU,"tests.matrix",openfluid::core::Value::MATRIX))
    OPENFLUID_RaiseError("tests.primitivestypedvalues.use","incorrect OPENFLUID_IsTypedVariableExist (tests.matrix, MATRIX)");


  // map

  OPENFLUID_GetVariable(TU,"tests.map",CurStep,VarMapVal);
  if (VarMapVal.getSize() != 2)
    OPENFLUID_RaiseError("tests.primitivestypedvalues.use","incorrect map size get by reference");

  openfluid::core::MapValue NewMap;
  NewMap.setString("key1",NewString);
  NewMap.setDouble("key2",NewDouble);
  NewMap.setBoolean("key3",NewBool);
  OPENFLUID_SetVariable(TU,"tests.map",CurStep,NewMap);

  OPENFLUID_GetVariable(TU,"tests.map",CurStep,VarMapVal);
  if (VarMapVal.getSize() != 3)
    OPENFLUID_RaiseError("tests.primitivestypedvalues.use","incorrect map size after update");
  if (VarMapVal.getString("key1") != NewString)
    OPENFLUID_RaiseError("tests.primitivestypedvalues.use","incorrect map value at key key1 after update");
  if (!openfluid::tools::IsCloseEnough(VarMapVal.getDouble("key2"),NewDouble,0.00001))
    OPENFLUID_RaiseError("tests.primitivestypedvalues.use","incorrect map value at key key2 after update");
  if (VarMapVal.getBoolean("key3") != NewBool)
    OPENFLUID_RaiseError("tests.primitivestypedvalues.use","incorrect map value at key key3 after update");

  if (!OPENFLUID_IsTypedVariableExist(TU,"tests.map",openfluid::core::Value::MAP))
    OPENFLUID_RaiseError("tests.primitivestypedvalues.use","incorrect OPENFLUID_IsTypedVariableExist (tests.map, MAP)");


  // none

  if (!OPENFLUID_IsTypedVariableExist(TU,"tests.none",openfluid::core::Value::NONE))
    OPENFLUID_RaiseError("tests.primitivestypedvalues.use","incorrect OPENFLUID_IsTypedVariableExist (tests.none, NONE)");


  if (!OPENFLUID_IsVariableExist(TU,"tests.none",CurStep,openfluid::core::Value::DOUBLE))
    OPENFLUID_RaiseError("tests.primitivestypedvalues.use","incorrect OPENFLUID_IsVariableExist (tests.none, DOUBLE)");

  VarDouble = 0.0;
  OPENFLUID_GetVariable(TU,"tests.none",CurStep,VarDouble);
  if (!openfluid::tools::IsCloseEnough(VarDouble,RefDouble,0.00001))
    OPENFLUID_RaiseError("tests.primitivestypedvalues.use","incorrect double value (tests.none)");


  OPENFLUID_SetVariable(TU,"tests.none",CurStep,NewLong);

  if (!OPENFLUID_IsVariableExist(TU,"tests.none",CurStep,openfluid::core::Value::INTEGER))
    OPENFLUID_RaiseError("tests.primitivestypedvalues.use","incorrect OPENFLUID_IsVariableExist (tests.none, INTEGER)");

  VarLong = 0;
  OPENFLUID_GetVariable(TU,"tests.none",CurStep,VarLong);
  if (VarLong != NewLong)
    OPENFLUID_RaiseError("tests.primitivestypedvalues.use","incorrect long value (tests.none)");


  OPENFLUID_SetVariable(TU,"tests.none",CurStep,openfluid::core::NullValue());

  if (!OPENFLUID_IsVariableExist(TU,"tests.none",CurStep,openfluid::core::Value::NULLL))
    OPENFLUID_RaiseError("tests.primitivestypedvalues.use","incorrect OPENFLUID_IsVariableExist (tests.none, NULL)");


  OPENFLUID_SetVariable(TU,"tests.none",CurStep,NewBool);

  if (!OPENFLUID_IsVariableExist(TU,"tests.none",CurStep,openfluid::core::Value::BOOLEAN))
    OPENFLUID_RaiseError("tests.primitivestypedvalues.use","incorrect OPENFLUID_IsVariableExist (tests.none, BOOLEAN)");

  VarBool = false;
  OPENFLUID_GetVariable(TU,"tests.none",CurStep,VarBool);
  if (VarBool != NewBool)
    OPENFLUID_RaiseError("tests.primitivestypedvalues.use","incorrect boolean value (tests.none)");


  OPENFLUID_SetVariable(TU,"tests.none",CurStep,NewString);

  if (!OPENFLUID_IsVariableExist(TU,"tests.none",CurStep,openfluid::core::Value::STRING))
    OPENFLUID_RaiseError("tests.primitivestypedvalues.use","incorrect OPENFLUID_IsVariableExist (tests.none, STRING)");

  VarString= "";
  OPENFLUID_GetVariable(TU,"tests.none",CurStep,VarString);
  if (VarString != NewString)
    OPENFLUID_RaiseError("tests.primitivestypedvalues.use","incorrect string value (tests.none)");


  OPENFLUID_SetVariable(TU,"tests.none",CurStep,NewVect);

  if (!OPENFLUID_IsVariableExist(TU,"tests.none",CurStep,openfluid::core::Value::VECTOR))
    OPENFLUID_RaiseError("tests.primitivestypedvalues.use","incorrect OPENFLUID_IsVariableExist (tests.none, VECTOR)");

  VarVectorVal.clear();
  OPENFLUID_GetVariable(TU,"tests.none",CurStep,VarVectorVal);
  if (VarVectorVal.size() != NewVect.size())
    OPENFLUID_RaiseError("tests.primitivestypedvalues.use","incorrect vector size value (tests.none)");
  if (!openfluid::tools::IsCloseEnough(VarVectorVal[4],NewDouble,0.00001))
    OPENFLUID_RaiseError("tests.primitivestypedvalues.use","incorrect vector value at index 4 (tests.none)");


  OPENFLUID_SetVariable(TU,"tests.none",CurStep,NewMatrix);

  if (!OPENFLUID_IsVariableExist(TU,"tests.none",CurStep,openfluid::core::Value::MATRIX))
    OPENFLUID_RaiseError("tests.primitivestypedvalues.use","incorrect OPENFLUID_IsVariableExist (tests.none, MATRIX)");

  VarMatrixVal.clear();
  OPENFLUID_GetVariable(TU,"tests.none",CurStep,VarMatrixVal);
  if (VarMatrixVal.size() != NewMatrix.size())
    OPENFLUID_RaiseError("tests.primitivestypedvalues.use","incorrect matrix size value (tests.none)");
  if (!openfluid::tools::IsCloseEnough(VarMatrixVal.get(4,3),NewDouble,0.00001))
    OPENFLUID_RaiseError("tests.primitivestypedvalues.use","incorrect matrix value at index 4,3 (tests.none)");


  OPENFLUID_SetVariable(TU,"tests.none",CurStep,NewMap);

  if (!OPENFLUID_IsVariableExist(TU,"tests.none",CurStep,openfluid::core::Value::MAP))
    OPENFLUID_RaiseError("tests.primitivestypedvalues.use","incorrect OPENFLUID_IsVariableExist (tests.none, MAP)");

  VarMapVal.clear();
  OPENFLUID_GetVariable(TU,"tests.none",CurStep,VarMapVal);
  if (VarMapVal.size() != NewMap.size())
    OPENFLUID_RaiseError("tests.primitivestypedvalues.use","incorrect map size value (tests.none)");
  if (VarMapVal.getBoolean("key3") != NewBool)
    OPENFLUID_RaiseError("tests.primitivestypedvalues.use","incorrect map value at key key3 (tests.none)");


  END_LOOP


  return true;
}
Esempio n. 26
0
SMatrix ReadSparse(char *name, char *probName)
{
	FILE *fp;
	long n, m, i, j;
	long n_rows, tmp;
	long numer_lines;
	long colnum, colsize, rownum, rowsize;
	char buf[100], type[4];
	SMatrix M, F;

	if (!name || name[0] == 0) {
		fp = stdin;
	} else {
		fp = fopen(name, "r");
	}

	if (!fp) {
		Error("Error opening file\n");
	}

	fscanf(fp, "%72c", buf);

	fscanf(fp, "%8c", probName);
	probName[8] = 0;
	DumpLine(fp);

	for (i=0; i<5; i++) {
	  fscanf(fp, "%14c", buf);
	  sscanf(buf, "%ld", &tmp);
	  if (i == 3)
	    numer_lines = tmp;
	}
	DumpLine(fp);

	fscanf(fp, "%3c", type);
	type[3] = 0;
	if (!(type[0] != 'C' && type[1] == 'S' && type[2] == 'A')) {
	  fprintf(stderr, "Wrong type: %s\n", type);
	  exit(0);
	}

	fscanf(fp, "%11c", buf); /* pad */

	fscanf(fp, "%14c", buf); sscanf(buf, "%ld", &n_rows);

	fscanf(fp, "%14c", buf); sscanf(buf, "%ld", &n);

	fscanf(fp, "%14c", buf); sscanf(buf, "%ld", &m);

	fscanf(fp, "%14c", buf); sscanf(buf, "%ld", &tmp);
	if (tmp != 0)
	  printf("This is not an assembled matrix!\n");
	if (n_rows != n)
	  printf("Matrix is not symmetric\n");
	DumpLine(fp);

	fscanf(fp, "%16c", buf);
	ParseIntFormat(buf, &colnum, &colsize);
	fscanf(fp, "%16c", buf);
	ParseIntFormat(buf, &rownum, &rowsize);
	fscanf(fp, "%20c", buf);
	fscanf(fp, "%20c", buf);
		
	DumpLine(fp); /* format statement */

	M = NewMatrix(n, m, 0);

	ReadVector(fp, n+1, M.col, colnum, colsize);

	ReadVector(fp, m, M.row, rownum, rowsize);

	for (i=0; i<numer_lines; i++) /* dump numeric values */
	  DumpLine(fp);

	for (i=0; i<n; i++)
		ISort(M, i);

	for (i=0; i<=n; i++)
	  M.startrow[i] = M.col[i];

	fclose(fp);

	F = LowerToFull(M);

	maxm = 0;
	for (i=0; i<n; i++)
	  if (F.col[i+1]-F.col[i] > maxm)
	    maxm = F.col[i+1]-F.col[i];

	if (F.nz) {
	  for (j=0; j<n; j++)
	    for (i=F.col[j]; i<F.col[j+1]; i++)
	      F.nz[i] = Value(F.row[i], j);
	}

	FreeMatrix(M);

	return(F);
}
Esempio n. 27
0
SMatrix LowerToFull(SMatrix L)
{
  SMatrix M;
  long *link, *first;
  long i, j, nextj, ind = 0;

  link = (long *) malloc(L.n*sizeof(long));
  first = (long *) malloc(L.n*sizeof(long));

  for (i=0; i<L.n; i++) {
    link[i] = first[i] = -1;
  }

  M = NewMatrix(L.n, 2*(L.m-L.n)+L.n, 0);

  for (i=0; i<L.n; i++) {
    M.col[i] = ind;

    for (j=L.col[i]; j<L.col[i+1]; j++) {
      if (L.row[j] >= i) {
	M.row[ind++] = L.row[j];
      }
    }

    j = link[i];
    while (j != -1) {
      nextj = link[j];
      M.row[ind++] = j;
      first[j]++;
      if (first[j] < L.col[j+1]) {
	AddMember(L.row[first[j]], j);
      }
      j = nextj;
    }

    first[i] = L.col[i];
    if (L.row[first[i]] == i) {
      first[i]++;
    } else {
      fprintf(stderr, "Missing diagonal: %ld: ", i);
      for (j=L.col[i]; j<L.col[i+1]; j++) {
	fprintf(stderr, "%ld ", L.row[j]);
      }
      fprintf(stderr, "\n");
    }

    if (first[i] < L.col[i+1]) {
      AddMember(L.row[first[i]], i);
    }
  }

  M.col[M.n] = ind;

  for (i=0; i<=L.n; i++) {
    M.startrow[i] = M.col[i];
  }

  if (ind != M.m) {
    printf("Lost some\n");
  }

  free(link); free(first);

  return(M);
}
int main () {

    long double h = 0.2;
    long double k = 0.04;

    long double i;
    long double t;
    long double t_min = 0;
    long double t_max = 0.4;

    long double x_min = 0;
    long double x_max = 4.0;

    long double alpha = 4 / (LM_PI * LM_PI);
    long double lambda = alpha * (k / (h * h));

    int j = (x_max - x_min) / h;
    int p = (t_max - t_min) / k;

    int d;

    long double xa = -lambda / 2.0;
    long double xb = 1 + lambda;
    long double xc = -xa;
    long double xd = 1 - lambda;

    matrix *A = NewMatrix (j, j);
    matrix *B = NewMatrix (j, j);
    matrix *w = NewMatrix (j, 1);

    for (d = 1; d <= j; d++)
    {

        Mat_SetCell (A, d, d - 1, xa);
        Mat_SetCell (A, d, d, xb);
        Mat_SetCell (A, d, d + 1, xa);

        Mat_SetCell (B, d, d - 1, xc);
        Mat_SetCell (B, d, d, xd);
        Mat_SetCell (B, d, d + 1, xc);

        Mat_SetCell (w, d, 1, f ((d) * h));
    }

    printf ("A \n");
    Mat_Print (A);

    printf ("B \n");
    Mat_Print (B);

    matrix *Ai = Mat_FindInverse (A);
    printf ("Ai \n");
    Mat_Print (Ai);

    matrix *Temp = Mat_Mult (Ai, B);

    matrix *w1;

    long double results[j + 1][p];
    int q = 0;
    int s;
    int u;

    for (t = k; t <= t_max; t += k)
    {

        for (s = 0; s <= j; s++)
            results[s][q] = Mat_GetCell (w, s + 1, 1);
        q++;

        w1 = Mat_Mult (Temp, w);
        Mat_Dispose (w);
        w = w1;
    }

    for (s = 0; s <= j; s++)
        results[s][q] = Mat_GetCell (w, s + 1, 1);

    printf ("Estimated Answer:\n\n       t ");

    for (t = t_min; t <= t_max; t += k)
        printf ("%8.5Lf ", t);
    printf ("\n");

    printf ("i\n");
    for (s = 0; s < j; s++)
    {
        printf ("%8.5Lf ", (s + 1) * h);
        for (u = 0; u <= p; u++)
        {
            printf ("%8.5Lf ", results[s][u]);
        }
        printf ("\n");
    }

    printf ("\nExact Answer:\n\n       t ");

    for (t = .4; t <= t_max; t += k)
        printf ("%8.5Lf ", t);
    printf ("\n");

    printf ("i\n");
    for (i = x_min + h; i < x_max; i += h)
    {
        printf ("%Lf ", i);
        for (t = .4; t <= t_max; t += k)
        {
            printf ("%8.5Lf ",
                    powl (LM_E, -t) * sinl (LM_PI / 2.0 * i) +
                    powl (LM_E, -t / 4.0) *
                    sinl (LM_PI / 4.0 * i));
        }
        printf ("\n");
    }

    return 0;

}
Esempio n. 29
0
void NucleotideData::CreateMatrixFromNCL(GarliReader &reader){
	NxsCharactersBlock *charblock;

	int num=0, numNuc = -1;
	do{
		charblock = reader.GetCharactersBlock(num);
		if(charblock->GetDataType() == NxsCharactersBlock::nucleotide ||
			charblock->GetDataType() == NxsCharactersBlock::dna ||
			charblock->GetDataType() == NxsCharactersBlock::rna){
			if(numNuc < 0) numNuc = num;
			else{
				throw ErrorException("Multiple characters/data blocks containing nucleotide data found in Nexus datafile!\n\tEither combine the blocks or comment one out.");
				}
			}
		else outman.UserMessage("Ignoring non-nucleotide characters block from Nexus datafile");
		num++;
		}while(num < reader.NumCharBlocks());
	if(numNuc < 0) throw ErrorException("No characters/data blocks containing nucleotide data found in Nexus datafile!");
	charblock = reader.GetCharactersBlock(numNuc);

	if(charblock->GetNumActiveChar() < charblock->GetNChar()){
		outman.UserMessageNoCR("Excluded characters:\n\t");
		for(int c=0;c<charblock->GetNCharTotal();c++)
			if(charblock->IsExcluded(c)) outman.UserMessageNoCR("%d ", c+1);
		outman.UserMessage("");
		}

//	vector<unsigned> reducedToOrigCharMap = charblock->GetOrigIndexVector();
	NxsTaxaBlock *taxablock = reader.GetTaxaBlock();
	
	int numOrigTaxa = charblock->GetNTax();
	int numActiveTaxa = charblock->GetNumActiveTaxa();
	int numOrigChar = charblock->GetNChar();
	int numActiveChar = charblock->GetNumActiveChar();
	//int num_chars = reducedToOrigCharMap.size();
	//cout << num_chars << endl;

	NewMatrix( numActiveTaxa, numActiveChar );

	// read in the data, including taxon names
	int i=0;
	for( int origTaxIndex = 0; origTaxIndex < numOrigTaxa; origTaxIndex++ ) {
		if(charblock->IsActiveTaxon(origTaxIndex)){
			//internally, blanks in taxon names will be stored as underscores
			NxsString tlabel = taxablock->GetTaxonLabel(origTaxIndex);
			tlabel.BlanksToUnderscores();
			SetTaxonLabel( i, tlabel.c_str());
			
			int j = 0;
			for( int origIndex = 0; origIndex < numOrigChar; origIndex++ ) {
				if(charblock->IsActiveChar(origIndex)){	
					unsigned char datum = '\0';
					if(charblock->IsGapState(origTaxIndex, origIndex) == true) datum = 15;
					else if(charblock->IsMissingState(origTaxIndex, origIndex) == true) datum = 15;
					else{
						int nstates = charblock->GetNumStates(origTaxIndex, origIndex);
						for(int s=0;s<nstates;s++){
							datum += CharToBitwiseRepresentation(charblock->GetState(origTaxIndex, origIndex, s));
							}
						}
					SetMatrix( i, j++, datum );
					}
				}
			i++;
			}
		}
	}
Esempio n. 30
0
void AminoacidData::CreateMatrixFromNCL(GarliReader &reader){
	NxsCharactersBlock *charblock;
	int num=0, numNuc = -1;
	do{
		charblock = reader.GetCharactersBlock(num);
		if(charblock->GetDataType() == NxsCharactersBlock::protein){
			if(numNuc < 0) numNuc = num;
			else{
				throw ErrorException("Multiple characters/data blocks containing protein data found in Nexus datafile!\n\tEither combine the blocks or comment one out.");
				}
			}
		else outman.UserMessage("Ignoring non-protein characters block from Nexus datafile");
		num++;
		}while(num < reader.NumCharBlocks());
	if(numNuc < 0) throw ErrorException("No characters/data blocks containing protein data found in Nexus datafile!");
	charblock = reader.GetCharactersBlock(numNuc);

	if(charblock->GetNumActiveChar() < charblock->GetNChar()){
		outman.UserMessageNoCR("Excluded characters:\n\t");
		for(int c=0;c<charblock->GetNCharTotal();c++)
			if(charblock->IsExcluded(c)) outman.UserMessageNoCR("%d ", c+1);
		outman.UserMessage("");
		}

//	vector<unsigned> reducedToOrigCharMap = charblock->GetOrigIndexVector();
	NxsTaxaBlock *taxablock = reader.GetTaxaBlock();
	
	int numOrigTaxa = charblock->GetNTax();
	int numActiveTaxa = charblock->GetNumActiveTaxa();
	int numOrigChar = charblock->GetNChar();
	int numActiveChar = charblock->GetNumActiveChar();
	//int num_chars = reducedToOrigCharMap.size();
	//cout << num_chars << endl;

	NewMatrix( numActiveTaxa, numActiveChar );

	// read in the data, including taxon names
	int i=0;
	for( int origTaxIndex = 0; origTaxIndex < numOrigTaxa; origTaxIndex++ ) {
		if(charblock->IsActiveTaxon(origTaxIndex)){
			//internally, blanks in taxon names will be stored as underscores
			NxsString tlabel = taxablock->GetTaxonLabel(origTaxIndex);
			tlabel.BlanksToUnderscores();
			SetTaxonLabel( i, tlabel.c_str());
			
			int j = 0;
			bool firstAmbig = true;
			for( int origIndex = 0; origIndex < numOrigChar; origIndex++ ) {
				if(charblock->IsActiveChar(origIndex)){	
					unsigned char datum = '\0';
					if(charblock->IsGapState(origTaxIndex, origIndex) == true) datum = 20;
					else if(charblock->IsMissingState(origTaxIndex, origIndex) == true) datum = 20;
					else{
						int nstates = charblock->GetNumStates(origTaxIndex, origIndex);
						//assert(nstates == 1);
						//need to deal with the possibility of multiple states represented in matrix
						//just convert to full ambiguity
						if(nstates == 1)
							datum = CharToDatum(charblock->GetState(origTaxIndex, origIndex, 0));
						else{
							if(firstAmbig){
								outman.UserMessageNoCR("Partially ambiguous characters of taxon %s converted to full ambiguity:\n\t", TaxonLabel(origTaxIndex));
								firstAmbig = false;
								}
							outman.UserMessageNoCR("%d ", origIndex+1);
							datum = CharToDatum('?');
							}
						}
					SetMatrix( i, j++, datum );
					}
				}
			if(firstAmbig == false) outman.UserMessage("");
			i++;
			}
		}
	}