void Classemes_end()
{
	delete_matrix(Tau);
	free(Tau);
	delete_matrix(Phi);
	free(Phi);
}
Exemple #2
0
void pred_generic(const unsigned int n, const double phidf, double *Z, 
  double **Ki, const unsigned int nn, double **k, double *mean, double **Sigma)
{
  int i, j;
  double **ktKi, **ktKik;

  /* ktKi <- t(k) %*% util$Ki */
  ktKi = new_matrix(n, nn);
  linalg_dsymm(CblasRight,nn,n,1.0,Ki,n,k,nn,0.0,ktKi,nn);
  /* ktKik <- ktKi %*% k */
  ktKik = new_matrix(nn, nn);
  linalg_dgemm(CblasNoTrans,CblasTrans,nn,nn,n,
               1.0,k,nn,ktKi,nn,0.0,ktKik,nn);

  /* mean <- ktKi %*% Z */
  linalg_dgemv(CblasNoTrans,nn,n,1.0,ktKi,nn,Z,1,0.0,mean,1);

  /* Sigma <- phi*(Sigma - ktKik)/df */
  for(i=0; i<nn; i++) {
    Sigma[i][i] = phidf * (Sigma[i][i] - ktKik[i][i]);
    for(j=0; j<i; j++)
      Sigma[j][i] = Sigma[i][j] = phidf * (Sigma[i][j] - ktKik[i][j]);
  }

  /* clean up */
  delete_matrix(ktKi);
  delete_matrix(ktKik);
}
Exemple #3
0
/** delete local problem */
void fclib_delete_local (struct fclib_local *problem)
{
  delete_matrix (problem->W);
  delete_matrix (problem->V);
  delete_matrix (problem->R);
  free (problem->mu);
  free (problem->q);
  if (problem->s) free (problem->s);
  delete_info (problem->info);
}
int main(int argc, char** argv)
{
  int matrix_size;
  int silent = 0;
  int optchar;
  elem_t *a, *inv, *prod;
  elem_t eps;
  double error;
  double ratio;

  while ((optchar = getopt(argc, argv, "qt:")) != EOF)
  {
    switch (optchar)
    {
    case 'q': silent = 1; break;
    case 't': s_nthread = atoi(optarg); break;
    default:
      fprintf(stderr, "Error: unknown option '%c'.\n", optchar);
      return 1;
    }
  }

  if (optind + 1 != argc)
  {
    fprintf(stderr, "Error: wrong number of arguments.\n");
  }
  matrix_size = atoi(argv[optind]);

  /* Error checking. */
  assert(matrix_size >= 1);
  assert(s_nthread >= 1);

  eps = epsilon();
  a = new_matrix(matrix_size, matrix_size);
  init_matrix(a, matrix_size, matrix_size);
  inv = invert_matrix(a, matrix_size);
  prod = multiply_matrices(a, matrix_size, matrix_size,
                           inv, matrix_size, matrix_size);
  error = identity_error(prod, matrix_size);
  ratio = error / (eps * matrix_size);
  if (! silent)
  {
    printf("error = %g; epsilon = %g; error / (epsilon * n) = %g\n",
           error, eps, ratio);
  }
  if (isfinite(ratio) && ratio < 100)
    printf("Error within bounds.\n");
  else
    printf("Error out of bounds.\n");
  delete_matrix(prod);
  delete_matrix(inv);
  delete_matrix(a);

  return 0;
}
Exemple #5
0
/* ----------------------------- MNI Header -----------------------------------
@NAME       : delete_lambda_buffer
@INPUT      : lambda_buffer - pointer to buffers used to calculate smoothness
                            of output fields for glim_image
@OUTPUT     : nothing
@RETURNS    : 
@DESCRIPTION: routine to delete buffers used for calculating
              smoothness of field
@CREATED    : Nov. 3, 1997, J. Taylor
@MODIFIED   : 
---------------------------------------------------------------------------- */
int delete_lambda_buffer(Lambda *lambda_buffer)
{
   int ibuff, itest;
   Fwhm_Info *fwhm_general;

   GI_FREE(lambda_buffer->sizes);
   GI_FREE(lambda_buffer->coord);
   GI_FREE(lambda_buffer->step);
   GI_FREE(lambda_buffer->test);

   if(lambda_buffer->is_gaussian == FALSE) {
      for(itest=0; itest<lambda_buffer->num_test; itest++) {
         fwhm_general = lambda_buffer->fwhm_general[itest];

         for(ibuff=0; ibuff<lambda_buffer->num_buffers; ibuff++) {
            GI_FREE(fwhm_general->data[ibuff]);
         }
         GI_FREE(fwhm_general->data);

         delete_matrix(fwhm_general->lambda);
         GI_FREE(fwhm_general->deriv);
      }
      if (lambda_buffer->fwhm_simple != NULL) {
         GI_FREE(lambda_buffer->fwhm_simple->deriv);

         for(ibuff=0; ibuff<lambda_buffer->num_buffers; ibuff++) {
            GI_FREE(lambda_buffer->fwhm_simple->data[ibuff]);
         }
         GI_FREE(lambda_buffer->fwhm_simple->data);
         delete_matrix(lambda_buffer->fwhm_simple->lambda);
      }
   }
   else if (lambda_buffer->fwhm_gaussian != NULL) {
      GI_FREE(lambda_buffer->fwhm_gaussian->deriv);

      for(ibuff=0; ibuff<lambda_buffer->num_buffers; ibuff++) {
         GI_FREE(lambda_buffer->fwhm_gaussian->data[ibuff]);
      }
      GI_FREE(lambda_buffer->fwhm_gaussian->data);
      delete_matrix(lambda_buffer->fwhm_gaussian->lambda);
   }

   if(lambda_buffer->is_avg == TRUE) {
      GI_FREE(lambda_buffer->fwhm_avg->deriv);

      for(ibuff=0; ibuff<lambda_buffer->num_buffers; ibuff++) {
         GI_FREE(lambda_buffer->fwhm_avg->data[ibuff]);
      }
      GI_FREE(lambda_buffer->fwhm_avg->data);
      delete_matrix(lambda_buffer->fwhm_avg->lambda);
   }

   return TRUE;

}
double * Linear_Regression::find_coeff_for_linear_regress(std::vector<Abalone> &Abalones)
{
	int number_of_features = 8;
	std::vector<double *> arr;
	for (Abalone a : Abalones)
	{
		double *tmp = new double[number_of_features + 1];
		double s = 1;
		if (a.get_Sex() == 'I'){ s = 2; }
		else if (a.get_Sex() == 'F'){ s = 3; }
		tmp[0] = s; tmp[1] = a.get_Diameter(); tmp[2] = a.get_Height(); tmp[3] = a.get_Length(); tmp[4] = a.get_Shell_weight();
		tmp[5] = a.get_Shucked_weight(); tmp[6] = a.get_Viscera_weight(); tmp[7] = a.get_Whole_weight(); tmp[8] = a.get_Rings();
		arr.push_back(tmp);
	}
	double ** F = new double*[number_of_features];
	double ** B = new double*[number_of_features];
	for (int i = 0; i < number_of_features; i++)
	{
		F[i] = new double[number_of_features];
		B[i] = new double[1];
		B[i][0] = 0;
		for (int h = 0; h < arr.size(); h++)
		{
			B[i][0] += arr[h][number_of_features] * arr[h][i];
		}
		for (int j = 0; j < number_of_features; j++)
		{
			F[i][j] = 0;
			for (int h = 0; h < arr.size(); h++)
			{
				F[i][j] += arr[h][j] * arr[h][i];
			}
		}
	}

	double ** F_inverse = inverse(F, number_of_features);
	double ** alpha = multiply(F_inverse, B, number_of_features, number_of_features, 1);
	double * res = new double[number_of_features];
	for (int i = 0; i < number_of_features; i++)
	{
		res[i] = alpha[i][0];
	}

	for (int h = 0; h < arr.size(); h++)
	{
		delete arr[h];
	}
	arr.clear();
	delete_matrix(F, number_of_features);
	delete_matrix(B, number_of_features);
	delete_matrix(alpha, number_of_features);

	return res;
}
Exemple #7
0
/** delete global problem */
void fclib_delete_global (struct fclib_global *problem)
{
  delete_matrix (problem->M);
  delete_matrix (problem->H);
  delete_matrix (problem->G);
  free (problem->mu);
  free (problem->f);
  if (problem->b) free (problem->b);
  free (problem->w);
  delete_info (problem->info);
}
void Classemes_deconstructor(Classemes* obj)
{
	assert(obj);

	if (obj->desc) {
		delete_matrix(obj->desc);
		free(obj->desc);
	}
	if (obj->desc_bin) {
		delete_matrix(obj->desc_bin);
		free(obj->desc_bin);
	}
}
Exemple #9
0
/*--------------------------------------------*/
void NOMAD::TGP_Model::clear(void)
{
    int i;

    if (_av_index)
    {
        delete [] _av_index;
        _av_index = NULL;
    }

    if (_fv_index)
    {
        delete [] _fv_index;
        _fv_index = NULL;
    }

    if (_X)
    {
        for (i = 0 ; i < _p ; ++i)
            delete [] _X[i];
        delete [] _X;
        _X = NULL;
    }

    if (_XX)
    {
        for (i = 0 ; i < _n_XX ; ++i)
            delete [] _XX[i];
        delete [] _XX;
        _XX = NULL;
    }

    if (_tgp_models)
    {
        int m = _bbot.size();
        for (i = 0 ; i < m ; ++i)
            if (_tgp_models[i])
            {
                delete _tgp_models[i];
            }
        delete [] _tgp_models;
        _tgp_models = NULL;
    }

    if (_tgp_rect)
    {
        delete_matrix(_tgp_rect);
        _tgp_rect = NULL;
    }

    _error_str.clear();
    _lb.clear();
    _ub.clear();
    _fv.clear();

    _p = _n = _n_XX = 0;

    _model_computed = false;
}
void free_linear_transform(preprocessed *prep)
{
  ASSERT(prep);
  ASSERT(prep->matrix);
  delete_fixed_matrix(prep->matrix, prep->dim);
  if (prep->offset)
    FREE(prep->offset);
  prep->matrix = NULL;
  prep->offset = NULL;
  ASSERT(prep->imelda);
  delete_matrix(prep->imelda, prep->dim);
  prep->imelda = NULL;
  ASSERT(prep->invmat);
  ASSERT(prep->inverse);
  delete_fixed_matrix(prep->invmat, prep->dim);
  delete_matrix(prep->inverse, prep->dim);
  prep->invmat = NULL;
  prep->inverse = NULL;
  return;
}
/** Matrix inversion via the Gauss-Jordan algorithm. */
static elem_t* invert_matrix(const elem_t* const a, const int n)
{
  int i, j;
  elem_t* const inv = new_matrix(n, n);
  elem_t* const tmp = new_matrix(n, 2*n);
  copy_matrix(a, n, n, 0, n, 0, n, tmp, n, 2 * n, 0, n, 0, n);
  for (i = 0; i < n; i++)
    for (j = 0; j < n; j++)
      tmp[i * 2 * n + n + j] = (i == j);
  gj(tmp, n, 2*n);
  copy_matrix(tmp, n, 2*n, 0, n, n, 2*n, inv, n, n, 0, n, 0, n);
  delete_matrix(tmp);
  return inv;
}
Exemple #12
0
int main(int argc, char** argv)
{
  int matrix_size;
  int silent;
  elem_t *a, *inv, *prod;
  elem_t eps;
  double error;
  double ratio;

  matrix_size = (argc > 1) ? atoi(argv[1]) : 3;
  s_nthread   = (argc > 2) ? atoi(argv[2]) : 3;
  silent      = (argc > 3) ? atoi(argv[3]) : 0;

  eps = epsilon();
  a = new_matrix(matrix_size, matrix_size);
  init_matrix(a, matrix_size, matrix_size);
  inv = invert_matrix(a, matrix_size);
  prod = multiply_matrices(a, matrix_size, matrix_size,
                           inv, matrix_size, matrix_size);
  error = identity_error(prod, matrix_size);
  ratio = error / (eps * matrix_size);
  if (! silent)
  {
    printf("error = %g; epsilon = %g; error / (epsilon * n) = %g\n",
           error, eps, ratio);
  }
  if (ratio < 100)
    printf("Error within bounds.\n");
  else
    printf("Error out of bounds.\n");
  delete_matrix(prod);
  delete_matrix(inv);
  delete_matrix(a);

  return 0;
}
void delete_img_features(ImgFeatures* imgf)
{
	unsigned int i;
  
	assert(imgf);
	
	for (i=0; i < imgf->n_features; ++i) {
		free(imgf->name[i]);
		delete_matrix(imgf->data[i]);
		free(imgf->data[i]);
	}
	free(imgf->name);
	free(imgf->level);
	free(imgf->data);
}
Exemple #14
0
double ssdiff(double **A, double **B, unsigned int M1,
	      unsigned int M2)
{
  double sum;	
  double **C;
  unsigned int  i, j;
  
  C = matrixdiff(A,B,M1,M2);
  
  sum = 0;
  
  for(i=0; i<M1; i++){
    for(j=0; j<M2; j++){
      sum= sum + C[i][j] * C[i][j];
    }
  }
  
  delete_matrix(C);
  
  return(sqrt(sum)/(M1*M2));
}
Exemple #15
0
void calc_ktKikx(double *ktKik, const int m, double **k, const int n,
		 double *g, const double mui, double *kxy, double **Gmui_util,
		 double *ktGmui_util, double *ktKikx)
{
  int i;
  double **Gmui;
  double *ktGmui;

  /* first calculate Gmui = g %*% t(g)/mu */
  if(!Gmui_util) Gmui = new_matrix(n, n);
  else Gmui = Gmui_util;
  linalg_dgemm(CblasNoTrans,CblasTrans,n,n,1,
               mui,&g,n,&g,n,0.0,Gmui,n);

  /* used in the for loop below */
  if(!ktGmui_util) ktGmui = new_vector(n);
  else ktGmui = ktGmui_util;

  /* loop over all of the m candidates */
  for(i=0; i<m; i++) {

    /* ktGmui = drop(t(k) %*% Gmui) */
    /* zerov(ktGmui, n); */
    linalg_dsymv(n,1.0,Gmui,n,k[i],1,0.0,ktGmui,1);

    /* ktKik += diag(t(k) %*% (g %*% t(g) * mui) %*% k) */
    if(ktKik) ktKikx[i] = ktKik[i] + linalg_ddot(n, ktGmui, 1, k[i], 1);
    else ktKikx[i] = linalg_ddot(n, ktGmui, 1, k[i], 1);

    /* ktKik.x += + 2*diag(kxy %*% t(g) %*% k) */
    ktKikx[i] += 2.0*linalg_ddot(n, k[i], 1, g, 1)*kxy[i];

    /* ktKik.x + kxy^2/mui */
    ktKikx[i] += sq(kxy[i])/mui;
  }

  /* clean up */
  if(!ktGmui_util) free(ktGmui);
  if(!Gmui_util) delete_matrix(Gmui);
}
double Linear_Regression::determinant(double **matrix_A, int m)
{
	double det = 0;
	if (m == 1)
	{
		return matrix_A[0][0];
	}
	double ***vector_matrix = new double**[m];
	for (int i = 0; i < m; i++)
	{
		vector_matrix[i] = new double*[m - 1];
		for (int j = 0; j < m - 1; j++)
		{
			vector_matrix[i][j] = new double[m - 1];
			for (int z = 0; z < m - 1; z++)
			{
				if (z < i)
				{
					vector_matrix[i][j][z] = matrix_A[j + 1][z];
				}
				else
				{
					vector_matrix[i][j][z] = matrix_A[j + 1][z + 1];
				}
			}
		}
	}
	for (int i = 0; i < m; i++)
	{
		det += pow(-1, i) * matrix_A[0][i] * determinant(vector_matrix[i], m - 1);
	}

	for (int i = 0; i < m; i++)
	{
		delete_matrix(vector_matrix[i], m - 1);
	}
	delete[] vector_matrix;

	return det;
}
Exemple #17
0
static void thread_main(void *args){
	struct work_struct *s = args;
	int tid = s->tid;
	int size = s->a_1.size;
	//printf("Thread %d Starting\n", tid);

    switch(tid){
		case 0:{
			matrix temp1 = new_matrix(size);
			matrix temp2 = new_matrix(size);
			plus(s->a_1, s->a_2, temp1);
			plus(s->b_1, s->b_2, temp2);
			strassen_mult(temp1, temp2, s->c);
			delete_matrix(temp2);
			delete_matrix(temp1);
		}
		break;
		case 1:{
			matrix temp1 = new_matrix(size);
			plus(s->a_1, s->a_2, temp1);
			strassen_mult(temp1, s->b_1, s->c);
			delete_matrix(temp1);
		}
		break;
		case 2:{
			matrix temp2 = new_matrix(size);
			minus(s->b_1, s->b_2, temp2);
			strassen_mult(s->a_1, temp2, s->c);
			delete_matrix(temp2);
		}
		break;
		case 3:{
			matrix temp2 = new_matrix(size);
			minus(s->b_1, s->b_2, temp2);
			strassen_mult(s->a_1, temp2, s->c);
			delete_matrix(temp2);
		}
		break;
		case 4:{
			matrix temp1 = new_matrix(size);
			plus(s->a_1, s->a_2, temp1);
			strassen_mult(temp1, s->b_1, s->c);
			delete_matrix(temp1);
		}
		break;
		case 5:{
			matrix temp1 = new_matrix(size);
			matrix temp2 = new_matrix(size);
			minus(s->a_1, s->a_2, temp1);
			plus(s->b_1, s->b_2, temp2);
			strassen_mult(temp1, temp2, s->c);
			delete_matrix(temp2);
			delete_matrix(temp1);
		}
		break;
		case 6:{
			matrix temp1 = new_matrix(size);
			matrix temp2 = new_matrix(size);
			minus(s->a_1, s->a_2, temp1);
			plus(s->b_1, s->b_2, temp2);
			strassen_mult(temp1, temp2, s->c);
			delete_matrix(temp2);
			delete_matrix(temp1);
		}
		break;
	}
}
 /**
   \brief destructor; needed because of dynamic allocation
 */
 ~ScoringMatrix() {delete_matrix(matrix, width);}
Exemple #19
0
int main(void) {

  // Construct a new 3x6 matrix
  MATRIX a = new_matrix(3,6);

  puts("Initial matrix a:");
  print_matrix(&a);

  puts("Modified matrix a:");
  set(&a, 1, 1, 20.0);
  set(&a, 2, 2, 40.0);
  set(&a, 0, 4, 60.0);
  set(&a, 2, 5, 80.0);
  change(&a);
  print_matrix(&a);

  puts("Element a(2,2):");
  print_value(get(&a, 2, 2));
  puts("");
  puts("Element a(0,4):");
  print_value(get(&a, 0, 4));
  puts("");

  // Construct a new 6x5 matrix
  MATRIX b = new_matrix(6,5);
  set(&b, 0, 4, 10.0);
  set(&b, 2, 3, 30.0);
  set(&b, 3, 1, 50.0);
  set(&b, 5, 0, 70.0);
  change(&b);

  puts("Matrix b:");
  print_matrix(&b);
  puts("");

  // Construct a new 4x7 matrix
  MATRIX c = new_matrix(4,7);
  set(&c, 0, 1, 10.0);
  set(&c, 1, 2, 10.0);
  set(&c, 2, 3, 10.0);
  set(&c, 3, 4, 10.0);
  set(&c, 3, 5, 10.0);
  set(&c, 2, 6, 10.0);
  change(&c);

  puts("Matrix c:");
  print_matrix(&c);
  puts("");

  // Test matprod with a product defined case
  puts("The product ab is:");
  MATRIX m = matprod(&a,&b);
  print_matrix(&m);
  puts("");

  // Test matprod with an undefined product case
  puts("The product ac is:");
  MATRIX n = matprod(&a,&c);
  print_matrix(&n);
  puts("");

  // Destruct matrices when done
  delete_matrix(a);
  delete_matrix(b);
  delete_matrix(c);
  delete_matrix(m);
  delete_matrix(n);

  return 0;
}
Exemple #20
0
main()
#endif
{
	FILE			*fp = stdin;	  /* File pointer, default stdin */
	CRITICALS		*tuples, *lower_dim_tuples;
	int				i, temp;
	BOUNDARY		**boundary;
	CUBE			*cube;
	int				n, num_rows, num_cols;
	MATRIX			matrix, tmatrix;

	printf("\ncmat - version %1.2f\n\n", VERSION_NUM);

#ifndef NO_CMD_LINE
	/* Check the command line and open file if required */
	command_line(&fp,argc, argv, &n);
#else
	/* Read command info from standard input */
	command_input(&fp, &n);
#endif

	/* Read in info from the file, setting up Fsa and so on... */
	switch (read_file_info(fp)) {
		case FORMAT_ERROR:
			ERROR(FORMAT);
		case NOT_A_GEN:
			ERROR(GEN_ERR);
	}
	fclose(fp);	/* No more reading required */

	tuples = find_n_criticals(n);
	/* remove_inverse_criticals(&tuples);  We are ignoring inverse tuples */

	/* Calc boundaries and store in an array */
	boundary = NEW(BOUNDARY *, tuples->num);

	for (i = 0; i < tuples->num; i++) {
		boundary[i] = calc_bound(cube =
					create_n_cube(tuples->info[i]->word,
					tuples->info[i]->vert, n), TRIVIAL | RETAIN_INV_TUPLES);
					/* We are ignoring inverse tuples */
		delete_cube(cube);
	}

	lower_dim_tuples = find_n_criticals(n-1);
	/* remove_inverse_criticals(&lower_dim_tuples);  Ignoring inverse tuples */

	num_rows = tuples->num;
	/* Create the matrix */
	matrix = make_matrix_n(boundary, lower_dim_tuples, &num_rows);
	num_cols = lower_dim_tuples->num;

	/* It is often useful to have rows and columns the other way */
	/* Get transpose, and swap rows and cols */
	tmatrix = transpose(matrix, num_cols, num_rows);
	temp = num_rows;
	num_rows = num_cols;
	num_cols = temp;

	/* Display....for now */
	printf("\nMatrix: rows = %d, cols = %d\n\n", num_rows, num_cols);
	show_matrix(stdout, tmatrix, num_cols, num_rows, 20);

	/*printf("\nMatrix after Gaussian Elimination...\n");
	gaussian_elim(matrix, num_cols, num_rows);
	show_matrix(stdout, matrix, num_cols, num_rows);

	rank_criticals_n = count_non_zero_rows(matrix, num_cols, num_rows);*/

	/* Clean up */
	for (i=0; i < tuples->num - Num_gens; i++)
	delete_boundary(boundary[i]);
	free(boundary);
	delete_criticals(tuples);
	delete_criticals(lower_dim_tuples);
	
	delete_matrix(matrix, num_cols);
	delete_matrix(tmatrix, num_rows);

	return 0;
}
Exemple #21
0
//expects c to be initialized
void strassen_mult(matrix a, matrix b, matrix c){
	matrix quar[12];
	matrix m[7];
	matrix temp1, temp2;
	int size = a.size/2;
	int i,j;

//	if(size==0){
//		c.rows[0][0] = a.rows[0][0] * b.rows[0][0];
//		return;
//	}
	
	if (a.size <= BREAK) {
		int i, j, k;
		for (i = 0; i < (a.size); i++) {
			for (k = 0; k < (a.size); k++) {
				for (j = 0; j < (a.size); j++) {
					c.rows[i][j] += a.rows[i][k] * b.rows[k][j];
				}
			}
		}
        
    }
	

	quar[0]=get00(a);  quar[1]=get01(a);
	quar[2]=get10(a);  quar[3]=get11(a);

	quar[4]=get00(b);  quar[5]=get01(b);
	quar[6]=get10(b);  quar[7]=get11(b);

	quar[8]=get00(c);  quar[9]=get01(c);
	quar[10]=get10(c); quar[11]=get11(c);
	
	for(i=0;i<7;i++){
		m[i] = new_matrix(size);
	}
	
	if (a.size <= BREAK)
		goto group;
		
		
	temp1 = new_matrix(size);
	temp2 = new_matrix(size);

	

	plus(quar[0], quar[3], temp1);
	plus(quar[4], quar[7], temp2);
	strassen_mult(temp1,temp2,m[0]);

	plus(quar[2], quar[3], temp1);
	strassen_mult(temp1, quar[4], m[1]);

	minus(quar[5], quar[7], temp2);
	strassen_mult(quar[0], temp2, m[2]);

	minus(quar[6], quar[4], temp2);
	strassen_mult(quar[3], temp2, m[3]);

	plus(quar[0], quar[1], temp1);
	strassen_mult(temp1, quar[7], m[4]);

	minus(quar[2], quar[0], temp1);
	plus(quar[4], quar[5], temp2);
	strassen_mult(temp1, temp2, m[5]);

	minus(quar[1], quar[3], temp1);
	plus(quar[6], quar[7], temp2);
	strassen_mult(temp1, temp2, m[6]);

	delete_matrix(temp1);
	delete_matrix(temp2);


group:
	
	for(i=0;i<size;i++){
		for(j=0;j<size;j++){
			quar[8].rows[i][j] = m[0].rows[i][j] + m[3].rows[i][j] - m[4].rows[i][j] + m[6].rows[i][j];
			quar[9].rows[i][j] = m[2].rows[i][j] + m[4].rows[i][j];
			quar[10].rows[i][j] = m[1].rows[i][j] + m[3].rows[i][j];
			quar[11].rows[i][j] = m[0].rows[i][j] - m[1].rows[i][j] + m[2].rows[i][j] + m[5].rows[i][j];
		}
	}


	for(i=0;i<12;i++){
		delete_matrix(quar[i]);
	}
	for(i=0;i<7;i++){
		delete_matrix(m[i]);
	}
}
Exemple #22
0
/*--------------------------------------------*/
bool NOMAD::TGP_Model::compute
(std::vector<NOMAD::Eval_Point *> &XX_pts            ,     // IN/OUT
 bool                               compute_Ds2x      ,   // IN
 bool                               compute_improv    ,   // IN
 bool                               pred_outside_bnds)    // IN
{
    _model_computed = false;

    if (!_error_str.empty())
        return false;

    int i , j , index_obj = -1 , n_XX0 = XX_pts.size() , m = _bbot.size();

    // check bbot: there must be exactly one objective:
    for (i = 0 ; i < m ; ++i)
    {
        if (_bbot[i] == NOMAD::OBJ)
        {
            if (index_obj < 0)
                index_obj = i;
            else
            {
                _error_str = "more than one objective";
                return false;
            }
        }
    }
    if (index_obj < 0)
    {
        _error_str = "no objective";
        return false;
    }

    // check n_XX0:
    if (n_XX0 == 0)
    {
        _error_str = "no user-provided prediction point";
        return false;
    }

    // reset XX_pts outputs:
    for (i = 0 ; i < n_XX0 ; ++i)
    {
        for (j = 0 ; j < m ; ++j)
            XX_pts[i]->set_bb_output(j , NOMAD::Double());
        XX_pts[i]->set_eval_status(NOMAD::EVAL_FAIL);
    }

    // create the XX matrix (prediction points):
    std::vector<NOMAD::Eval_Point *> XX_filtered_pts;
    NOMAD::Eval_Point               *cur2;

    // the list of points has to be filtered:
    NOMAD::Double tmp;
    bool          chk;

    for (i = 0 ; i < n_XX0 ; ++i)
    {
        if (XX_pts[i]->size() == _n0)
        {
            cur2 = XX_pts[i];
            chk  = true;
            for (j = 0 ; j < _n0 ; ++j)
            {
                tmp = (*cur2)[j];
                if (!pred_outside_bnds && (tmp < _lb[j] || tmp > _ub[j]))
                {
                    chk = false;
                    break;
                }
            }
            if (chk)
                XX_filtered_pts.push_back(cur2);
        }
    }

    if (_XX)
    {
        for (i = 0 ; i < _n_XX ; ++i)
            delete [] _XX[i];
        delete [] _XX;
    }

    _n_XX = XX_filtered_pts.size();

    if (_n_XX == 0)
    {
        _error_str = "no prediction point after filtering";
        return false;
    }

    _XX = new double * [_n_XX];
    for (i = 0 ; i < _n_XX ; ++i)
    {
        _XX[i] = new double[_n];
        for (j = 0 ; j < _n ; ++j)
            _XX[i][j] = (*XX_filtered_pts[i])[_fv_index[j]].value();
    }

    // Xsplit: X+XX: size = nsplit x n:
    int       nsplit = _p + _n_XX;
    double **Xsplit = new double * [nsplit];

    for (i = 0 ; i < _p ; ++i)
    {
        Xsplit[i] = new double [_n];
        for (j = 0 ; j < _n ; ++j)
            Xsplit[i][j] = _X[i][j];
    }

    for (i = _p ; i < nsplit ; ++i)
    {
        Xsplit[i] = new double [_n];
        for (j = 0 ; j < _n ; ++j)
            Xsplit[i][j] = _XX[i-_p][j];
    }

    // get the rectangle:
    if (_tgp_rect)
        delete_matrix(_tgp_rect);
    _tgp_rect = get_data_rect(Xsplit , nsplit , _n);

    // TGP parameters:
    Params   tgp_params(_n);
    double *dparams = NOMAD::TGP_Model::get_TGP_dparams(_n);
    tgp_params.read_double(dparams);
    delete [] dparams;

    int BTE[3];
    if (!get_BTE(BTE))
    {
        for (i = 0 ; i < nsplit ; ++i)
            delete [] Xsplit[i];
        delete [] Xsplit;
        return false;
    }

    // display BTE:
#ifdef TGP_DEBUG
    _out << std::endl
         << "BTE={" << BTE[0] << ", " << BTE[1] << ", " << BTE[2] << "}"
         << std::endl;
#endif

    // compute the individual TGP models (one for each output):
    double *ZZ = new double [_n_XX];

    // Ds2x, expected reduction in predictive variance:
    if (_Ds2x == NULL)
    {
        _Ds2x = new double * [m];
        for (i = 0 ; i < m ; ++i)
            _Ds2x[i] = NULL;
    }
    else
    {
        for (i = 0 ; i < m ; ++i)
            if (_Ds2x[i])
            {
                delete [] _Ds2x[i];
                _Ds2x[i] = NULL;
            }
    }

    // improv, expected improvement of the objective (ranks):
    if (_improv)
    {
        delete [] _improv;
        _improv = NULL;
    }
    if (compute_improv)
        _improv = new int [_n_XX];

    for (i = 0 ; i < m ; ++i)
    {

        if (_tgp_models[i])
        {

            _Ds2x[i] = (compute_Ds2x) ? new double [_n_XX] : NULL;

            _tgp_models[i]->compute(_X                              ,
                                    _XX                             ,
                                    Xsplit                          ,
                                    _n                              ,
                                    _n_XX                           ,
                                    nsplit                          ,
                                    &tgp_params                     ,
                                    _tgp_rect                       ,
                                    BTE                             ,
                                    _tgp_linburn                    ,
                                    _tgp_verb                       ,
                                    ZZ                              ,
                                    _Ds2x[i]                        ,
                                    (i==index_obj) ? _improv : NULL);

            // set XX_pts outputs #i:
            for (j = 0 ; j < _n_XX ; ++j)
            {
                XX_filtered_pts[j]->set_bb_output(i , ZZ[j]);
                XX_filtered_pts[j]->set_eval_status(NOMAD::EVAL_OK);
            }

            // check if TGP has been interrupted:
            if (NOMAD::TGP_Output_Model::get_force_quit())
            {
                _error_str = "TGP has been interrupted with ctrl-c";
                break;
            }
        }
    }

    // clear memory:
    for (i = 0 ; i < nsplit ; ++i)
        delete [] Xsplit[i];
    delete [] Xsplit;
    delete [] ZZ;

    _model_computed = _error_str.empty();

    return _model_computed;
}
Exemple #23
0
void strassen_8thread_mult(matrix a, matrix b, matrix c){
	matrix quar[12];
	matrix m[7];
	struct work_struct *jobs[7];
	int size = a.size/2;
	int i, j;
	
	if(size==0){
		c.rows[0][0] = a.rows[0][0] * b.rows[0][0];
		return;
	}

	/*
	if (a.size <= BREAK) {
		int i, j, k;
		for (i = 0; i < (a.size); i++) {
			for (k = 0; k < (a.size); k++) {
				for (j = 0; j < (a.size); j++) {
					c.rows[i][j] += a.rows[i][k] * b.rows[k][j];
				}
			}
		}
        return;
    }
	*/
	
	job_init();
	
	quar[0]=get00(a);  quar[1]=get01(a);
	quar[2]=get10(a);  quar[3]=get11(a);

	quar[4]=get00(b);  quar[5]=get01(b);
	quar[6]=get10(b);  quar[7]=get11(b);

	quar[8]=get00(c);  quar[9]=get01(c);
	quar[10]=get10(c); quar[11]=get11(c);

	for(i=0;i<7;i++){
		m[i] = new_matrix(size);
	}

	for (i = 0; i < 7; i++) {
		jobs[i] = malloc(sizeof(struct work_struct));
		if (jobs[i] == NULL) {
			perror(NULL);
			exit(1);
		}
	}
	
	jobs[0]->a_1 = quar[0];
	jobs[0]->a_2 = quar[3];
	jobs[0]->b_1 = quar[4];
	jobs[0]->b_2 = quar[7];
	jobs[0]->c = m[0];
	jobs[0]->tid = 0;
	job_create(thread_main, jobs[0], 0);


	jobs[1]->a_1 = quar[2];
	jobs[1]->a_2 = quar[3];
	jobs[1]->b_1 = quar[4];
	jobs[1]->c = m[1];
	jobs[1]->tid = 1;
	job_create(thread_main, jobs[1], 0);


	jobs[2]->a_1 = quar[0];
	jobs[2]->b_1 = quar[5];
	jobs[2]->b_2 = quar[7];
	jobs[2]->c = m[2];
	jobs[2]->tid = 2;
	job_create(thread_main, jobs[2], 0);


	jobs[3]->a_1 = quar[3];
	jobs[3]->b_1 = quar[6];
	jobs[3]->b_2 = quar[4];
	jobs[3]->c = m[3];
	jobs[3]->tid = 3;
	job_create(thread_main, jobs[3], 0);


	jobs[4]->a_1 = quar[0];
	jobs[4]->a_2 = quar[1];
	jobs[4]->b_1 = quar[7];
	jobs[4]->c = m[4];
	jobs[4]->tid = 4;
	job_create(thread_main, jobs[4], 0);


	jobs[5]->a_1 = quar[2];
	jobs[5]->a_2 = quar[0];
	jobs[5]->b_1 = quar[4];
	jobs[5]->b_2 = quar[5];
	jobs[5]->c = m[5];
	jobs[5]->tid = 5;
	job_create(thread_main, jobs[5], 0);


	jobs[6]->a_1 = quar[1];
	jobs[6]->a_2 = quar[3];
	jobs[6]->b_1 = quar[6];
	jobs[6]->b_2 = quar[7];
	jobs[6]->c = m[6];
	jobs[6]->tid = 6;
	job_create(thread_main, jobs[6], 0);


	for(i=0;i<7;i++){
		job_join(jobs[i]);
	}

	for(i=0;i<size;i++){
		for(j=0;j<size;j++){
			quar[8].rows[i][j] = m[0].rows[i][j] + m[3].rows[i][j] - m[4].rows[i][j] + m[6].rows[i][j];
			quar[9].rows[i][j] = m[2].rows[i][j] + m[4].rows[i][j];
			quar[10].rows[i][j] = m[1].rows[i][j] + m[3].rows[i][j];
			quar[11].rows[i][j] = m[0].rows[i][j] - m[1].rows[i][j] + m[2].rows[i][j] + m[5].rows[i][j];
		}
	}

	for(i=0;i<12;i++){
		delete_matrix(quar[i]);
	}
	for(i=0;i<7;i++){
		delete_matrix(m[i]);
	}
}