9 #ifndef __IPCACHEDRESULTS_HPP__ 10 #define __IPCACHEDRESULTS_HPP__ 21 #if COIN_IPOPT_CHECKLEVEL > 2 22 # define IP_DEBUG_CACHE 75 static const Index dbg_verbosity;
96 const std::vector<const TaggedObject*>& dependents,
97 const std::vector<Number>& scalar_dependents);
104 const std::vector<const TaggedObject*>& dependents,
105 const std::vector<Number>& scalar_dependents)
const;
111 const std::vector<const TaggedObject*>& dependents);
117 const std::vector<const TaggedObject*>& dependents)
const;
208 const std::vector<Number>& scalar_dependents);
261 #ifdef IP_DEBUG_CACHE 262 static const Index dbg_verbosity;
268 DependentResult(
const T& result,
const std::vector<const TaggedObject*>& dependents,
269 const std::vector<Number>& scalar_dependents);
292 const std::vector<Number>& scalar_dependents)
const;
339 #ifdef IP_DEBUG_CACHE 350 const std::vector<const TaggedObject*>& dependents,
351 const std::vector<Number>& scalar_dependents)
355 dependent_tags_(dependents.size()),
356 scalar_dependents_(scalar_dependents)
358 #ifdef IP_DEBUG_CACHE 359 DBG_START_METH(
"DependentResult<T>::DependentResult()", dbg_verbosity);
362 for (
Index i=0; i<(
Index)dependents.size(); i++) {
371 RequestAttach(NT_Changed, dependents[i]);
372 dependent_tags_[i] = dependents[i]->GetTag();
375 dependent_tags_[i] = 0;
383 #ifdef IP_DEBUG_CACHE 384 DBG_START_METH(
"DependentResult<T>::~DependentResult()", dbg_verbosity);
407 #ifdef IP_DEBUG_CACHE 408 DBG_START_METH(
"DependentResult<T>::RecieveNotification", dbg_verbosity);
411 if (notify_type == NT_Changed || notify_type==NT_BeingDestroyed) {
420 const std::vector<Number>& scalar_dependents)
const 422 #ifdef IP_DEBUG_CACHE 423 DBG_START_METH(
"DependentResult<T>::DependentsIdentical", dbg_verbosity);
425 DBG_ASSERT(dependents.size() == dependent_tags_.size());
430 if (dependents.size() != dependent_tags_.size()
431 || scalar_dependents.size() != scalar_dependents_.size()) {
435 for (
Index i=0; i<(
Index)dependents.size(); i++) {
436 if ( (dependents[i] && dependents[i]->GetTag() != dependent_tags_[i])
437 || (!dependents[i] && dependent_tags_[i] != 0) ) {
443 for (
Index i=0; i<(
Index)scalar_dependents.size(); i++) {
444 if (scalar_dependents[i] != scalar_dependents_[i]) {
458 #ifdef IP_DEBUG_CACHE 469 #ifdef IP_DEBUG_CACHE 478 max_cache_size_(max_cache_size),
479 cached_results_(NULL)
481 #ifdef IP_DEBUG_CACHE 490 #ifdef IP_DEBUG_CACHE 491 DBG_START_METH(
"CachedResults<T>::!CachedResults()", dbg_verbosity);
494 if (cached_results_) {
497 iter != cached_results_->end();
501 delete cached_results_;
514 const std::vector<const TaggedObject*>& dependents,
515 const std::vector<Number>& scalar_dependents)
517 #ifdef IP_DEBUG_CACHE 518 DBG_START_METH(
"CachedResults<T>::AddCachedResult", dbg_verbosity);
521 CleanupInvalidatedResults();
525 if (!cached_results_) {
526 cached_results_ =
new std::list<DependentResult<T>*>;
528 cached_results_->push_front(newResult);
531 if (max_cache_size_ >= 0) {
534 if ((
Int)cached_results_->size() > max_cache_size_) {
535 delete cached_results_->back();
536 cached_results_->pop_back();
540 #ifdef IP_DEBUG_CACHE 541 DBG_EXEC(2, DebugPrintCachedResults());
548 const std::vector<const TaggedObject*>& dependents)
550 std::vector<Number> scalar_dependents;
551 AddCachedResult(result, dependents, scalar_dependents);
556 const std::vector<Number>& scalar_dependents)
const 558 #ifdef IP_DEBUG_CACHE 559 DBG_START_METH(
"CachedResults<T>::GetCachedResult", dbg_verbosity);
562 if (!cached_results_)
565 CleanupInvalidatedResults();
567 bool retValue =
false;
568 typename std::list< DependentResult<T>* >::const_iterator iter;
569 for (iter = cached_results_->begin(); iter != cached_results_->end(); iter++) {
570 if ((*iter)->DependentsIdentical(dependents, scalar_dependents)) {
571 retResult = (*iter)->GetResult();
577 #ifdef IP_DEBUG_CACHE 578 DBG_EXEC(2, DebugPrintCachedResults());
586 T& retResult,
const std::vector<const TaggedObject*>& dependents)
const 588 std::vector<Number> scalar_dependents;
589 return GetCachedResult(retResult, dependents, scalar_dependents);
596 #ifdef IP_DEBUG_CACHE 597 DBG_START_METH(
"CachedResults<T>::AddCachedResult1Dep", dbg_verbosity);
600 std::vector<const TaggedObject*> dependents(1);
601 dependents[0] = dependent1;
603 AddCachedResult(result, dependents);
609 #ifdef IP_DEBUG_CACHE 610 DBG_START_METH(
"CachedResults<T>::GetCachedResult1Dep", dbg_verbosity);
613 std::vector<const TaggedObject*> dependents(1);
614 dependents[0] = dependent1;
616 return GetCachedResult(retResult, dependents);
624 #ifdef IP_DEBUG_CACHE 625 DBG_START_METH(
"CachedResults<T>::AddCachedResult2dDep", dbg_verbosity);
628 std::vector<const TaggedObject*> dependents(2);
629 dependents[0] = dependent1;
630 dependents[1] = dependent2;
632 AddCachedResult(result, dependents);
638 #ifdef IP_DEBUG_CACHE 639 DBG_START_METH(
"CachedResults<T>::GetCachedResult2Dep", dbg_verbosity);
642 std::vector<const TaggedObject*> dependents(2);
643 dependents[0] = dependent1;
644 dependents[1] = dependent2;
646 return GetCachedResult(retResult, dependents);
655 #ifdef IP_DEBUG_CACHE 656 DBG_START_METH(
"CachedResults<T>::AddCachedResult2dDep", dbg_verbosity);
659 std::vector<const TaggedObject*> dependents(3);
660 dependents[0] = dependent1;
661 dependents[1] = dependent2;
662 dependents[2] = dependent3;
664 AddCachedResult(result, dependents);
672 #ifdef IP_DEBUG_CACHE 673 DBG_START_METH(
"CachedResults<T>::GetCachedResult2Dep", dbg_verbosity);
676 std::vector<const TaggedObject*> dependents(3);
677 dependents[0] = dependent1;
678 dependents[1] = dependent2;
679 dependents[2] = dependent3;
681 return GetCachedResult(retResult, dependents);
686 const std::vector<Number>& scalar_dependents)
688 if (!cached_results_)
691 CleanupInvalidatedResults();
693 bool retValue =
false;
694 typename std::list< DependentResult<T>* >::const_iterator iter;
695 for (iter = cached_results_->begin(); iter != cached_results_->end();
697 if ((*iter)->DependentsIdentical(dependents, scalar_dependents)) {
698 (*iter)->Invalidate();
710 if (!cached_results_)
713 typename std::list< DependentResult<T>* >::const_iterator iter;
714 for (iter = cached_results_->begin(); iter != cached_results_->end();
716 (*iter)->Invalidate();
719 CleanupInvalidatedResults();
726 max_cache_size_ = max_cache_size;
732 #ifdef IP_DEBUG_CACHE 733 DBG_START_METH(
"CachedResults<T>::CleanupInvalidatedResults", dbg_verbosity);
736 if (!cached_results_)
739 typename std::list< DependentResult<T>* >::iterator iter;
740 iter = cached_results_->begin();
741 while (iter != cached_results_->end()) {
742 if ((*iter)->IsStale()) {
743 typename std::list< DependentResult<T>* >::iterator
744 iter_to_remove = iter;
747 cached_results_->erase(iter_to_remove);
748 delete result_to_delete;
759 #ifdef IP_DEBUG_CACHE 760 DBG_START_METH(
"CachedResults<T>::DebugPrintCachedResults", dbg_verbosity);
762 if (!cached_results_) {
763 DBG_PRINT((2,
"Currentlt no cached results:\n"));
766 typename std::list< DependentResult<T>* >::const_iterator iter;
767 DBG_PRINT((2,
"Current set of cached results:\n"));
768 for (iter = cached_results_->begin(); iter != cached_results_->end(); iter++) {
769 DBG_PRINT((2,
" DependentResult:0x%x\n", (*iter)));
const T result_
The value of the dependent results.
int Index
Type for all incides.
CachedResults()
Default Constructor.
NotifyType
Enumeration specifying the type of notification.
int Int
Type of default integer.
const T & GetResult() const
Returns the cached result.
std::vector< Number > scalar_dependents_
Dependencies in form a Numbers.
bool GetCachedResult2Dep(T &retResult, const TaggedObject *dependent1, const TaggedObject *dependent2)
Method for retrieving a cached result, proving two dependencies as a TaggedObject explicitly...
bool DependentsIdentical(const std::vector< const TaggedObject *> &dependents, const std::vector< Number > &scalar_dependents) const
This method returns true if the dependencies provided to this function are identical to the ones stor...
std::vector< TaggedObject::Tag > dependent_tags_
Dependencies in form of TaggedObjects.
#define DBG_START_METH(__func_name, __verbose_level)
bool GetCachedResult3Dep(T &retResult, const TaggedObject *dependent1, const TaggedObject *dependent2, const TaggedObject *dependent3)
Method for retrieving a cached result, proving three dependencies as a TaggedObject explicitly...
void operator=(const DependentResult &)
Overloaded Equals Operator.
void AddCachedResult(const T &result, const std::vector< const TaggedObject *> &dependents, const std::vector< Number > &scalar_dependents)
Generic method for adding a result to the cache, given a std::vector of TaggesObjects and a std::vect...
void operator=(const CachedResults &)
Overloaded Equals Operator.
bool GetCachedResult(T &retResult, const std::vector< const TaggedObject *> &dependents, const std::vector< Number > &scalar_dependents) const
Generic method for retrieving a cached results, given the dependencies as a std::vector of TaggesObje...
#define DBG_EXEC(__verbosity, __cmd)
Slight Variation of the Observer Design Pattern (Subject part).
void Invalidate()
Invalidates the cached result.
DependentResult()
Default Constructor.
Int max_cache_size_
maximum number of cached results
void AddCachedResult1Dep(const T &result, const TaggedObject &dependent1)
void AddCachedResult2Dep(const T &result, const TaggedObject *dependent1, const TaggedObject *dependent2)
Method for adding a result to the cache, proving two dependencies as a TaggedObject explicitly...
void CleanupInvalidatedResults() const
internal method for removing stale DependentResults from the list.
Slight Variation of the Observer Design Pattern.
~DependentResult()
Destructor.
virtual ~CachedResults()
Destructor.
bool GetCachedResult2Dep(T &retResult, const TaggedObject &dependent1, const TaggedObject &dependent2)
bool GetCachedResult1Dep(T &retResult, const TaggedObject &dependent1)
bool GetCachedResult1Dep(T &retResult, const TaggedObject *dependent1)
Method for retrieving a cached result, proving one dependency as a TaggedObject explicitly.
virtual void RecieveNotification(NotifyType notify_type, const Subject *subject)
This method is overloading the pure virtual method from the Observer base class.
void DebugPrint() const
Print information about this DependentResults.
void Clear()
Invalidates all cached results.
int Index
Type of all indices of vectors, matrices etc.
void AddCachedResult3Dep(const T &result, const TaggedObject &dependent1, const TaggedObject &dependent2, const TaggedObject &dependent3)
std::list< DependentResult< T > * > * cached_results_
list of currently cached results.
#define DBG_PRINT(__printf_args)
Templated class which stores one entry for the CachedResult class.
bool IsStale() const
This returns true, if the DependentResult is no longer valid.
bool InvalidateResult(const std::vector< const TaggedObject *> &dependents, const std::vector< Number > &scalar_dependents)
Invalidates the result for given dependencies.
void AddCachedResult3Dep(const T &result, const TaggedObject *dependent1, const TaggedObject *dependent2, const TaggedObject *dependent3)
Method for adding a result to the cache, proving three dependencies as a TaggedObject explicitly...
void AddCachedResult1Dep(const T &result, const TaggedObject *dependent1)
Method for adding a result to the cache, proving one dependency as a TaggedObject explicitly...
bool stale_
Flag indicating, if the cached result is still valid.
void DebugPrintCachedResults() const
Print list of currently cached results.
void AddCachedResult2Dep(const T &result, const TaggedObject &dependent1, const TaggedObject &dependent2)
bool GetCachedResult3Dep(T &retResult, const TaggedObject &dependent1, const TaggedObject &dependent2, const TaggedObject &dependent3)