All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines
Public Member Functions | Static Public Member Functions | Protected Member Functions | Protected Attributes
QGpCoreTools::StatisticalValue< numberType > Class Template Reference

Brief description of class still missing. More...

#include <StatisticalValue.h>

Inheritance diagram for QGpCoreTools::StatisticalValue< numberType >:
QGpCoreTools::XMLClass QGpCoreTools::StatisticalPoint< numberType >

List of all members.

Public Member Functions

void average (const StatisticalValue &p)
bool isValid () const
const numberType & mean () const
double misfit (int &nValues, int &nData, const Value< numberType > &value, MisfitType type, double min) const
void operator= (const StatisticalValue &o)
bool operator== (const StatisticalValue &o) const
void setMean (const numberType &v)
void setStddev (double v)
void setValid (bool f)
void setWeight (double v)
 StatisticalValue ()
 StatisticalValue (const numberType &mean, double stddev=0.0, double weight=1.0, bool valid=true)
double stddev () const
double weight () const

Static Public Member Functions

static MisfitType misfitType (QString type)
static QString misfitTypeString (MisfitType type)

Protected Member Functions

virtual XMLMember xml_member (XML_MEMBER_ARGS)
virtual bool xml_setProperty (XML_SETPROPERTY_ARGS)
virtual void xml_writeProperties (XML_WRITEPROPERTIES_ARGS) const

Protected Attributes

numberType _mean
double _stddev
bool _valid
double _weight

Detailed Description

template<class numberType>
class QGpCoreTools::StatisticalValue< numberType >

Brief description of class still missing.

Full description of class still missing


Constructor & Destructor Documentation

template<class numberType >
QGpCoreTools::StatisticalValue< numberType >::StatisticalValue ( ) [inline]

References TRACE.

{
  TRACE;
  _mean=0.0;
  _stddev=0.0;
  _weight=1.0;
  _valid=true;
}
template<class numberType>
QGpCoreTools::StatisticalValue< numberType >::StatisticalValue ( const numberType &  mean,
double  stddev = 0.0,
double  weight = 1.0,
bool  valid = true 
) [inline]

References TRACE.


Member Function Documentation

template<class numberType >
void QGpCoreTools::StatisticalValue< numberType >::average ( const StatisticalValue< numberType > &  p) [inline]

References QGpCoreTools::StatisticalValue< numberType >::_mean, QGpCoreTools::StatisticalValue< numberType >::_stddev, QGpCoreTools::StatisticalValue< numberType >::_weight, QGpCoreTools::abs2(), QGpCoreTools::StatisticalValue< numberType >::isValid(), QGpCoreTools::sqrt(), and TRACE.

{
  TRACE;
  if(isValid()) {
    if(o.isValid()) {
      double wt=_weight+o._weight;
      _mean=(_mean*_weight+o._mean*o._weight)/wt;
      double sigma2=_weight*abs2(_mean);
      if(_weight>1.0)
        sigma2 += (_weight -1.0)* _stddev*_stddev;
      else
        sigma2 += _weight* _stddev*_stddev;
      sigma2 += o._weight *abs2(o._mean);
      if(o._weight>1.0)
        sigma2 += (o._weight-1.0) * o._stddev*o._stddev;
      else
        sigma2 += o._weight * o._stddev*o._stddev;
      sigma2 -= abs2(_mean) * wt;
      sigma2 /= wt-1;
      _stddev=::sqrt(sigma2);
      _weight=wt;
    }
  } else if(o.isValid()) {
    *this=o;
  }
}
template<class numberType>
bool QGpCoreTools::StatisticalValue< numberType >::isValid ( ) const [inline]
template<class numberType>
const numberType& QGpCoreTools::StatisticalValue< numberType >::mean ( ) const [inline]
template<class numberType>
double QGpCoreTools::StatisticalValue< numberType >::misfit ( int &  nValues,
int &  nData,
const Value< numberType > &  value,
MisfitType  type,
double  min 
) const

Returns a misfit value comparing val with the mean and stddev.

nValues is incremented by one if the value and this point are valid. nData is incremented by one if this point is valid.

If min is greater than 0, the difference between val and mean (eventually normalized) is clipped to min.

References QGpCoreTools::abs(), QGpCoreTools::Akaike, QGpCoreTools::AkaikeFewSamples, QGpCoreTools::Value< numberType >::isValid(), QGpCoreTools::L1, QGpCoreTools::L1_LogNormalized, QGpCoreTools::L1_Normalized, QGpCoreTools::L1_NormalizedBySigmaOnly, QGpCoreTools::L2, QGpCoreTools::L2_LogNormalized, QGpCoreTools::L2_Normalized, QGpCoreTools::L2_NormalizedBySigmaOnly, QGpCoreTools::log(), TRACE, and QGpCoreTools::Value< numberType >::value().

Referenced by Spac3CForward::misfit(), QGpCoreWave::MagnetoTelluricCurve::misfit(), QGpCoreWave::RefractionCurve::misfit(), and QGpCoreWave::ModalCurve::misfit().

{
  TRACE;
  if(isValid()) {
    nData++;
    if(val.isValid()) {
      nValues++;
      double diff;
      switch (type) {
      case L1:
        diff=abs(_mean - val.value());
        if(diff<min) diff=min;
        return diff;
      case L1_Normalized:
        if(_stddev>0.0) {
          diff=abs((_mean - val.value())/_stddev);
        } else {
          diff=abs((_mean - val.value())/_mean);
        }
        if(diff<min) diff=min;
        return diff;
      case L1_LogNormalized:
        if(_stddev>1.0) {
          diff=abs((log(_mean/val.value()))/log(_stddev));
        } else {
          diff=abs((log(_mean/val.value()))/log(_mean));
        }
        if(diff<min) diff=min;
        return diff;
      case L1_NormalizedBySigmaOnly:
        if(_stddev>0.0) {
          diff=abs((_mean - val.value())/_stddev);
        } else {
          diff=abs(_mean - val.value());
        }
        if(diff<min) diff=min;
        return diff;
      case L2:
        diff=abs(_mean - val.value());
        if(diff<min) diff=min;
        return diff*diff;
      case L2_Normalized:
        if(_stddev>0.0) {
          diff=abs((_mean - val.value())/_stddev);
        } else {
          diff=abs((_mean - val.value())/_mean);
        }
        if(diff<min) diff=min;
        return diff*diff;
      case L2_LogNormalized:
        if(_stddev>1.0) {
          diff=abs((log(_mean/val.value()))/log(_stddev));
        } else {
          diff=abs((log(_mean/val.value()))/log(_mean));
        }
        if(diff<min) diff=min;
        return diff*diff;
      case L2_NormalizedBySigmaOnly:
        if(_stddev>0.0) {
          diff=abs((_mean - val.value())/_stddev);
        } else {
          diff=abs(_mean - val.value());
        }
        if(diff<min) diff=min;
        return diff*diff;
      case Akaike:
      case AkaikeFewSamples:
        diff=abs(_mean - val.value());
        if(diff<min) diff=min;
        return diff*diff;
      }
      return 0.0;
    } else {
      return 0.0;
    }
  } else {
    return 0.0;
  }
}
template<class numberType >
MisfitType QGpCoreTools::StatisticalValue< numberType >::misfitType ( QString  type) [static]

References QGpCoreTools::Akaike, QGpCoreTools::AkaikeFewSamples, QGpCoreTools::L1, QGpCoreTools::L1_Normalized, QGpCoreTools::L2, QGpCoreTools::L2_Normalized, QGpCoreTools::L2_NormalizedBySigmaOnly, and TRACE.

{
  TRACE;
  if(type.count()>1) {
    switch(type[1].unicode()) {
    case '1':
      if(type=="L1") return L1; else return L1_Normalized;
    case '2':
      if(type=="L2") return L2;
      else if(type=="L2_Normalized") return L2_Normalized;
      else return L2_NormalizedBySigmaOnly;
    case 'k':
      if(type=="Akaike") return Akaike; else return AkaikeFewSamples;
      break;
    default:
      break;
    }
  }
  return L2_Normalized;
}
template<class numberType >
QString QGpCoreTools::StatisticalValue< numberType >::misfitTypeString ( MisfitType  type) [static]

References QGpCoreTools::Akaike, QGpCoreTools::AkaikeFewSamples, QGpCoreTools::L1, QGpCoreTools::L1_LogNormalized, QGpCoreTools::L1_Normalized, QGpCoreTools::L1_NormalizedBySigmaOnly, QGpCoreTools::L2, QGpCoreTools::L2_LogNormalized, QGpCoreTools::L2_Normalized, QGpCoreTools::L2_NormalizedBySigmaOnly, and TRACE.

{
  TRACE;
  switch (type) {
  case L1:
    return "L1";
  case L1_Normalized:
    return "L1_Normalized";
  case L1_LogNormalized:
    return "L1_LogNormalized";
  case L1_NormalizedBySigmaOnly:
    return "L1_NormalizedBySigmaOnly";
  case L2:
    return "L2";
  case L2_Normalized:
    return "L2_Normalized";
  case L2_LogNormalized:
    return "L2_LogNormalized";
  case L2_NormalizedBySigmaOnly:
    return "L2_NormalizedBySigmaOnly";
  case Akaike:
    return "Akaike";
  case AkaikeFewSamples:
    return "AkaikeFewSamples";
  }
  return QString::null;
}
template<class numberType >
void QGpCoreTools::StatisticalValue< numberType >::operator= ( const StatisticalValue< numberType > &  o) [inline]
template<class numberType >
bool QGpCoreTools::StatisticalValue< numberType >::operator== ( const StatisticalValue< numberType > &  o) const [inline]
template<class numberType>
void QGpCoreTools::StatisticalValue< numberType >::setMean ( const numberType &  v) [inline]
template<class numberType>
void QGpCoreTools::StatisticalValue< numberType >::setStddev ( double  v) [inline]
template<class numberType>
void QGpCoreTools::StatisticalValue< numberType >::setValid ( bool  f) [inline]
template<class numberType>
void QGpCoreTools::StatisticalValue< numberType >::setWeight ( double  v) [inline]
template<class numberType>
double QGpCoreTools::StatisticalValue< numberType >::stddev ( ) const [inline]
template<class numberType>
double QGpCoreTools::StatisticalValue< numberType >::weight ( ) const [inline]
template<class numberType >
XMLMember QGpCoreTools::StatisticalValue< numberType >::xml_member ( XML_MEMBER_ARGS  ) [protected, virtual]

Re-implement this function to offer XML restore (children and properties) support to your class.

From tag and map (with contains the attibute value) return a unique identifier under the format of a XMLMember. XMLMember is initialized with 3 types of contructors:

  • An integer: id number of a property
  • A XMLClass * : a child of this object identified by tag
  • Default constructor: error, unknow child or property

Map of attributes can be inspected in this way (can be achived also in xml_setProperty()):

    static const QString tmp("childrenName");
    XMLRestoreAttributeIterator it=map.find(tmp);
    if(it!=map.end()) {
      // found attribute "childrenName"
    }

If the map of attributes is not used:

    Q_UNUSED(attributes);
    if(tag=="x1") return XMLMember(0);
    else if(tag=="y1") return XMLMember(1);
    else if(tag=="x2") return XMLMember(2);
    else if(tag=="y2") return XMLMember(3);
    else return XMLMember(XMLMember::Unknown);

Arithmetic operations + and - apply to XMLMember to avoid confusion of property id numbers between inherited objects. Offset 3 corresponds to the number of properties defined in this object.

    if(tag=="anInteger") return XMLMember(0);
    else if(tag=="aString") return XMLMember(1);
    else if(tag=="aDouble") return XMLMember(2);
    return AbstractLine::xml_member(tag, attributes, context)+3;

For the arguments of this function use Macro XML_MEMBER_ARGS.

Reimplemented from QGpCoreTools::XMLClass.

Reimplemented in QGpCoreTools::StatisticalPoint< numberType >, QGpCoreTools::StatisticalPoint< double >, and QGpCoreTools::StatisticalPoint< Complex >.

References TRACE.

Referenced by QGpCoreTools::StatisticalPoint< numberType >::xml_member().

{
  TRACE;
  Q_UNUSED(attributes);
  Q_UNUSED(context);
  if(tag=="mean") return XMLMember(0);
  else if(tag=="stddev") return XMLMember(1);
  else if(tag=="weight") return XMLMember(2);
  else if(tag=="valid") return XMLMember(3);
  else return false;
}
template<class numberType >
bool QGpCoreTools::StatisticalValue< numberType >::xml_setProperty ( XML_SETPROPERTY_ARGS  ) [protected, virtual]

Re-implement this function to offer XML restore properties support to your class.

From memberID set the corresponding property with value content. The map of attributes is given as a supplementary information (not useful in all cases).

For a general case:

  Q_UNUSED(attributes);
  double val=content.toDouble();
  switch (memberID) {
  case 0:
    _x1=val;
    return true;
  case 1:
    _y1=val;
    return true;
  case 2:
    _x2=val;
    return true;
  case 3:
    _y2=val;
    return true;
  default:
    return false;
  }

For classes inheriting other classes (see also xml_member())

  switch (memberID) {
  case 0:
    _anInteger=content.toString();
    return true;
  case 1:
    _aString=content.toInt();
    return true;
  case 2:
    _aDouble=content.toDouble();
    return true;
  default:
    return AbstractLine::xml_setProperty(memberID-3, map, content);

For the arguments of this function use Macro XML_SETPROPERTY_ARGS.

Reimplemented from QGpCoreTools::XMLClass.

Reimplemented in QGpCoreTools::StatisticalPoint< numberType >, QGpCoreTools::StatisticalPoint< double >, and QGpCoreTools::StatisticalPoint< Complex >.

References SAFE_UNINITIALIZED, and TRACE.

Referenced by QGpCoreTools::StatisticalPoint< numberType >::xml_setProperty().

{
  TRACE;
  Q_UNUSED(tag);
  Q_UNUSED(attributes);
  Q_UNUSED(context);
  switch (memberID) {
  case 0: {
      numberType tmp;
      SAFE_UNINITIALIZED(tmp, 0);
      _mean=content.to(tmp);
    }
    return true;
  case 1: _stddev=content.toDouble(); return true;
  case 2: _weight=content.toDouble(); return true;
  case 3: _valid=content.toBool(); return true;
  default: return false;
  }
}
template<class numberType >
void QGpCoreTools::StatisticalValue< numberType >::xml_writeProperties ( XML_WRITEPROPERTIES_ARGS  ) const [protected, virtual]

Member Data Documentation

template<class numberType>
numberType QGpCoreTools::StatisticalValue< numberType >::_mean [protected]
template<class numberType>
double QGpCoreTools::StatisticalValue< numberType >::_stddev [protected]
template<class numberType>
bool QGpCoreTools::StatisticalValue< numberType >::_valid [protected]
template<class numberType>
double QGpCoreTools::StatisticalValue< numberType >::_weight [protected]

The documentation for this class was generated from the following files:
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines