6 #include <catch2/catch_test_macros.hpp>
7 using namespace Catch::literals;
9 template <
typename T =
double>
17 bool match(std::vector<T>
const& in)
const override {
18 if (in.size() != vec.size()) {
22 for (
int i = 0;
i < in.size(); ++
i) {
23 if (in[
i] != approx(vec[
i])) {
32 for (
int i = 0;
i < in.size(); ++
i) {
33 if (in[
i] != approx(-1 * vec[
i])) {
43 std::ostringstream ss;
44 ss <<
"is not approx or opposite approx of " << Catch::Detail::stringify(vec);
59 approx.
scale(newScale);
63 mutable Catch::Detail::Approx approx = Catch::Detail::Approx::custom();
67 REQUIRE(m.
nrow() ==
ref.size());
68 for (
int i = 0;
i < m.
nrow(); ++
i) {
70 for (
int j = 0;
j < m.
ncol(); ++
j) {
71 REQUIRE(m.
getval(
i,
j) == Catch::Detail::Approx(
ref[
i][
j]).margin(1e-10));
77 SCENARIO(
"A Matrix",
"[neuron_ivoc][OcMatrix]") {
78 GIVEN(
"A 3x3 Full matrix") {
80 REQUIRE(m.nrow() == 3);
81 REQUIRE(m.ncol() == 3);
84 REQUIRE(
compareMatrix(m, {{1., 0., 0.}, {0., 1., 0}, {0., 0., 1.}}));
87 double*
value = m.mep(0, 0);
90 REQUIRE(m.getval(0, 0) == 3);
95 REQUIRE(
compareMatrix(m, {{3., 0., 0.}, {0., 1., 0.}, {0., 0., 1.}, {2., 2., 2.}}));
98 std::vector<std::pair<int, int>> nzs = m.nonzeros();
99 std::vector<std::pair<int, int>> res = {{0, 0}, {1, 1}, {2, 2}, {3, 0}, {3, 1}, {3, 2}};
103 std::vector<int> x, y;
105 std::vector<int> res_x = {0, 1, 2, 3, 3, 3};
106 std::vector<int> res_y = {0, 1, 2, 0, 1, 2};
112 REQUIRE(
compareMatrix(m, {{3., 4., 0.}, {0., 4., 0.}, {0., 4., 1.}, {2., 4., 2.}}));
116 REQUIRE(
compareMatrix(m, {{5., 4., 0.}, {0., 5., 0.}, {0., 4., 5.}, {2., 4., 2.}}));
120 REQUIRE(
compareMatrix(m, {{5., 6., 0.}, {0., 5., 6.}, {0., 4., 5.}, {2., 4., 2.}}));
124 REQUIRE(
compareMatrix(m, {{5., 6., 0.}, {7., 5., 6.}, {0., 7., 5.}, {2., 4., 7.}}));
131 REQUIRE(
compareMatrix(m, {{6., 6., 0.}, {7., 6., 6.}, {0., 7., 6.}, {2., 4., 7.}}));
135 m.bcopy(&
n, 1, 1, 3, 2, 0, 0);
136 REQUIRE(
compareMatrix(
n, {{6., 6., 0.}, {7., 6., 0.}, {4., 7., 0.}, {0., 0., 0.}}));
141 REQUIRE(
compareMatrix(
n, {{6., 7., 0., 2.}, {6., 6., 7., 4.}, {0., 6., 6., 7.}}));
146 REQUIRE_THAT(
v.vec(), Catch::Matchers::Approx(std::vector<double>({0., 7., 6.})));
148 REQUIRE(
compareMatrix(m, {{0., 7., 6.}, {7., 6., 6.}, {0., 7., 6.}, {2., 4., 7.}}));
153 REQUIRE_THAT(
v.vec(), Catch::Matchers::Approx(std::vector<double>({6., 6., 6., 7.})));
155 REQUIRE(
compareMatrix(m, {{0., 6., 6.}, {7., 6., 6.}, {0., 6., 6.}, {2., 7., 7.}}));
159 REQUIRE(
compareMatrix(m, {{0., 6., 6.}, {7., 6., 6.}, {0., 6., 6.}}));
164 REQUIRE(
n(0, 0) == Catch::Detail::Approx(442925.));
166 {{442925., 938481., 938481.},
167 {651970., 1381407., 1381407.},
168 {442926., 938481., 938482.}}));
172 REQUIRE(
compareMatrix(m, {{42., 72., 72.}, {42., 114., 114.}, {42., 72., 72.}}));
176 double det = m.det(&e);
184 double det = m.det(&e);
185 REQUIRE(det == -1.2348_a);
193 {{0.064625850, -0.040816326, 0.},
194 {-0.00024295432, -0.0000971817, 0.01428571},
195 {-0.023566569, 0.0239067055, -0.014285714}}));
197 REQUIRE(
compareMatrix(
n, {{0., 0., 0.}, {0., 0., 0.}, {0., 0., 0.}}));
202 REQUIRE_THAT(
v.vec(), Catch::Matchers::Approx(std::vector<double>({72., 114., 0.})));
203 v.vec() = {0., 72., 114.};
205 REQUIRE(
compareMatrix(m, {{42., 72., 72.}, {72., 114., 114.}, {1., 114., 2.}}));
210 REQUIRE(
v.vec()[2] == Catch::Detail::Approx(1.0));
211 v.vec() = {1., 0., 0.};
213 REQUIRE(
compareMatrix(m, {{42., 72., 1.}, {72., 114., 114.}, {1., 114., 2.}}));
220 REQUIRE_THAT(vout.
vec(),
221 Catch::Matchers::Approx(std::vector<double>({115., 300., 117.})));
226 REQUIRE(
compareMatrix(
n, {{42., 72., 1.}, {72., 114., 114.}, {1., 114., 2.}}));
230 o, {{6949., 11346., 8252.}, {11346., 31176., 13296.}, {8252., 13296., 13001.}}));
235 REQUIRE(
compareMatrix(
n, {{84., 144., 2.}, {144., 228., 228.}, {2., 228., 4.}}));
241 m.solv(&
v, &vout,
false);
242 REQUIRE_THAT(vout.
vec(),
243 Catch::Matchers::Approx(
244 std::vector<double>({0.0088700, 0.0087927, -0.00562299})));
245 m.solv(&
v, &vout,
true);
246 REQUIRE_THAT(vout.
vec(),
247 Catch::Matchers::Approx(
248 std::vector<double>({0.0088700, 0.0087927, -0.00562299})));
260 REQUIRE_THAT(
v.vec(),
261 Catch::Matchers::Approx(
262 std::vector<double>({7.074673, -0.88679, -3.18788})));
276 REQUIRE_THAT(d.
vec(), Catch::Matchers::Approx(std::vector<double>({3., 1.})));
280 c.vec() = {u(0, 0), u(0, 1),
v(0, 0),
v(0, 1)};
282 c.vec() = {u(1, 0), u(1, 1),
v(1, 0),
v(1, 1)};
289 s.vec() = {3., 2., 2.};
291 s.vec() = {2., 3., -2.};
298 REQUIRE_THAT(d.
vec(), Catch::Matchers::Approx(std::vector<double>({5., 3.})));
302 c.vec() = {u(0, 0), u(0, 1),
v(0, 0),
v(0, 1),
v(0, 2)};
305 c.vec() = {u(1, 0), u(1, 1),
v(1, 0),
v(1, 1),
v(1, 2)};
308 c.vec() = {0., 0.,
v(2, 0),
v(2, 1),
v(2, 2)};
324 GIVEN(
"A 3x3 Sparse matrix") {
326 REQUIRE(m.nrow() == 3);
327 REQUIRE(m.ncol() == 3);
330 REQUIRE(
compareMatrix(m, {{1., 0., 0.}, {0., 1., 0}, {0., 0., 1.}}));
331 REQUIRE(m.sprowlen(1) == 1);
334 std::vector<int> x, y,
result = {0, 1, 2};
340 double* pmep = m.mep(1, 1);
347 double value = m.spgetrowval(2, 0, &col);
349 REQUIRE(
value == Catch::Detail::Approx(1.0));
353 REQUIRE(m.sprowlen(2) == 1);
354 REQUIRE(
compareMatrix(m, {{0., 0., 0.}, {0., 0., 0}, {0., 0., 0.}}));
358 REQUIRE(
compareMatrix(m, {{0., 0., 0.}, {2., 2., 2.}, {0., 0., 0.}}));
362 REQUIRE(
compareMatrix(m, {{3., 0., 0.}, {3., 2., 2.}, {3., 0., 0.}}));
366 REQUIRE(
compareMatrix(m, {{1., 0., 0.}, {3., 1., 2.}, {3., 0., 1.}}));
370 REQUIRE(
compareMatrix(m, {{1., 0., 0.}, {4., 1., 2.}, {3., 4., 1.}}));
374 REQUIRE(
compareMatrix(m, {{1., 0., 5.}, {4., 1., 2.}, {3., 4., 1.}}));
376 REQUIRE(m.sprowlen(1) == 3);
382 REQUIRE(
compareMatrix(m, {{1., 2., 3.}, {4., 1., 2.}, {3., 4., 1.}}));
388 REQUIRE(
compareMatrix(m, {{1., 2., 3.}, {2., 1., 2.}, {3., 4., 1.}}));
394 REQUIRE(
compareMatrix(m, {{1., 2., 3.}, {2., 2., 2.}, {3., 4., 3.}}));
398 v.vec() = {0., 1., 2.};
400 REQUIRE(
compareMatrix(m, {{1., 2., 3.}, {1., 2., 2.}, {3., 2., 3.}}));
407 REQUIRE_THAT(out.
vec(), Catch::Matchers::Approx(std::vector<double>({14., 11., 16.})));
413 m.solv(&
v, &vout,
false);
414 REQUIRE_THAT(vout.
vec(), Catch::Matchers::Approx(std::vector<double>({0., 0.5, 0.})));
415 m.solv(&
v, &vout,
true);
416 REQUIRE_THAT(vout.
vec(), Catch::Matchers::Approx(std::vector<double>({0., 0.5, 0.})));
std::string describe() const override
ApproxOrOpposite & epsilon(T const &newEpsilon)
ApproxOrOpposite(std::vector< T > vec)
ApproxOrOpposite & scale(T const &newScale)
ApproxOrOpposite & margin(T const &newMargin)
bool match(std::vector< T > const &in) const override
std::vector< double > & vec()
virtual double getval(int i, int j) const
int const size_t const size_t n
static double ref(void *v)
SCENARIO("A Matrix", "[neuron_ivoc][OcMatrix]")
bool compareMatrix(OcMatrix &m, const std::vector< std::vector< double >> &ref)