00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 
00029 
00030 
00031 
00032 
00033 #ifndef __RVLALG_SCALAR_TERMINATOR
00034 #define __RVLALG_SCALAR_TERMINATOR
00035 
00036 #include "alg.hh"
00037 #include "functional.hh"
00038 #include "except.hh"
00039 
00046 namespace RVLAlg {
00047 
00052 class CountTerminator: public Terminator {
00053 public:
00054 
00063   CountTerminator( int maxcount ) : mc(maxcount), count(0), i(1) {}
00064 
00075   CountTerminator( int init, int maxcount, int inc ) 
00076     : mc(maxcount), count(init), i(inc) {
00077     if ( inc <= 0 ) {
00078       RVL::RVLException e; e << "Error in CountTerminator constructor: parameters cause infinite loop";
00079       throw e;
00080     }
00081   }
00082   
00083   ~CountTerminator() {}
00084 
00085   virtual bool query() {
00086     count += i;
00087     return (count >= mc );
00088   }
00089 
00090   int getCount() { return count; }
00091 
00092 protected:
00093   int mc;
00094   int count;
00095   int i;
00096 
00097 private:
00098 
00099   CountTerminator();
00100   CountTerminator(CountTerminator const &);
00101 };
00102 
00108 template<class Scalar>
00109 class MaxTerminator: public Terminator {
00110 public:
00111   MaxTerminator(const Scalar & tx, Scalar maxval) : x(tx), mv(maxval) {}
00112   
00113   virtual bool query() {
00114     return (x > mv);
00115   }
00116 
00117 protected:
00118   const Scalar & x;
00119   Scalar mv;
00120 };
00121 
00127 template<class Scalar>
00128 class MinTerminator: public Terminator {
00129 public:
00130   MinTerminator(const Scalar & tx, Scalar minval) : x(tx), mv(minval) {}
00131   
00132   virtual bool query() {
00133     cout<<"   MinTerminator: test scalar = "<<x<<" threshold = "<<mv<<endl;
00134     return (x < mv);
00135   }
00136 
00137 protected:
00138   const Scalar & x;
00139   Scalar mv;
00140 };
00141 
00147   template<class Scalar>
00148   class MinTerminatorFE: public Terminator {
00149   public:
00150     MinTerminatorFE(RVL::FunctionalEvaluation<Scalar> & _fx, Scalar minval) 
00151       : fx(_fx), mv(minval) {}
00152     
00153     virtual bool query() {
00154       Scalar x = fx.getValue();
00155       cout<<"   MinTerminator: test scalar = "<<x<<" threshold = "<<mv<<endl;
00156       return (x < mv);
00157     }
00158     
00159   protected:
00160     Scalar mv;
00161   private:
00162     RVL::FunctionalEvaluation<Scalar> & fx;
00163   };
00164 
00165 
00166 }
00167 
00168 #endif