12 #ifndef SummationValueScalarOptiSwapToValueFactorVectorHppIncluded 13 #define SummationValueScalarOptiSwapToValueFactorVectorHppIncluded 39 template <
Order MaxiOrMini,
typename paramValue,
typename value = paramValue,
40 typename paramMetric = paramValue,
typename metric = paramMetric>
89 virtual void executeBacklog();
90 virtual void emulateBacklog();
91 virtual void undoScalars(Serial
const ParamSerial);
107 ValueBuffType cacheSimulValue;
108 #endif//SimulDownward 113 ValueBuffType cacheEmulValue;
114 #endif // ComputeLazy 127 template <Order MaxiOrMini,
typename paramValue,
typename value,
typename paramMetric,
typename metric>
141 template <Order MaxiOrMini,
typename paramValue,
typename value,
typename paramMetric,
typename metric>
153 if (tFuncSerial != InvalidSerial)
154 return scast<SummationValueScalarOptiSwapToValueFactorVector<MaxiOrMini,paramValue,value,paramMetric,metric> *>(pSystem->LocateFunc(tFuncSerial));
167 template <Order MaxiOrMini,
typename paramValue,
typename value,
typename paramMetric,
typename metric>
188 for(Serial tParamSerial = 0; tParamSerial < ParamCount; ++tParamSerial)
210 template <Order MaxiOrMini,
typename paramValue,
typename value,
typename paramMetric,
typename metric>
217 for(Serial tFactorSerial = 0; tFactorSerial < this->
FactorVars.ItemCount(); ++tFactorSerial)
224 for(Serial tParamFactorSerial = 0; tParamFactorSerial < this->
ParamFactors[tParamSerial].ItemCount(); ++tParamFactorSerial)
226 Serial
const tFactorSerial = this->
ParamFactors[tParamSerial][tParamFactorSerial];
232 for(Serial tFactorSerial = 0; tFactorSerial < this->
FactorVars.ItemCount(); ++tFactorSerial)
243 template <Order MaxiOrMini,
typename paramValue,
typename value,
typename paramMetric,
typename metric>
248 for(Serial tFactorSerial = 0; tFactorSerial < this->
FactorVars.ItemCount(); ++tFactorSerial)
259 for(Serial tParamFactorSerial = 0; tParamFactorSerial < this->
ParamFactors[tParamSerial].ItemCount(); ++tParamFactorSerial)
261 Serial
const tFactorSerial = this->
ParamFactors[tParamSerial][tParamFactorSerial];
268 for(Serial tFactorSerial = 0; tFactorSerial < this->
FactorVars.ItemCount(); ++tFactorSerial)
270 #if ExecUpwardOrLazyDownward 271 this->runPostExecAnew();
281 template <Order MaxiOrMini,
typename paramValue,
typename value,
typename paramMetric,
typename metric>
290 #endif//SimulDownward 296 this->runPostSimulAnew();
306 template <Order MaxiOrMini,
typename paramValue,
typename value,
typename paramMetric,
typename metric>
311 for(Serial tParamFactorSerial = 0; tParamFactorSerial < this->
ParamFactors[ParamSerial].ItemCount(); ++tParamFactorSerial)
313 Serial
const tFactorSerial = this->
ParamFactors[ParamSerial][tParamFactorSerial];
319 #endif // ComputeLazy 326 template <Order MaxiOrMini,
typename paramValue,
typename value,
typename paramMetric,
typename metric>
331 if (this->mExecChangedParams.TagCount())
334 for(Index tIndex = 0; tIndex < this->mExecChangedParams.TagCount(); ++tIndex)
336 Serial
const tParamSerial = this->mExecChangedParams.TaggedSerial(tIndex);
339 if (tParamExprValueRecord->
PrevDiff(this->SysMaster->ExecClock()))
343 for(Serial tParamFactorSerial = 0; tParamFactorSerial < this->
ParamFactors[tParamSerial].ItemCount(); ++tParamFactorSerial)
345 Serial
const tFactorSerial = this->
ParamFactors[tParamSerial][tParamFactorSerial];
361 this->runPostExecIncr();
367 if (!this->BacklogExists())
369 #endif // ComputeLazy 371 if (this->needExecParamComputation()) this->listExecParams();
372 if (this->mBlockExecParams->ItemCount())
376 for(Index tIndex = 0; tIndex < this->mBlockExecParams->ItemCount(); ++tIndex)
378 Serial
const tParamSerial = this->mBlockExecParams->Item(tIndex);
381 if (tParamExprValueRecord->
PrevDiff(this->SysMaster->ExecClock()))
385 for(Serial tParamFactorSerial = 0; tParamFactorSerial < this->
ParamFactors[tParamSerial].ItemCount(); ++tParamFactorSerial)
387 Serial
const tFactorSerial = this->
ParamFactors[tParamSerial][tParamFactorSerial];
408 if (this->needExecParamComputation()) this->markExecParams();
410 for(Index tIndex = 0; tIndex < this->mBlockExecParams->ItemCount(); ++tIndex)
412 Serial
const tParamSerial = this->mBlockExecParams->Item(tIndex);
416 if (this->mScalarUndoneParams->Tagged(tParamSerial))
419 for(Serial tParamFactorSerial = 0; tParamFactorSerial < this->
ParamFactors[tParamSerial].ItemCount(); ++tParamFactorSerial)
421 Serial
const tFactorSerial = this->
ParamFactors[tParamSerial][tParamFactorSerial];
429 if (tParamExprValueRecord->
PrevDiff(this->SysMaster->ExecClock()))
432 for(Serial tParamFactorSerial = 0; tParamFactorSerial < this->
ParamFactors[tParamSerial].ItemCount(); ++tParamFactorSerial)
434 Serial
const tFactorSerial = this->
ParamFactors[tParamSerial][tParamFactorSerial];
443 for(Index tIndex = 0; tIndex < this->mBacklogParams.TagCount(); ++tIndex)
445 Serial
const tParamSerial = this->mBacklogParams.TaggedSerial(tIndex);
446 if (this->mLabelExecParams.Tagged(tParamSerial))
continue;
447 Expression::performExecBacklog(this->
ParamExprs[tParamSerial]);
450 if (this->mScalarUndoneParams->Tagged(tParamSerial))
453 for(Serial tParamFactorSerial = 0; tParamFactorSerial < this->
ParamFactors[tParamSerial].ItemCount(); ++tParamFactorSerial)
455 Serial
const tFactorSerial = this->
ParamFactors[tParamSerial][tParamFactorSerial];
463 if (tParamExprValueRecord->
PrevDiff(this->SysMaster->ExecClock()))
466 for(Serial tParamFactorSerial = 0; tParamFactorSerial < this->
ParamFactors[tParamSerial].ItemCount(); ++tParamFactorSerial)
468 Serial
const tFactorSerial = this->
ParamFactors[tParamSerial][tParamFactorSerial];
486 this->runPostExecIncr();
487 #endif // ComputeLazy 497 template <Order MaxiOrMini,
typename paramValue,
typename value,
typename paramMetric,
typename metric>
501 for(Index tIndex = 0; tIndex < this->mBacklogParams.TagCount(); ++tIndex)
503 Serial
const tParamSerial = this->mBacklogParams.TaggedSerial(tIndex);
504 Expression::performExecBacklog(this->
ParamExprs[tParamSerial]);
507 if (this->mScalarUndoneParams->Tagged(tParamSerial))
510 for(Serial tParamFactorSerial = 0; tParamFactorSerial < this->
ParamFactors[tParamSerial].ItemCount(); ++tParamFactorSerial)
512 Serial
const tFactorSerial = this->
ParamFactors[tParamSerial][tParamFactorSerial];
520 if (tParamExprValueRecord->
PrevDiff(this->SysMaster->ExecClock()))
523 for(Serial tParamFactorSerial = 0; tParamFactorSerial < this->
ParamFactors[tParamSerial].ItemCount(); ++tParamFactorSerial)
525 Serial
const tFactorSerial = this->
ParamFactors[tParamSerial][tParamFactorSerial];
542 this->runPostExecBacklog();
545 #endif // ComputeLazy 552 template <Order MaxiOrMini,
typename paramValue,
typename value,
typename paramMetric,
typename metric>
557 if (this->mSimulChangedParams.TagCount())
560 for(Index tIndex = 0; tIndex < this->mSimulChangedParams.TagCount(); ++tIndex)
562 Serial
const tParamSerial = this->mSimulChangedParams.TaggedSerial(tIndex);
564 if (tParamExprValueRecord->
SimulDiff(this->SysMaster->SimulClock()))
568 this->runPostSimulIncr();
573 if (!this->BacklogExists())
575 #endif // ComputeLazy 577 if (this->needSimulFlexiParamComputation()) this->listSimulFlexiParams();
580 if (this->needSimulFixedParamComputation())
581 this->enumSimulFixedParams(this->mBlockSimulFlexiParams->ItemCount());
583 if (this->needSimulFixedParamComputation()) this->listSimulFixedParams();
587 if (this->needSimulCacheComputation())
590 for(Index tIndex = 0; tIndex < this->mBlockSimulFixedParams->ItemCount(); ++tIndex)
592 Serial
const tParamSerial = this->mBlockSimulFixedParams->Item(tIndex);
599 if (this->mBlockSimulFixedParams->ItemCount() || this->mBlockSimulFlexiParams->ItemCount())
601 if (this->mBlockSimulFixedParams->ItemCount())
603 if (this->mBlockSimulFlexiParams->ItemCount())
613 for(Index tIndex = 0; tIndex < this->mBlockSimulFixedParams->ItemCount(); ++tIndex)
615 Serial
const tParamSerial = this->mBlockSimulFixedParams->Item(tIndex);
622 for(Index tIndex = 0; tIndex < this->mBlockSimulFlexiParams->ItemCount(); ++tIndex)
624 Serial
const tParamSerial = this->mBlockSimulFlexiParams->Item(tIndex);
626 if (this->mLabelSimulFixedParams.Tagged(tParamSerial))
continue;
631 if (tParamExprValueRecord->
SimulDiff(this->SysMaster->SimulClock()))
643 if (this->needSimulFlexiParamComputation()) this->listSimulFlexiParams();
646 if (this->needSimulFixedParamComputation()) this->markSimulFixedParams();
649 if (this->needSimulCacheComputation())
651 if (!this->ChangedSystemEmulClock())
653 cacheSimulValue = cacheEmulValue;
655 for(Index tIndex = 0; tIndex < this->mBlockSimulFixedParams->ItemCount(); ++tIndex)
657 Serial
const tParamSerial = this->mBlockSimulFixedParams->Item(tIndex);
666 for(Index tIndex = 0; tIndex < this->mBlockSimulFixedParams->ItemCount(); ++tIndex)
668 Serial
const tParamSerial = this->mBlockSimulFixedParams->Item(tIndex);
669 if (!this->mScalarUndoneParams->Tagged(tParamSerial))
673 for(Index tIndex = 0; tIndex < this->mBacklogParams.TagCount(); ++tIndex)
675 Serial
const tParamSerial = this->mBacklogParams.TaggedSerial(tIndex);
677 if (this->mLabelSimulFixedParams.Tagged(tParamSerial))
continue;
679 Expression::performEmulBacklog(this->
ParamExprs[tParamSerial]);
682 if (this->mScalarUndoneParams->Tagged(tParamSerial))
683 cacheSimulValue += tParamExprValueRecord->EmulData(this->SysMaster->EmulClock());
684 else if (tParamExprValueRecord->EmulDiff(this->SysMaster->EmulClock()))
685 cacheSimulValue += tParamExprValueRecord->EmulBuffer() - tParamExprValueRecord->
ExecBuffer();
693 for(Index tIndex = 0; tIndex < this->mBlockSimulFixedParams->ItemCount(); ++tIndex)
695 Serial
const tParamSerial = this->mBlockSimulFixedParams->Item(tIndex);
702 for(Index tIndex = 0; tIndex < this->mBlockSimulFlexiParams->ItemCount(); ++tIndex)
704 Serial
const tParamSerial = this->mBlockSimulFlexiParams->Item(tIndex);
707 if (this->mLabelSimulFixedParams.Tagged(tParamSerial))
continue;
710 Expression::performEmulBacklog(this->
ParamExprs[tParamSerial]);
713 if (tParamExprValueRecord->EmulSimulDiff(this->SysMaster->EmulClock(), this->
SysMaster->
SimulClock()))
715 tParamExprValueRecord->EmulData(this->SysMaster->EmulClock());
720 #endif // ComputeLazy 721 #endif//SimulDownward 731 template <Order MaxiOrMini,
typename paramValue,
typename value,
typename paramMetric,
typename metric>
736 for(Index tIndex = 0; tIndex < this->mBacklogParams.TagCount(); ++tIndex)
738 Serial
const tParamSerial = this->mBacklogParams.TaggedSerial(tIndex);
739 Expression::performEmulBacklog(this->
ParamExprs[tParamSerial]);
742 if (this->mScalarUndoneParams->Tagged(tParamSerial))
743 cacheEmulValue += tParamExprValueRecord->EmulData(this->SysMaster->EmulClock());
744 else if (tParamExprValueRecord->EmulDiff(this->SysMaster->EmulClock()))
745 cacheEmulValue += tParamExprValueRecord->EmulBuffer() - tParamExprValueRecord->
ExecBuffer();
750 #endif // ComputeLazy 755 #endif//SummationValueScalarOptiSwapToValueFactorVectorHppIncluded void updateExecData(Clock const ExecClock, data const &Data)
Update the execution data.
Definition: scalarrecord.hpp:228
static void performExecIncr(Expression *const pExpression)
Execute in incremental mode.
Definition: expression1.hpp:287
Order
Orders.
Definition: datatypes.hpp:156
void setExprHash(Hash const pHash)
Set expression hash value.
Definition: expression1.hpp:607
kll< Serial > * tempChangedVector
Vector that undergone changes.
Definition: summationValueScalarOptiSwapToValueFactorVector.hpp:117
Bool Updatable() const
Whether the expression updatable—variables are updatable, functions may be updatable.
Definition: expression1.hpp:44
Clock SimulClock() const
Get the simulation clock.
Definition: system1.hpp:249
#define SimulFlexiOnly
Use flexi simulation only, not fixed one.
Definition: options.hpp:166
DataTempBuff< paramValue, value >::Type ValueBuffType
Value buff type.
Definition: summationValueScalarOptiSwapToValueFactorVector.hpp:99
kb< ParamSpecType > const *const ParamSpecs
Parameter specifications i.e. how to use values and metrics.
Definition: function0.hpp:172
SummationValueScalarOptiSwapToValueFactorVector(System *const pSystem, Dim const ParamCount, Expression *const *pParamExprs, ParamSpecType *const pParamSpecs)
Param constructor.
Definition: summationValueScalarOptiSwapToValueFactorVector.hpp:168
void finaliseField(Serial const FieldSerial, data const &Data)
Finalise the field particularly for unupdatable expressions.
Definition: vectorrecord.hpp:324
ValueRecord< value > * mExprValueRecord
Point to the value record.
Definition: valueVectorFunction.hpp:81
#define openKangarooSpace
Open the project namespace.
Definition: project.hpp:74
xb< Variable * > const FactorVars
Factor variables that this function transitively depends on.
Definition: function0.hpp:177
void updateSimulData(Clock const SimulClock, data const &Data)
Update the simulation data.
Definition: valuerecord.hpp:299
value ValueType
Value type.
Definition: summationValueScalarOptiSwapToValueFactorVector.hpp:47
constexpr char const * kFuncNotRequiredParams
Function does not have required parameters.
Definition: messages.hpp:247
void initialiseExecData(data const &Data)
Initialise the execution data.
Definition: scalarrecord.hpp:214
ValueBuffType cacheExecValue
Execution cache value.
Definition: summationValueScalarOptiSwapToValueFactorVector.hpp:110
Bool SimulDiff(Clock const SimulClock) const
SimulDiff = (SimulClock == SimulClock).
Definition: valuerecord.hpp:420
Bool PrevDiff(Clock const ExecClock) const
PrevDiff = (PrevClock == ExecClock).
Definition: scalarrecord.hpp:313
kb< ScalarRecord< paramMetric > const * > mParamExprScalarRecords
Parameter expresion scalar records.
Definition: summationValueScalarOptiSwapToValueFactorVector.hpp:103
kb< Expression * > const ParamExprs
Parameter expressions that this function immediately depends on.
Definition: function0.hpp:171
static Serial defineWithinSystem(Function *const pFunction)
Define the function in the system.
Definition: function1.hpp:1619
kb< ValueRecord< paramValue > const * > mParamExprValueRecords
Parameter expression value records.
Definition: summationValueScalarOptiSwapToValueFactorVector.hpp:102
Hash calcExprHash() const
Calculate expression hash value.
Definition: function1.hpp:855
Compatible temporary buffer type for two given data types.
Definition: datatypes.hpp:294
Use default parameter option which is just null.
Definition: parameter.hpp:32
virtual void simulateAnew()
Simulate the expression.
Definition: summationValueScalarOptiSwapToValueFactorVector.hpp:282
~SummationValueScalarOptiSwapToValueFactorVector()
Destructor.
Definition: summationValueScalarOptiSwapToValueFactorVector.hpp:128
data const & SimulBuffer() const
Return simulation buffer; validity depends on SimulDiff.
Definition: valuerecord.hpp:365
void setParameters(ParamOrder const pParamOrder, Dim const ParamCount, Expression *const *const pParamExprs, ParamSpecType const *const pParamSpecs=nullptr, Index *const pParamIndexes=nullptr)
Set the parameters, if unordered then expression pointers along with indexes (if given) are sorted...
Definition: function1.hpp:927
data const & ExecData() const
Return execution data in execution buffer.
Definition: scalarrecord.hpp:287
void initialiseExecData(Serial const FieldSerial, data const &Data)
Initialise the execution buffer, particularly for anew execution.
Definition: vectorrecord.hpp:336
void setExprFormat(Identifier const pFormat)
Set expression format.
Definition: expression1.hpp:577
#define ComputeLazy
Perform lazy computation.
Definition: options.hpp:112
Summation value scalar optimisation swap to value factor vector.
Definition: summationValueScalarOptiSwapToValueFactorVector.hpp:41
void finaliseRecord(data const &Data)
Finalise the record.
Definition: valuerecord.hpp:262
static void performExecAnew(Expression *const pExpression)
Execute in anew mode.
Definition: expression1.hpp:271
data const & PrevBuffer() const
Return previous data in previous buffer: validity depends on PrevDiff.
Definition: scalarrecord.hpp:339
paramValue ParamValueType
Parameter value type.
Definition: summationValueScalarOptiSwapToValueFactorVector.hpp:45
void defineExprValueRecord()
Define expression value.
Unique identifier of a class.
void defineRootWithinSystem()
Define as a root within the system.
Definition: function1.hpp:1605
kb< MetricBuffType > * cacheExecVector
Execution cache vector.
Definition: summationValueScalarOptiSwapToValueFactorVector.hpp:116
DataTempBuff< paramMetric, metric >::Type MetricBuffType
Metric buff type.
Definition: summationValueScalarOptiSwapToValueFactorVector.hpp:100
Clock ExecClock() const
Get the execution clock.
Definition: system1.hpp:237
Bool updateExecData(Serial const FieldSerial, Clock const ExecClock, data const &Data)
Update the execution buffer and insert into previous fields if needed.
Definition: vectorrecord.hpp:348
#define SimulDownward
Perform simulation downward.
Definition: options.hpp:114
void defineExprVectorRecord(Dim const FieldCount)
Define vector record.
void resetPrevSerials(Clock const ExecClock)
Reset the list of fields having previous data.
Definition: vectorrecord.hpp:309
Unordered parameters.
Definition: parameter.hpp:66
virtual void executeIncr()
Execute the expression.
Definition: summationValueScalarOptiSwapToValueFactorVector.hpp:327
static void performSimulIncr(Expression *const pExpression)
Simulate in incremental mode.
Definition: expression1.hpp:326
data const & ExecBuffer() const
Return execution data in execution buffer.
Definition: scalarrecord.hpp:326
Constraint-based local search systems.
Definition: system0.hpp:45
BitStr ParamSpecType
Parameter specification type.
Definition: parameter.hpp:76
kb< OptiSwap< paramMetric, MetricBuffType > > mParamOptiSwapOperators
Parameter optimisation swap operators.
Definition: summationValueScalarOptiSwapToValueFactorVector.hpp:104
System *const SysMaster
The system that contains this expression.
Definition: expression0.hpp:281
Flexible arity value and scalar to value and vector function.
void Type
Temporary buffer type.
Definition: datatypes.hpp:297
paramMetric ParamMetricType
Parameter metric type.
Definition: summationValueScalarOptiSwapToValueFactorVector.hpp:46
#define SimulFixedOnly
Use fixed simulation only, not flexi one.
Definition: options.hpp:165
virtual void computeFinal()
Compute the expression.
Definition: summationValueScalarOptiSwapToValueFactorVector.hpp:211
#define closeKangarooSpace
Close the project namespace.
Definition: project.hpp:75
virtual void simulateIncr()
Simulate the expression.
Definition: summationValueScalarOptiSwapToValueFactorVector.hpp:553
virtual void executeAnew()
Execute the expression.
Definition: summationValueScalarOptiSwapToValueFactorVector.hpp:244
metric MetricType
Metric type.
Definition: summationValueScalarOptiSwapToValueFactorVector.hpp:48
VectorRecord< metric > * mExprVectorRecord
Point to the vector record.
Definition: valueVectorFunction.hpp:82
data const & SimulData(Clock const SimulClock) const
SimulDiff ? SimulBuffer : ExecBuffer().
Definition: valuerecord.hpp:408
Optimisation swap operator that is used if maxi and mini are swapped or vice versa.
Definition: optiswap.hpp:33
Abstract expressions.
Definition: expression0.hpp:41
Value records store expression values.
Definition: valuerecord.hpp:32
static void performSimulAnew(Expression *const pExpression)
Simulate in anew mode.
Definition: expression1.hpp:310
nrl< xb< Serial > > const ParamFactors
Variables that parameters depend on. Factor serial of the function are use to represent parameter var...
Definition: function0.hpp:178
Flexible arity value and scalar to value and vector functions.
Definition: naryValueScalarToValueFactorVectorFunc.hpp:30
static SummationValueScalarOptiSwapToValueFactorVector< MaxiOrMini, paramValue, value, paramMetric, metric > * define(System *const pSystem, Dim const ParamCount, Expression *const *pParamExprs, ParamSpecType *const pParamSpecs=nullptr)
Define a summation of value scalar to value factor vector with optimisation swapping.
Definition: summationValueScalarOptiSwapToValueFactorVector.hpp:143