creativity  v1.3.0
Agent-based model of creativity and piracy
Variable.hpp
1 #pragma once
2 #include <cmath>
3 #include <stdexcept>
4 #include <string>
5 #include <type_traits>
6 #include <memory>
7 #include <Eigen/Core>
8 
9 namespace creativity { namespace data {
10 
12 std::string to_string(double d);
13 
14 #define CREATE_SHARED_WRAPPER(C) template <class... Args> static std::shared_ptr<C> create(Args... args) { return std::shared_ptr<C>(new C(std::forward<Args>(args)...)); }
15 
19 class Variable : public std::enable_shared_from_this<Variable> {
20  public:
22  virtual ~Variable() = default;
23 
25  virtual std::string name() const = 0;
26 
34  virtual std::string nameBracketed(const std::string &bracketL = "(", const std::string &bracketR = ")") const;
35 
51  virtual void populate(Eigen::Ref<Eigen::VectorXd> column, unsigned int offset = 0, unsigned int trim = 0) const = 0;
52 
60  Eigen::VectorXd values(unsigned int rows = 0, unsigned int offset = 0, unsigned int trim = 0) const;
61 
66  virtual unsigned int size() const = 0;
67 
71  class SizeError : public std::logic_error {
72  public:
74  SizeError();
76  SizeError(const std::string &why);
77  };
78 };
79 
83 class ConstantVariable final : public Variable {
84  protected:
86  ConstantVariable() = default;
90  ConstantVariable(double c);
91  public:
93  CREATE_SHARED_WRAPPER(ConstantVariable)
94 
95 
96  virtual void populate(Eigen::Ref<Eigen::VectorXd> column, unsigned int offset = 0, unsigned int trim = 0) const override;
97 
101  virtual std::string name() const override;
102 
104  virtual std::string nameBracketed(const std::string& = "(", const std::string& = ")") const override;
105 
107  const double& value() const;
108 
110  unsigned int size() const override;
111 
112  private:
114  double c_ = 1.0;
115 };
116 
118 class SimpleVariable : public Variable {
119  protected:
121  SimpleVariable() = delete;
122 
125  SimpleVariable(const std::string &name, const Eigen::Ref<const Eigen::VectorXd> values);
126 
127  public:
129  CREATE_SHARED_WRAPPER(SimpleVariable)
130 
131 
132  virtual void populate(Eigen::Ref<Eigen::VectorXd> column, unsigned int offset = 0, unsigned int trim = 0) const override;
134  virtual std::string name() const override;
136  virtual std::string nameBracketed(const std::string& = "(", const std::string& = ")") const override;
138  unsigned int size() const override;
139 
140  protected:
142  const std::string name_;
144  Eigen::VectorXd col_;
145 };
146 
148 class BinaryExpr : public Variable {
149  public:
153  virtual unsigned int size() const override;
154 
155  protected:
157  BinaryExpr() = delete;
158 
160  BinaryExpr(const std::shared_ptr<const Variable> &left, const std::shared_ptr<const Variable> &right);
161 
163  std::shared_ptr<const Variable> left_;
165  std::shared_ptr<const Variable> right_;
166 };
167 
170 class UnaryExpr : public Variable {
171  public:
175  virtual unsigned int size() const override;
176 
177  protected:
179  UnaryExpr() = delete;
180 
182  UnaryExpr(const std::shared_ptr<const Variable> &var);
183 
185  std::shared_ptr<const Variable> var_;
186 };
187 
188 
192 class Multiplication : public BinaryExpr {
193  protected:
196 
197  public:
199  CREATE_SHARED_WRAPPER(Multiplication)
200 
201 
202  virtual void populate(Eigen::Ref<Eigen::VectorXd> column, unsigned int offset = 0, unsigned int trim = 0) const override;
203 
211  virtual std::string name() const override;
212 };
213 
217 class Addition : public BinaryExpr {
218  protected:
221 
222  public:
224  CREATE_SHARED_WRAPPER(Addition)
225 
226 
227  virtual void populate(Eigen::Ref<Eigen::VectorXd> column, unsigned int offset = 0, unsigned int trim = 0) const override;
228 
233  virtual std::string name() const override;
234 };
235 
241 class Division : public BinaryExpr {
242  protected:
245 
246  public:
248  CREATE_SHARED_WRAPPER(Division)
249 
250 
251  virtual void populate(Eigen::Ref<Eigen::VectorXd> column, unsigned int offset = 0, unsigned int trim = 0) const override;
252 
257  virtual std::string name() const override;
258 };
259 
266 class Power : public UnaryExpr {
267  protected:
269  Power() = delete;
270 
272  Power(const std::shared_ptr<const Variable> &var, double power);
273 
274  public:
276  CREATE_SHARED_WRAPPER(Power)
277 
278 
279  virtual void populate(Eigen::Ref<Eigen::VectorXd> column, unsigned int offset = 0, unsigned int trim = 0) const override;
280 
285  virtual std::string name() const override;
286 
287  protected:
289  double power_;
290 };
291 
299 class Exponential : public UnaryExpr {
300  protected:
302  Exponential(double base, const std::shared_ptr<const Variable> &var);
303 
307  Exponential(const std::shared_ptr<const Variable> &var);
308 
309  public:
311  CREATE_SHARED_WRAPPER(Exponential)
312 
313 
314  virtual void populate(Eigen::Ref<Eigen::VectorXd> column, unsigned int offset = 0, unsigned int trim = 0) const override;
315 
320  virtual std::string name() const override;
321 
323  virtual std::string nameBracketed(const std::string &bracketL = "(", const std::string &bracketR = ")") const override;
324 
325  protected:
327  double base_;
328 };
329 
332 class Logarithm : public UnaryExpr {
333  protected:
335  using UnaryExpr::UnaryExpr;
336 
337  public:
339  CREATE_SHARED_WRAPPER(Logarithm)
340 
341 
342  virtual void populate(Eigen::Ref<Eigen::VectorXd> column, unsigned int offset = 0, unsigned int trim = 0) const override;
343 
347  virtual std::string name() const override;
348 
349  virtual std::string nameBracketed(const std::string& = "(", const std::string& = ")") const override;
350 };
351 
352 #undef CREATE_SHARED_WRAPPER
353 
355 std::shared_ptr<Multiplication> operator* (const std::shared_ptr<const Variable> &left, const std::shared_ptr<const Variable> &right);
357 std::shared_ptr<Multiplication> operator* (const std::shared_ptr<const Variable> &v, double c);
359 std::shared_ptr<Multiplication> operator* (double c, const std::shared_ptr<const Variable> &v);
361 std::shared_ptr<Multiplication> operator- (const std::shared_ptr<const Variable> &v);
363 std::shared_ptr<Addition> operator+ (const std::shared_ptr<const Variable> &left, const std::shared_ptr<const Variable> &right);
365 std::shared_ptr<Addition> operator+ (const std::shared_ptr<const Variable> &v, double c);
367 std::shared_ptr<Addition> operator+ (double c, const std::shared_ptr<const Variable> &v);
369 std::shared_ptr<Addition> operator- (const std::shared_ptr<const Variable> &left, const std::shared_ptr<const Variable> &right);
371 std::shared_ptr<Addition> operator- (const std::shared_ptr<const Variable> &v, double c);
375 std::shared_ptr<Addition> operator- (double c, const std::shared_ptr<const Variable> &v);
377 std::shared_ptr<Division> operator/ (const std::shared_ptr<const Variable> &numerator, const std::shared_ptr<const Variable> &denominator);
379 std::shared_ptr<Division> operator/ (const std::shared_ptr<const Variable> &v, double c);
381 std::shared_ptr<Division> operator/ (double c, const std::shared_ptr<const Variable> &v);
383 std::shared_ptr<Power> operator^ (const std::shared_ptr<const Variable> &val, double pow);
385 std::shared_ptr<Exponential> operator^ (double base, const std::shared_ptr<const Variable> &val);
386 
387 }}
388 
389 namespace std {
391 shared_ptr<creativity::data::Exponential>
392 exp(const shared_ptr<const creativity::data::Variable> &var);
394 shared_ptr<creativity::data::Exponential>
395 exp2(const shared_ptr<const creativity::data::Variable> &var);
397 shared_ptr<creativity::data::Logarithm>
398 log(const shared_ptr<const creativity::data::Variable> &var);
400 shared_ptr<creativity::data::Power>
401 sqrt(const shared_ptr<const creativity::data::Variable> &var);
403 shared_ptr<creativity::data::Power>
404 pow(const shared_ptr<const creativity::data::Variable> &var, double power);
406 shared_ptr<creativity::data::Exponential>
407 pow(double base, const shared_ptr<const creativity::data::Variable> &var);
408 }
Takes a natural logarithm of a Variable&#39;s values.
Definition: Variable.hpp:332
std::string to_string(double d)
Helper wrapper around std::to_string that removes insignificant 0s and a .
SizeError()
Constructs with default message about populate() size mismatch.
std::shared_ptr< Multiplication > operator*(const std::shared_ptr< const Variable > &left, const std::shared_ptr< const Variable > &right)
Multiplies two Variable objects together, returning a new Multiplication object.
UnaryExpr()=delete
Not default-constructible.
Primary namespace for all Creativity library code.
Definition: config.hpp:4
std::shared_ptr< const Variable > var_
The underlying unary variable.
Definition: Variable.hpp:185
Wrapper class around a simple column, where values are exactly the value in the column.
Definition: Variable.hpp:118
Abstract base class for model variables.
Definition: Variable.hpp:19
Exception class thrown when attempting to populate a column from a source of an incompatible or unkno...
Definition: Variable.hpp:71
virtual std::string nameBracketed(const std::string &bracketL="(", const std::string &bracketR=")") const
Returns a name for this variable, but with surrounding brackets if this variable needs it–for exampl...
Definition: Variable.hpp:389
Class that returns the coefficient-wise division of elements in one Variable by corresponding element...
Definition: Variable.hpp:241
Special Variable subclass for representing a constant value.
Definition: Variable.hpp:83
virtual unsigned int size() const =0
Returns the intrinsic size of this data.
Raises a Variable&#39;s values to a power.
Definition: Variable.hpp:266
std::shared_ptr< Power > operator^(const std::shared_ptr< const Variable > &val, double pow)
Variable ^ power returns a Power object.
virtual void populate(Eigen::Ref< Eigen::VectorXd > column, unsigned int offset=0, unsigned int trim=0) const =0
Populates the given column reference with this variable&#39;s values.
std::shared_ptr< const Variable > left_
The left-hand Variable.
Definition: Variable.hpp:163
Wrapper class around a multiplication of the elements of two Variables.
Definition: Variable.hpp:192
std::shared_ptr< Division > operator/(const std::shared_ptr< const Variable > &numerator, const std::shared_ptr< const Variable > &denominator)
Divides one Variable by another, returning a new Division object.
Eigen::VectorXd values(unsigned int rows=0, unsigned int offset=0, unsigned int trim=0) const
Shortcut wrapper around populate that creates a new column of the given size, calls populate() with i...
Raises a base value to a Variable&#39;s value.
Definition: Variable.hpp:299
BinaryExpr()=delete
Not default-constructible.
Wrapper class around a addition of the elements of two Variables.
Definition: Variable.hpp:217
std::shared_ptr< Multiplication > operator-(const std::shared_ptr< const Variable > &v)
Unary negation of a Variable is converted to a multiplication by -1.
virtual ~Variable()=default
Virtual destructor.
std::shared_ptr< Addition > operator+(const std::shared_ptr< const Variable > &left, const std::shared_ptr< const Variable > &right)
Adds two Variable objects together, returning a new Addition object.
Base class for composite variables with two Variable components.
Definition: Variable.hpp:148
Base class for composite variables with a single variable.
Definition: Variable.hpp:170
virtual std::string name() const =0
Returns a name for this variable.
std::shared_ptr< const Variable > right_
The right-hand Variable.
Definition: Variable.hpp:165