Main Page   Class Hierarchy   Alphabetical List   Compound List   File List   Compound Members   File Members  

sweeper.cc

Go to the documentation of this file.
00001 // SuperMix version 1.0  C++ source file
00002 //
00003 // Copyright (c) 1999 California Institute of Technology.
00004 // All rights reserved.
00005 //
00006 // Redistribution and use in source and binary forms for noncommercial
00007 // purposes are permitted provided that the above copyright notice and
00008 // this paragraph are duplicated in all such forms and that any
00009 // documentation and other materials related to such distribution and
00010 // use acknowledge that the software was developed by California
00011 // Institute of Technology. Redistribution and/or use in source or
00012 // binary forms is not permitted for any commercial purpose. Use of
00013 // this software does not include a permitted use of the Institute's
00014 // name or trademark for any purpose.
00015 //
00016 // DISCLAIMER:
00017 // THIS SOFTWARE AND/OR RELATED MATERIALS ARE PROVIDED "AS-IS" WITHOUT
00018 // WARRANTY OF ANY KIND INCLUDING ANY WARRANTIES OF PERFORMANCE OR
00019 // MERCHANTABILITY OR FITNESS FOR A PARTICULAR USE OR PURPOSE (AS SET
00020 // FORTH IN UCC 23212-2313) OR FOR ANY PURPOSE WHATSOEVER, FOR THE
00021 // LICENSED PRODUCT, HOWEVER USED.  IN NO EVENT SHALL CALTECH/JPL BE
00022 // LIABLE FOR ANY DAMAGES AND/OR COSTS, INCLUDING BUT NOT LIMITED TO
00023 // INCIDENTAL OR CONSEQUENTIAL DAMAGES OF ANY KIND, INCLUDING ECONOMIC
00024 // DAMAGE OR INJURY TO PROPERTY AND LOST PROFITS, REGARDLESS OF
00025 // WHETHER CALTECH/JPL SHALL BE ADVISED, HAVE REASON TO KNOW, OR IN
00026 // FACT SHALL KNOW OF THE POSSIBILITY.  THE USER BEARS ALL RISK
00027 // RELATING TO QUALITY AND PERFORMANCE OF THE SOFTWARE AND/OR RELATED
00028 // MATERIALS.
00029 
00030 // ************************************************************************
00031 //
00032 // sweeper.cc
00033 //
00034 // See sweeper.h for more information.
00035 //
00036 // 7/21/98 J.Z.
00037 //
00038 // 3/20/00:  Added npoints() to sweeper class
00039 // 3/17/00:  Fixed problems with multi-parameter sweeps. FRR
00040 // 4/26/99:  Added initialize member function.  JSW
00041 //
00042 // ************************************************************************
00043 
00044 #include "sweeper.h"
00045 #include "error.h"
00046 #include <algorithm>
00047 
00048 // Definitions for sweep_parameter
00049 // Note that class sweep_parameter is contained within class sweeper
00050 
00051 // no default constructor 
00052 
00053 // constructor using startv, stopv, step
00054 sweeper::sweep_parameter::sweep_parameter(real_parameter &rp,
00055                             double startvp, double stopvp, double stepp) :
00056   rpr(&rp),
00057   vecmode(false), 
00058   startv(0.), 
00059   stopv(0.), 
00060   step(0.),
00061   values(0), 
00062   num_values(0), 
00063   index(0),
00064   wrapped(false) 
00065 { 
00066   // need to check parameter values
00067   if(stepp == 0.) {
00068     error::warning("Fixing zero step size in sweeper::sweep_parameter() !") ;
00069     stepp = (stopvp-startvp) ;
00070   }
00071   double dtry = (stopvp-startvp)/stepp +1;
00072   if(dtry < 0.) {
00073     error::warning(
00074     "Fixing inconsistent start, stop, and step in sweeper::sweep_parameter()"
00075                   ) ;
00076     stepp = -stepp ;
00077     dtry = -dtry ;
00078   }
00079   int nmax = (1 << 31) -1 ;          // assumes at least 32 bit ints
00080   if(dtry > nmax) {
00081     error::warning("Fixing very small step in sweeper::sweep_parameter()") ;
00082     dtry = nmax ;
00083     stepp = (stopvp-startvp)/(nmax-1) ;
00084   }
00085   // All is OK now, so set values
00086   startv = startvp ;
00087   stopv = stopvp ;
00088   step = stepp ;
00089   num_values = (int) dtry ;
00090 }
00091 
00092 // constructor using C-style array of values
00093 sweeper::sweep_parameter::sweep_parameter(real_parameter &rp,
00094                                           double *valp, int nump) :
00095   rpr(&rp),
00096   vecmode(true), 
00097   startv(0.), 
00098   stopv(0.), 
00099   step(0.),
00100   values(0), 
00101   num_values(0), 
00102   index(0),
00103   wrapped(true) 
00104 {
00105   if(nump <= 0) {
00106     error::warning(
00107     "sweeper::sweep_parameter() -- number of data values in array is <= 0 !"
00108                   );
00109   }
00110   else {
00111     values.resize(nump) ;    // make enough room
00112     std::copy(valp, valp+nump, values.begin()) ; // copy into the vector<>
00113     num_values = values.size() ; // lets ask the vector how many it has
00114     wrapped = false ;
00115   }
00116 }
00117 
00118 // constructor using SuperMix real_vector
00119 sweeper::sweep_parameter::sweep_parameter(real_parameter &rp,
00120                                           const real_vector & rvec):
00121   rpr(&rp),
00122   vecmode(true), 
00123   startv(0.), 
00124   stopv(0.), 
00125   step(0.),
00126   values(0), 
00127   num_values(0), 
00128   index(0),
00129   wrapped(true) 
00130 {
00131   int nump = rvec.maxindex() - rvec.minindex() +1 ;
00132   if(nump <= 0) {
00133     error::warning(
00134     "sweeper::sweep_parameter() -- number of data values in array is <= 0 !"
00135                   );
00136   }
00137   else {
00138     values.resize(nump) ;    // make enough room
00139     int imin = rvec.minindex() ;
00140     for(int i = 0; i < nump; i++)  // copy the vector
00141       values[i] = rvec.read(i+imin) ;
00142     num_values = values.size() ; // lets ask the vector how many it has
00143     wrapped = false ;
00144   }
00145 }
00146 
00147 // constructor using STL vector<double> array
00148 sweeper::sweep_parameter::sweep_parameter(real_parameter &rp,
00149                                           const std::vector<double> & val) :
00150   rpr(&rp),
00151   vecmode(true), 
00152   startv(0.), 
00153   stopv(0.), 
00154   step(0.),
00155   values(val), 
00156   num_values(val.size()), 
00157   index(0),
00158   wrapped(false) 
00159 {
00160   if(num_values == 0) {
00161     wrapped = true ;
00162   }
00163 }
00164 
00165 // increment operator
00166 // define postfix form of increment only 
00167 // see Stroustrup 11.11
00168 
00169 sweeper::sweep_parameter &
00170 sweeper::sweep_parameter::operator ++(int)
00171 {
00172   if(num_values <=0) {
00173     index = 0 ;
00174     wrapped = true ;
00175   }
00176   else {
00177     wrapped = false ;
00178     index++ ;
00179     if(index >= num_values) {
00180       wrapped = true ;
00181       index = 0 ;
00182     }
00183   }
00184   *rpr = getval() ; // set the value of the actual parameter
00185   return(*this) ;
00186 }
00187 
00188 
00189 // makes sure parameter has the proper value without incrementing
00190 sweeper::sweep_parameter &
00191 sweeper::sweep_parameter::touch()
00192 {
00193   if(index < num_values)
00194     *rpr = getval() ; // set the value of the parameter
00195   return(*this) ;
00196 }
00197 
00198 // reset() the index
00199 
00200 void sweeper::sweep_parameter::reset()
00201 {
00202   index = 0 ;
00203   wrapped = false ;
00204   if(num_values <=0) {
00205     wrapped = true ;
00206   }  
00207   *rpr = getval() ; // set the value of the actual parameter
00208   return ;
00209 }
00210 
00211 // This function returns the current value of the sweep_parameter
00212 
00213 double sweeper::sweep_parameter::getval() const
00214 {
00215   double result ;
00216   if(vecmode) {
00217     result = values[index] ;
00218   }
00219   else {
00220     result = startv + index*step ;
00221   }
00222   return(result) ;
00223 }
00224 
00225 //**************************************************************************
00226 // Now follow the definitions for class sweeper proper.
00227 
00228 sweeper::sweeper() :
00229   parms(),  // creates an empty list
00230   alldone(false),
00231   num_values(1)
00232 { }
00233 
00234 void sweeper::sweep(real_parameter & rp,
00235                     double startv, double stopv, double step)
00236 {
00237   parms.push_back(sweep_parameter(rp, startv, stopv, step)) ;
00238   // now the last element of the list has this latest sweep
00239   int n = parms.rbegin()->npoints();
00240   if(n > 1) num_values *= n;
00241 }
00242 
00243 void sweeper::sweep(real_parameter & rp, double *valp, int nump)
00244 {
00245   parms.push_back(sweep_parameter(rp, valp, nump)) ;
00246   // now the last element of the list has this latest sweep
00247   int n = parms.rbegin()->npoints();
00248   if(n > 1) num_values *= n;
00249 }
00250 
00251 void sweeper::sweep(real_parameter & rp, const real_vector & rvec)
00252 {
00253   parms.push_back(sweep_parameter(rp, rvec)) ;
00254   // now the last element of the list has this latest sweep
00255   int n = parms.rbegin()->npoints();
00256   if(n > 1) num_values *= n;
00257 }
00258 
00259 void sweeper::sweep(real_parameter & rp, const std::vector<double> & val)
00260 {
00261   parms.push_back(sweep_parameter(rp, val)) ;
00262   // now the last element of the list has this latest sweep
00263   int n = parms.rbegin()->npoints();
00264   if(n > 1) num_values *= n;
00265 }
00266 
00267 void sweeper::initialize(real_parameter & rp, double value)
00268 {
00269   parms.push_front(sweep_parameter(rp, std::vector<double>(1,value))) ;
00270 }
00271 
00272 // define postfix form of increment only 
00273 // see Stroustrup 11.11
00274 sweeper & sweeper::operator ++(int i)
00275 {
00276   std::list<sweeper::sweep_parameter>::iterator ipar = parms.begin() ;
00277   if(!alldone) {
00278     bool done = false ;  // done goes true when no more incrementing needed
00279     while(ipar != parms.end() && !done) {
00280       (*ipar)++ ;   // postfix increment this parameter
00281       if(ipar->check_wrap() == false) // this parameter didn't wrap
00282         done = true ;
00283       ipar++ ;      // go on to next parameter
00284     }
00285     while(ipar != parms.end()) (ipar++)->touch();  // set without incrementing
00286     if(!done)   // all parameters wrapped this time
00287       alldone = true ;                 // so we're done sweeping
00288 
00289     // call the setup function now that all parameters are set:
00290     setup();
00291   }
00292   else {
00293     error::warning(
00294     "cannot increment sweeper object -- the sweep is finished");
00295   }
00296     return(*this) ;
00297 }
00298 
00299 void sweeper::reset()
00300 {
00301   alldone = false ;
00302   // need to reset all parameters in our list
00303   for(std::list<sweep_parameter>::iterator ipar = parms.begin() ;
00304       ipar != parms.end() ; ipar++) {
00305     ipar->reset() ;
00306   }
00307 
00308   // call the setup function now that all parameters are set:
00309   setup();
00310 }

Please direct comments and corrections to supermix@submm.caltech.edu
Go to the supermix home page
Generated by doxygen1.2.7