Main Page | Modules | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

AlgAdapt.cxx

Go to the documentation of this file.
00001 // $Id: AlgAdapt.cxx,v 1.7 2008/01/17 18:09:03 rustem Exp $
00002 
00003 // C/C++
00004 #include <cassert>
00005 #include <iomanip>
00006 #include <iostream>
00007 
00008 // MINOS
00009 #include "Registry/Registry.h"
00010 #include "Util/UtilString.h"
00011 
00012 // Local
00013 #include "AlgAdapt.h"
00014 
00015 using namespace std;
00016 
00017 //---------------------------------------------------------------------------------
00018 Anp::AlgAdapt::AlgAdapt()
00019 {
00020 }
00021 
00022 //---------------------------------------------------------------------------------
00023 Anp::AlgAdapt::~AlgAdapt()
00024 {
00025 }
00026 
00027 //------------------------------------------------------------------------------------------
00028 long double Anp::AlgAdapt::GetPT() const
00029 {
00030    if(fCurPar.size() != fDefPar.size() || fCurPar.size() != fDefErr.size())
00031    {
00032       cerr << "AlgAdapt::GetPT - parameter and/or error vectors have different size" << endl;
00033       return 0.0;
00034    }
00035 
00036    long double pterm = 0.0;
00037 
00038    for(unsigned int ipar = 0; ipar < fCurPar.size(); ++ipar)
00039    {
00040       const double cur_par = fCurPar[ipar];
00041       const double def_par = fDefPar[ipar];
00042       const double def_err = fDefErr[ipar];
00043 
00044       if(def_err > 0.0)
00045       {
00046          pterm += (cur_par - def_par)*(cur_par - def_par)/(def_err*def_err);
00047       }
00048       else
00049       {
00050          cerr << "AlgAdapt::GetPT - default error values are not positive" << endl;
00051       }      
00052    }
00053 
00054    return pterm;
00055 }
00056 
00057 //---------------------------------------------------------------------------------
00058 const vector<double>& Anp::AlgAdapt::Get(const string &key) const
00059 {
00060    if(key == "CurErr")
00061    {
00062       return fCurErr;
00063    }
00064    else if(key == "CurPar")
00065    {
00066       return fCurPar;
00067    }
00068    else if(key == "DefErr")
00069    {
00070       return fDefErr;
00071    }
00072    else if(key == "DefPar")
00073    {
00074       return fDefPar;
00075    }
00076    
00077    cerr << "AlgAdapt::Get - unknown key: " << key << endl;
00078    
00079    assert(false && "unknown key");
00080 
00081    return fCurPar;
00082 }
00083 
00084 //---------------------------------------------------------------------------------
00085 void Anp::AlgAdapt::Set(const vector<double> &dvec, const string &key)
00086 {
00087    if(dvec.size() != GetNPar())
00088    {
00089       cerr << "AlgAdapt::Set - number of parameters and size of input vector do not match: " 
00090            << " GetNPar() = " << GetNPar() << " and dvec.size() = " << dvec.size() << endl;
00091       return;
00092    }
00093 
00094    if(key == "CurErr")
00095    {
00096       fCurErr = dvec;
00097       return;
00098    }
00099    else if(key == "CurPar")
00100    {
00101       fCurPar = dvec;
00102       return;
00103    }
00104    else if(key == "DefErr")
00105    {
00106       fDefErr = dvec;
00107       return;
00108    }
00109    else if(key == "DefPar")
00110    {
00111       fDefPar = dvec;
00112       return;
00113    }
00114    
00115    cerr << "AlgAdapt::Set - unknown key: " << key << endl;
00116 
00117    assert(false && "unknown key");
00118 }
00119 
00120 //---------------------------------------------------------------------------------
00121 void Anp::AlgAdapt::ReadVec(const string &prefix, const Registry &reg)
00122 {
00123    //
00124    // Read in default and and current error and parameter vectors from
00125    // Registry, if these keys exist in Registry. Use virtual functions Set()
00126    // to set parameter values.
00127    //
00128 
00129    const vector<double> pvec = GetVec(prefix + "Par", reg);
00130    if(!pvec.empty())
00131    {
00132       Set(pvec, "CurPar");
00133    }
00134 
00135    const vector<double> evec = GetVec(prefix + "Err", reg);
00136    if(!evec.empty())
00137    {
00138       Set(evec, "CurErr");
00139    }
00140 
00141    const vector<double> evec_def = GetVec(prefix + "DefErr", reg);
00142    if(!evec_def.empty())
00143    {
00144       Set(evec_def, "DefErr");
00145    }
00146 
00147    const vector<double> pvec_def = GetVec(prefix + "DefPar", reg);
00148    if(!pvec_def.empty())
00149    {
00150       Set(pvec_def, "DefPar");
00151    }
00152 
00153    const vector<double> pvec_cur = GetVec(prefix + "CurPar", reg);
00154    if(!pvec_cur.empty())
00155    {
00156       Set(pvec_cur, "CurPar");
00157    }
00158 
00159    const vector<double> evec_cur = GetVec(prefix + "CurErr", reg);
00160    if(!evec_cur.empty())
00161    {
00162       Set(evec_cur, "CurErr");
00163    }
00164 }
00165 
00166 //---------------------------------------------------------------------------------
00167 const vector<double> Anp::AlgAdapt::GetVec(const string &key, const Registry &reg) const
00168 {
00169    //
00170    // Extract Registry value stored at key and convert string numbers separated by
00171    // " " or "," or both to vector of doubles.
00172    //
00173  
00174    vector<double> dvec;
00175    
00176    const char *value_char = 0;
00177    if(!reg.Get(key.c_str(), value_char) || !value_char)
00178    {
00179       return dvec;
00180    }
00181 
00182    vector<string> svec;
00183 
00184    UtilString::StringTok(svec, string(value_char), ", ");
00185    
00186    dvec = vector<double>(svec.size(), 0.0);
00187 
00188    for(unsigned int i = 0; i < svec.size(); ++i)
00189    {
00190       if(!svec[i].empty())
00191       {
00192          dvec[i] = std::atof(svec[i].c_str());
00193       }
00194    }
00195 
00196    return dvec;
00197 }
00198 
00199 //------------------------------------------------------------------------------------------
00200 void Anp::AlgAdapt::PrintVec(std::ostream &o, const int w, const int p) const
00201 {
00202    if(!fCurPar.empty())
00203    {
00204       o << "   CurPar = ";
00205       PrintVec(fCurPar, o, w, p);
00206    }
00207    
00208    if(!fCurErr.empty())
00209    {
00210       o << "   CurErr = ";
00211       PrintVec(fCurErr, o, w, p);
00212    }
00213    
00214    if(!fDefPar.empty())
00215    {
00216       o << "   DefPar = ";
00217       PrintVec(fDefPar, o, w, p);
00218    }
00219    
00220    if(!fDefErr.empty())
00221    {
00222       o << "   DefErr = ";
00223       PrintVec(fDefErr, o, w, p);
00224    }
00225 }
00226 
00227 //---------------------------------------------------------------------------------
00228 void Anp::AlgAdapt::PrintVec(const vector<double> &v, ostream &o, const int w, const int p) const
00229 {
00230    for(unsigned int i = 0; i < v.size(); ++i)
00231    {
00232       if(i == 0)
00233       {
00234          o << "(";
00235       }
00236       else
00237       {
00238          o << ", ";
00239       }
00240       
00241       if(p > 0)
00242       {
00243          o << setprecision(p);
00244       }
00245       if(w > 0)
00246       {
00247          o << setw(w);
00248       }
00249 
00250       o << v[i];
00251       
00252       if(i + 1 == v.size())
00253       {
00254          o << ")";
00255       }
00256    }
00257 
00258    o << endl;
00259 }
00260 
00261 //---------------------------------------------------------------------------------
00262 void Anp::AlgAdapt::Print(std::ostream &os) const
00263 {
00264    os << "AlgAdapt::Print - this function is not implemented for this class" << endl;
00265 }

Generated on Fri Mar 28 15:26:45 2008 for loon by  doxygen 1.3.9.1