Line data Source code
1 : /** 2 : Bojan Nikolic <bojan@bnikolic.co.uk> 3 : Initial version 2003 4 : 5 : This file is part of BNMin1 and is licensed under GNU General 6 : Public License version 2 7 : 8 : \file minim.cxx 9 : Renamed to minim.cc 2023 10 : 11 : */ 12 : 13 : #include "minim.h" 14 : 15 : #include <cmath> 16 : 17 : #include "monitor.h" 18 : #include "paramalgo.h" 19 : 20 : #include <iostream> 21 : 22 : 23 : namespace Minim { 24 : 25 0 : ModelDesc::ModelDesc( Model &mod ) : 26 0 : mod(mod) 27 : { 28 0 : mod.AddParams(pars); 29 0 : } 30 : 31 0 : ModelDesc::~ModelDesc(void) 32 : { 33 : 34 0 : } 35 : 36 : 37 0 : DParamCtr * ModelDesc::operator[] (const std::string &name) 38 : { 39 0 : return findName(pars, name); 40 : } 41 : 42 0 : void ModelDesc::CopyParsFrom ( ModelDesc & mod2 ) 43 : { 44 0 : for ( size_t i =0 ; i < mod2.NTotParam() ; ++ i ) 45 : { 46 0 : DParamCtr * cpar = (*this)[ mod2[i]->getname() ] ; 47 0 : if ( cpar != NULL ) 48 : { 49 0 : cpar->setp( mod2[i]->getp() ); 50 0 : std::cerr<< mod2[i]->getp() << std::endl; 51 : } 52 : 53 : } 54 0 : } 55 : 56 0 : unsigned ModelDesc::NParam(void) const 57 : { 58 0 : unsigned count(0); 59 0 : for (std::vector<DParamCtr>::const_iterator i (pars.begin() ) ; i< pars.end() ; ++i ) 60 0 : if (i->dofit) ++count; 61 0 : return count; 62 : } 63 : 64 0 : void ModelDesc::copytopars(const double *x) 65 : { 66 0 : unsigned count(0); 67 0 : for ( std::vector<DParamCtr>::iterator i ( pars.begin() ) ; 68 0 : i < pars.end(); 69 0 : i++ ) 70 0 : if (i->dofit) { 71 0 : *(i-> p) = x[ count ]; 72 0 : ++count; 73 : } 74 0 : } 75 : 76 0 : void ModelDesc::copyfrompars(double *x) 77 : { 78 0 : unsigned count(0); 79 0 : for ( std::vector<DParamCtr>::iterator i ( pars.begin() ) ; 80 0 : i < pars.end(); 81 0 : i++ ) if(i->dofit) { 82 0 : x[ count ] = * (i-> p) ; 83 0 : ++count; 84 : } 85 0 : } 86 : 87 : 88 0 : Minimiser::Minimiser (Minim::Minimisable &pm) : 89 : ModelDesc(pm), 90 : /* iter(0) ,*/ 91 0 : m(pm) , 92 0 : MonitorChi_stride(1) , 93 0 : MonitorChi_cno(0) 94 : { 95 : 96 0 : } 97 0 : void Minimiser::AddMon (Monitor * mon) 98 : { 99 0 : mons.push_back(mon); 100 0 : } 101 : 102 : 103 0 : void Minim::Minimiser::ResEval (void ) 104 : { 105 : 106 0 : m.residuals(res); 107 : 108 0 : if ( MonitorChi_cno % MonitorChi_stride == 0 ) 109 : { 110 0 : for ( unsigned i =0 ; i < mons.size() ; ++ i ) 111 0 : mons[i]->Iter(this); 112 : } 113 : 114 0 : MonitorChi_cno++; 115 : 116 0 : } 117 : 118 0 : void Minimiser::InitRes (void) 119 : { 120 0 : unsigned nresiduals ( m.nres() ); 121 : 122 : 123 0 : res = std::vector<double> ( nresiduals); 124 0 : } 125 : 126 0 : void Minimiser::CollectParams ( Model & m ) 127 : { 128 0 : m.AddParams(pars) ; 129 0 : MonitorChi_stride=NParam(); 130 0 : }; 131 : 132 : 133 0 : double Minimiser::ChiSquared(void) { 134 0 : double total(0.0); 135 0 : for (unsigned i (0) ; i < res.size() ; ++i) total += pow(res[i],2); 136 0 : return total; 137 : } 138 : 139 : 140 : 141 : 142 : } 143 : 144 :