7 #ifndef __IPCACHEDRESULTS_HPP__ 8 #define __IPCACHEDRESULTS_HPP__ 19 #if IPOPT_CHECKLEVEL > 2 20 # define IP_DEBUG_CACHE 73 static const Index dbg_verbosity;
94 const std::vector<const TaggedObject*>& dependents,
95 const std::vector<Number>& scalar_dependents
104 const std::vector<const TaggedObject*>& dependents,
105 const std::vector<Number>& scalar_dependents
111 const std::vector<const TaggedObject*>& dependents
117 const std::vector<const TaggedObject*>& dependents
242 const std::vector<const TaggedObject*>& dependents,
243 const std::vector<Number>& scalar_dependents
305 #ifdef IP_DEBUG_CACHE 306 static const Index dbg_verbosity;
314 const std::vector<const TaggedObject*>& dependents,
315 const std::vector<Number>& scalar_dependents
339 const std::vector<const TaggedObject*>& dependents,
340 const std::vector<Number>& scalar_dependents
401 #ifdef IP_DEBUG_CACHE 412 const std::vector<const TaggedObject*>& dependents,
413 const std::vector<Number>& scalar_dependents
417 dependent_tags_(dependents.size()),
418 scalar_dependents_(scalar_dependents)
420 #ifdef IP_DEBUG_CACHE 421 DBG_START_METH(
"DependentResult<T>::DependentResult()", dbg_verbosity);
424 for(
Index i = 0; i < (
Index) dependents.size(); ++i )
448 #ifdef IP_DEBUG_CACHE 449 DBG_START_METH(
"DependentResult<T>::~DependentResult()", dbg_verbosity);
475 #ifdef IP_DEBUG_CACHE 476 DBG_START_METH(
"DependentResult<T>::ReceiveNotification", dbg_verbosity);
479 if( notify_type == NT_Changed || notify_type == NT_BeingDestroyed )
489 const std::vector<const TaggedObject*>& dependents,
490 const std::vector<Number>& scalar_dependents
493 #ifdef IP_DEBUG_CACHE 494 DBG_START_METH(
"DependentResult<T>::DependentsIdentical", dbg_verbosity);
496 DBG_ASSERT(dependents.size() == dependent_tags_.size());
501 if( dependents.size() != dependent_tags_.size() || scalar_dependents.size() != scalar_dependents_.size() )
507 for(
Index i = 0; i < (
Index) dependents.size(); i++ )
509 if( ( dependents[i] && dependents[i]->GetTag() != dependent_tags_[i])
510 || (!dependents[i] && dependent_tags_[i] != 0) )
517 for(
Index i = 0; i < (
Index) scalar_dependents.size(); i++ )
518 if( scalar_dependents[i] != scalar_dependents_[i] )
531 #ifdef IP_DEBUG_CACHE 542 #ifdef IP_DEBUG_CACHE 552 : max_cache_size_(max_cache_size),
553 cached_results_(NULL)
555 #ifdef IP_DEBUG_CACHE 564 #ifdef IP_DEBUG_CACHE 565 DBG_START_METH(
"CachedResults<T>::!CachedResults()", dbg_verbosity);
568 if( cached_results_ )
570 for(
typename std::list<
DependentResult<T>*>::iterator iter = cached_results_->begin(); iter != cached_results_->end(); iter++ )
575 delete cached_results_;
589 const std::vector<const TaggedObject*>& dependents,
590 const std::vector<Number>& scalar_dependents
593 #ifdef IP_DEBUG_CACHE 594 DBG_START_METH(
"CachedResults<T>::AddCachedResult", dbg_verbosity);
597 CleanupInvalidatedResults();
601 if( !cached_results_ )
603 cached_results_ =
new std::list<DependentResult<T>*>;
606 cached_results_->push_front(newResult);
609 if( max_cache_size_ >= 0 )
613 DBG_ASSERT((
Int)cached_results_->size() <= max_cache_size_ + 1);
614 if( (
Int) cached_results_->size() > max_cache_size_ )
616 delete cached_results_->back();
617 cached_results_->pop_back();
621 #ifdef IP_DEBUG_CACHE 622 DBG_EXEC(2, DebugPrintCachedResults());
630 const std::vector<const TaggedObject*>& dependents
633 std::vector<Number> scalar_dependents;
634 AddCachedResult(result, dependents, scalar_dependents);
640 const std::vector<const TaggedObject*>& dependents,
641 const std::vector<Number>& scalar_dependents
644 #ifdef IP_DEBUG_CACHE 645 DBG_START_METH(
"CachedResults<T>::GetCachedResult", dbg_verbosity);
648 if( !cached_results_ )
653 CleanupInvalidatedResults();
655 bool retValue =
false;
656 typename std::list<DependentResult<T>*>::const_iterator iter;
657 for( iter = cached_results_->begin(); iter != cached_results_->end(); iter++ )
658 if( (*iter)->DependentsIdentical(dependents, scalar_dependents) )
660 retResult = (*iter)->GetResult();
665 #ifdef IP_DEBUG_CACHE 666 DBG_EXEC(2, DebugPrintCachedResults());
675 const std::vector<const TaggedObject*>& dependents
678 std::vector<Number> scalar_dependents;
679 return GetCachedResult(retResult, dependents, scalar_dependents);
688 #ifdef IP_DEBUG_CACHE 689 DBG_START_METH(
"CachedResults<T>::AddCachedResult1Dep", dbg_verbosity);
692 std::vector<const TaggedObject*> dependents(1);
693 dependents[0] = dependent1;
695 AddCachedResult(result, dependents);
704 #ifdef IP_DEBUG_CACHE 705 DBG_START_METH(
"CachedResults<T>::GetCachedResult1Dep", dbg_verbosity);
708 std::vector<const TaggedObject*> dependents(1);
709 dependents[0] = dependent1;
711 return GetCachedResult(retResult, dependents);
722 #ifdef IP_DEBUG_CACHE 723 DBG_START_METH(
"CachedResults<T>::AddCachedResult2dDep", dbg_verbosity);
726 std::vector<const TaggedObject*> dependents(2);
727 dependents[0] = dependent1;
728 dependents[1] = dependent2;
730 AddCachedResult(result, dependents);
740 #ifdef IP_DEBUG_CACHE 741 DBG_START_METH(
"CachedResults<T>::GetCachedResult2Dep", dbg_verbosity);
744 std::vector<const TaggedObject*> dependents(2);
745 dependents[0] = dependent1;
746 dependents[1] = dependent2;
748 return GetCachedResult(retResult, dependents);
759 #ifdef IP_DEBUG_CACHE 760 DBG_START_METH(
"CachedResults<T>::AddCachedResult2dDep", dbg_verbosity);
763 std::vector<const TaggedObject*> dependents(3);
764 dependents[0] = dependent1;
765 dependents[1] = dependent2;
766 dependents[2] = dependent3;
768 AddCachedResult(result, dependents);
779 #ifdef IP_DEBUG_CACHE 780 DBG_START_METH(
"CachedResults<T>::GetCachedResult2Dep", dbg_verbosity);
783 std::vector<const TaggedObject*> dependents(3);
784 dependents[0] = dependent1;
785 dependents[1] = dependent2;
786 dependents[2] = dependent3;
788 return GetCachedResult(retResult, dependents);
793 const std::vector<const TaggedObject*>& dependents,
794 const std::vector<Number>& scalar_dependents
797 if( !cached_results_ )
802 CleanupInvalidatedResults();
804 bool retValue =
false;
805 typename std::list<DependentResult<T>*>::const_iterator iter;
806 for( iter = cached_results_->begin(); iter != cached_results_->end(); iter++ )
807 if( (*iter)->DependentsIdentical(dependents, scalar_dependents) )
809 (*iter)->Invalidate();
820 if( !cached_results_ )
825 typename std::list<DependentResult<T>*>::const_iterator iter;
826 for( iter = cached_results_->begin(); iter != cached_results_->end(); iter++ )
828 (*iter)->Invalidate();
831 CleanupInvalidatedResults();
840 max_cache_size_ = max_cache_size;
846 #ifdef IP_DEBUG_CACHE 847 DBG_START_METH(
"CachedResults<T>::CleanupInvalidatedResults", dbg_verbosity);
850 if( !cached_results_ )
855 typename std::list<DependentResult<T>*>::iterator iter;
856 iter = cached_results_->begin();
857 while( iter != cached_results_->end() )
859 if( (*iter)->IsStale() )
861 typename std::list<DependentResult<T>*>::iterator iter_to_remove = iter;
864 cached_results_->erase(iter_to_remove);
865 delete result_to_delete;
877 #ifdef IP_DEBUG_CACHE 878 DBG_START_METH(
"CachedResults<T>::DebugPrintCachedResults", dbg_verbosity);
881 if (!cached_results_)
883 DBG_PRINT((2,
"Currentlt no cached results:\n"));
887 typename std::list< DependentResult<T>* >::const_iterator iter;
888 DBG_PRINT((2,
"Current set of cached results:\n"));
889 for (iter = cached_results_->begin(); iter != cached_results_->end(); iter++)
891 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.
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 &)
Default Assignment Operator.
void RequestAttach(NotifyType notify_type, const Subject *subject)
Derived classes should call this method to request an "Attach" to a Subject.
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 &)
Default Assignment 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
This file contains a base class for all exceptions and a set of macros to help with exceptions...
Slight Variation of the Observer Design Pattern.
virtual void ReceiveNotification(NotifyType notify_type, const Subject *subject)
Notification Receiver Method.
~DependentResult()
Destructor.
virtual ~CachedResults()
Destructor.
bool GetCachedResult2Dep(T &retResult, const TaggedObject &dependent1, const TaggedObject &dependent2)
bool GetCachedResult1Dep(T &retResult, const TaggedObject *dependent1)
Method for retrieving a cached result, proving one dependency as a TaggedObject explicitly.
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
Indicates, whether 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)