File: gradient_operator.cc

package info (click to toggle)
sopt 5.0.1%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 6,704 kB
  • sloc: cpp: 13,620; xml: 182; makefile: 6
file content (45 lines) | stat: -rw-r--r-- 1,855 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <catch2/catch_all.hpp>
#include <memory>
#include <random>

#include "sopt/config.h"
#include "sopt/gradient_operator.h"
#include "sopt/types.h"
#include "sopt/utilities.h"

// This header is not part of the installed sopt interface
// It is only present in tests
#include "tools_for_tests/directories.h"
#include "tools_for_tests/tiffwrappers.h"

TEST_CASE("Gradient Operator") {
  using namespace sopt;
  // Some type aliases for simplicity
  using Scalar = double;

  using Vector = sopt::Vector<Scalar>;

  using Matrix = sopt::Matrix<Scalar>;

  using Image = sopt::Image<Scalar>;

  Image const image = sopt::tools::read_standard_tiff("cameraman256");
  auto const psi = sopt::gradient_operator::gradient_operator<Scalar>(image.rows(), image.cols());
  Matrix input = Matrix::Ones(image.rows(), image.cols());
  for (Eigen::Index i(0); i < image.rows(); i++) input.row(i) *= static_cast<Scalar>(i);
  Vector output = psi.adjoint() * Vector::Map(input.data(), input.size());
  CAPTURE(output.segment(0, 5));
  CAPTURE(output.segment(image.size(), 5));
  CHECK(output.size() == 2 * input.size());
  CHECK(output.segment(0, input.size()).isApprox(Vector::Zero(input.size())));
  CHECK(output.segment(input.size(), input.size() - 1)
            .isApprox(Vector::Constant((Eigen::Index)0.5, input.size() - 1)));
  input = Matrix::Ones(image.rows(), image.cols());
  for (Eigen::Index i(0); i < image.cols(); i++) input.col(i) *= static_cast<Scalar>(i);
  output = psi.adjoint() * Vector::Map(input.data(), input.size());
  CAPTURE(output.segment(0, 5));
  CAPTURE(output.segment(image.size(), 5));
  CHECK(output.size() == 2 * input.size());
  CHECK(output.segment(0, input.size() - 1).isApprox(Vector::Constant((Eigen::Index)0.5, input.size() - 1)));
  CHECK(output.segment(input.size(), input.size()).isApprox(Vector::Zero(input.size())));
}