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++) {
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.
CachedResults()
Default Constructor.
NotifyType
Enumeration specifying the type of notification.
void DebugPrint() const
Print information about this DependentResults.
bool InvalidateResult(const std::vector< const TaggedObject * > &dependents, const std::vector< Number > &scalar_dependents)
Invalidates the result for given dependencies.
int Int
Type of default integer.
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...
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...
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...
void operator=(const DependentResult &)
Overloaded Equals Operator.
void RequestAttach(NotifyType notify_type, const Subject *subject)
Derived classes should call this method to request an "Attach" to a Subject.
void operator=(const CachedResults &)
Overloaded Equals Operator.
#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...
Slight Variation of the Observer Design Pattern.
~DependentResult()
Destructor.
virtual ~CachedResults()
Destructor.
bool GetCachedResult2Dep(T &retResult, const TaggedObject &dependent1, const TaggedObject &dependent2)
void CleanupInvalidatedResults() const
internal method for removing stale DependentResults from the list.
bool IsStale() const
This returns true, if the DependentResult is no longer valid.
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...
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 Clear()
Invalidates all cached results.
int Index
Type of all indices of vectors, matrices etc.
const T & GetResult() const
Returns the cached result.
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.
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...
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...
bool stale_
Flag indicating, if the cached result is still valid.
void AddCachedResult2Dep(const T &result, const TaggedObject &dependent1, const TaggedObject &dependent2)
void DebugPrintCachedResults() const
Print list of currently cached results.
bool GetCachedResult3Dep(T &retResult, const TaggedObject &dependent1, const TaggedObject &dependent2, const TaggedObject &dependent3)