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);
278 bool IsStale()
const;
284 const T& GetResult()
const;
291 bool DependentsIdentical(
const std::vector<const TaggedObject*>& dependents,
292 const std::vector<Number>& scalar_dependents)
const;
295 void DebugPrint()
const;
305 virtual void RecieveNotification(NotifyType notify_type,
const Subject* subject);
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);
420 const std::vector<Number>& scalar_dependents)
const 422 #ifdef IP_DEBUG_CACHE 423 DBG_START_METH(
"DependentResult<T>::DependentsIdentical", dbg_verbosity);
435 for (
Index i=0; i<(
Index)dependents.size(); i++) {
443 for (
Index i=0; i<(
Index)scalar_dependents.size(); 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);
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);
540 #ifdef IP_DEBUG_CACHE 548 const std::vector<const TaggedObject*>& dependents)
550 std::vector<Number> scalar_dependents;
556 const std::vector<Number>& scalar_dependents)
const 558 #ifdef IP_DEBUG_CACHE 559 DBG_START_METH(
"CachedResults<T>::GetCachedResult", dbg_verbosity);
567 bool retValue =
false;
568 typename std::list< DependentResult<T>* >::const_iterator iter;
570 if ((*iter)->DependentsIdentical(dependents, scalar_dependents)) {
571 retResult = (*iter)->GetResult();
577 #ifdef IP_DEBUG_CACHE 586 T& retResult,
const std::vector<const TaggedObject*>& dependents)
const 588 std::vector<Number> 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;
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;
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;
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;
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;
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;
686 const std::vector<Number>& scalar_dependents)
693 bool retValue =
false;
694 typename std::list< DependentResult<T>* >::const_iterator iter;
697 if ((*iter)->DependentsIdentical(dependents, scalar_dependents)) {
698 (*iter)->Invalidate();
713 typename std::list< DependentResult<T>* >::const_iterator iter;
716 (*iter)->Invalidate();
732 #ifdef IP_DEBUG_CACHE 733 DBG_START_METH(
"CachedResults<T>::CleanupInvalidatedResults", dbg_verbosity);
739 typename std::list< DependentResult<T>* >::iterator iter;
742 if ((*iter)->IsStale()) {
743 typename std::list< DependentResult<T>* >::iterator
744 iter_to_remove = iter;
748 delete result_to_delete;
759 #ifdef IP_DEBUG_CACHE 760 DBG_START_METH(
"CachedResults<T>::DebugPrintCachedResults", dbg_verbosity);
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"));
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 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)