CASM
AClustersApproachtoStatisticalMechanics
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules
Reference.hh
Go to the documentation of this file.
1 #ifndef CASM_Reference
2 #define CASM_Reference
3 
4 #include <map>
5 #include <functional>
6 #include <memory>
7 #include <string>
8 
9 #include "casm/external/Eigen/Dense"
13 
14 namespace CASM {
15 
17 
19 
27  class ConstantReference : public Reference {
29 
30  public:
31 
32  static const std::string Name;
33  static const std::string Desc;
34 
35  explicit ConstantReference(double _value = 0.0) :
36  Reference(Name, Desc), m_value(_value) {}
37 
39  double value() const {
40  return m_value;
41  }
42 
44  double evaluate(const Configuration &config) const override {
45  return value();
46  }
47 
48  std::unique_ptr<ConstantReference> clone() const {
49  return notstd::make_unique<ConstantReference>(*this->_clone());
50  }
51 
52  private:
53 
55  virtual ConstantReference *_clone() const override {
56  return new ConstantReference(*this);
57  }
58 
59  double m_value;
60 
61  };
62 
63 
64 
74  class HyperPlaneReferenceBase : public Reference {
75 
76  public:
77 
78  typedef std::map<std::string, Eigen::VectorXd> SpecializedRef;
79  typedef std::function<Eigen::VectorXd(const Configuration &)> InputFunction;
80 
99  HyperPlaneReferenceBase(std::string _name,
100  std::string _desc,
101  const Eigen::VectorXd &_global_ref,
102  InputFunction _input,
103  SpecializedRef _supercell_ref = SpecializedRef(),
104  SpecializedRef _config_ref = SpecializedRef()) :
105  Reference(_name, _desc),
106  m_input(_input),
107  m_config_ref(_config_ref),
108  m_supercell_ref(_supercell_ref),
109  m_global_ref(_global_ref) {}
110 
112 
114  std::unique_ptr<HyperPlaneReferenceBase> clone() const {
115  return notstd::make_unique<HyperPlaneReferenceBase>(*this->_clone());
116  }
117 
120  const Eigen::VectorXd &global() const {
121  return m_global_ref;
122  }
123 
124 
128  const std::map<std::string, Eigen::VectorXd> &supercell() const {
129  return m_supercell_ref;
130  }
131 
135  const std::map<std::string, Eigen::VectorXd> &config() const {
136  return m_config_ref;
137  }
138 
140  std::function<Eigen::VectorXd(const Configuration &)> input() const {
141  return m_input;
142  }
143 
146  return m_input(config);
147  }
148 
154 
155 
162  double evaluate(const Configuration &config) const override {
163 
164  return hyperplane(config).dot(input(config));
165  }
166 
167  protected:
168 
172  return m_global_ref;
173  }
174 
178  std::map<std::string, Eigen::VectorXd> &supercell() {
179  return m_supercell_ref;
180  }
181 
185  std::map<std::string, Eigen::VectorXd> &config() {
186  return m_config_ref;
187  }
188 
189 
190  private:
191 
193  virtual HyperPlaneReferenceBase *_clone() const override {
194  return new HyperPlaneReferenceBase(*this);
195  }
196 
197 
198  InputFunction m_input;
199 
200  std::map<std::string, Eigen::VectorXd> m_config_ref;
201 
202  std::map<std::string, Eigen::VectorXd> m_supercell_ref;
203 
205 
206  };
207 
208 
217 
218  public:
219 
220  static const std::string Name;
221  static const std::string Desc;
222 
242  InputFunction _input,
243  SpecializedRef _supercell_ref = SpecializedRef(),
244  SpecializedRef _config_ref = SpecializedRef()) :
245  HyperPlaneReferenceBase(Name, Desc, _global_ref, _input, _config_ref, _supercell_ref) {}
246 
247 
249  std::unique_ptr<HyperPlaneReference> clone() const {
250  return notstd::make_unique<HyperPlaneReference>(*this->_clone());
251  }
252 
253 
254  // --- Prevent hiding of const accessors ---
255 
259 
260 
261  // --- Make protected inherited members public ---
262 
267  }
268 
272  std::map<std::string, Eigen::VectorXd> &supercell() {
274  }
275 
279  std::map<std::string, Eigen::VectorXd> &config() {
281  }
282 
283  private:
284 
286  HyperPlaneReference *_clone() const override {
287  return new HyperPlaneReference(*this);
288  }
289 
290  };
291 
294 }
295 
296 #endif
virtual HyperPlaneReferenceBase * _clone() const override
Clone.
Definition: Reference.hh:193
Eigen::VectorXd m_global_ref
Definition: Reference.hh:204
std::function< Eigen::VectorXd(const Configuration &)> input() const
Return the 'input' function that maps a Configuration to coordinates.
Definition: Reference.hh:140
std::function< Eigen::VectorXd(const Configuration &)> InputFunction
Definition: Reference.hh:79
double value() const
Return the constant value used for all Configuration.
Definition: Reference.hh:39
static const std::string Desc
Definition: Reference.hh:33
Eigen::VectorXd hyperplane(const Configuration &config) const
Return the reference hyperplane used for a particular configuration.
Definition: Reference.cc:21
HyperPlaneReferenceBase(std::string _name, std::string _desc, const Eigen::VectorXd &_global_ref, InputFunction _input, SpecializedRef _supercell_ref=SpecializedRef(), SpecializedRef _config_ref=SpecializedRef())
Constructor.
Definition: Reference.hh:99
std::map< std::string, Eigen::VectorXd > m_config_ref
Definition: Reference.hh:200
Main CASM namespace.
Definition: complete.cpp:8
Base class for creating scalar DatumFormatter.
static const std::string Desc
Definition: Reference.hh:221
static const std::string Name
Definition: Reference.hh:32
std::map< std::string, Eigen::VectorXd > SpecializedRef
Definition: Reference.hh:78
std::map< std::string, Eigen::VectorXd > & config()
Access a map of configname to reference for Configuration specialized references. ...
Definition: Reference.hh:185
std::unique_ptr< ConstantReference > clone() const
Definition: Reference.hh:48
std::unique_ptr< HyperPlaneReferenceBase > clone() const
Clone.
Definition: Reference.hh:114
const std::map< std::string, Eigen::VectorXd > & supercell() const
const Access a map of scelname to reference for Supercell specialized references
Definition: Reference.hh:128
HyperPlaneReference * _clone() const override
Clone.
Definition: Reference.hh:286
virtual ConstantReference * _clone() const override
Clone.
Definition: Reference.hh:55
std::map< std::string, Eigen::VectorXd > m_supercell_ref
Definition: Reference.hh:202
Eigen::VectorXd VectorXd
Eigen::VectorXd & global()
Access the global reference.
Definition: Reference.hh:265
static const std::string Name
Definition: Reference.hh:220
std::unique_ptr< HyperPlaneReference > clone() const
Clone.
Definition: Reference.hh:249
double evaluate(const Configuration &config) const override
Return the reference for a particular configuration.
Definition: Reference.hh:162
HyperPlaneReference(const Eigen::VectorXd &_global_ref, InputFunction _input, SpecializedRef _supercell_ref=SpecializedRef(), SpecializedRef _config_ref=SpecializedRef())
Constructor.
Definition: Reference.hh:241
double evaluate(const Configuration &config) const override
Returns the same constant value for all Configuration.
Definition: Reference.hh:44
std::map< std::string, Eigen::VectorXd > & supercell()
Access a map of scelname to reference for Supercell specialized references.
Definition: Reference.hh:272
const Eigen::VectorXd & global() const
const Access the global reference
Definition: Reference.hh:120
std::map< std::string, Eigen::VectorXd > & config()
Access a map of configname to reference for Configuration specialized references. ...
Definition: Reference.hh:279
Maps a Configuration to a scalar value via a hyperplane.
Definition: Reference.hh:74
std::map< std::string, Eigen::VectorXd > & supercell()
Access a map of scelname to reference for Supercell specialized references.
Definition: Reference.hh:178
Maps all Configurations to the same value.
Definition: Reference.hh:28
ScalarAttribute< Configuration > Reference
Definition: Reference.hh:16
ConstantReference(double _value=0.0)
Definition: Reference.hh:35
Eigen::VectorXd input(const Configuration &config) const
Return the 'input' coordinates that a Configuration is mapped to.
Definition: Reference.hh:145
const std::map< std::string, Eigen::VectorXd > & config() const
const Access a map of configname to reference for Configuration specialized references ...
Definition: Reference.hh:135
Eigen::VectorXd & global()
Access the global reference.
Definition: Reference.hh:171
Maps a Configuration to a scalar value via a hyperplane.
Definition: Reference.hh:216
A Configuration represents the values of all degrees of freedom in a Supercell.