7 #ifndef __IPCACHEDRESULTS_HPP__
8 #define __IPCACHEDRESULTS_HPP__
19 #if COIN_IPOPT_CHECKLEVEL > 2
20 # define IP_DEBUG_CACHE
29 class DependentResult;
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
357 NotifyType notify_type,
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 )
435 RequestAttach(NT_Changed, dependents[i]);
448 #ifdef IP_DEBUG_CACHE
449 DBG_START_METH(
"DependentResult<T>::~DependentResult()", dbg_verbosity);
471 NotifyType notify_type,
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)));