20#ifndef _GIMLI_TRANS__H
21#define _GIMLI_TRANS__H
25#include "numericbase.h"
33template<
class Vec >
class Trans {
49 inline Vec
fwd(
const Vec & f)
const {
return this->
trans(f); }
52 inline double fwd(
double f)
const {
return this->
trans(f); }
55 inline Vec
inv(
const Vec & f)
const {
return this->
invTrans(f); }
58 inline double inv(
double f)
const {
return this->
inv(Vec(1, f))[0]; }
62 virtual double trans(
double x)
const {
return this->
trans(Vec(1,
x))[0]; }
65 virtual Vec
trans(
const Vec &
x)
const {
return x; }
68 virtual Vec
invTrans(
const Vec & f)
const {
return f; }
74 virtual Vec
deriv(
const Vec &
x)
const {
return Vec(
x.size(), 1.0); }
78 Vec
update(
const Vec & a,
const Vec & b)
const {
84 Vec
error(
const Vec & a,
const Vec & daBya)
const {
85 if (daBya == Vec(a.size(), 0.0))
return Vec(a.size(), 1.0);
86 return abs(Vec(a * daBya *
deriv(a)));
92 return abs(
trans(a * (daBya + 1.0)) -
trans(a));
98template<
class Vec >
class TransNewton :
public Trans < Vec >{
100 TransNewton(
const int maxiter=10)
101 : maxiter_(maxiter) { }
103 virtual ~TransNewton(){ }
105 virtual Vec
trans(
const Vec & a)
const { }
107 virtual Vec
deriv(
const Vec & a)
const { }
110 Vec p(Vec(a.size(), 0.01));
111 Vec dm(
trans(p) - a);
113 for(
size_t i = 0; i < 10; i++) {
114 p = p - dm /
deriv(p);
129template<
class Vec >
class TransLinear :
public Trans < Vec > {
131 TransLinear(
const Vec & factor,
double offset=0.0)
132 : factor_(factor), offset_(Vec(factor.size(), offset)) {}
134 virtual ~TransLinear() { }
140 return x * factor_ + offset_;
144 virtual Vec
invTrans(
const Vec & f)
const {
return (f - offset_) / factor_;}
147 virtual Vec
deriv(
const Vec &
x)
const {
return factor_; }
156template<
class Vec >
class TransLin :
public Trans < Vec > {
158 TransLin(
double factor=1.0,
double offset=0.0)
159 : factor_(factor), offset_(offset) {}
161 virtual ~TransLin() { }
163 virtual Vec
trans(
const Vec & a)
const {
return a * factor_ + offset_; }
165 virtual Vec
invTrans(
const Vec & a)
const {
return (a - offset_) / factor_;}
167 virtual Vec
deriv(
const Vec & a)
const {
return Vec(a.size(), factor_); }
175template<
class Vec >
class TransPower :
public Trans < Vec > {
177 TransPower(
double npower=-1.0,
double a0=1.0)
178 : npower_(npower), a0_(a0) {}
179 virtual ~TransPower() { }
183 return pow(
x / a0_, npower_);}
187 return pow(f, 1.0 / npower_) * a0_;}
190 virtual Vec
deriv(
const Vec & a)
const {
191 return pow(a / a0_, npower_ - 1.0) * npower_ / a0_;}
198template<
class Vec >
class TransExp :
public Trans < Vec > {
201 TransExp(
double a0=1.0,
double f0=1.0)
202 : a0_(a0), f0_(f0) {}
205 virtual ~TransExp() {}
208 virtual Vec
trans(
const Vec & a)
const {
209 return exp(a / a0_ * (-1.0)) * f0_; }
213 return log(f / f0_) * a0_ * (-1.0); }
216 virtual Vec
deriv(
const Vec & a)
const {
217 return trans(a) / a0_ * (-1.0); }
224template<
class Vec >
class TransInv :
public Trans < Vec > {
227 virtual ~TransInv() { }
229 virtual Vec
trans(
const Vec & a)
const {
return 1.0 / a; }
230 virtual Vec
invTrans(
const Vec & f)
const {
return 1.0 / f; }
231 virtual Vec
deriv(
const Vec & a)
const {
return -1.0 / a / a; }
236template<
class Vec >
class TransLog :
public Trans < Vec > {
238 TransLog(
double lowerbound=0.0) : lowerbound_(lowerbound) { }
239 virtual ~TransLog() { }
241 virtual Vec
trans(
const Vec & a)
const {
242 double lb1 = lowerbound_ * (1.0 + TRANSTOL);
244 std::cerr << WHERE_AM_I <<
" Warning! " << min(a)
245 <<
" <=" << lowerbound_ <<
" lowerbound" << std::endl;
247 for (uint i = 0; i < a.size(); i ++){
248 tmp[i] = max(a[i], lb1 );
250 return log(tmp - lowerbound_);
252 return log(a - lowerbound_);
255 virtual Vec
invTrans(
const Vec & f)
const {
return exp(f) + lowerbound_; }
257 virtual Vec
deriv(
const Vec & a)
const {
258 double lb1 = lowerbound_ * (1.0 + TRANSTOL);
260 std::cerr << WHERE_AM_I <<
" Warning! " << min(a)
261 <<
" <=" << lowerbound_ <<
" lowerbound" << std::endl;
263 for (uint i = 0; i < a.size(); i ++){
264 tmp[i] = max(a[i], lb1 );
266 return 1.0 / (tmp - lowerbound_);
268 return 1.0 / (a - lowerbound_);
274 inline void setLowerBound(
double lb) { lowerbound_ = lb; }
276 inline double lowerBound()
const {
return lowerbound_; }
285template<
class Vec >
class TransLogLU :
public TransLog < Vec > {
287 TransLogLU(
double lowerbound=0.0,
double upperbound=0.0)
288 : TransLog< Vec >(lowerbound), upperbound_(upperbound) { }
289 virtual ~TransLogLU() { }
294 virtual Vec
trans(
const Vec & a)
const;
298 virtual Vec
deriv(
const Vec & a)
const;
300 inline void setUpperBound(
double ub) { upperbound_ = ub; }
302 inline double upperBound()
const {
return upperbound_; }
316template<
class Vec >
class TransCotLU :
public Trans < Vec > {
319 TransCotLU(
double lowerbound=0.0,
double upperbound=0.0)
320 : lowerbound_(lowerbound), upperbound_(upperbound) { }
322 virtual ~TransCotLU() { }
324 virtual Vec
trans(
const Vec & a)
const {
326 double fak = 1.00001;
327 if (min(a) <= lowerbound_ ){
328 std::cerr << WHERE_AM_I <<
" Warning! " << min(a) <<
" < " << lowerbound_ <<
" = lowerbound" << std::endl;
329 for (uint i = 0; i < a.size(); i ++){
330 tmp[i] = max(a[i], lowerbound_ * fak);
333 if (max(a) >= upperbound_ ){
334 std::cerr << WHERE_AM_I <<
" Warning! " << max(a) <<
" > " << upperbound_ <<
" = upperbound" << std::endl;
335 for (uint i = 0; i < a.size(); i ++){
336 tmp[i] = min(a[i], upperbound_ / fak);
339 return cot((tmp - lowerbound_) / (upperbound_ - lowerbound_) * PI) * (-1.0);
344 return atan(a) * (upperbound_ - lowerbound_) / PI + (lowerbound_ + upperbound_) / 2;
347 virtual Vec
deriv(
const Vec & a)
const {
348 return ((
trans(a) *
trans(a) + 1.0) * PI / (upperbound_ - lowerbound_));
358template<
class Vec >
class TransNest :
public Trans < Vec >{
362 virtual ~TransNest(){ }
364 virtual Vec
trans(
const Vec & a)
const {
365 return T1_->trans(T2_->trans(a));
369 return T2_->invTrans(T1_->invTrans(a));
372 virtual Vec
deriv(
const Vec & a)
const {
373 return T1_->deriv(T2_->trans(a)) * T2_->deriv(a);
382template<
class Vec >
class TransAdd :
public TransNewton < Vec >{
385 virtual ~TransAdd(){ }
387 virtual Vec
trans(
const Vec & a)
const {
388 return T1_->trans(a) + T2_->trans(a);
391 virtual Vec
deriv(
const Vec & a)
const {
392 return T1_->deriv(a) + T2_->deriv(a);
401template<
class Vec >
class TransMult :
public TransNewton < Vec >{
404 virtual ~TransMult(){ }
406 virtual Vec
trans(
const Vec & a)
const {
407 return T1_->trans(a) * T2_->trans(a);
410 virtual Vec
deriv(
const Vec & a)
const {
411 return T1_->deriv(a) * T2_->trans(a) + T2_->deriv(a) * T1_->trans(a);
421template<
class Vec >
class TransCRIM :
public TransLinear < Vec > {
424 TransCRIM(
const Vec & phi,
double ematrix = 5.0,
double ewater = 81.0)
425 : TransLinear< Vec >(1.0 / phi / 2.99e8 / (std::sqrt(ewater) - 1.0),
426 (phi + (phi - 1.0) * std::sqrt(ematrix)) / (phi * (std::sqrt(ewater) - 1.0))){
432template<
class Vec >
class TransArchie :
public TransPower < Vec > {
436 :TransPower< Vec >(resfluid, 1 / mexp){
444template<
class Vec >
class TransQuadrat :
public TransNewton < Vec >{
446 TransQuadrat(
const int maxiter = 10) : TransNewton< Vec >(maxiter){ }
447 virtual ~TransQuadrat(){ }
448 virtual Vec
trans(
const Vec & a)
const {
return a * a; }
449 virtual Vec
deriv(
const Vec & a)
const {
return a * 2.0; }
453template<
class Vec >
class TransLogMult :
public TransLog < Vec > {
455 TransLogMult(
const Vec & factor,
double lowerbound = 0.0)
456 : TransLog< Vec >(lowerbound), factor_(factor) { }
457 virtual ~TransLogMult() { }
468template<
class Vec >
class TransTanLU :
public Trans < Vec > {
470 TransTanLU(
double lowerbound=0.0,
double upperbound=0.0)
471 : lowerbound_(lowerbound), upperbound_(upperbound) {
473 virtual ~TransTanLU() { }
475 virtual Vec
trans(
const Vec & a)
const {
478 if (a.min() < lowerbound_ ){
479 std::cerr << WHERE_AM_I <<
" Warning! " << a.min() <<
" < " << lowerbound_ <<
" lowerbound" << std::endl;
480 for (
int i = 0; i < a.size(); i ++){
481 tmp[i] = max(a[i], lowerbound_) + tol;
484 if (a.max() > upperbound_ ){
485 std::cerr << WHERE_AM_I <<
" Warning! " << a.max() <<
" > " << upperbound_ <<
" lowerbound" << std::endl;
487 for (
int i = 0; i < a.size(); i ++){
488 tmp[i] = min(a[i], upperbound_) - tol;
491 return tan(((a - lowerbound_) / (upperbound_ - lowerbound_) - 0.5) * PI);
495 return atan(a) / PI * (upperbound_ - lowerbound_) + (lowerbound_ + upperbound_) / 2;
498 virtual Vec
deriv(
const Vec & a)
const {
499 return (pow(
trans(a), 2.0) + 1.0);
508template<
class Vec >
class TransLogLUMult :
public TransLogLU < Vec > {
510 TransLogLUMult(
const Vec & factor,
511 double lowerbound=0.0,
512 double upperbound=0.0)
513 : TransLogLU< Vec >(lowerbound, upperbound), factor_(factor){ }
515 virtual ~TransLogLUMult() { }
517 virtual Vec
trans(
const Vec & a)
const {
525 virtual Vec
deriv(
const Vec & a)
const {
535template<
class Vec >
class TransCumulative :
public Trans < Vec >{
537 TransCumulative() { }
539 virtual ~TransCumulative() { }
541 virtual Vec
trans(
const Vec & a)
const;
545 virtual Vec
deriv(
const Vec & a)
const;
547 Index size()
const {
return transVec_.size(); }
564 const std::pair< Index, Index> & slice(Index i)
const {
return slice_.at(i);}
566 const IVector & indices(Index i)
const {
return indices_.at(i);}
569 std::vector < Trans< Vec > * > transVec_;
570 std::vector < std::pair< Index, Index> > slice_;
571 std::vector < IVector > indices_;
574template <> DLLEXPORT RVector TransCumulative < RVector >::trans(
const RVector & a)
const;
575template <> DLLEXPORT RVector TransCumulative < RVector >::invTrans(
const RVector & a)
const;
576template <> DLLEXPORT RVector TransCumulative < RVector >::deriv(
const RVector & a)
const;
579template <> DLLEXPORT
void TransCumulative < RVector >::add(
Trans< RVector > &
trans, Index start, Index end);
580template <> DLLEXPORT
void TransCumulative < RVector >::add(
Trans< RVector > &
trans,
const IVector & indices);
582typedef Trans < RVector > RTrans;
583typedef TransLinear < RVector > RTransLinear;
584typedef TransLin < RVector > RTransLin;
585typedef TransPower < RVector > RTransPower;
586typedef TransLog < RVector > RTransLog;
587typedef TransLogLU < RVector > RTransLogLU;
588typedef TransCotLU < RVector > RTransCotLU;
virtual Vec trans(const Vec &a) const
Definition trans.h:387
virtual Vec deriv(const Vec &a) const
Definition trans.h:391
TransArchie(double resfluid, double mexp=2.0)
Definition trans.h:435
TransCRIM(const Vec &phi, double ematrix=5.0, double ewater=81.0)
Definition trans.h:424
virtual Vec trans(const Vec &a) const
Definition trans.h:324
virtual Vec deriv(const Vec &a) const
Definition trans.h:347
virtual Vec invTrans(const Vec &a) const
Definition trans.h:342
Trans< Vec > & at(Index i)
Definition trans.h:562
virtual Vec trans(const Vec &a) const
virtual Vec invTrans(const Vec &a) const
virtual Vec deriv(const Vec &a) const
virtual Vec trans(const Vec &a) const
Definition trans.h:208
virtual Vec invTrans(const Vec &f) const
Definition trans.h:212
virtual Vec deriv(const Vec &a) const
Definition trans.h:216
virtual Vec invTrans(const Vec &f) const
Definition trans.h:230
virtual Vec deriv(const Vec &a) const
Definition trans.h:231
virtual Vec trans(const Vec &a) const
Definition trans.h:229
virtual Vec trans(const Vec &a) const
Definition trans.h:163
virtual Vec invTrans(const Vec &a) const
Definition trans.h:165
virtual Vec deriv(const Vec &a) const
Definition trans.h:167
virtual Vec deriv(const Vec &x) const
Definition trans.h:147
virtual Vec invTrans(const Vec &f) const
Definition trans.h:144
virtual Vec trans(const Vec &x) const
Definition trans.h:137
virtual Vec deriv(const Vec &a) const
Definition trans.h:525
virtual Vec invTrans(const Vec &a) const
Definition trans.h:521
virtual Vec trans(const Vec &a) const
Definition trans.h:517
virtual Vec trans(const Vec &a) const
Vec rangify(const Vec &a) const
virtual Vec deriv(const Vec &a) const
virtual Vec invTrans(const Vec &a) const
virtual Vec deriv(const Vec &a) const
Definition trans.h:461
virtual Vec invTrans(const Vec &a) const
Definition trans.h:460
virtual Vec trans(const Vec &a) const
Definition trans.h:459
virtual Vec deriv(const Vec &a) const
Definition trans.h:257
virtual Vec invTrans(const Vec &f) const
Definition trans.h:255
virtual Vec trans(const Vec &a) const
Definition trans.h:241
virtual Vec deriv(const Vec &a) const
Definition trans.h:410
virtual Vec trans(const Vec &a) const
Definition trans.h:406
virtual Vec deriv(const Vec &a) const
Definition trans.h:372
virtual Vec trans(const Vec &a) const
Definition trans.h:364
virtual Vec invTrans(const Vec &a) const
Definition trans.h:368
virtual Vec trans(const Vec &a) const
Definition trans.h:105
virtual Vec deriv(const Vec &a) const
Definition trans.h:107
virtual Vec invTrans(const Vec &a) const
Definition trans.h:109
virtual Vec deriv(const Vec &a) const
Definition trans.h:190
virtual Vec invTrans(const Vec &f) const
Definition trans.h:186
virtual Vec trans(const Vec &x) const
Definition trans.h:182
virtual Vec trans(const Vec &a) const
Definition trans.h:448
virtual Vec deriv(const Vec &a) const
Definition trans.h:449
virtual Vec invTrans(const Vec &a) const
Definition trans.h:494
virtual Vec deriv(const Vec &a) const
Definition trans.h:498
virtual Vec trans(const Vec &a) const
Definition trans.h:475
virtual ~Trans()
Definition trans.h:40
virtual Vec operator()(const Vec &a) const
Definition trans.h:43
Vec inv(const Vec &f) const
Definition trans.h:55
virtual Vec invTrans(const Vec &f) const
Definition trans.h:68
virtual Vec trans(const Vec &x) const
Definition trans.h:65
virtual double trans(double x) const
Definition trans.h:62
double inv(double f) const
Definition trans.h:58
Vec error_brute(const Vec &a, const Vec &daBya) const
Definition trans.h:91
Trans()
Definition trans.h:37
virtual Vec deriv(const Vec &x) const
Definition trans.h:74
double fwd(double f) const
Definition trans.h:52
Vec fwd(const Vec &f) const
Definition trans.h:49
virtual double invTrans(double f) const
Definition trans.h:71
Vec error(const Vec &a, const Vec &daBya) const
Definition trans.h:84
virtual double operator()(double x) const
Definition trans.h:46
Vec update(const Vec &a, const Vec &b) const
Definition trans.h:78
GIMLi main namespace for the Geophyiscal Inversion and Modelling Library.
Definition baseentity.h:24
RVector x(const R3Vector &rv)
Definition pos.cpp:107