#include "iwopt.hh" #define VERBOSE namespace TSOpt { void IWaveOpt(PARARRAY pars, RVL::Operator const & op, RVL::Vector const & d, RVL::Vector & m) { try { /* Components cm(m); for (int i=0;i svmin; RVL::RVLMax svmax; RVL::MPISerialFunctionObjectRedn vmin(svmin); RVL::MPISerialFunctionObjectRedn vmax(svmax); cm[i].eval(vmin); cm[i].eval(vmax); cerr<<"StdOLS bfore \n"; cerr<<" background model comp "<>nnn; #else RVL::RVLMin vmin; RVL::RVLMax vmax; cm[i].eval(vmin); cm[i].eval(vmax); cerr<<" background model comp "<(pars,"outfile",""); if ((outfile.size()==0) && (retrieveRank()==0)) optr = &cout; /* switch on method */ RVLAlg::Algorithm * alg = NULL; std::string optmethod = RVL::valparse(pars,"OptMethod","lbfgs"); #ifdef VERBOSE cerr<<"IWaveOpt: optmethod="< f(op,d); alg = new RVLUmin::LBFGSBT (f, m, RVL::valparse(pars,"InvHessianScale",1.0f), RVL::valparse(pars,"MaxInvHessianUpdates",5), RVL::valparse(pars,"MaxSubSteps",10), RVL::valparse(pars,"VerboseDisplay",true), RVL::valparse(pars,"InitStepBound",1.0f), RVL::valparse(pars,"MinDecrease",0.1f), RVL::valparse(pars,"GoodDecrease",0.9f), RVL::valparse(pars,"StepDecrFactor",0.5f), RVL::valparse(pars,"StepIncrFactor",1.8f), RVL::valparse(pars,"MaxFracDistToBdry",1.0), RVL::valparse(pars,"MinStepTol",1.e-06), // min step as frac of LS segment RVL::valparse(pars,"MaxSteps",10), RVL::valparse(pars,"AbsGradThresh",0.0), RVL::valparse(pars,"RelGradThresh",1.e-2), *optr); } else if (optmethod == "trcg") { RVL::ResidualOperator rop(op,d); RVLUmin::TRGNAlg > * tralg = new RVLUmin::TRGNAlg > (rop, m, RVL::valparse(pars,"MaxSteps",10), // _maxcount, RVL::valparse(pars,"ResidualTol",0.0f), // _jtol, RVL::valparse(pars,"AbsGradThresh",0.0f), // _agtol, RVL::valparse(pars,"RelGradThresh",1.0e-2), // _rgtol, RVL::valparse(pars,"MinDecrease",0.1f), // _eta1 RVL::valparse(pars,"GoodDecrease",0.9f), // _eta2 RVL::valparse(pars,"StepDecrFactor",0.5f), // _gamma1 RVL::valparse(pars,"StepIncrFactor",1.8f), // _gamma2 RVL::valparse(pars,"MinStepTol",1.e-06), // min step as frac *optr); // assign CG params tralg->assign (RVL::valparse(pars,"CGNE_ResTol",0.0f), // rtol RVL::valparse(pars,"CGNE_GradTol",0.001f), // nrtol, RVL::valparse(pars,"InitStepBound",1.0f), // Delta RVL::valparse(pars,"MaxSubSteps",10), // maxcount RVL::valparse(pars,"VerboseDisplay",true)); // verbose alg=tralg; } else { RVL::RVLException e; e<<"ERROR: IWaveOpt\n"; e<<" no optimization algorithm selected, or algoritm specified is not\n"; e<<" supported. Currently supported algorithms:\n"; e<<" OptMethod = lbfgs (Limited Memory Broyden-Fletcher-Goldfarb-Shanno)\n"; e<<" OptMethod = trcg (Trust Region Gauss-Newton with CG linear solver\n)"; throw e; } #ifdef VERBOSE cerr<<"IWaveOpt -> run\n"; #endif alg->run(); #ifdef VERBOSE cerr<<"IWaveOpt -> report\n"; #endif delete alg; /* for (int i=0; i svmin; RVL::RVLMax svmax; RVL::MPISerialFunctionObjectRedn vmin(svmin); RVL::MPISerialFunctionObjectRedn vmax(svmax); cm[i].eval(vmin); cm[i].eval(vmax); cerr<<"StdOLS after\n"; cerr<<" background model comp "<>nnn; #else RVL::RVLMin vmin; RVL::RVLMax vmax; cm[i].eval(vmin); cm[i].eval(vmax); cerr<<" background model comp "<0) && (retrieveRank()==0)) { std::ofstream outf(outfile.c_str()); outf< const d, RVL::Vector const r) { try { // create model vector, optionally assign components to // archival files RVL::Vector m(op.getTransformOp().getRange()); Components cm(m); std::vector mkeys = op.getDomainKeys(); size_t flag = 0; for (int i=0; i(pars,mdl+"_est",""); std::string fname = RVL::valparse(pars,mdl+"_inv",""); // cerr<<"IWaveResMod:\n"; // cerr<<" model index="< 0) && (fname.size() > 0)) { RVL::AssignFilename fn(fname); cm[i].eval(fn); flag += fname.size(); /* #ifdef IWAVE_USE_MPI RVL::RVLMin svmin; RVL::RVLMax svmax; RVL::MPISerialFunctionObjectRedn vmin(svmin); RVL::MPISerialFunctionObjectRedn vmax(svmax); cm[i].eval(vmin); cm[i].eval(vmax); cerr<<" background model comp "<>nnn; #else RVL::RVLMin vmin; RVL::RVLMax vmax; cm[i].eval(vmin); cm[i].eval(vmax); cerr<<" background model comp "< 0) { RVL::OperatorEvaluation transeval(op.getTransformOp(),r); m.copy(transeval.getValue()); } // create residual vector, optionally assign components to // archival files RVL::Vector res(op.getModelingOp().getRange()); Components cres(res); std::vector ekeys = op.getRangeKeys(); size_t elag = 0; for (int i=0; i(pars,ekeys[i]+"_res",""); if (fname.size() > 0) { RVL::AssignFilename fn(fname); cres[i].eval(fn); elag += fname.size(); } } // don't bother if the user hasn't asked for any residual files if (elag > 0) { if (flag > 0) { RVL::OperatorEvaluation modeleval(op.getModelingOp(),m); res.copy(modeleval.getValue()); } else { RVL::OperatorEvaluation modeleval(op,r); res.copy(modeleval.getValue()); } } res.linComb(-1.0f,d); } catch (RVL::RVLException & e) { e<<"\ncalled from IWaveResMod\n"; throw e; } } int IWaveOpApply(int argc, char ** argv, void (*invfcn)(PARARRAY, FILE *)) { try { PARARRAY * pars = NULL; FILE * stream = NULL; TSOpt::IWaveEnvironment(argc, argv, 0, &pars, &stream); if (retrieveGlobalRank()==0 && argc<2) { pagedoc(); exit(0); } #ifdef IWAVE_USE_MPI if (retrieveGroupID() == MPI_UNDEFINED) { fprintf(stream,"NOTE: finalize MPI, cleanup, exit\n"); fflush(stream); } else { #endif invfcn(*pars,stream); #ifdef IWAVE_USE_MPI /* end nontriv comm branch */ } MPI_Barrier(MPI_COMM_WORLD); #endif ps_delete(&pars); fclose(stream); return 0; } catch (RVL::RVLException & e) { e<<"\ncalled from IWaveOpApply\n"; throw e; } } void StraightOLS(PARARRAY pars, FILE * stream) { try { #ifdef VERBOSE cerr<<"StraightOLS -> IWaveFWIOp constructor\n"; #endif TSOpt::IWaveFWIOp op(pars, stream); #ifdef VERBOSE cerr<<"StraightOLS -> domain vector\n"; #endif RVL::Vector r(op.getDomain()); #ifdef VERBOSE cerr<<"StraightOLS -> range vector\n"; #endif RVL::Vector d(op.getRange()); #ifdef VERBOSE for (int i=0;iload domain vector\n"; #endif TSOpt::IWaveLoad(pars,r,op.getDomainKeys()); #ifdef VERBOSE for (int i=0;iload range vector\n"; #endif TSOpt::IWaveLoad(pars,d,op.getRangeKeys()); #ifdef VERBOSE cerr<<"StraightOLS: optimize\n"; #endif TSOpt::IWaveOpt(pars, op, d, r); #ifdef VERBOSE cerr<<"StraightOLS: cleanup\n"; #endif TSOpt::IWaveResMod(pars,op,d,r); #ifdef VERBOSE cerr<<"StraightOLS exit\n"; #endif } catch (RVL::RVLException & e) { e<<"\ncalled from TSOpt::StraightOLS\n"; throw e; } } }