void save_current_iteration(List& trace_x, List& trace_pi, List& trace_A, List& trace_B, List& log_posterior, List& trace_switching_prob, arma::ivec x, NumericVector pi, NumericMatrix A, NumericMatrix B, double& loglik, NumericVector switching_prob, int index){ IntegerVector xx(x.begin(), x.end()); trace_x[index] = clone(xx); trace_pi[index] = clone(pi); trace_A[index] = clone(A); trace_B[index] = clone(B); log_posterior[index] = clone(wrap(loglik)); trace_switching_prob[index] = clone(switching_prob); }
// [[Rcpp::export]] arma::mat sgd(arma::mat& coords, arma::ivec& targets_i, // vary randomly arma::ivec& sources_j, // ordered arma::ivec& ps, // N+1 length vector of indices to start of each row j in vector is arma::vec& weights, // w{ij} const double& gamma, const double& rho, const arma::uword& n_samples, const int& M, const double& alpha, const Rcpp::Nullable<Rcpp::NumericVector> momentum, const bool& useDegree, const Rcpp::Nullable<Rcpp::NumericVector> seed, const Rcpp::Nullable<Rcpp::NumericVector> threads, const bool verbose) { #ifdef _OPENMP checkCRAN(threads); #endif const dimidxtype D = coords.n_rows; const vertexidxtype N = coords.n_cols; const edgeidxtype E = targets_i.n_elem; Visualizer* v; if (momentum.isNull()) v = new Visualizer( sources_j.memptr(), targets_i.memptr(), coords.memptr(), D, N, E, rho, n_samples, M, alpha, gamma); else { float moment = NumericVector(momentum)[0]; if (moment < 0) throw Rcpp::exception("Momentum cannot be negative."); if (moment > 0.95) throw Rcpp::exception("Bad things happen when momentum is > 0.95."); v = new MomentumVisualizer( sources_j.memptr(), targets_i.memptr(), coords.memptr(), D, N, E, rho, n_samples, moment, M, alpha, gamma); } distancetype* negweights = new distancetype[N]; std::fill(negweights, negweights + N, 0); if (useDegree) { std::for_each(targets_i.begin(), targets_i.end(), [&negweights](const sword& e) {negweights[e]++;}); } else { for (vertexidxtype p = 0; p < N; ++p) { for (edgeidxtype e = ps[p]; e != ps[p + 1]; ++e) { negweights[p] += weights[e]; } } } std::for_each(negweights, negweights + N, [](distancetype& weight) {weight = pow(weight, 0.75);}); v -> initAlias(weights.memptr(), negweights, seed); delete[] negweights; const uword batchSize = BATCHSIZE; #ifdef _OPENMP const unsigned int ts = omp_get_max_threads(); #else const unsigned int ts = 2; #endif Progress progress(max((uword) ts, n_samples / BATCHSIZE), verbose); #ifdef _OPENMP #pragma omp parallel for #endif for (unsigned int t = 0; t < ts; ++t) { v->thread(progress, batchSize); } delete v; return coords; }