Flow123d  release_2.2.0-37-g336ee74
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.precision(prec);
82  ss << "[ ";
83  for(unsigned int i_row=0; i_row < mat.n_rows; i_row ++ ) {
84  if (i_row != 0) ss << " , ";
85  ss << "[ ";
86  for(unsigned int i_col=0; i_col < mat.n_cols; i_col++) {
87  if (i_col != 0) ss << " , ";
88  ss << mat.at(i_row, i_col);
89  }
90  ss << " ]";
91  }
92  ss << " ]";
93  return ss.str();
94 }
95 
96 // internal implementation template
97 template <class T>
98 string field_value_to_yaml_vector(const T &vec, unsigned int prec) {
99  stringstream ss;
100  ss.precision(prec);
101  ss << "[ ";
102  for(unsigned int i=0; i < vec.n_elem; i++) {
103  if (i != 0) ss << " , ";
104  ss << vec(i);
105  }
106  ss << " ]";
107  return ss.str();
108 }
109 
110 template <class IsScalar>
112 
113 template <>
114 struct field_value_scalar_resolution<std::true_type> {
115  template <class T>
116  inline static string print(const T &mat, unsigned int prec) {
117  stringstream ss;
118  ss.precision(prec);
119  ss << mat;
120  return ss.str();
121  }
122 };
123 
124 template <>
125 struct field_value_scalar_resolution<std::false_type> {
126  template <class T>
127  inline static string print(const T &mat, unsigned int prec) {
128  if (mat.n_cols == 1 || mat.n_rows == 1) {
129  return field_value_to_yaml_vector(mat, prec);
130  } else {
131  return field_value_to_yaml_matrix(mat, prec);
132  }
133  }
134 };
135 
136 
137 template <class T>
138 inline string field_value_to_yaml(const T &mat, unsigned int prec) {
140 }
141 
142 
143 
144 #define FIELD_VALUE_TO_YAML_DIM(dim) \
145  template string field_value_to_yaml(arma::Mat<double>::fixed<dim,dim> const &mat, unsigned int prec); \
146  template string field_value_to_yaml(const arma::Mat<int>::fixed<dim,dim> &mat, unsigned int prec); \
147  template string field_value_to_yaml(const arma::Mat<unsigned int>::fixed<dim,dim> &mat, unsigned int prec); \
148  template string field_value_to_yaml(const arma::Col<double>::fixed<dim> &mat, unsigned int prec); \
149  template string field_value_to_yaml(const arma::Col<int>::fixed<dim> &mat, unsigned int prec); \
150  template string field_value_to_yaml(const arma::Col<unsigned int>::fixed<dim> &mat, unsigned int prec);
151 
154 
155 template string field_value_to_yaml(const arma::Col<double> &mat, unsigned int prec);
156 template string field_value_to_yaml(const arma::Col<unsigned int> &mat, unsigned int prec);
157 
158 template string field_value_to_yaml(const double &mat, unsigned int prec);
159 template string field_value_to_yaml(const int &mat, unsigned int prec);
160 template string field_value_to_yaml(const unsigned int &mat, unsigned int prec);
161 
162 
163 
164 
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)
void print_info(std::ostringstream &out) const override
#define FIELD_VALUE_TO_YAML_DIM(dim)
void armadillo_setup()
#define _LOG(type)
Internal macro defining universal record of log.
Definition: logger.hh:230
int sync() override
string field_value_to_yaml_vector(const T &vec, unsigned int prec)
Base of exceptions used in Flow123d.
Definition: exceptions.hh:75
string field_value_to_yaml_matrix(const T &mat, unsigned int prec)