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
1.2.7