#ifndef __IWAVE_OP #define __IWAVE_OP #define DEFAULT_SNAPS 10 //#include "alg.hh" #include "op.hh" #include "productspace.hh" #include "blockop.hh" #include "ocdc.hh" #include "gridpp.hh" #include "segypp.hh" #ifdef IWAVE_USE_MPI #include "mpigridpp.hh" #include "mpisegypp.hh" #endif #include "gridops.hh" #include "logistic.hh" #include "iwsim.hh" namespace TSOpt { //using namespace RVLAlg; using RVLAlg::ListAlg; using RVL::DataContainer; using RVL::ProductDataContainer; using RVL::StdProductDataContainer; using RVL::Space; using RVL::SpaceDCF; using RVL::ProductSpace; using RVL::StdProductSpace; using RVL::ConstContainer; using RVL::STRING_PAIR; using RVL::Vector; using RVL::Components; using RVL::FunctionObject; using RVL::Operator; using RVL::LinOpValOp; using RVL::Writeable; using RVL::AssignParams; class IWaveSpace: public ProductSpace { private: /** vector of const pointers to Space */ std::vector< Space const * > _s; std::vector< std::string > _keys; protected: Space * clone() const { return new IWaveSpace(*this); } public: IWaveSpace(PARARRAY const & par, IWaveInfo const & ic, bool input, int lflag = 1, ostream & outfile = cerr); IWaveSpace(IWaveSpace const & sp); ~IWaveSpace(); /** implements virtual DataContainer constructor via StdProductDataContainer class. */ DataContainer * buildDataContainer() const; size_t getSize() const; Space const & operator[](size_t i) const; std::vector getKeys() const; }; // convenience filename transfer - weak sanity check, presume // that membership is already established // change 25.03.16: hoisted out of IWaveOp class, // membership test added void param_set(RVL::Vector const & x, PARARRAY & pars, IWaveSpace const & sp, std::string const & suf, FILE * stream=stderr); class IWaveOp: public Operator { private: IWaveInfo ic; IWaveSpace dom; IWaveSpace rng; mutable FILE * stream; /* output stream */ PARARRAY * pars; /* parameter array ref copy */ // verbosity control int dump_steps; int dump_pars; int dump_term; // other verbosity control handled within iwave code // dry run option bool dryrun; ostream & drystr; // verbose announcements ostream & announce; IWaveOp(); protected: void apply(const Vector & x, Vector & y) const; void applyDeriv(const Vector & x, const Vector & dx, Vector & dy) const; void applyAdjDeriv(const Vector & x, const Vector & dy, Vector & dx) const; void applyDeriv2(const Vector & x, const Vector & dx0, const Vector & dx1, Vector & dy) const; void applyAdjDeriv2(const Vector & x, const Vector & dx0, const Vector & dy, Vector & dx1) const; Operator * clone() const; public: IWaveOp(PARARRAY _pars, FILE * _stream, bool _dryrun=false, ostream & _drystr=cerr, ostream & _announce=cerr); IWaveOp(IWaveOp const & x); ~IWaveOp(); const IWaveSpace & getIWaveDomain() const { return dom; } const IWaveSpace & getIWaveRange() const { return rng; } const Space & getDomain() const { return getIWaveDomain(); } const Space & getRange() const { return getIWaveRange(); } // added 23.06.10 to facilitate using source as variable // without admitting that it's part of domain PARARRAY & getPar(); PARARRAY const & getPar() const; ostream & write(ostream & str) const; }; class IWaveLOVOp: public LinOpValOp { private: IWaveInfo ic; StdProductSpace dom; IWaveSpace rng; mutable FILE * stream; /* output stream */ PARARRAY * pars; /* parameter array ref copy */ // verbosity control int dump_steps; int dump_pars; int dump_term; // other verbosity control handled within iwave code // dry run option bool dryrun; ostream & drystr; // verbose announcements ostream & announce; IWaveLOVOp(); protected: virtual void apply0(const Vector & x0, const Vector & x1, Vector & y) const; void applyAdj0(const Vector & x0, const Vector & y, Vector & x1) const; void applyPartialDeriv0(const Vector & x0, const Vector & x1, const Vector & dx0, Vector & dy) const; void applyAdjPartialDeriv0(const Vector & x0, const Vector & x1, const Vector & dy, Vector & dx0) const; void applyPartialDeriv20(const Vector & x0, const Vector & x1, const Vector & dx00, const Vector & dx01, Vector & dy) const; void applyAdjPartialDeriv20(const Vector & x0, const Vector & x1, const Vector & dx00, const Vector & dy, Vector & dx01) const; RVL::OperatorProductDomain * clonePD() const { return new IWaveLOVOp(*this); } public: IWaveLOVOp(PARARRAY _pars, FILE * _stream, bool _dryrun=false, ostream & _drystr=cerr, ostream & _announce=cerr); IWaveLOVOp(IWaveLOVOp const & x); ~IWaveLOVOp(); // convenience functions const IWaveSpace & getNonLinDomain() const { try { IWaveSpace const & iwspace = dynamic_cast(this->getProductDomain()[0]); return iwspace; } catch (RVLException & e) { e<<"\ncalled from IWaveLOVOp::getNonLinDomain\n"; throw e; } catch (bad_cast) { RVLException e; e<<"ERROR: IWaveLOVOp::getNonLinDomain\n"; e<<" who knows how - first component of domain not iwspace\n"; throw e; } } const IWaveSpace & getLinDomain() const { try { IWaveSpace const & iwspace = dynamic_cast(this->getProductDomain()[1]); return iwspace; } catch (RVLException & e) { e<<"\ncalled from IWaveLOVOp::getLinDomain\n"; throw e; } catch (bad_cast) { RVLException e; e<<"ERROR: IWaveLOVOp::getLinDomain\n"; e<<" who knows how - first component of domain not iwspace\n"; throw e; } } const IWaveSpace & getIWaveRange() const { return rng; } // mandatory const ProductSpace & getProductDomain() const { return dom; } const Space & getRange() const { return rng; } // added 23.06.10 to facilitate using source as variable // without admitting that it's part of domain PARARRAY & getPar(); PARARRAY const & getPar() const; ostream & write(ostream & str) const; }; void IWaveLoad(PARARRAY, Vector &, std::vector); /** parameters for iwavefwi: for each parameter to be updated: name should take form [name from keys]_est grid spec'd in file is update grid, to be injected into grid spec'd by [name_from_keys] upper and lower bounds are either [name_from_keys]_ub, [name_from_keys]_lb (files for envelope, must have same grid as _est file [name_from_keys]_max, [name_from_keys]_min (floats) tapers on grid windows (same for all): taper1, taper2, taper3 */ class IWaveFWIOp: public Operator { private: IWaveOp iwop; std::shared_ptr > m0; std::shared_ptr > m; std::vector est; std::vector estkeys; std::vector estidx; std::shared_ptr > dom; std::shared_ptr > med; std::shared_ptr > ub; std::shared_ptr > lb; std::shared_ptr > lm0; std::shared_ptr > dwop; std::shared_ptr > dlop; std::shared_ptr > injop; std::shared_ptr > transop; std::shared_ptr > modelop; std::shared_ptr > op; IWaveFWIOp(); protected: void apply(Vector const & x, Vector & y) const; void applyDeriv(Vector const & x, Vector const & dx, Vector & dy) const; void applyAdjDeriv(Vector const & x, Vector const & dy, Vector & dx) const; void applyDeriv2(const Vector & x, const Vector & dx1, const Vector & dx2, Vector & dy) const; void applyAdjDeriv2(const Vector & x, const Vector & dy, const Vector & dx2, Vector & dx1) const; Operator * clone() const { return new IWaveFWIOp(*this); } public: IWaveFWIOp(PARARRAY par, FILE * stream); IWaveFWIOp(IWaveFWIOp const & x); ~IWaveFWIOp() {} Space const & getDomain() const { return op->getDomain(); } Space const & getRange() const { return op->getRange(); } Operator const & getTransformOp() const { return *transop; } Operator const & getModelingOp() const { return *modelop; } std::vector getDomainKeys() const { return estkeys; } std::vector getModelKeys() const { IWaveSpace const & iwdom = dynamic_cast(iwop.getDomain()); return iwdom.getKeys(); } std::vector getRangeKeys() const { IWaveSpace const & iwrng = dynamic_cast(iwop.getRange()); return iwrng.getKeys(); } ostream & write(ostream & str) const; }; } #endif