Flow123d  release_2.1.0-87-gfbc1563
armadillo_tools.cc
Go to the documentation of this file.
1 /*
2  * armadillo_setup.cc
3  *
4  * Created on: Jul 4, 2016
5  * Author: jb
6  */
7 
8 
9 
10 
11 
12 #include "armadillo_tools.hh"
13 
14 #include <ostream>
15 #include <sstream>
16 #include <type_traits>
17 #include "system/exc_common.hh"
18 #include "system/logger.hh"
19 
20 #include <armadillo>
21 
22 using namespace std;
23 
24 /**
25  * Auxiliary exception in order to change standard frames_to_cut_.
26  */
27 class ExcArmadillo : public ExceptionBase {
28 public:
30  {
31  this->frames_to_cut_ = {"arma_stop"};
32  }
33 
34  void print_info(std::ostringstream &out) const override {
35  ::internal::ExcStream estream(out, *this);
36  estream << "Armadillo Message: " << EI_Message::val << "\n";
37  }
38 };
39 
40 /**
41  * Auxiliary output buffer to catch the error messages and report stacktrace.
42  */
43 class ArmaStreamBuf : public std::stringbuf {
44 protected:
45  /**
46  * Override sync to throw on error message.
47  */
48  int sync() override;
49 };
50 
52  if (this->str().find("error") != string::npos) {
53  // Can not throw here, since any exception is cached somewhere between armadillo call point and this method.
54  // Must write out the stack here.
55  auto e = ExcArmadillo();
56  e << EI_Message(this->str());
57  _LOG( Logger::MsgType::message ) << e.what();
58 
59  }
60  std::cout << this->str() << std::endl;
61  this->str().clear();
62  return 1;
63 }
64 
65 
67 {
68  static ArmaStreamBuf stream_buf;
69  static std::ostream arma_stream(&stream_buf);
70  arma::set_stream_err1(arma_stream);
71  arma::set_stream_err2(arma_stream);
72 }
73 
74 
75 
76 
77 // internal implementation template
78 template <class T>
79 string field_value_to_yaml_matrix(const T &mat, unsigned int prec) {
80  stringstream ss;
81  ss << "[ ";
82  for(unsigned int i_row=0; i_row < mat.n_rows; i_row ++ ) {
83  if (i_row != 0) ss << ", ";
84  ss << "[ ";
85  for(unsigned int i_col=0; i_col < mat.n_cols; i_col++) {
86  if (i_col != 0) ss << ", ";
87  if (std::is_floating_point<decltype(mat.at(0,0))>::value)
88  ss << fmt::format("{0:#.{1}g}", mat.at(i_row, i_col), prec);
89  else
90  ss << mat.at(i_row, i_col);
91  }
92  ss << " ]";
93  }
94  ss << " ]";
95  return ss.str();
96 }
97 
98 // internal implementation template
99 template <class T>
100 string field_value_to_yaml_vector(const T &vec, unsigned int prec) {
101  stringstream ss;
102  ss << "[ ";
103  for(unsigned int i=0; i < vec.n_elem; i++) {
104  if (i != 0) ss << ", ";
105  if (std::is_floating_point<decltype(vec[0])>::value)
106  ss << fmt::format("{0:#.{1}g}", vec(i), prec);
107  else
108  ss << vec(i);
109  }
110  ss << " ]";
111  return ss.str();
112 }
113 
114 template <class IsScalar>
116 
117 template <>
118 struct field_value_scalar_resolution<std::true_type> {
119  template <class T>
120  inline static string print(const T &mat, unsigned int prec) {
121  stringstream ss;
123  ss << mat;
124  else
125  ss << fmt::format("{0:#.{1}g}", mat, prec);
126  return ss.str();
127  }
128 };
129 
130 template <>
131 struct field_value_scalar_resolution<std::false_type> {
132  template <class T>
133  inline static string print(const T &mat, unsigned int prec) {
134  if (mat.n_cols == 1 || mat.n_rows == 1) {
135  return field_value_to_yaml_vector(mat, prec);
136  } else {
137  return field_value_to_yaml_matrix(mat, prec);
138  }
139  }
140 };
141 
142 
143 template <class T>
144 inline string field_value_to_yaml(const T &mat, unsigned int prec) {
146 }
147 
148 
149 
150 #define FIELD_VALUE_TO_YAML_DIM(dim) \
151  template string field_value_to_yaml(arma::Mat<double>::fixed<dim,dim> const &mat, unsigned int prec); \
152  template string field_value_to_yaml(const arma::Mat<int>::fixed<dim,dim> &mat, unsigned int prec); \
153  template string field_value_to_yaml(const arma::Mat<unsigned int>::fixed<dim,dim> &mat, unsigned int prec); \
154  template string field_value_to_yaml(const arma::Col<double>::fixed<dim> &mat, unsigned int prec); \
155  template string field_value_to_yaml(const arma::Col<int>::fixed<dim> &mat, unsigned int prec); \
156  template string field_value_to_yaml(const arma::Col<unsigned int>::fixed<dim> &mat, unsigned int prec);
157 
160 
161 template string field_value_to_yaml(const arma::Col<double> &mat, unsigned int prec);
162 template string field_value_to_yaml(const arma::Col<unsigned int> &mat, unsigned int prec);
163 
164 template string field_value_to_yaml(const double &mat, unsigned int prec);
165 template string field_value_to_yaml(const int &mat, unsigned int prec);
166 template string field_value_to_yaml(const unsigned int &mat, unsigned int prec);
167 
168 
169 
170 
static string print(const T &mat, unsigned int prec)
string field_value_to_yaml(const T &mat, unsigned int prec)
FMT_API void print(std::FILE *f, CStringRef format_str, ArgList args)
Definition: format.cc:489
static string print(const T &mat, unsigned int prec)
std::string format(CStringRef format_str, ArgList args)
Definition: format.h:3141
void print_info(std::ostringstream &out) const override
static constexpr bool value
Definition: json.hpp:87
#define FIELD_VALUE_TO_YAML_DIM(dim)
void armadillo_setup()
#define _LOG(type)
Internal macro defining universal record of log.
Definition: logger.hh:228
int sync() override
string field_value_to_yaml_vector(const T &vec, unsigned int prec)
Base of exceptions used in Flow123d.
Definition: exceptions.hh:67
string field_value_to_yaml_matrix(const T &mat, unsigned int prec)