37 template <
class VT,
class PT>
62 template <
class VT,
class PT>
72 , lastfound_(VSEvent::
None) {}
83 int idxminus1,
int idx0,
int idx1,
84 VT vminus1,VT v0,VT v1,
109 #define mIncSampIdx(idx) { \ 111 if ( idx == sg.stop+inc ) \ 112 return ValueSeriesEvent<VT,PT>( 0, mUdf(PT) ); } 113 #undef mDecrOccAtZero 114 #define mDecrOccAtZero(idx) { \ 117 return ValueSeriesEvent<VT,PT>( 0, sd_.atIndex(idx) ); } 120 template <
class VT,
class PT>
124 const int inc = sg.
start < sg.
stop ? 1 : -1;
127 VT v0 = vs_.value( idx );
132 v0 = vs_.value( idx );
135 int frompositive = v0 > 0;
138 for ( ; idx!=sg.
stop+inc; idx+=inc )
140 VT v1 = vs_.value( idx );
145 v1 = vs_.value( idx );
148 if ( ( (v1<0) != frompositive && needtoneg )
149 || ( (v1>0) != frompositive && needtopos ) )
153 v0 = v1; frompositive = v0 > 0;
154 v1 = vs_.value( idx );
159 const bool istopos = v0 < 0 && v1 > 0;
160 const bool istoneg = v0 > 0 && v1 < 0;
161 if ( ( istopos && needtopos ) || ( istoneg && needtoneg ) )
168 PT pos = idx - inc * (v1 / ( v1 - v0 ));
179 template <
class VT,
class PT>
182 VT vm1, VT v0, VT v1,
186 {
Swap( idxm1, idx1 );
Swap( vm1, v1 ); }
189 idxm1 -= idx0; idx1 -= idx0;
191 vm1 /= idxm1; v1 /= idx1;
193 VT a = (vm1 - v1) / (idxm1 - idx1);
203 ret.
val = (VT)(v0 + a * relpos * relpos + b * relpos);
209 template <
class VT,
class PT>
218 int extridx = sg.
start; VT extrval = vs_.value( extridx );
219 for ( curidx=sg.
start+1;
mIsUdf(extrval) && curidx<=sg.
stop; curidx++ )
220 { extridx = curidx; extrval = vs_.value( curidx ); }
225 for ( ; curidx<=sg.
stop; curidx++ )
227 const VT val = vs_.value( curidx );
228 if (
mIsUdf(val) )
continue;
230 if ( (needmax && val > extrval) || (!needmax && val < extrval) )
231 { extridx = curidx; extrval = val; }
236 VT vm1 = extridx > sg.
start ? vs_.value(extridx-1) : v0;
237 if (
mIsUdf(vm1) ) vm1 = v0;
238 VT v1 = extridx < sg.
stop-1 ? vs_.value(extridx+1) : v0;
239 if (
mIsUdf(v1) ) v1 = v0;
242 extridx-1, extridx, extridx+1, vm1, v0, v1, sd_ );
246 template <
class VT,
class PT>
250 const int inc = sg.
start < sg.
stop ? 1 : -1;
252 VT v0 = vs_.value( idx0 );
253 bool havevm1 = (inc > 0 && sg.
start > 0) || (inc < 0 && sg.
start < maxidx_);
254 VT vm1 = havevm1 ? vs_.value( sg.
start - inc ) : v0;
255 if (
mIsUdf(vm1) ) vm1 = v0;
256 bool upw0 = v0 > vm1;
263 VT v1 = vs_.value( idx1 );
264 if (
mIsUdf(v1) || v1 == v0 )
267 const bool upw1 = v1 > v0;
268 bool ishit = havevm1 && !
mIsUdf(v0) && upw0 != upw1;
271 const bool atmax = upw0 && !upw1;
282 return exactExtreme( evtype, idx0-inc, idx0, idx1,
285 upw0 = upw1; idx0 = idx1; vm1 = v0; v0 = v1;
293 template <
class VT,
class PT>
303 pErrMsg(
"Weird request: less than first occ of event.");
310 const int inc = pg.
start < pg.
stop ? 1 : -1;
311 if ( pg.
start < sd_.start )
312 {
if ( inc < 0 )
return ev; pg.
start = sd_.start; }
313 if ( pg.
stop < sd_.start )
314 {
if ( inc > 0 )
return ev; pg.
stop = sd_.start; }
316 const PT endpos = sd_.atIndex( maxidx_ );
317 if ( pg.
start > endpos )
318 {
if ( inc > 0 )
return ev; pg.
start = endpos; }
319 if ( pg.
stop > endpos )
320 {
if ( inc < 0 )
return ev; pg.
stop = endpos; }
349 ev = getExtreme( sg, occ, evtype );
352 ev = getZC( sg, occ, evtype );
360 if ( ( inc > 0 && ev.
pos < pg.
start ) ||
361 ( inc < 0 && ev.pos > pg.
start ) )
373 template <
class VT,
class PT>
388 const bool isascending = pg.
stop > pg.
start;
390 while ( isascending == (curg.
stop>curg.
start) )
403 if ( !posset.
size() )
return false;
410 #undef mDecrOccAtZero #define mExpClass(module)
Definition: commondefs.h:157
#define mIsUdf(val)
Use mIsUdf to check for undefinedness of simple types.
Definition: undefval.h:285
T step
Definition: samplingdata.h:48
const SamplingData< PT > & samplingData() const
Definition: valseriesevent.h:75
Definition: valseriesevent.h:24
#define mCast(tp, v)
Definition: commondefs.h:120
Definition: valseriesevent.h:24
Definition: valseriesevent.h:21
#define mIncSampIdx(idx)
Definition: valseriesevent.h:109
Definition: stattype.h:24
ValueSeriesEvent< VT, PT > getExtreme(const Interval< int > &, int, VSEvent::Type) const
Definition: valseriesevent.h:247
Definition: valseriesevent.h:24
#define mDeclareEnumUtils(enm)
Some utilities surrounding the often needed enum <-> string table.
Definition: enums.h:188
Interval of values.
Definition: commontypes.h:27
ValueSeriesEvent< VT, PT > find(VSEvent::Type, const Interval< PT > &, int occ=1) const
Definition: valseriesevent.h:294
FixedString None()
Definition: keystrs.h:90
VT val
Definition: valseriesevent.h:46
Definition: valseriesevent.h:25
Definition: valseriesevent.h:24
int maxidx_
Definition: valseriesevent.h:96
Set of (small) copyable elements.
Definition: commontypes.h:26
static ValueSeriesEvent< VT, PT > exactExtreme(VSEvent::Type, int idxminus1, int idx0, int idx1, VT vminus1, VT v0, VT v1, const SamplingData< PT > &)
Definition: valseriesevent.h:180
Definition: stattype.h:24
ValueSeriesEvent< VT, PT > getZC(const Interval< int > &, int, VSEvent::Type) const
Definition: valseriesevent.h:121
Event in value series.
Definition: valseriesevent.h:38
#define mDecrOccAtZero(idx)
Definition: valseriesevent.h:114
#define mUdf(type)
Use this macro to get the undefined for simple types.
Definition: undefval.h:270
ValueSeriesEvent< VT, PT > getGateExtr(const Interval< int > &, bool) const
Definition: valseriesevent.h:210
PT pos
Definition: valseriesevent.h:47
T start
Definition: samplingdata.h:47
const ValueSeries< VT > & valueSeries() const
Definition: valseriesevent.h:74
void Swap(T &a, T &b)
Definition: commondefs.h:34
Event finder in gate.
Definition: valseriesevent.h:63
const T * find(const ObjectSet< T > &os, const S &val)
Get const object in set.
Definition: objectset.h:187
Definition: valseriesevent.h:25
VSEvent::Type lastFound() const
Useful when finding Extr or ZC.
Definition: valseriesevent.h:89
T stop
Definition: ranges.h:91
VSEvent::Type lastfound_
Definition: valseriesevent.h:97
Definition: valseriesevent.h:24
const ValueSeries< VT > & vs_
Definition: valseriesevent.h:94
T start
Definition: ranges.h:90
virtual void sort(bool asc=true)
Definition: ranges.h:584
#define mClass(module)
Definition: commondefs.h:161
#define pErrMsg(msg)
Usual access point for programmer error messages.
Definition: errmsg.h:34
Type
Definition: valseriesevent.h:24
bool findEvents(TypeSet< PT > &, Interval< PT >, VSEvent::Type)
Definition: valseriesevent.h:374
const SamplingData< PT > sd_
Definition: valseriesevent.h:95
ValueSeriesEvFinder(const ValueSeries< VT > &v, int maxidx, const SamplingData< PT > &s)
Definition: valseriesevent.h:66
ValueSeriesEvent(VT v=mUdf(VT), PT p=mUdf(PT))
Definition: valseriesevent.h:43
Definition: valseriesevent.h:24