CASM
AClustersApproachtoStatisticalMechanics
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules
EigenDataStream.hh
Go to the documentation of this file.
1 #ifndef EIGENDATASTREAM_HH
2 #define EIGENDATASTREAM_HH
5 #include "casm/external/Eigen/Dense"
6 namespace CASM {
7 
10  class MatrixXdDataStream : public DataStream {
11  public:
12  MatrixXdDataStream(DataStreamTraits _traits = none) : DataStream(_traits), m_matrix(1, 0), m_row(0), m_col(0) {}
13  DataStream &operator<<(double _d) {
14  if(m_col == m_matrix.cols()) {
15  if(m_row > 0 || m_matrix.rows() != 1)
16  throw std::runtime_error("Attempting to stream non-rectangular data to Eigen::MatrixXd using MatrixXdDataStream, at row=" + std::to_string(m_row) + ", col=" + std::to_string(m_row) + "\n");
17  m_matrix.conservativeResize(Eigen::NoChange, m_col + 1);
18  }
19  if(m_row == m_matrix.rows()) {
20  m_matrix.conservativeResize(m_row + 1, Eigen::NoChange);
21  }
22  m_matrix(m_row, m_col++) = _d;
23  return *this;
24  }
25 
26  DataStream &operator<<(long _l) {
27  return operator<<((double)_l);
28  }
29 
30  virtual DataStream &newline() {
31  if(fail() && _skipfail()) {
32  clear_fail();
33  }
34  else
35  ++m_row;
36  m_col = 0;
37  return *this;
38  }
39 
41  return m_matrix;
42  }
43  protected:
44  EigenIndex row() const {
45  return m_row;
46  }
47  private:
50  };
51 
52  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
53  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
54 
55 
59  public:
61  MatrixXdDataStream(_traits) {}
62  const std::vector<std::string> &labels() const {
63  return m_labels;
64  }
65 
66  DataStream &operator<<(const std::string &_str) {
67  if(labels().size() == row())
68  m_labels.push_back(_str);
69  else if(row() + 1 == labels().size()) {
70  std::cerr << "WARNING: Attempting to collect labeled data from a datastream, but too many labels exist for row " << row() << "\n";
72  }
73  return *this;
74  }
75 
77  if(!fail() && labels().size() < row() + 1) {
78  std::cerr << "WARNING: Attempting to collect labeled data from a datastream, but no label was available for row " << row() << "\n";
80  }
81  else if(_skipfail() && fail() && row() + 1 == labels().size()) {
82  std::cout << "*******I'm Discarding " << m_labels.back() << "\n";
83  m_labels.pop_back();
84  }
85 
87  }
88 
89  private:
90  std::vector<std::string> m_labels;
91  };
92 }
93 
94 #endif
Eigen::MatrixXd MatrixXd
DataStream & operator<<(const std::string &_str)
MatrixXdDataStream(DataStreamTraits _traits=none)
EigenIndex row() const
Main CASM namespace.
Definition: complete.cpp:8
std::string to_string(ENUM val)
Return string representation of enum class.
Definition: EnumIO.hh:83
const Eigen::MatrixXd & matrix()
virtual DataStream & newline()
const std::vector< std::string > & labels() const
DataStream & operator<<(long _l)
Eigen::MatrixXd::Index EigenIndex
For integer indexing:
virtual DataStream & operator<<(const std::string &)
Definition: DataStream.hh:30
LabeledMatrixXdDataStream(DataStreamTraits _traits=none)
std::vector< std::string > m_labels
bool fail() const
Definition: DataStream.hh:73
DataStream & operator<<(double _d)