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); }
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; } } }
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 =¤t; 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; }
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); }