Skip to content

Commit

Permalink
Refactor code
Browse files Browse the repository at this point in the history
  • Loading branch information
doccstat committed Apr 24, 2024
1 parent 34cb4e1 commit 1ebea50
Show file tree
Hide file tree
Showing 9 changed files with 154 additions and 122 deletions.
2 changes: 1 addition & 1 deletion src/fastcpd_class_private.cc → src/fastcpd_class.cc
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
#include "fastcpd_classes.h"
#include "fastcpd_class.h"
#include "fastcpd_constants.h"
#include "RProgress.h"

Expand Down
117 changes: 7 additions & 110 deletions src/fastcpd_classes.h → src/fastcpd_class.h
Original file line number Diff line number Diff line change
@@ -1,120 +1,17 @@
#ifndef FASTCPD_CLASSES_H_
#define FASTCPD_CLASSES_H_
#ifndef FASTCPD_CLASS_H_
#define FASTCPD_CLASS_H_

#include <memory>

#include "fastcpd_test.h"
#include "fastcpd_types.h"
#include "fastcpd_wrapper.h"
#include "RcppClock.h"
#include "RProgress.h"

namespace fastcpd::classes {

struct ColMat {
mat data;

operator colvec() const;
operator mat() const;
operator rowvec() const;
};

struct CostResult {
ColMat par;
ColMat residuals;
double value;
};

struct CostFunction {
const Function cost;
const mat& data;

CostFunction(const Function& cost, const mat& data);
CostResult operator() (
const unsigned int segment_start,
const unsigned int segment_end,
const Nullable<colvec>& theta,
const double lambda, // UNUSED
const bool cv, // UNUSED
const Nullable<colvec>& start // UNUSED
) const;
};

struct CostGradient {
const Function cost_gradient;
const mat& data;

CostGradient(const Function& cost_gradient, const mat& data);
const colvec operator() (
const unsigned int segment_start,
const unsigned int segment_end,
const colvec& theta
) const;
};

struct CostHessian {
const Function cost_hessian;
const mat& data;

CostHessian(const Function& cost_hessian, const mat& data);
const mat operator() (
const unsigned int segment_start,
const unsigned int segment_end,
const colvec& theta
) const;
};

class FastcpdTest {
public:
static colvec get_gradient_arma(
const mat& data,
const unsigned int segment_start,
const unsigned int segment_end,
const colvec& theta
);

static mat get_hessian_arma(
const mat& data,
const unsigned int segment_start,
const unsigned int segment_end,
const colvec& theta
);
using ::fastcpd::test::FastcpdTest;

static mat get_hessian_binomial(
const mat& data,
const unsigned int segment_start,
const unsigned int segment_end,
const colvec& theta
);

static mat get_hessian_poisson(
const mat& data,
const unsigned int segment_start,
const unsigned int segment_end,
const colvec& theta
);

static double get_nll_wo_cv(
const mat& data,
const unsigned int segment_start,
const unsigned int segment_end,
colvec theta,
double lambda
);

static CostResult get_nll_wo_theta(
const mat& data,
const unsigned int segment_start,
const unsigned int segment_end,
double lambda,
bool cv,
Nullable<colvec> start
);

static mat update_theta_sum(
const unsigned int col,
colvec old_theta_sum,
colvec new_theta_sum
);
};
namespace fastcpd::classes {

class Fastcpd {
public:
Expand Down Expand Up @@ -605,4 +502,4 @@ class Fastcpd {

} // namespace fastcpd::classes

#endif // FASTCPD_CLASSES_H_
#endif // FASTCPD_CLASS_H_
2 changes: 1 addition & 1 deletion src/fastcpd_class_nll.cc
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
#include "fastcpd_classes.h"
#include "fastcpd_class.h"

namespace fastcpd::classes {

Expand Down
2 changes: 1 addition & 1 deletion src/fastcpd_impl.cc
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
#include "fastcpd_classes.h"
#include "fastcpd_class.h"
#include "fastcpd_impl.h"

List fastcpd_impl(
Expand Down
9 changes: 6 additions & 3 deletions src/fastcpd_class_test.cc → src/fastcpd_test.cc
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
#include "fastcpd_classes.h"
#include "fastcpd_class.h"
#include "fastcpd_test.h"

namespace fastcpd::classes {
using ::fastcpd::classes::Fastcpd;

namespace fastcpd::test {

colvec FastcpdTest::get_gradient_arma(
const mat& data,
Expand Down Expand Up @@ -267,4 +270,4 @@ mat FastcpdTest::update_theta_sum(
return fastcpd_class.theta_sum;
}

} // namespace fastcpd::classes
} // namespace fastcpd::test
67 changes: 67 additions & 0 deletions src/fastcpd_test.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
#ifndef FASTCPD_TEST_H_
#define FASTCPD_TEST_H_

#include "fastcpd_types.h"
#include "fastcpd_wrapper.h"

using ::fastcpd::classes::CostResult;

namespace fastcpd::test {

class FastcpdTest {
public:
static colvec get_gradient_arma(
const mat& data,
const unsigned int segment_start,
const unsigned int segment_end,
const colvec& theta
);

static mat get_hessian_arma(
const mat& data,
const unsigned int segment_start,
const unsigned int segment_end,
const colvec& theta
);

static mat get_hessian_binomial(
const mat& data,
const unsigned int segment_start,
const unsigned int segment_end,
const colvec& theta
);

static mat get_hessian_poisson(
const mat& data,
const unsigned int segment_start,
const unsigned int segment_end,
const colvec& theta
);

static double get_nll_wo_cv(
const mat& data,
const unsigned int segment_start,
const unsigned int segment_end,
colvec theta,
double lambda
);

static CostResult get_nll_wo_theta(
const mat& data,
const unsigned int segment_start,
const unsigned int segment_end,
double lambda,
bool cv,
Nullable<colvec> start
);

static mat update_theta_sum(
const unsigned int col,
colvec old_theta_sum,
colvec new_theta_sum
);
};

} // namespace fastcpd::test

#endif // FASTCPD_TEST_H_
2 changes: 1 addition & 1 deletion src/fastcpd_class_cost.cc → src/fastcpd_wrapper.cc
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
#include "fastcpd_classes.h"
#include "fastcpd_wrapper.h"

namespace fastcpd::classes {

Expand Down
63 changes: 63 additions & 0 deletions src/fastcpd_wrapper.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
#ifndef FASTCPD_WRAPPER_H_
#define FASTCPD_WRAPPER_H_

#include "fastcpd_types.h"

namespace fastcpd::classes {

struct ColMat {
mat data;

operator colvec() const;
operator mat() const;
operator rowvec() const;
};

struct CostResult {
ColMat par;
ColMat residuals;
double value;
};

struct CostFunction {
const Function cost;
const mat& data;

CostFunction(const Function& cost, const mat& data);
CostResult operator() (
const unsigned int segment_start,
const unsigned int segment_end,
const Nullable<colvec>& theta,
const double lambda, // UNUSED
const bool cv, // UNUSED
const Nullable<colvec>& start // UNUSED
) const;
};

struct CostGradient {
const Function cost_gradient;
const mat& data;

CostGradient(const Function& cost_gradient, const mat& data);
const colvec operator() (
const unsigned int segment_start,
const unsigned int segment_end,
const colvec& theta
) const;
};

struct CostHessian {
const Function cost_hessian;
const mat& data;

CostHessian(const Function& cost_hessian, const mat& data);
const mat operator() (
const unsigned int segment_start,
const unsigned int segment_end,
const colvec& theta
) const;
};

} // namespace fastcpd::classes

#endif // FASTCPD_WRAPPER_H_
12 changes: 7 additions & 5 deletions src/test-functions.cc → src/test-fastcpd.cc
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
#include "fastcpd_classes.h"
#include "fastcpd_test.h"
#include "fastcpd_test_constants.h"
#include "testthat.h"

using ::fastcpd::classes::FastcpdTest;
using ::fastcpd::classes::CostResult;
using ::fastcpd::test::FastcpdTest;

context("get_nll_wo_theta Unit Test") {
test_that("arma(3, 2) is correct for 200 data points") {
const fastcpd::classes::CostResult cost_result =
FastcpdTest::get_nll_wo_theta(
const CostResult cost_result = FastcpdTest::get_nll_wo_theta(
colvec(kARMA32.data(), kARMA32.size()), 0, 199, 0, false, R_NilValue
);
const colvec par = cost_result.par;
Expand Down Expand Up @@ -91,6 +91,8 @@ context("update_theta_sum Unit Test") {
expect_true(theta_sum.n_cols == 1);
colvec theta_sum_col = theta_sum.col(0);
colvec expected_theta_sum = {5, 7, 9};
expect_true(approx_equal(theta_sum_col, expected_theta_sum, "absdiff", 1e-6));
expect_true(
approx_equal(theta_sum_col, expected_theta_sum, "absdiff", 1e-6)
);
}
}

0 comments on commit 1ebea50

Please sign in to comment.