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)...)); } 19 class Variable :
public std::enable_shared_from_this<Variable> {
25 virtual std::string
name()
const = 0;
34 virtual std::string
nameBracketed(
const std::string &bracketL =
"(",
const std::string &bracketR =
")")
const;
51 virtual void populate(Eigen::Ref<Eigen::VectorXd> column,
unsigned int offset = 0,
unsigned int trim = 0)
const = 0;
60 Eigen::VectorXd
values(
unsigned int rows = 0,
unsigned int offset = 0,
unsigned int trim = 0)
const;
66 virtual unsigned int size()
const = 0;
96 virtual
void populate(Eigen::Ref<Eigen::VectorXd> column,
unsigned int offset = 0,
unsigned int trim = 0) const override;
101 virtual
std::
string name() const override;
107 const
double& value() const;
110 unsigned int size() const override;
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;
138 unsigned int size() const override;
144 Eigen::VectorXd col_;
153 virtual unsigned int size()
const override;
160 BinaryExpr(
const std::shared_ptr<const Variable> &left,
const std::shared_ptr<const Variable> &right);
163 std::shared_ptr<const Variable>
left_;
175 virtual unsigned int size()
const override;
182 UnaryExpr(
const std::shared_ptr<const Variable> &var);
185 std::shared_ptr<const Variable>
var_;
202 virtual
void populate(Eigen::Ref<Eigen::VectorXd> column,
unsigned int offset = 0,
unsigned int trim = 0) const override;
211 virtual
std::
string name() const override;
227 virtual
void populate(Eigen::Ref<Eigen::VectorXd> column,
unsigned int offset = 0,
unsigned int trim = 0) const override;
233 virtual
std::
string name() const override;
251 virtual
void populate(Eigen::Ref<Eigen::VectorXd> column,
unsigned int offset = 0,
unsigned int trim = 0) const override;
257 virtual
std::
string name() const override;
272 Power(
const std::shared_ptr<const Variable> &var,
double power);
279 virtual
void populate(Eigen::Ref<Eigen::VectorXd> column,
unsigned int offset = 0,
unsigned int trim = 0) const override;
285 virtual
std::
string name() const override;
302 Exponential(
double base,
const std::shared_ptr<const Variable> &var);
307 Exponential(
const std::shared_ptr<const Variable> &var);
314 virtual
void populate(Eigen::Ref<Eigen::VectorXd> column,
unsigned int offset = 0,
unsigned int trim = 0) const override;
320 virtual
std::
string name() const override;
323 virtual
std::
string nameBracketed(const
std::
string &bracketL = "(", const
std::
string &bracketR = ")") const override;
342 virtual
void populate(Eigen::Ref<Eigen::VectorXd> column,
unsigned int offset = 0,
unsigned int trim = 0) const override;
347 virtual
std::
string name() const override;
352 #undef CREATE_SHARED_WRAPPER 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);
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);
Takes a natural logarithm of a Variable'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'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'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'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