Skip to content

Commit

Permalink
removed arma
Browse files Browse the repository at this point in the history
  • Loading branch information
Matt Lyon committed Nov 23, 2021
1 parent 30d190d commit 15c22b8
Show file tree
Hide file tree
Showing 4 changed files with 29 additions and 51 deletions.
3 changes: 0 additions & 3 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@ include_directories(${CMAKE_CURRENT_SOURCE_DIR}/lib/fast-cpp-csv-parser)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/lib/eigen-3.4.0)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/lib/cxxopts-2.2.0/include)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/lib/spdlog/include)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/lib/armadillo-10.7.1/build/include)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/src)

# libraries
Expand All @@ -30,7 +29,6 @@ find_library(ZSTD_LIB_PATH NAMES libzstd.so libzstd.a libzstd.dylib HINTS ${CMAK
find_library(SQLITE_LIB_PATH NAMES libsqlite3.a HINTS ${CMAKE_CURRENT_SOURCE_DIR}/lib/bgen/build/3rd_party/sqlite3)
find_library(DB_LIB_PATH NAMES libdb.a HINTS ${CMAKE_CURRENT_SOURCE_DIR}/lib/bgen/build/db)
find_library(SPDLOG_LIB_PATH NAMES libspdlog.a HINTS ${CMAKE_CURRENT_SOURCE_DIR}/lib/spdlog/build)
find_library(ARMADILLO_LIBRARIES NAMES libarmadillo.so libarmadillo.10.7.1.dylib HINTS ${CMAKE_CURRENT_SOURCE_DIR}/lib/armadillo-10.7.1/build/lib64 ${CMAKE_CURRENT_SOURCE_DIR}/lib/armadillo-10.7.1/build/lib ${CMAKE_CURRENT_SOURCE_DIR}/lib/armadillo-10.7.1/build)
set(LIBS
${BGEN_LIB_PATH}
ZLIB::ZLIB
Expand All @@ -39,7 +37,6 @@ set(LIBS
${SQLITE_LIB_PATH}
${DB_LIB_PATH}
${SPDLOG_LIB_PATH}
${ARMADILLO_LIBRARIES}
)

# src
Expand Down
12 changes: 0 additions & 12 deletions lib.sh
Original file line number Diff line number Diff line change
Expand Up @@ -12,18 +12,6 @@ cd bgen
./waf configure
./waf

# armadillo
# TODO replace with Eigen
cd "$LIB_DIR"
curl --insecure -L http://sourceforge.net/projects/arma/files/armadillo-10.7.1.tar.xz >armadillo-10.7.1.tar.xz
tar -xf armadillo-10.7.1.tar.xz
cd armadillo-10.7.1
mkdir build
cd build
cmake .. -DCMAKE_INSTALL_PREFIX:PATH=.
make
make install

# csv reader
# TODO replace with Boost
cd "$LIB_DIR"
Expand Down
57 changes: 26 additions & 31 deletions src/QRMM.cpp
Original file line number Diff line number Diff line change
@@ -1,49 +1,44 @@
// Taken from https://raw.githubusercontent.com/cran/cqrReg/master/src/QRMM.cpp
// Adapted from https://raw.githubusercontent.com/cran/cqrReg/master/src/QRMM.cpp
// Pietrosanu, M., Gao, J., Kong, L., Jiang, B., and Niu, D. (2020). Advanced algorithms for penalized quantile and composite quantile regression. Comput. Stat. 2020 361 36, 333–346.

#include <armadillo>
#include <Eigen/Core>
#include <Eigen/QR>
#include "QRMM.h"

namespace CqrReg {
Eigen::VectorXd QRMM::fit(Eigen::MatrixXd X,
Eigen::VectorXd Y,
Eigen::VectorXd init,
double toler,
int maxit,
double tau) {
int n = X.rows();
int p = X.cols();
arma::mat x = arma::mat(X.data(), X.rows(), X.cols(), false, false);
arma::vec y = arma::vec(Y.data(), Y.rows(), false, false);
arma::vec beta = arma::vec(init.data(), init.rows(), false, false);
arma::mat product, xt;
arma::vec W, newX, z, signw, v, r;
arma::vec delta;
arma::uvec order, index;
Eigen::VectorXd QRMM::fit(
const Eigen::MatrixXd &X,
const Eigen::VectorXd &y,
const Eigen::VectorXd &init,
double toler,
int maxit,
double tau) {
Eigen::VectorXd beta = init;
Eigen::MatrixXd xt = X.transpose();

double error = 10000, epsilon = 0.9999;
int iteration = 1;
product.ones(p, n);
xt = x.t();

while (iteration <= maxit && error > toler) {
r = y - x * beta;
v = 1 - 2 * tau - r / (arma::abs(r) + epsilon);

W = 1 / (epsilon + arma::abs(r));

for (int i = 0; i < n; i++) { product.col(i) = xt.col(i) * W(i); }

delta = arma::solve(product * x, xt * v);
Eigen::VectorXd fitted = X * beta;
Eigen::VectorXd r = y - fitted;
Eigen::VectorXd v = 1 - 2 * tau - r.array() / (r.array().abs() + epsilon);

Eigen::VectorXd W = 1 / (epsilon + r.array().abs());
Eigen::MatrixXd product = xt.array().rowwise() * W.transpose().array();
Eigen::MatrixXd pX = product * X;

Eigen::ColPivHouseholderQR<Eigen::MatrixXd> qr(pX);
if (qr.rank() < pX.cols()) {
throw std::runtime_error("rank-deficient matrix");
}
Eigen::VectorXd delta = qr.solve(xt * v);
beta = beta - delta;

error = sum(abs(delta));
error = delta.cwiseAbs().sum();
iteration++;
}

Eigen::VectorXd res = Eigen::Map<Eigen::VectorXd>(beta.memptr(), beta.n_rows, beta.n_cols);

return(res);
return (beta);
}
}
8 changes: 3 additions & 5 deletions src/QRMM.h
Original file line number Diff line number Diff line change
@@ -1,10 +1,8 @@
// Taken from https://raw.githubusercontent.com/cran/cqrReg/master/src/QRMM.cpp
// Pietrosanu, M., Gao, J., Kong, L., Jiang, B., and Niu, D. (2020). Advanced algorithms for penalized quantile and composite quantile regression. Comput. Stat. 2020 361 36, 333–346.

#include <armadillo>
#include <Eigen/Core>
#include <Eigen/QR>
#include <Eigen/Dense>
#include <iostream>
#include <sstream>

Expand All @@ -14,9 +12,9 @@
namespace CqrReg {
class QRMM {
public:
static Eigen::VectorXd fit(Eigen::MatrixXd X,
Eigen::VectorXd Y,
Eigen::VectorXd init,
static Eigen::VectorXd fit(const Eigen::MatrixXd &X,
const Eigen::VectorXd &Y,
const Eigen::VectorXd &init,
double toler,
int maxit,
double tau
Expand Down

0 comments on commit 15c22b8

Please sign in to comment.