19 #ifndef MINSKYTENSOROPS_H 20 #define MINSKYTENSOROPS_H 31 const char*
what()
const throw() {
return "Falling back to scalar processing";}
37 double* m_flowVars=
nullptr;
38 std::size_t m_fvSize=0;
39 const double* m_stockVars=
nullptr;
43 std::size_t
fvSize()
const {
return m_fvSize;}
44 const double*
stockVars()
const {
return m_stockVars;}
50 void update(
double* fv, std::size_t n,
const double* sv)
52 m_flowVars=fv; m_fvSize=n; m_stockVars=sv; m_timestamp=ITensor::Timestamp::clock::now();
58 shared_ptr<EvalCommon>
ev;
64 std::vector<TensorPtr> tensorsFromPort(
const Port&)
const;
66 std::vector<TensorPtr> tensorsFromPorts(
const Item&)
const;
72 class TensorOpFactory:
public classdesc::Factory<civita::ITensor, OperationType::Type>
74 using classdesc::Factory<civita::ITensor, OperationType::Type>::create;
89 virtual double dFlow(std::size_t ti, std::size_t fi)
const=0;
91 virtual double dStock(std::size_t ti, std::size_t si)
const=0;
95 template <
class VV=const VariableValue,
class I=ITensor>
101 shared_ptr<EvalCommon>
ev;
103 int idx()
const {
return value->idx();}
108 return value->isFlowVar()? ev->flowVars()[value->idx()+i]: ev->stockVars()[value->idx()+i];
112 const Hypercube&
hypercube()
const override {
return value->hypercube();}
113 const Index&
index()
const override {
return value->index();}
115 std::size_t
size()
const override {
return value->size();}
117 double dFlow(std::size_t ti, std::size_t fi)
const override 118 {
return value->isFlowVar() && fi==ti+value->idx();}
119 double dStock(std::size_t ti, std::size_t si)
const override 120 {
return !value->isFlowVar() && si==ti+value->idx();}
127 TensorVarVal(
const std::shared_ptr<VariableValue>& vv,
const shared_ptr<EvalCommon>& ev):
129 using ITensorVal::index;
130 const Index&
index(Index&& x)
override {
return value->index(std::move(x));}
131 const Index&
index()
const override {
return value->index();}
132 const Hypercube&
hypercube(
const Hypercube& hc)
override {
return value->hypercube(hc);}
133 const Hypercube&
hypercube(Hypercube&& hc)
override {
return value->hypercube(std::move(hc));}
134 const Hypercube&
hypercube()
const override {
return value->hypercube();}
135 using ITensorVal::operator[];
137 assert(value->isFlowVar());
141 || value->idx()+i<ev->fvSize());
142 return ev->flowVars()[value->idx()+i];
147 for (
size_t i=0; i<size(); ++i)
150 ev->update(ev->flowVars(), ev->fvSize(), ev->stockVars());
157 class TensorEval:
public classdesc::Poly<TensorEval, EvalOpBase>
166 TensorEval(
const std::shared_ptr<VariableValue>& v,
const shared_ptr<EvalCommon>& ev,
167 const TensorPtr& rhs): result(v, ev), rhs(rhs) {
168 result.
index(rhs->index());
169 assert(!rhs->index().empty() || rhs->hypercube().numElements()==rhs->size());
171 assert(result.
idx()>=0);
172 assert(result.
size()==rhs->size());
174 TensorEval(
const std::shared_ptr<VariableValue>& dest,
const std::shared_ptr<VariableValue>& src);
177 void eval(
double* fv, std::size_t,
const double* sv)
override;
179 void deriv(
double* df,std::size_t,
const double* ds,
const double* sv,
const double* fv)
override;
shared_ptr< EvalCommon > ev
reference to EvalOpVector owning this value, to extract flowVar and stockVarinfo
ITensor::Timestamp m_timestamp
A helper to evaluate a variable value.
ITensor::Timestamp timestamp() const
virtual const Hypercube & hypercube() const
information describing the axes, types and labels of this tensor
shared_ptr< EvalCommon > ev
ITensor::Timestamp timestamp() const override
const char * what() const
virtual const Index & index() const
the index vector - assumed to be ordered and unique
std::shared_ptr< Item > ItemPtr
const Index & index() const override
const Hypercube & hypercube(const Hypercube &hc) override
double dFlow(std::size_t ti, std::size_t fi) const override
partial derivative of tensor component ti wrt flow variable fi
const Hypercube & hypercube() const override
As it says on the tin, this is a factory for creating a TensorOp which can compute the result of op a...
double & operator[](std::size_t i) override
A place to store common data shared between TensorVarVals within a give calculation.
Creation and access to the minskyTCL_obj object, which has code to record whenever Minsky's state cha...
TensorsFromPort(const shared_ptr< EvalCommon > &ev)
std::shared_ptr< VV > value
std::chrono::time_point< std::chrono::high_resolution_clock > Timestamp
Type type() const override
support for partial derivatives needed for implicit method
void update(double *fv, std::size_t n, const double *sv)
initialise flow and stock var array pointers
const Index & index(Index &&x) override
std::shared_ptr< ITensor > TensorPtr
const Hypercube & hypercube() const override
static std::vector< double, CIVITA_ALLOCATOR< double > > flowVars
variables defined as a simple function of the stock variables, also known as lhs variables. These variables appear in the body of the Godley table
TensorVarVal(const std::shared_ptr< VariableValue > &vv, const shared_ptr< EvalCommon > &ev)
const Hypercube & hypercube(Hypercube &&hc) override
TensorEval(const std::shared_ptr< VariableValue > &v, const shared_ptr< EvalCommon > &ev, const TensorPtr &rhs)
const Index & index() const override
TensorVarVal & operator=(const ITensor &t) override
TensorOpFactory tensorOpFactory
std::size_t size() const override
double dStock(std::size_t ti, std::size_t si) const override
partial derivative of tensor component ti wrt stock variable si
double operator[](std::size_t i) const override
double * flowVars() const
const double * stockVars() const
TensorVarValBase(const std::shared_ptr< VV > &vv, const shared_ptr< EvalCommon > &ev)
std::size_t fvSize() const