Exemplo n.º 1
0
void multiply(DistSlicedMat & mat, int curoffset, double a){

  assert(a>0);
  DistVec current = mat[curoffset];
  assert(mat.start_offset <= current.offset); 
  vec result = zeros(curoffset);

  if (curoffset > 0){

#pragma omp parallel for
    for (int i=mat.start_offset; i< current.offset; i++){
      for (int k=info.get_start_node(!current.transpose); k< info.get_end_node(!current.transpose); k++){
        result[i-mat.start_offset] += latent_factors_inmem[k].pvec[i] * latent_factors_inmem[k].pvec[current.offset];
      }
    }
#pragma omp parallel for
    for (int k=info.get_start_node(!current.transpose); k< info.get_end_node(!current.transpose); k++){
      latent_factors_inmem[k].pvec[curoffset] /= a;
    }

    for (int i=mat.start_offset; i< current.offset; i++){
#pragma omp parallel for
      for (int k=info.get_start_node(!current.transpose); k< info.get_end_node(!current.transpose); k++){
        latent_factors_inmem[k].pvec[current.offset] -= result[i-mat.start_offset]/a  * latent_factors_inmem[k].pvec[i];
      }
    }
  }

  current.debug_print(current.name);
}
Exemplo n.º 2
0
void orthogonalize_vs_all(DistSlicedMat & mat, int curoffset, double &alpha){
  assert(mi.ortho_repeats >=1 && mi.ortho_repeats <= 3);
  bool old_debug = debug;
  debug = false;
  DistVec current = mat[curoffset];
  assert(mat.start_offset <= current.offset); 
  double * alphas = new double[curoffset];
  //DistDouble * alphas = new DistDouble[curoffset];
  //cout<<current.to_vec().transpose() << endl;
  if (curoffset > 0){
    for (int j=0; j < mi.ortho_repeats; j++){
      memset(alphas, 0, sizeof(double)*curoffset);
#pragma omp parallel for
      for (int i=mat.start_offset; i< current.offset; i++){
        for (int k=info.get_start_node(!current.transpose); k< info.get_end_node(!current.transpose); k++){
          assert(i-mat.start_offset>=0 && i-mat.start_offset < curoffset);
          assert(i < latent_factors_inmem[k].pvec.size());
          assert(k < (int)latent_factors_inmem.size());
          assert(current.offset < latent_factors_inmem[k].pvec.size());
          alphas[i-mat.start_offset] += latent_factors_inmem[k].pvec[i] * latent_factors_inmem[k].pvec[current.offset];
        }
      }
      for (int i=mat.start_offset; i< current.offset; i++){
#pragma omp parallel for
        for (int k=info.get_start_node(!current.transpose); k< info.get_end_node(!current.transpose); k++){
          latent_factors_inmem[k].pvec[current.offset] -= alphas[i-mat.start_offset]  * latent_factors_inmem[k].pvec[i];
        }
      }
    } //for ortho_repeast 
  }

  delete [] alphas; 
  debug = old_debug;
  current.debug_print(current.name);
  //    alpha = 0;
  double sum = 0;
  int k;
  //#pragma omp parallel for private(k) reduction(+: sum)
  for (k=info.get_start_node(!current.transpose); k< info.get_end_node(!current.transpose); k++){
    sum = sum + pow(latent_factors_inmem[k].pvec[current.offset],2);
  }    
  alpha = sqrt(sum);
  if (alpha >= 1e-10 ){
#pragma omp parallel for
    for (int k=info.get_start_node(!current.transpose); k< info.get_end_node(!current.transpose); k++){
      latent_factors_inmem[k].pvec[current.offset]/=alpha;
    }    
  }
}
Exemplo n.º 3
0
  double orthogonalize_vs_all(DistSlicedMat & mat, int _curoffset, double &alpha){
    assert(mi.ortho_repeats >=1 && mi.ortho_repeats <= 3);
    curoffset = _curoffset;
    curMat = &mat;
    mi.mat_offset = mat.start_offset;
    INITIALIZE_TRACER(orthogonalize_vs_alltrace, "orthogonalization step - optimized");
    BEGIN_TRACEPOINT(orthogonalize_vs_alltrace);
    bool old_debug = debug;
    debug = false;
    DistVec current = mat[curoffset];
    pcurrent =&current;
    mi.vec_offset = pcurrent->offset;
    assert(mat.start_offset <= current.offset); 
    vertex_set nodes = pgraph->select(selected_node);
    if (curoffset > 0){
      for (int j=0; j < mi.ortho_repeats; j++){
        INITIALIZE_TRACER(orth1, "map reduce in ortho");
        BEGIN_TRACEPOINT(orth1);
        alphas = pgraph->map_reduce_vertices<gather_type>(map_reduce_ortho, nodes);
        END_TRACEPOINT(orth1);
        //pgraph->transform_vertices(transform_ortho, nodes);
        mat[_curoffset] = mat[_curoffset].orthogonalize(); 
      } //for ortho_repeast 
    }

    debug = old_debug;
    current.debug_print(current.name);
    INITIALIZE_TRACER(orth2, "map reduce in ortho2");
    BEGIN_TRACEPOINT(orth2);
    sum_alpha = pgraph->map_reduce_vertices<gather_type>(map_reduce_sum_power, nodes);
    END_TRACEPOINT(orth2);
    sum_alpha.training_rmse = sqrt(sum_alpha.training_rmse);
    alpha = sum_alpha.training_rmse;
    if (alpha >= 1e-10 ){
       INITIALIZE_TRACER(orth3, "transform_vertices in ortho3");
       BEGIN_TRACEPOINT(orth3);
       //pgraph->transform_vertices(divide_by_sum, nodes);    
       mat[_curoffset] = mat[_curoffset] / alpha;
       END_TRACEPOINT(orth3);
    }
    END_TRACEPOINT(orthogonalize_vs_alltrace);
    return alpha;
  }
Exemplo n.º 4
0
void orthogonalize_vs_all(DistSlicedMat & mat, int curoffset){
  assert(mi.ortho_repeats >=1 && mi.ortho_repeats <= 3);
  INITIALIZE_TRACER(orthogonalize_vs_alltrace, "orthogonalization step");
  BEGIN_TRACEPOINT(orthogonalize_vs_alltrace);
  bool old_debug = debug;
  debug = false;
  DistVec current = mat[curoffset];
  //DistDouble * alphas = new DistDouble[curoffset];
  //cout<<current.to_vec().transpose() << endl;
  for (int j=0; j < mi.ortho_repeats; j++){
    for (int i=0; i< curoffset; i++){
      DistDouble alpha = mat[i]*current;
      //     //cout<<mat[i].to_vec().transpose()<<endl;
      //     //cout<<"alpha is: " <<alpha.toDouble()<<endl;
      if (alpha.toDouble() > 1e-10)
        current = current - mat[i]*alpha;
    }
  }
  END_TRACEPOINT(orthogonalize_vs_alltrace);
  debug = old_debug;
  current.debug_print(current.name);
}