OpendTect  6.3
datadistribution.h
Go to the documentation of this file.
1 #pragma once
2 
3 /*+
4 ________________________________________________________________________
5 
6  (C) dGB Beheer B.V.; (LICENSE) http://opendtect.org/OpendTect_license.txt
7  Author: Bert
8  Date: January 2017
9 ________________________________________________________________________
10 
11 -*/
12 
13 #include "algomod.h"
14 #include "typeset.h"
15 #include "samplingdata.h"
16 #include "sharedobject.h"
17 
18 template <class VT> class DataDistributionChanger;
19 template <class VT> class DataDistributionInfoExtracter;
20 template <class VT> class DataDistributionIter;
21 
22 
41 template <class VT>
43 {
44 public:
45 
46  typedef VT DataValueType;
47  typedef DataValueType PosType;
48  typedef VT ValueType;
50  typedef typename SetType::size_type size_type;
51  typedef size_type IdxType;
54 
56  : sampling_(PosType(0),PosType(1)) {}
57  inline DataDistribution(size_type);
58  inline DataDistribution(SamplingType,size_type n=256);
59  inline DataDistribution(const SetType&);
60  inline DataDistribution(const SetType&,SamplingType);
62 
63  inline size_type size() const;
64  inline bool isEmpty() const { return size() < 1; }
65  inline void setEmpty();
66  mImplSimpleMonitoredGetSet( inline,sampling,setSampling,SamplingType,
67  sampling_,cSamplingChange());
68  void setSize(size_type);
69 
70  inline VT get(IdxType,bool cumulative=false) const;
71  inline VT operator[](IdxType) const;
72  inline VT valueAt(PosType,bool cumulative) const;
73  inline IdxType getBinNr(PosType) const;
74  inline SetType getSet( bool cum ) const
75  { mLock4Read(); return cum ? cumdata_ : data_; }
76 
77  inline void set(IdxType,VT);
78  inline void set(const VT*);
79  inline void add(const VT*);
80 
81  inline bool isNormalised() const
82  { return sumOfValues() == VT(1); }
83  inline VT sumOfValues() const;
84  inline VT maxValue() const;
85  inline RangeType dataRange() const;
86 
87  inline PosType positionForCumulative(VT) const;
88  inline PosType medianPosition() const;
89  inline VT* getArr( bool cum ) const
90  { return cum ? cumdata_.arr() : data_.arr(); }
92 
93  static ChangeType cDataChange() { return 2; }
94  static ChangeType cSamplingChange() { return 3; }
95 
96  static const DataDistribution<VT>& getEmptyDistrib();
97  static inline IdxType getBinNrFor(PosType,const SamplingType&,
98  size_type nrbins);
99 
100 protected:
101 
102  inline ~DataDistribution();
103 
104  SetType data_;
105  SetType cumdata_;
106  SamplingType sampling_;
107 
108  void setCumData(int);
109  inline VT gtMax(int* idxat=0) const;
110 
111  friend class DataDistributionChanger<VT>;
113  friend class DataDistributionIter<VT>;
114 
115 };
116 
117 
118 template <class VT> inline
120  : SharedObject(oth)
121  , data_(oth.data_)
122  , cumdata_(oth.cumdata_)
123  , sampling_(oth.sampling_)
124 {
125 }
126 
127 
128 template <class VT> inline
130  : data_(nrbins,0)
131  , cumdata_(nrbins,0)
132  , sampling_(PosType(0),PosType(1))
133 {
134 }
135 
136 
137 template <class VT> inline
139  : data_(nrbins,0)
140  , cumdata_(nrbins,0)
141  , sampling_(sd)
142 {
143 }
144 
145 
146 template <class VT> inline
148  : data_(d.size(),0)
149  , cumdata_(d.size(),0)
150  , sampling_(PosType(0),PosType(1))
151 {
152  set( d.arr() );
153 }
154 
155 
156 template <class VT> inline
158  : data_(d.size(),0)
159  , cumdata_(d.size(),0)
160  , sampling_(sd)
161 {
162  set( d.arr() );
163 }
164 
165 
166 template <class VT> inline
168 {
169  sendDelNotif();
170 }
171 
172 
173 mGenImplMonitorableAssignment(template <class VT> inline,DataDistribution<VT>,
174  SharedObject);
175 
176 
177 template <class VT> inline
179 {
180  data_ = oth.data_;
181  cumdata_ = oth.cumdata_;
182  sampling_ = oth.sampling_;
183 }
184 
185 
186 template <class VT> inline
188  const DataDistribution<VT>& oth ) const
189 {
194 }
195 
196 
197 template <class VT> inline
199 {
200  mLock4Read();
201  return data_.size();
202 }
203 
204 
205 template <class VT> inline
207  PosType pos, const SamplingType& sd, size_type nbins )
208 {
209  const float fbin = sd.getfIndex( pos );
210  IdxType ret;
211  if ( fbin < 0 )
212  ret = 0;
213  else
214  {
215  ret = (IdxType)( fbin + 0.5f );
216  if ( ret >= nbins )
217  ret = nbins - 1;
218  }
219  return ret;
220 }
221 
222 
223 template <class VT> inline
225  PosType p ) const
226 {
227  mLock4Read();
228  return getBinNrFor( p, sampling_, data_.size() );
229 }
230 
231 
232 template <class VT> inline
234 {
235  return get( idx, false );
236 }
237 
238 
239 template <class VT> inline
240 VT DataDistribution<VT>::get( IdxType idx, bool cumulative ) const
241 {
242  mLock4Read();
243  return cumulative ? cumdata_[idx] : data_[idx];
244 }
245 
246 template <class VT> inline
247 VT DataDistribution<VT>::valueAt( PosType pos, bool cumulative ) const
248 {
249  mLock4Read();
250  const SetType& vals = cumulative ? cumdata_ : data_;
251  const int sz = vals.size();
252  if ( sz < 1 )
253  return mUdf(VT);
254 
255  PosType fidx = sampling_.getfIndex( pos );
256  if ( fidx < -0.5f )
257  fidx = -0.5f;
258  else if ( fidx > vals.size()-0.5f )
259  fidx = vals.size()-0.5f;
260  if ( cumulative )
261  fidx -= 0.5f;
262 
263  const int aftidx = getLimited( ((int)fidx + 1), 0, sz );
264  const int beforeidx = aftidx - 1;
265 
266  const VT valbefore = beforeidx<0 ? (cumulative?VT(0):vals[0])
267  : vals[ beforeidx ];
268  const VT valafter = aftidx>sz-2 ? vals.last() : vals[ aftidx ] ;
269  const PosType relpos = (fidx - beforeidx);
270  return valbefore + (valafter-valbefore) * relpos;
271 }
272 
273 
274 template <class VT> inline
276 {
277  mLock4Read();
278  if ( data_.isEmpty() )
279  return;
280  if ( !mLock2Write() && data_.isEmpty() )
281  return;
282 
283  data_.setEmpty();
285 }
286 
287 
288 template <class VT> inline
289 void DataDistribution<VT>::set( IdxType isamp, VT val )
290 {
291  mLock4Read();
292  if ( !data_.validIdx(isamp) || data_[isamp] == val )
293  return;
294  if ( !mLock2Write() && (isamp>=data_.size() || data_[isamp] == val) )
295  return;
296 
297  const VT diff = val - data_[isamp];
298  data_[isamp] = val;
299  const size_type sz = data_.size();
300  for ( IdxType idx=isamp+1; idx<sz; idx++ )
301  data_[idx] += diff;
302  mSendChgNotif( cDataChange(), isamp );
303 }
304 
305 
306 template <class VT> inline
307 void DataDistribution<VT>::add( const VT* vals )
308 {
309  mLock4Write();
310  const size_type sz = data_.size();
311  VT add2cumulative = 0;
312  for ( IdxType idx=0; idx<sz; idx++ )
313  {
314  add2cumulative += vals[idx];
315  data_[idx] += vals[idx];
316  cumdata_[idx] += add2cumulative;
317  }
318 
320 }
321 
322 
323 template <class VT> inline
325 {
326  cumdata_[idx] = data_[idx] + (idx<1 ? VT(0) : cumdata_[idx-1]);
327 }
328 
329 
330 template <class VT> inline
331 void DataDistribution<VT>::set( const VT* vals )
332 {
333  mLock4Write();
334  const size_type sz = data_.size();
335  for ( IdxType idx=0; idx<sz; idx++ )
336  {
337  data_[idx] = vals[idx];
338  setCumData( idx );
339  }
340 
342 }
343 
344 
345 template <class VT> inline
347 {
348  mLock4Read();
349  return cumdata_.last();
350 }
351 
352 
353 template <class VT> inline
355 {
356  mLock4Read();
357  return gtMax();
358 }
359 
360 
361 template <class VT> inline
363 {
364  mLock4Read();
365  const PosType hstep = sampling_.step * PosType(0.5);
366  return RangeType( sampling_.start - hstep,
367  sampling_.atIndex(data_.size()-1) + hstep );
368 }
369 
370 
371 template <class VT> inline
372 VT DataDistribution<VT>::gtMax( int* idxat ) const
373 {
374  const size_type sz = data_.size();
375  if ( idxat )
376  *idxat = 0;
377 
378  if ( sz < 2 )
379  return sz == 1 ? data_[0] : VT(0);
380 
381  VT ret = data_[0];
382  for ( IdxType idx=1; idx<sz; idx++ )
383  {
384  const VT val = data_[idx];
385  if ( val > ret )
386  {
387  ret = val;
388  if ( idxat )
389  *idxat = idx;
390  }
391  }
392 
393  return ret;
394 }
395 
396 
397 template <class VT> inline typename DataDistribution<VT>::PosType
399 {
400  if ( mIsUdf(val) )
401  return VT(1);
402 
403  mLock4Read();
404  const size_type sz = cumdata_.size();
405  if ( sz < 2 )
406  return sz == 1 ? sampling_.start : mUdf(PosType);
407  else if ( val <= VT(0) )
408  return sampling_.start - PosType(0.5) * sampling_.step;
409  else if ( val >= cumdata_.last() )
410  return sampling_.start + PosType(sz-0.5) * sampling_.step;
411 
412  // this function is mostly used for clipping which is at start or end
413  // simple bisection may then not be optimal.
414  // if not, then this will still be 2 times faster (on average)
415 
416  if ( val < cumdata_[sz/2] )
417  {
418  for ( int idx=0; idx<sz; idx++ )
419  {
420  const VT nextval = cumdata_[idx];
421  if ( val <= nextval )
422  {
423  PosType prevpos = sampling_.start + PosType(idx-0.5)
424  * sampling_.step;
425  if ( val == nextval )
426  return prevpos + sampling_.step;
427 
428  const VT prevval = idx ? cumdata_[idx-1] : VT(0);
429  const PosType relpos = (val - prevval) / (nextval - prevval);
430  return prevpos + sampling_.step * relpos;
431  }
432  }
433  }
434  else
435  {
436  for ( int idx=sz-1; idx>0; idx-- )
437  {
438  const VT prevval = cumdata_[idx-1];
439  if ( val >= prevval )
440  {
441  PosType prevpos = sampling_.start + VT(idx-0.5)
442  * sampling_.step;
443  if ( prevval == val )
444  return prevpos;
445 
446  const VT nextval = cumdata_[idx];
447  const PosType relpos = (val - prevval) / (nextval - prevval);
448  return prevpos + sampling_.step * relpos;
449  }
450  }
451  }
452 
453  // should not reach
454  return VT(0);
455 }
456 
457 
458 template <class VT> inline typename DataDistribution<VT>::PosType
460 {
461  mLock4Read();
462  if ( cumdata_.size() < 2 )
463  return sampling_.start;
464 
465  return positionForCumulative( cumdata_.last() * VT(0.5) );
466 }
467 
468 
469 template <class VT> inline
471 {
473  = new DataDistribution<VT> );
474  return *theempty;
475 }
#define mIsUdf(val)
Use mIsUdf to check for undefinedness of simple types.
Definition: undefval.h:285
T step
Definition: samplingdata.h:48
SetType getSet(bool cum) const
Definition: datadistribution.h:74
#define mLock4Read()
Definition: monitor.h:60
int ChangeType
Definition: monitorable.h:80
RangeType dataRange() const
Definition: datadistribution.h:362
~DataDistribution()
Definition: datadistribution.h:167
VT maxValue() const
Definition: datadistribution.h:354
void set(IdxType, VT)
slow, O(N)
Definition: datadistribution.h:289
short IdxType
Definition: seisblocksdata.h:39
SamplingData< PosType > SamplingType
Definition: datadistribution.h:52
VT get(IdxType, bool cumulative=false) const
Definition: datadistribution.h:240
size_type IdxType
Definition: datadistribution.h:51
PosType positionForCumulative(VT) const
Definition: datadistribution.h:398
#define mStartMonitorableCompare()
Helper macro to easily implement your compareClassData() in standard situations.
Definition: monitor.h:235
bool isNormalised() const
Definition: datadistribution.h:81
Definition: sharedobject.h:18
static const DataDistribution< VT > & getEmptyDistrib()
Definition: datadistribution.h:470
SamplingType sampling_
Definition: datadistribution.h:106
#define mDefineStaticLocalObject(type, var, init)
Definition: commondefs.h:199
void setCumData(int)
Definition: datadistribution.h:324
Definition: datadistribution.h:20
#define mLock2Write()
Definition: monitor.h:62
size_type size() const
Definition: datadistribution.h:198
SetType data_
Definition: datadistribution.h:104
bool isEmpty() const
Definition: odset.h:43
IdxType getBinNr(PosType) const
Definition: datadistribution.h:224
ChangeType compareClassData(const SharedObject &) const
#define mDeclMonitorableAssignment(clss)
like mDeclAbstractMonitorableAssignment but for non-abstract subclasses. Implements the clone() metho...
Definition: monitor.h:111
VT * getArr(bool cum) const
for fast non-shared usage
Definition: datadistribution.h:89
static ChangeType cDataChange()
Definition: datadistribution.h:93
Interval of values.
Definition: commontypes.h:27
#define mSendChgNotif(typ, id)
Definition: monitor.h:66
void setEmpty()
Definition: datadistribution.h:275
virtual T * arr()
3rd party access
Definition: typeset.h:86
static IDType cUnspecChgID()
Definition: monitorable.h:108
#define mLock4Write()
Definition: monitor.h:61
T atIndex(IT) const
Definition: samplingdata.h:156
I size_type
Definition: typeset.h:29
SetType cumdata_
Definition: datadistribution.h:105
#define mImplSimpleMonitoredGetSet(pfx, fnnmget, fnnmset, typ, memb, chgtyp)
Defines simple MT-safe copyable member access.
Definition: monitor.h:39
VT valueAt(PosType, bool cumulative) const
Definition: datadistribution.h:247
Definition: datadistribution.h:19
#define mUdf(type)
Use this macro to get the undefined for simple types.
Definition: undefval.h:270
VT operator[](IdxType) const
Definition: datadistribution.h:233
mGenImplMonitorableAssignment(template< class VT > inline, DataDistribution< VT >, SharedObject)
T start
Definition: samplingdata.h:47
void setEmpty()
Definition: odset.h:44
#define mDeliverMonitorableCompare()
Definition: monitor.h:255
T & last()
Definition: typeset.h:320
Definition: datadistribution.h:18
void copyClassData(const SharedObject &)
static IdxType getBinNrFor(PosType, const SamplingType &, size_type nrbins)
Definition: datadistribution.h:206
TypeSet< VT > SetType
Definition: datadistribution.h:49
static ChangeType cSamplingChange()
Definition: datadistribution.h:94
VT sumOfValues() const
Definition: datadistribution.h:346
float getfIndex(FT) const
Definition: samplingdata.h:124
VT DataValueType
Definition: datadistribution.h:46
size_type size() const
Definition: typeset.h:263
T getLimited(T v, T min, T max)
Definition: commondefs.h:43
PosType medianPosition() const
Definition: datadistribution.h:459
void add(const VT *)
fast, no checks
Definition: datadistribution.h:307
#define mSendEntireObjChgNotif()
Definition: monitor.h:67
Interval< VT > RangeType
Definition: datadistribution.h:53
#define mHandleMonitorableCompare(memb, val)
Definition: monitor.h:237
DataDistribution()
Definition: datadistribution.h:55
bool isEmpty() const
Definition: datadistribution.h:64
Sharable data distribution. Sampling defaults to 0 step 1.
Definition: datadistribution.h:42
#define mClass(module)
Definition: commondefs.h:161
void sendDelNotif() const
DataValueType PosType
Definition: datadistribution.h:47
virtual bool validIdx(int64_t) const
Definition: typeset.h:288
SetType::size_type size_type
Definition: datadistribution.h:50
VT ValueType
Definition: datadistribution.h:48
VT gtMax(int *idxat=0) const
Definition: datadistribution.h:372
Definition: ptrman.h:200

Generated at for the OpendTect seismic interpretation project. Copyright (C): dGB Beheer B. V. 2017