// Generated by using Rcpp::compileAttributes() -> do not edit by hand
// Generator token: 10BE3573-1514-4C36-9D1C-5A225CD40393

#include <RcppEigen.h>
#include <Rcpp.h>

using namespace Rcpp;

#ifdef RCPP_USE_GLOBAL_ROSTREAM
Rcpp::Rostream<true>&  Rcpp::Rcout = Rcpp::Rcpp_cout_get();
Rcpp::Rostream<false>& Rcpp::Rcerr = Rcpp::Rcpp_cerr_get();
#endif

// GEDI_new
SEXP GEDI_new(List params, List aux, List target, List hyperparams, int verbose, int num_threads);
RcppExport SEXP _gedi2_GEDI_new(SEXP paramsSEXP, SEXP auxSEXP, SEXP targetSEXP, SEXP hyperparamsSEXP, SEXP verboseSEXP, SEXP num_threadsSEXP) {
BEGIN_RCPP
    Rcpp::RObject rcpp_result_gen;
    Rcpp::RNGScope rcpp_rngScope_gen;
    Rcpp::traits::input_parameter< List >::type params(paramsSEXP);
    Rcpp::traits::input_parameter< List >::type aux(auxSEXP);
    Rcpp::traits::input_parameter< List >::type target(targetSEXP);
    Rcpp::traits::input_parameter< List >::type hyperparams(hyperparamsSEXP);
    Rcpp::traits::input_parameter< int >::type verbose(verboseSEXP);
    Rcpp::traits::input_parameter< int >::type num_threads(num_threadsSEXP);
    rcpp_result_gen = Rcpp::wrap(GEDI_new(params, aux, target, hyperparams, verbose, num_threads));
    return rcpp_result_gen;
END_RCPP
}
// GEDI_set_verbose
void GEDI_set_verbose(SEXP model_ptr, int verbose);
RcppExport SEXP _gedi2_GEDI_set_verbose(SEXP model_ptrSEXP, SEXP verboseSEXP) {
BEGIN_RCPP
    Rcpp::RNGScope rcpp_rngScope_gen;
    Rcpp::traits::input_parameter< SEXP >::type model_ptr(model_ptrSEXP);
    Rcpp::traits::input_parameter< int >::type verbose(verboseSEXP);
    GEDI_set_verbose(model_ptr, verbose);
    return R_NilValue;
END_RCPP
}
// GEDI_initialize
List GEDI_initialize(SEXP model_ptr, bool multimodal);
RcppExport SEXP _gedi2_GEDI_initialize(SEXP model_ptrSEXP, SEXP multimodalSEXP) {
BEGIN_RCPP
    Rcpp::RObject rcpp_result_gen;
    Rcpp::RNGScope rcpp_rngScope_gen;
    Rcpp::traits::input_parameter< SEXP >::type model_ptr(model_ptrSEXP);
    Rcpp::traits::input_parameter< bool >::type multimodal(multimodalSEXP);
    rcpp_result_gen = Rcpp::wrap(GEDI_initialize(model_ptr, multimodal));
    return rcpp_result_gen;
END_RCPP
}
// GEDI_optimize
List GEDI_optimize(SEXP model_ptr, int iterations, int track_interval);
RcppExport SEXP _gedi2_GEDI_optimize(SEXP model_ptrSEXP, SEXP iterationsSEXP, SEXP track_intervalSEXP) {
BEGIN_RCPP
    Rcpp::RObject rcpp_result_gen;
    Rcpp::RNGScope rcpp_rngScope_gen;
    Rcpp::traits::input_parameter< SEXP >::type model_ptr(model_ptrSEXP);
    Rcpp::traits::input_parameter< int >::type iterations(iterationsSEXP);
    Rcpp::traits::input_parameter< int >::type track_interval(track_intervalSEXP);
    rcpp_result_gen = Rcpp::wrap(GEDI_optimize(model_ptr, iterations, track_interval));
    return rcpp_result_gen;
END_RCPP
}
// GEDI_train
List GEDI_train(SEXP model_ptr, int iterations, int track_interval, bool multimodal);
RcppExport SEXP _gedi2_GEDI_train(SEXP model_ptrSEXP, SEXP iterationsSEXP, SEXP track_intervalSEXP, SEXP multimodalSEXP) {
BEGIN_RCPP
    Rcpp::RObject rcpp_result_gen;
    Rcpp::RNGScope rcpp_rngScope_gen;
    Rcpp::traits::input_parameter< SEXP >::type model_ptr(model_ptrSEXP);
    Rcpp::traits::input_parameter< int >::type iterations(iterationsSEXP);
    Rcpp::traits::input_parameter< int >::type track_interval(track_intervalSEXP);
    Rcpp::traits::input_parameter< bool >::type multimodal(multimodalSEXP);
    rcpp_result_gen = Rcpp::wrap(GEDI_train(model_ptr, iterations, track_interval, multimodal));
    return rcpp_result_gen;
END_RCPP
}
// getDiffO_cpp
Eigen::VectorXd getDiffO_cpp(const Eigen::Map<Eigen::MatrixXd>& Ro, const Eigen::Map<Eigen::MatrixXd>& H_rotation, const Eigen::Map<Eigen::VectorXd>& contrast, int verbose);
RcppExport SEXP _gedi2_getDiffO_cpp(SEXP RoSEXP, SEXP H_rotationSEXP, SEXP contrastSEXP, SEXP verboseSEXP) {
BEGIN_RCPP
    Rcpp::RObject rcpp_result_gen;
    Rcpp::RNGScope rcpp_rngScope_gen;
    Rcpp::traits::input_parameter< const Eigen::Map<Eigen::MatrixXd>& >::type Ro(RoSEXP);
    Rcpp::traits::input_parameter< const Eigen::Map<Eigen::MatrixXd>& >::type H_rotation(H_rotationSEXP);
    Rcpp::traits::input_parameter< const Eigen::Map<Eigen::VectorXd>& >::type contrast(contrastSEXP);
    Rcpp::traits::input_parameter< int >::type verbose(verboseSEXP);
    rcpp_result_gen = Rcpp::wrap(getDiffO_cpp(Ro, H_rotation, contrast, verbose));
    return rcpp_result_gen;
END_RCPP
}
// getDiffQ_cpp
Eigen::MatrixXd getDiffQ_cpp(const Rcpp::List& Rk_list, const Eigen::Map<Eigen::MatrixXd>& H_rotation, const Eigen::Map<Eigen::VectorXd>& contrast, int verbose);
RcppExport SEXP _gedi2_getDiffQ_cpp(SEXP Rk_listSEXP, SEXP H_rotationSEXP, SEXP contrastSEXP, SEXP verboseSEXP) {
BEGIN_RCPP
    Rcpp::RObject rcpp_result_gen;
    Rcpp::RNGScope rcpp_rngScope_gen;
    Rcpp::traits::input_parameter< const Rcpp::List& >::type Rk_list(Rk_listSEXP);
    Rcpp::traits::input_parameter< const Eigen::Map<Eigen::MatrixXd>& >::type H_rotation(H_rotationSEXP);
    Rcpp::traits::input_parameter< const Eigen::Map<Eigen::VectorXd>& >::type contrast(contrastSEXP);
    Rcpp::traits::input_parameter< int >::type verbose(verboseSEXP);
    rcpp_result_gen = Rcpp::wrap(getDiffQ_cpp(Rk_list, H_rotation, contrast, verbose));
    return rcpp_result_gen;
END_RCPP
}
// getDiffExp_cpp
Eigen::MatrixXd getDiffExp_cpp(const Rcpp::List& Rk_list, const Eigen::Map<Eigen::MatrixXd>& H_rotation, const Eigen::Map<Eigen::VectorXd>& contrast, const Eigen::Map<Eigen::VectorXd>& D, const Rcpp::List& Bi_list, int verbose);
RcppExport SEXP _gedi2_getDiffExp_cpp(SEXP Rk_listSEXP, SEXP H_rotationSEXP, SEXP contrastSEXP, SEXP DSEXP, SEXP Bi_listSEXP, SEXP verboseSEXP) {
BEGIN_RCPP
    Rcpp::RObject rcpp_result_gen;
    Rcpp::RNGScope rcpp_rngScope_gen;
    Rcpp::traits::input_parameter< const Rcpp::List& >::type Rk_list(Rk_listSEXP);
    Rcpp::traits::input_parameter< const Eigen::Map<Eigen::MatrixXd>& >::type H_rotation(H_rotationSEXP);
    Rcpp::traits::input_parameter< const Eigen::Map<Eigen::VectorXd>& >::type contrast(contrastSEXP);
    Rcpp::traits::input_parameter< const Eigen::Map<Eigen::VectorXd>& >::type D(DSEXP);
    Rcpp::traits::input_parameter< const Rcpp::List& >::type Bi_list(Bi_listSEXP);
    Rcpp::traits::input_parameter< int >::type verbose(verboseSEXP);
    rcpp_result_gen = Rcpp::wrap(getDiffExp_cpp(Rk_list, H_rotation, contrast, D, Bi_list, verbose));
    return rcpp_result_gen;
END_RCPP
}
// compute_svd_factorized_cpp
Rcpp::List compute_svd_factorized_cpp(const Eigen::Map<Eigen::MatrixXd>& Z, const Eigen::Map<Eigen::VectorXd>& D, const Rcpp::List& Bi_list, int verbose);
RcppExport SEXP _gedi2_compute_svd_factorized_cpp(SEXP ZSEXP, SEXP DSEXP, SEXP Bi_listSEXP, SEXP verboseSEXP) {
BEGIN_RCPP
    Rcpp::RObject rcpp_result_gen;
    Rcpp::RNGScope rcpp_rngScope_gen;
    Rcpp::traits::input_parameter< const Eigen::Map<Eigen::MatrixXd>& >::type Z(ZSEXP);
    Rcpp::traits::input_parameter< const Eigen::Map<Eigen::VectorXd>& >::type D(DSEXP);
    Rcpp::traits::input_parameter< const Rcpp::List& >::type Bi_list(Bi_listSEXP);
    Rcpp::traits::input_parameter< int >::type verbose(verboseSEXP);
    rcpp_result_gen = Rcpp::wrap(compute_svd_factorized_cpp(Z, D, Bi_list, verbose));
    return rcpp_result_gen;
END_RCPP
}
// run_factorized_svd_cpp
Rcpp::List run_factorized_svd_cpp(const Eigen::Map<Eigen::MatrixXd>& Z, const Eigen::Map<Eigen::MatrixXd>& projDB, int verbose);
RcppExport SEXP _gedi2_run_factorized_svd_cpp(SEXP ZSEXP, SEXP projDBSEXP, SEXP verboseSEXP) {
BEGIN_RCPP
    Rcpp::RObject rcpp_result_gen;
    Rcpp::RNGScope rcpp_rngScope_gen;
    Rcpp::traits::input_parameter< const Eigen::Map<Eigen::MatrixXd>& >::type Z(ZSEXP);
    Rcpp::traits::input_parameter< const Eigen::Map<Eigen::MatrixXd>& >::type projDB(projDBSEXP);
    Rcpp::traits::input_parameter< int >::type verbose(verboseSEXP);
    rcpp_result_gen = Rcpp::wrap(run_factorized_svd_cpp(Z, projDB, verbose));
    return rcpp_result_gen;
END_RCPP
}
// Yi_resZ
SEXP Yi_resZ(Eigen::MatrixXd Yi, Eigen::MatrixXd QiDBi, Eigen::VectorXd si, Eigen::VectorXd o, Eigen::VectorXd oi);
RcppExport SEXP _gedi2_Yi_resZ(SEXP YiSEXP, SEXP QiDBiSEXP, SEXP siSEXP, SEXP oSEXP, SEXP oiSEXP) {
BEGIN_RCPP
    Rcpp::RObject rcpp_result_gen;
    Rcpp::RNGScope rcpp_rngScope_gen;
    Rcpp::traits::input_parameter< Eigen::MatrixXd >::type Yi(YiSEXP);
    Rcpp::traits::input_parameter< Eigen::MatrixXd >::type QiDBi(QiDBiSEXP);
    Rcpp::traits::input_parameter< Eigen::VectorXd >::type si(siSEXP);
    Rcpp::traits::input_parameter< Eigen::VectorXd >::type o(oSEXP);
    Rcpp::traits::input_parameter< Eigen::VectorXd >::type oi(oiSEXP);
    rcpp_result_gen = Rcpp::wrap(Yi_resZ(Yi, QiDBi, si, o, oi));
    return rcpp_result_gen;
END_RCPP
}
// predict_Yhat
SEXP predict_Yhat(Eigen::MatrixXd ZDBi, Eigen::MatrixXd QiDBi, Eigen::VectorXd si, Eigen::VectorXd o, Eigen::VectorXd oi);
RcppExport SEXP _gedi2_predict_Yhat(SEXP ZDBiSEXP, SEXP QiDBiSEXP, SEXP siSEXP, SEXP oSEXP, SEXP oiSEXP) {
BEGIN_RCPP
    Rcpp::RObject rcpp_result_gen;
    Rcpp::RNGScope rcpp_rngScope_gen;
    Rcpp::traits::input_parameter< Eigen::MatrixXd >::type ZDBi(ZDBiSEXP);
    Rcpp::traits::input_parameter< Eigen::MatrixXd >::type QiDBi(QiDBiSEXP);
    Rcpp::traits::input_parameter< Eigen::VectorXd >::type si(siSEXP);
    Rcpp::traits::input_parameter< Eigen::VectorXd >::type o(oSEXP);
    Rcpp::traits::input_parameter< Eigen::VectorXd >::type oi(oiSEXP);
    rcpp_result_gen = Rcpp::wrap(predict_Yhat(ZDBi, QiDBi, si, o, oi));
    return rcpp_result_gen;
END_RCPP
}
// Yi_var_M
SEXP Yi_var_M(Eigen::MatrixXd Yi, double sigma2);
RcppExport SEXP _gedi2_Yi_var_M(SEXP YiSEXP, SEXP sigma2SEXP) {
BEGIN_RCPP
    Rcpp::RObject rcpp_result_gen;
    Rcpp::RNGScope rcpp_rngScope_gen;
    Rcpp::traits::input_parameter< Eigen::MatrixXd >::type Yi(YiSEXP);
    Rcpp::traits::input_parameter< double >::type sigma2(sigma2SEXP);
    rcpp_result_gen = Rcpp::wrap(Yi_var_M(Yi, sigma2));
    return rcpp_result_gen;
END_RCPP
}
// Yi_var_M_paired
SEXP Yi_var_M_paired(Eigen::MatrixXd Yi, Eigen::SparseMatrix<double> M1i, Eigen::SparseMatrix<double> M2i, double sigma2);
RcppExport SEXP _gedi2_Yi_var_M_paired(SEXP YiSEXP, SEXP M1iSEXP, SEXP M2iSEXP, SEXP sigma2SEXP) {
BEGIN_RCPP
    Rcpp::RObject rcpp_result_gen;
    Rcpp::RNGScope rcpp_rngScope_gen;
    Rcpp::traits::input_parameter< Eigen::MatrixXd >::type Yi(YiSEXP);
    Rcpp::traits::input_parameter< Eigen::SparseMatrix<double> >::type M1i(M1iSEXP);
    Rcpp::traits::input_parameter< Eigen::SparseMatrix<double> >::type M2i(M2iSEXP);
    Rcpp::traits::input_parameter< double >::type sigma2(sigma2SEXP);
    rcpp_result_gen = Rcpp::wrap(Yi_var_M_paired(Yi, M1i, M2i, sigma2));
    return rcpp_result_gen;
END_RCPP
}
// compute_dispersion_sparse
List compute_dispersion_sparse(Eigen::MatrixXd Yi_fitted, Eigen::SparseMatrix<double> Mi, int subsample);
RcppExport SEXP _gedi2_compute_dispersion_sparse(SEXP Yi_fittedSEXP, SEXP MiSEXP, SEXP subsampleSEXP) {
BEGIN_RCPP
    Rcpp::RObject rcpp_result_gen;
    Rcpp::RNGScope rcpp_rngScope_gen;
    Rcpp::traits::input_parameter< Eigen::MatrixXd >::type Yi_fitted(Yi_fittedSEXP);
    Rcpp::traits::input_parameter< Eigen::SparseMatrix<double> >::type Mi(MiSEXP);
    Rcpp::traits::input_parameter< int >::type subsample(subsampleSEXP);
    rcpp_result_gen = Rcpp::wrap(compute_dispersion_sparse(Yi_fitted, Mi, subsample));
    return rcpp_result_gen;
END_RCPP
}
// Yi_SSE_M_paired
double Yi_SSE_M_paired(Eigen::MatrixXd Yi, Eigen::SparseMatrix<double> M1i, Eigen::SparseMatrix<double> M2i, Eigen::MatrixXd ZDBi, Eigen::MatrixXd QiDBi, Eigen::VectorXd si, Eigen::VectorXd o, Eigen::VectorXd oi, double sigma2);
RcppExport SEXP _gedi2_Yi_SSE_M_paired(SEXP YiSEXP, SEXP M1iSEXP, SEXP M2iSEXP, SEXP ZDBiSEXP, SEXP QiDBiSEXP, SEXP siSEXP, SEXP oSEXP, SEXP oiSEXP, SEXP sigma2SEXP) {
BEGIN_RCPP
    Rcpp::RObject rcpp_result_gen;
    Rcpp::RNGScope rcpp_rngScope_gen;
    Rcpp::traits::input_parameter< Eigen::MatrixXd >::type Yi(YiSEXP);
    Rcpp::traits::input_parameter< Eigen::SparseMatrix<double> >::type M1i(M1iSEXP);
    Rcpp::traits::input_parameter< Eigen::SparseMatrix<double> >::type M2i(M2iSEXP);
    Rcpp::traits::input_parameter< Eigen::MatrixXd >::type ZDBi(ZDBiSEXP);
    Rcpp::traits::input_parameter< Eigen::MatrixXd >::type QiDBi(QiDBiSEXP);
    Rcpp::traits::input_parameter< Eigen::VectorXd >::type si(siSEXP);
    Rcpp::traits::input_parameter< Eigen::VectorXd >::type o(oSEXP);
    Rcpp::traits::input_parameter< Eigen::VectorXd >::type oi(oiSEXP);
    Rcpp::traits::input_parameter< double >::type sigma2(sigma2SEXP);
    rcpp_result_gen = Rcpp::wrap(Yi_SSE_M_paired(Yi, M1i, M2i, ZDBi, QiDBi, si, o, oi, sigma2));
    return rcpp_result_gen;
END_RCPP
}
// compute_feature_projection
Eigen::VectorXd compute_feature_projection(const Eigen::Map<Eigen::VectorXd>& feature_weights, const Eigen::Map<Eigen::VectorXd>& D, const Rcpp::List& Bi_list, int verbose);
RcppExport SEXP _gedi2_compute_feature_projection(SEXP feature_weightsSEXP, SEXP DSEXP, SEXP Bi_listSEXP, SEXP verboseSEXP) {
BEGIN_RCPP
    Rcpp::RObject rcpp_result_gen;
    Rcpp::RNGScope rcpp_rngScope_gen;
    Rcpp::traits::input_parameter< const Eigen::Map<Eigen::VectorXd>& >::type feature_weights(feature_weightsSEXP);
    Rcpp::traits::input_parameter< const Eigen::Map<Eigen::VectorXd>& >::type D(DSEXP);
    Rcpp::traits::input_parameter< const Rcpp::List& >::type Bi_list(Bi_listSEXP);
    Rcpp::traits::input_parameter< int >::type verbose(verboseSEXP);
    rcpp_result_gen = Rcpp::wrap(compute_feature_projection(feature_weights, D, Bi_list, verbose));
    return rcpp_result_gen;
END_RCPP
}
// compute_multi_feature_projection
Eigen::MatrixXd compute_multi_feature_projection(const Eigen::Map<Eigen::MatrixXd>& feature_weights, const Eigen::Map<Eigen::VectorXd>& D, const Rcpp::List& Bi_list, int verbose);
RcppExport SEXP _gedi2_compute_multi_feature_projection(SEXP feature_weightsSEXP, SEXP DSEXP, SEXP Bi_listSEXP, SEXP verboseSEXP) {
BEGIN_RCPP
    Rcpp::RObject rcpp_result_gen;
    Rcpp::RNGScope rcpp_rngScope_gen;
    Rcpp::traits::input_parameter< const Eigen::Map<Eigen::MatrixXd>& >::type feature_weights(feature_weightsSEXP);
    Rcpp::traits::input_parameter< const Eigen::Map<Eigen::VectorXd>& >::type D(DSEXP);
    Rcpp::traits::input_parameter< const Rcpp::List& >::type Bi_list(Bi_listSEXP);
    Rcpp::traits::input_parameter< int >::type verbose(verboseSEXP);
    rcpp_result_gen = Rcpp::wrap(compute_multi_feature_projection(feature_weights, D, Bi_list, verbose));
    return rcpp_result_gen;
END_RCPP
}
// aggregate_vectors
DataFrame aggregate_vectors(const Eigen::Map<Eigen::VectorXd>& Dim1, const Eigen::Map<Eigen::VectorXd>& Dim2, const Eigen::Map<Eigen::VectorXd>& To1, const Eigen::Map<Eigen::VectorXd>& To2, const Eigen::Map<Eigen::VectorXd>& color, const Eigen::Map<Eigen::VectorXd>& alpha, int n_bins, int min_per_bin);
RcppExport SEXP _gedi2_aggregate_vectors(SEXP Dim1SEXP, SEXP Dim2SEXP, SEXP To1SEXP, SEXP To2SEXP, SEXP colorSEXP, SEXP alphaSEXP, SEXP n_binsSEXP, SEXP min_per_binSEXP) {
BEGIN_RCPP
    Rcpp::RObject rcpp_result_gen;
    Rcpp::RNGScope rcpp_rngScope_gen;
    Rcpp::traits::input_parameter< const Eigen::Map<Eigen::VectorXd>& >::type Dim1(Dim1SEXP);
    Rcpp::traits::input_parameter< const Eigen::Map<Eigen::VectorXd>& >::type Dim2(Dim2SEXP);
    Rcpp::traits::input_parameter< const Eigen::Map<Eigen::VectorXd>& >::type To1(To1SEXP);
    Rcpp::traits::input_parameter< const Eigen::Map<Eigen::VectorXd>& >::type To2(To2SEXP);
    Rcpp::traits::input_parameter< const Eigen::Map<Eigen::VectorXd>& >::type color(colorSEXP);
    Rcpp::traits::input_parameter< const Eigen::Map<Eigen::VectorXd>& >::type alpha(alphaSEXP);
    Rcpp::traits::input_parameter< int >::type n_bins(n_binsSEXP);
    Rcpp::traits::input_parameter< int >::type min_per_bin(min_per_binSEXP);
    rcpp_result_gen = Rcpp::wrap(aggregate_vectors(Dim1, Dim2, To1, To2, color, alpha, n_bins, min_per_bin));
    return rcpp_result_gen;
END_RCPP
}
// compute_ZDB_cpp
Eigen::MatrixXd compute_ZDB_cpp(const Eigen::Map<Eigen::MatrixXd>& Z, const Eigen::Map<Eigen::VectorXd>& D, const Rcpp::List& Bi_list, int verbose);
RcppExport SEXP _gedi2_compute_ZDB_cpp(SEXP ZSEXP, SEXP DSEXP, SEXP Bi_listSEXP, SEXP verboseSEXP) {
BEGIN_RCPP
    Rcpp::RObject rcpp_result_gen;
    Rcpp::RNGScope rcpp_rngScope_gen;
    Rcpp::traits::input_parameter< const Eigen::Map<Eigen::MatrixXd>& >::type Z(ZSEXP);
    Rcpp::traits::input_parameter< const Eigen::Map<Eigen::VectorXd>& >::type D(DSEXP);
    Rcpp::traits::input_parameter< const Rcpp::List& >::type Bi_list(Bi_listSEXP);
    Rcpp::traits::input_parameter< int >::type verbose(verboseSEXP);
    rcpp_result_gen = Rcpp::wrap(compute_ZDB_cpp(Z, D, Bi_list, verbose));
    return rcpp_result_gen;
END_RCPP
}
// compute_DB_cpp
Eigen::MatrixXd compute_DB_cpp(const Eigen::Map<Eigen::VectorXd>& D, const Rcpp::List& Bi_list, int verbose);
RcppExport SEXP _gedi2_compute_DB_cpp(SEXP DSEXP, SEXP Bi_listSEXP, SEXP verboseSEXP) {
BEGIN_RCPP
    Rcpp::RObject rcpp_result_gen;
    Rcpp::RNGScope rcpp_rngScope_gen;
    Rcpp::traits::input_parameter< const Eigen::Map<Eigen::VectorXd>& >::type D(DSEXP);
    Rcpp::traits::input_parameter< const Rcpp::List& >::type Bi_list(Bi_listSEXP);
    Rcpp::traits::input_parameter< int >::type verbose(verboseSEXP);
    rcpp_result_gen = Rcpp::wrap(compute_DB_cpp(D, Bi_list, verbose));
    return rcpp_result_gen;
END_RCPP
}
// compute_ADB_cpp
Eigen::MatrixXd compute_ADB_cpp(const Eigen::Map<Eigen::MatrixXd>& C_rotation, const Eigen::Map<Eigen::MatrixXd>& A, const Eigen::Map<Eigen::VectorXd>& D, const Rcpp::List& Bi_list, int verbose);
RcppExport SEXP _gedi2_compute_ADB_cpp(SEXP C_rotationSEXP, SEXP ASEXP, SEXP DSEXP, SEXP Bi_listSEXP, SEXP verboseSEXP) {
BEGIN_RCPP
    Rcpp::RObject rcpp_result_gen;
    Rcpp::RNGScope rcpp_rngScope_gen;
    Rcpp::traits::input_parameter< const Eigen::Map<Eigen::MatrixXd>& >::type C_rotation(C_rotationSEXP);
    Rcpp::traits::input_parameter< const Eigen::Map<Eigen::MatrixXd>& >::type A(ASEXP);
    Rcpp::traits::input_parameter< const Eigen::Map<Eigen::VectorXd>& >::type D(DSEXP);
    Rcpp::traits::input_parameter< const Rcpp::List& >::type Bi_list(Bi_listSEXP);
    Rcpp::traits::input_parameter< int >::type verbose(verboseSEXP);
    rcpp_result_gen = Rcpp::wrap(compute_ADB_cpp(C_rotation, A, D, Bi_list, verbose));
    return rcpp_result_gen;
END_RCPP
}
// compute_s_0_dense
Eigen::VectorXd compute_s_0_dense(const Eigen::Map<Eigen::VectorXd>& J_vec, const Eigen::Map<Eigen::MatrixXd>& Y, double J);
RcppExport SEXP _gedi2_compute_s_0_dense(SEXP J_vecSEXP, SEXP YSEXP, SEXP JSEXP) {
BEGIN_RCPP
    Rcpp::RObject rcpp_result_gen;
    Rcpp::RNGScope rcpp_rngScope_gen;
    Rcpp::traits::input_parameter< const Eigen::Map<Eigen::VectorXd>& >::type J_vec(J_vecSEXP);
    Rcpp::traits::input_parameter< const Eigen::Map<Eigen::MatrixXd>& >::type Y(YSEXP);
    Rcpp::traits::input_parameter< double >::type J(JSEXP);
    rcpp_result_gen = Rcpp::wrap(compute_s_0_dense(J_vec, Y, J));
    return rcpp_result_gen;
END_RCPP
}
// compute_Yp
Eigen::SparseMatrix<double> compute_Yp(const Eigen::MappedSparseMatrix<double>& Y, const Eigen::Map<Eigen::VectorXd>& J_vec, const Eigen::Map<Eigen::VectorXd>& s_0);
RcppExport SEXP _gedi2_compute_Yp(SEXP YSEXP, SEXP J_vecSEXP, SEXP s_0SEXP) {
BEGIN_RCPP
    Rcpp::RObject rcpp_result_gen;
    Rcpp::RNGScope rcpp_rngScope_gen;
    Rcpp::traits::input_parameter< const Eigen::MappedSparseMatrix<double>& >::type Y(YSEXP);
    Rcpp::traits::input_parameter< const Eigen::Map<Eigen::VectorXd>& >::type J_vec(J_vecSEXP);
    Rcpp::traits::input_parameter< const Eigen::Map<Eigen::VectorXd>& >::type s_0(s_0SEXP);
    rcpp_result_gen = Rcpp::wrap(compute_Yp(Y, J_vec, s_0));
    return rcpp_result_gen;
END_RCPP
}
// compute_o_0_dense
Eigen::VectorXd compute_o_0_dense(const Eigen::Map<Eigen::MatrixXd>& Yp, const Eigen::Map<Eigen::VectorXd>& N_vec, double N);
RcppExport SEXP _gedi2_compute_o_0_dense(SEXP YpSEXP, SEXP N_vecSEXP, SEXP NSEXP) {
BEGIN_RCPP
    Rcpp::RObject rcpp_result_gen;
    Rcpp::RNGScope rcpp_rngScope_gen;
    Rcpp::traits::input_parameter< const Eigen::Map<Eigen::MatrixXd>& >::type Yp(YpSEXP);
    Rcpp::traits::input_parameter< const Eigen::Map<Eigen::VectorXd>& >::type N_vec(N_vecSEXP);
    Rcpp::traits::input_parameter< double >::type N(NSEXP);
    rcpp_result_gen = Rcpp::wrap(compute_o_0_dense(Yp, N_vec, N));
    return rcpp_result_gen;
END_RCPP
}
// compute_Yp_dense
Eigen::MatrixXd compute_Yp_dense(const Eigen::Map<Eigen::MatrixXd>& Y, const Eigen::Map<Eigen::VectorXd>& J_vec, const Eigen::Map<Eigen::VectorXd>& s_0);
RcppExport SEXP _gedi2_compute_Yp_dense(SEXP YSEXP, SEXP J_vecSEXP, SEXP s_0SEXP) {
BEGIN_RCPP
    Rcpp::RObject rcpp_result_gen;
    Rcpp::RNGScope rcpp_rngScope_gen;
    Rcpp::traits::input_parameter< const Eigen::Map<Eigen::MatrixXd>& >::type Y(YSEXP);
    Rcpp::traits::input_parameter< const Eigen::Map<Eigen::VectorXd>& >::type J_vec(J_vecSEXP);
    Rcpp::traits::input_parameter< const Eigen::Map<Eigen::VectorXd>& >::type s_0(s_0SEXP);
    rcpp_result_gen = Rcpp::wrap(compute_Yp_dense(Y, J_vec, s_0));
    return rcpp_result_gen;
END_RCPP
}
// VecVecProduct
Eigen::MatrixXd VecVecProduct(const Eigen::Map<Eigen::VectorXd>& a, const Eigen::Map<Eigen::VectorXd>& b);
RcppExport SEXP _gedi2_VecVecProduct(SEXP aSEXP, SEXP bSEXP) {
BEGIN_RCPP
    Rcpp::RObject rcpp_result_gen;
    Rcpp::RNGScope rcpp_rngScope_gen;
    Rcpp::traits::input_parameter< const Eigen::Map<Eigen::VectorXd>& >::type a(aSEXP);
    Rcpp::traits::input_parameter< const Eigen::Map<Eigen::VectorXd>& >::type b(bSEXP);
    rcpp_result_gen = Rcpp::wrap(VecVecProduct(a, b));
    return rcpp_result_gen;
END_RCPP
}
// MatVecProduct
Eigen::VectorXd MatVecProduct(const Eigen::Map<Eigen::MatrixXd>& A, const Eigen::Map<Eigen::VectorXd>& b);
RcppExport SEXP _gedi2_MatVecProduct(SEXP ASEXP, SEXP bSEXP) {
BEGIN_RCPP
    Rcpp::RObject rcpp_result_gen;
    Rcpp::RNGScope rcpp_rngScope_gen;
    Rcpp::traits::input_parameter< const Eigen::Map<Eigen::MatrixXd>& >::type A(ASEXP);
    Rcpp::traits::input_parameter< const Eigen::Map<Eigen::VectorXd>& >::type b(bSEXP);
    rcpp_result_gen = Rcpp::wrap(MatVecProduct(A, b));
    return rcpp_result_gen;
END_RCPP
}
// eigenSparseMatVecProduct
Eigen::VectorXd eigenSparseMatVecProduct(const Eigen::MappedSparseMatrix<double>& A, const Eigen::Map<Eigen::VectorXd>& b);
RcppExport SEXP _gedi2_eigenSparseMatVecProduct(SEXP ASEXP, SEXP bSEXP) {
BEGIN_RCPP
    Rcpp::RObject rcpp_result_gen;
    Rcpp::RNGScope rcpp_rngScope_gen;
    Rcpp::traits::input_parameter< const Eigen::MappedSparseMatrix<double>& >::type A(ASEXP);
    Rcpp::traits::input_parameter< const Eigen::Map<Eigen::VectorXd>& >::type b(bSEXP);
    rcpp_result_gen = Rcpp::wrap(eigenSparseMatVecProduct(A, b));
    return rcpp_result_gen;
END_RCPP
}
// compute_Mp
Eigen::SparseMatrix<double> compute_Mp(const Eigen::MappedSparseMatrix<double> M, const Eigen::Map<Eigen::VectorXd> J_vec, const Eigen::Map<Eigen::VectorXd> s_0);
RcppExport SEXP _gedi2_compute_Mp(SEXP MSEXP, SEXP J_vecSEXP, SEXP s_0SEXP) {
BEGIN_RCPP
    Rcpp::RObject rcpp_result_gen;
    Rcpp::RNGScope rcpp_rngScope_gen;
    Rcpp::traits::input_parameter< const Eigen::MappedSparseMatrix<double> >::type M(MSEXP);
    Rcpp::traits::input_parameter< const Eigen::Map<Eigen::VectorXd> >::type J_vec(J_vecSEXP);
    Rcpp::traits::input_parameter< const Eigen::Map<Eigen::VectorXd> >::type s_0(s_0SEXP);
    rcpp_result_gen = Rcpp::wrap(compute_Mp(M, J_vec, s_0));
    return rcpp_result_gen;
END_RCPP
}
// compute_s_0
Eigen::VectorXd compute_s_0(const Eigen::Map<Eigen::VectorXd> J_vec, const Eigen::MappedSparseMatrix<double> M, double J);
RcppExport SEXP _gedi2_compute_s_0(SEXP J_vecSEXP, SEXP MSEXP, SEXP JSEXP) {
BEGIN_RCPP
    Rcpp::RObject rcpp_result_gen;
    Rcpp::RNGScope rcpp_rngScope_gen;
    Rcpp::traits::input_parameter< const Eigen::Map<Eigen::VectorXd> >::type J_vec(J_vecSEXP);
    Rcpp::traits::input_parameter< const Eigen::MappedSparseMatrix<double> >::type M(MSEXP);
    Rcpp::traits::input_parameter< double >::type J(JSEXP);
    rcpp_result_gen = Rcpp::wrap(compute_s_0(J_vec, M, J));
    return rcpp_result_gen;
END_RCPP
}
// compute_o_0
Eigen::VectorXd compute_o_0(const Eigen::MappedSparseMatrix<double> Mp, const Eigen::Map<Eigen::VectorXd> N_vec, double N);
RcppExport SEXP _gedi2_compute_o_0(SEXP MpSEXP, SEXP N_vecSEXP, SEXP NSEXP) {
BEGIN_RCPP
    Rcpp::RObject rcpp_result_gen;
    Rcpp::RNGScope rcpp_rngScope_gen;
    Rcpp::traits::input_parameter< const Eigen::MappedSparseMatrix<double> >::type Mp(MpSEXP);
    Rcpp::traits::input_parameter< const Eigen::Map<Eigen::VectorXd> >::type N_vec(N_vecSEXP);
    Rcpp::traits::input_parameter< double >::type N(NSEXP);
    rcpp_result_gen = Rcpp::wrap(compute_o_0(Mp, N_vec, N));
    return rcpp_result_gen;
END_RCPP
}

static const R_CallMethodDef CallEntries[] = {
    {"_gedi2_GEDI_new", (DL_FUNC) &_gedi2_GEDI_new, 6},
    {"_gedi2_GEDI_set_verbose", (DL_FUNC) &_gedi2_GEDI_set_verbose, 2},
    {"_gedi2_GEDI_initialize", (DL_FUNC) &_gedi2_GEDI_initialize, 2},
    {"_gedi2_GEDI_optimize", (DL_FUNC) &_gedi2_GEDI_optimize, 3},
    {"_gedi2_GEDI_train", (DL_FUNC) &_gedi2_GEDI_train, 4},
    {"_gedi2_getDiffO_cpp", (DL_FUNC) &_gedi2_getDiffO_cpp, 4},
    {"_gedi2_getDiffQ_cpp", (DL_FUNC) &_gedi2_getDiffQ_cpp, 4},
    {"_gedi2_getDiffExp_cpp", (DL_FUNC) &_gedi2_getDiffExp_cpp, 6},
    {"_gedi2_compute_svd_factorized_cpp", (DL_FUNC) &_gedi2_compute_svd_factorized_cpp, 4},
    {"_gedi2_run_factorized_svd_cpp", (DL_FUNC) &_gedi2_run_factorized_svd_cpp, 3},
    {"_gedi2_Yi_resZ", (DL_FUNC) &_gedi2_Yi_resZ, 5},
    {"_gedi2_predict_Yhat", (DL_FUNC) &_gedi2_predict_Yhat, 5},
    {"_gedi2_Yi_var_M", (DL_FUNC) &_gedi2_Yi_var_M, 2},
    {"_gedi2_Yi_var_M_paired", (DL_FUNC) &_gedi2_Yi_var_M_paired, 4},
    {"_gedi2_compute_dispersion_sparse", (DL_FUNC) &_gedi2_compute_dispersion_sparse, 3},
    {"_gedi2_Yi_SSE_M_paired", (DL_FUNC) &_gedi2_Yi_SSE_M_paired, 9},
    {"_gedi2_compute_feature_projection", (DL_FUNC) &_gedi2_compute_feature_projection, 4},
    {"_gedi2_compute_multi_feature_projection", (DL_FUNC) &_gedi2_compute_multi_feature_projection, 4},
    {"_gedi2_aggregate_vectors", (DL_FUNC) &_gedi2_aggregate_vectors, 8},
    {"_gedi2_compute_ZDB_cpp", (DL_FUNC) &_gedi2_compute_ZDB_cpp, 4},
    {"_gedi2_compute_DB_cpp", (DL_FUNC) &_gedi2_compute_DB_cpp, 3},
    {"_gedi2_compute_ADB_cpp", (DL_FUNC) &_gedi2_compute_ADB_cpp, 5},
    {"_gedi2_compute_s_0_dense", (DL_FUNC) &_gedi2_compute_s_0_dense, 3},
    {"_gedi2_compute_Yp", (DL_FUNC) &_gedi2_compute_Yp, 3},
    {"_gedi2_compute_o_0_dense", (DL_FUNC) &_gedi2_compute_o_0_dense, 3},
    {"_gedi2_compute_Yp_dense", (DL_FUNC) &_gedi2_compute_Yp_dense, 3},
    {"_gedi2_VecVecProduct", (DL_FUNC) &_gedi2_VecVecProduct, 2},
    {"_gedi2_MatVecProduct", (DL_FUNC) &_gedi2_MatVecProduct, 2},
    {"_gedi2_eigenSparseMatVecProduct", (DL_FUNC) &_gedi2_eigenSparseMatVecProduct, 2},
    {"_gedi2_compute_Mp", (DL_FUNC) &_gedi2_compute_Mp, 3},
    {"_gedi2_compute_s_0", (DL_FUNC) &_gedi2_compute_s_0, 3},
    {"_gedi2_compute_o_0", (DL_FUNC) &_gedi2_compute_o_0, 3},
    {NULL, NULL, 0}
};

RcppExport void R_init_gedi2(DllInfo *dll) {
    R_registerRoutines(dll, NULL, CallEntries, NULL, NULL);
    R_useDynamicSymbols(dll, FALSE);
}
