ROOT logo
// $Id: SVars.h 2341 2010-01-24 01:28:32Z matevz $

// Copyright (C) 1999-2008, Matevz Tadel. All rights reserved.
// This file is part of GLED, released under GNU General Public License version 2.
// For the licensing terms see $GLEDSYS/LICENSE or http://www.gnu.org/.

#ifndef GledCore_SVars_H
#define GledCore_SVars_H

#include <TMath.h>

//==============================================================================
// SVars
//==============================================================================

template<typename T>
class SMinMaxVar
{
protected:
  T mVal, mMin, mMax;

  T valminmax(T v) const
  {
    return v > mMax ? mMax : (v < mMin ? mMin : v);
  }

public:
  SMinMaxVar()
    : mVal(0), mMin(0), mMax(1)
  {}

  SMinMaxVar(T val, T min, T max) :
    mVal(val), mMin(min), mMax(max)
  {}

  operator T() const { return mVal; }
  T operator=(T v) { return Set(v); }

  T Get() const { return mVal; }

  T Set(T v)
  {
    // Returns the actual value set.
    mVal = valminmax(v);
    return mVal;
  }

  T Delta(T d)
  {
    // Returns the actual delta used.
    T ov = mVal;
    mVal = valminmax(mVal + d);
    return mVal - ov;
  }

  T    GetMin() const { return mMin; }
  T    GetMax() const { return mMax; }
  // Check min/max mismatch?
  void SetMin(T min) { mMin = min; }
  void SetMax(T max) { mMax = max; }  

  void SetMinMax(T min, T max) { mMin = min; mMax = max; }

  void Print() const
  {
    printf("%f [%f, %f]\n", mVal, mMin, mMax); 
  }

  ClassDefNV(SMinMaxVar, 1);
};

typedef SMinMaxVar<Float_t>  SMinMaxVarF;
typedef SMinMaxVar<Double_t> SMinMaxVarD;

// Needed this in HTrans
// #ifndef __APPLE__
// template class SMinMaxVar<Float_t>;
// template class SMinMaxVar<Double_t>;
// #endif


//==============================================================================
// SInertVar
//==============================================================================

// Inert variable with limited maximum change (per unit time).
// Two deltas must be specified:
//   1. DeltaInc - applied when absolute value is increasing,
//   2. DeltaDec - applied when absolute value is decreasing.
// They should both be positive.

template<typename T>
class SInertVar : public SMinMaxVar<T>
{
  typedef SMinMaxVar<T> MMV;

protected:
  T mDeltaInc, mDeltaDec;

  T deltaminmax(T d) const
  {
    if (d > 0)
    {
      T lim = MMV::mVal >= 0 ? mDeltaInc : mDeltaDec;
      return d > lim ? lim : d;
    } else {
      T lim = MMV::mVal <= 0 ? -mDeltaInc : -mDeltaDec;
      return d < lim ? lim : d;
    }
  }

  T deltaminmax(T d, T dt) const
  {
    if (d > 0)
    {
      T lim = MMV::mVal >= 0 ?  mDeltaInc*dt :  mDeltaDec*dt;
      return d > lim ? lim : d;
    } else {
      T lim = MMV::mVal <= 0 ? -mDeltaInc*dt : -mDeltaDec*dt;
      return d < lim ? lim : d;
    }
  }

  T deltamaxpos(T dt) const
  {
    return MMV::mVal >= 0 ?  mDeltaInc*dt :  mDeltaDec*dt;
  }

  T deltamaxneg(T dt) const
  {
    return MMV::mVal <= 0 ? -mDeltaInc*dt : -mDeltaDec*dt;
  }

public:
  SInertVar()
    : MMV(), mDeltaInc(1), mDeltaDec(-1)
  {}

  SInertVar(T val, T min, T max, T delta) :
    MMV(val, min, max), mDeltaInc(delta), mDeltaDec(-delta)
  {}

  SInertVar(T val, T min, T max, T delta_i, T delta_d) :
    MMV(val, min, max), mDeltaInc(delta_i), mDeltaDec(delta_d)
  {}

  T operator=(T v) { return Set(v); }

  T Set(T v)
  {
    T d = deltaminmax(v - MMV::mVal);
    return MMV::Set(MMV::mVal + d);
  }

  T Delta(T d)
  {
    d = deltaminmax(d);
    return MMV::Delta(d);
  }

  T Delta(T d, T dt)
  {
    d = deltaminmax(d, dt);
    return MMV::Delta(d);
  }

  T DeltaMaxPositive(T dt)
  {
    return MMV::Delta(deltamaxpos(dt));
  }

  T DeltaMaxNegative(T dt)
  {
    return MMV::Delta(deltamaxneg(dt));
  }

  T DeltaMax(Int_t sign, T dt)
  {
    if      (sign > 0) return DeltaMaxPositive(dt);
    else if (sign < 0) return DeltaMaxNegative(dt);
    else               return 0;
  }

  T    GetDeltaInc() const { return mDeltaInc; }
  void SetDeltaInc(T d)    { mDeltaInc = d;    }
  T    GetDeltaDec() const { return mDeltaDec; }
  void SetDeltaDec(T d)    { mDeltaDec = d;    }

  void SetMinMaxDelta(T min, T max, T delta_i, T delta_d)
  { SetMinMax(min, max); mDeltaInc = delta_i; mDeltaDec = delta_d; }

  void Print() const
  {
    printf("%f [%f, %f; %f, %f]\n", MMV::mVal, MMV::mMin, MMV::mMax, mDeltaInc, mDeltaDec); 
  }

  ClassDefNV(SInertVar, 1);
};

typedef SInertVar<Float_t>  SInertVarF;
typedef SInertVar<Double_t> SInertVarD;


//==============================================================================
// SDesireVar
//==============================================================================

template<typename T>
class SDesireVar : public SInertVar<T>
{
  typedef SMinMaxVar<T> MMV;
  typedef SInertVar<T>  IV;

protected:
  T              mStdDesireDelta;  // Standard delta of desire.
  mutable T      mDesire;
  mutable Bool_t bDesireSatisfied;

public:
  SDesireVar() :
    IV(), mStdDesireDelta(1), mDesire(0), bDesireSatisfied(true)
  {}

  SDesireVar(T val, T min, T max, T delta) :
    IV(val, min, max, delta),
    mStdDesireDelta(delta),
    mDesire(val), bDesireSatisfied(true)
  {}

  SDesireVar(T val, T min, T max, T delta_i, T delta_d) :
    IV(val, min, max, delta_i, delta_d),
    mStdDesireDelta(TMath::Max(delta_i, delta_d)),
    mDesire(val), bDesireSatisfied(true)
  {}

  T operator=(T v) { return Set(v); }

  T Set(T v)
  {
    bDesireSatisfied = false;
    T d = deltaminmax(v - MMV::mVal);
    return MMV::Set(MMV::mVal + d);
  }

  T Delta(T d)
  {
    bDesireSatisfied = false;
    d = deltaminmax(d);
    return MMV::Delta(d);
  }

  T Delta(T d, T dt)
  {
    bDesireSatisfied = false;
    d = deltaminmax(d, dt);
    return MMV::Delta(d);
  }

  T    GetStdDesireDelta() const { return mStdDesireDelta; }
  void SetStdDesireDelta(T sdd)  { mStdDesireDelta = sdd; }

  T    GetDesire()     const { return mDesire; }
  void SetDesire(T d)  const { bDesireSatisfied = false; mDesire = valminmax(d); }
  void DesireToValue() const { bDesireSatisfied = true;  mDesire = MMV::mVal; }

  T DeltaDesire(T d) const
  {
    bDesireSatisfied = false;
    mDesire = valminmax(mDesire + d);
    return mDesire;
  }

  T DeltaDesireMax(Int_t ifac, T dt) const
  {
    if (ifac) return DeltaDesire(ifac*mStdDesireDelta*dt);
    else      return 0;
  }

  Bool_t IsDesireSatisfied() const { return bDesireSatisfied; }

  Bool_t IsAboveDesire() const { return MMV::mVal > mDesire; }
  Bool_t IsBelowDesire() const { return MMV::mVal < mDesire; }

  void SetMinMaxDeltaDesire(T min, T max, T delta_i, T delta_d, T desire)
  {
    SetMinMaxDelta(min, max, delta_i, delta_d);
    SetDesire(desire);
  }

  void TimeTick(T dt)
  {
    if (bDesireSatisfied)
      return;

    if (MMV::mVal < mDesire)
    {
      DeltaMaxPositive(dt);
      if (MMV::mVal > mDesire)
      {
	MMV::mVal = mDesire;
	bDesireSatisfied = true;
      }
    }
    else if (MMV::mVal > mDesire)
    {
      DeltaMaxNegative(dt);
      if (MMV::mVal < mDesire)
      {
	MMV::mVal = mDesire;
	bDesireSatisfied = true;
      }
    }
    else
    {
      bDesireSatisfied = true;
    }
  }

  void Print() const
  {
    printf("%f -> %f [%f, %f; %f, %f]\n", MMV::mVal, mDesire,
	   MMV::mMin, MMV::mMax, IV::mDeltaInc, IV::mDeltaDec); 
  }

  ClassDefNV(SDesireVar, 1);
}; // endclass SDesireVar

typedef SDesireVar<Float_t>  SDesireVarF;
typedef SDesireVar<Double_t> SDesireVarD;


//==============================================================================
// SExpDesireVar
//==============================================================================

template<typename T>
class SExpDesireVar : public SDesireVar<T>
{
  typedef SMinMaxVar<T> MMV;
  typedef SInertVar<T>  IV;
  typedef SDesireVar<T> DV;

protected:
  T       mOmega;   // factor for difference of value
  UChar_t mExpMode; // reference modes for inc / dec (min, max, zero or desire) - separate inc / dec?

public:
  SExpDesireVar()
    : DV(), mOmega(0), mExpMode(0)
  {}

  SExpDesireVar(T val, T min, T max, T delta) :
    DV(val, min, max, delta), mOmega(0), mExpMode(0)
  {}

  SExpDesireVar(T val, T min, T max, T delta, T omega, T mode) :
    DV(val, min, max, delta), mOmega(omega), mExpMode(mode)
  {}

  // This is mostly an idea ... will implement when needed.
  // Guess soon, as seems reasonable for engine throttle. [3.10.2009]

  /*
  T operator=(T v) { return Set(v); }

  void Print() const
  {
    printf("%f -> %f [%f, %f; %f]\n", MMV::mVal, mDesire, MMV::mMin, MMV::mMax, IV::mDelta); 
  }
  */

  ClassDefNV(SExpDesireVar, 1);
}; // endclass SExpDesireVar

typedef SExpDesireVar<Float_t>  SExpDesireVarF;
typedef SExpDesireVar<Double_t> SExpDesireVarD;

#endif
 SVars.h:1
 SVars.h:2
 SVars.h:3
 SVars.h:4
 SVars.h:5
 SVars.h:6
 SVars.h:7
 SVars.h:8
 SVars.h:9
 SVars.h:10
 SVars.h:11
 SVars.h:12
 SVars.h:13
 SVars.h:14
 SVars.h:15
 SVars.h:16
 SVars.h:17
 SVars.h:18
 SVars.h:19
 SVars.h:20
 SVars.h:21
 SVars.h:22
 SVars.h:23
 SVars.h:24
 SVars.h:25
 SVars.h:26
 SVars.h:27
 SVars.h:28
 SVars.h:29
 SVars.h:30
 SVars.h:31
 SVars.h:32
 SVars.h:33
 SVars.h:34
 SVars.h:35
 SVars.h:36
 SVars.h:37
 SVars.h:38
 SVars.h:39
 SVars.h:40
 SVars.h:41
 SVars.h:42
 SVars.h:43
 SVars.h:44
 SVars.h:45
 SVars.h:46
 SVars.h:47
 SVars.h:48
 SVars.h:49
 SVars.h:50
 SVars.h:51
 SVars.h:52
 SVars.h:53
 SVars.h:54
 SVars.h:55
 SVars.h:56
 SVars.h:57
 SVars.h:58
 SVars.h:59
 SVars.h:60
 SVars.h:61
 SVars.h:62
 SVars.h:63
 SVars.h:64
 SVars.h:65
 SVars.h:66
 SVars.h:67
 SVars.h:68
 SVars.h:69
 SVars.h:70
 SVars.h:71
 SVars.h:72
 SVars.h:73
 SVars.h:74
 SVars.h:75
 SVars.h:76
 SVars.h:77
 SVars.h:78
 SVars.h:79
 SVars.h:80
 SVars.h:81
 SVars.h:82
 SVars.h:83
 SVars.h:84
 SVars.h:85
 SVars.h:86
 SVars.h:87
 SVars.h:88
 SVars.h:89
 SVars.h:90
 SVars.h:91
 SVars.h:92
 SVars.h:93
 SVars.h:94
 SVars.h:95
 SVars.h:96
 SVars.h:97
 SVars.h:98
 SVars.h:99
 SVars.h:100
 SVars.h:101
 SVars.h:102
 SVars.h:103
 SVars.h:104
 SVars.h:105
 SVars.h:106
 SVars.h:107
 SVars.h:108
 SVars.h:109
 SVars.h:110
 SVars.h:111
 SVars.h:112
 SVars.h:113
 SVars.h:114
 SVars.h:115
 SVars.h:116
 SVars.h:117
 SVars.h:118
 SVars.h:119
 SVars.h:120
 SVars.h:121
 SVars.h:122
 SVars.h:123
 SVars.h:124
 SVars.h:125
 SVars.h:126
 SVars.h:127
 SVars.h:128
 SVars.h:129
 SVars.h:130
 SVars.h:131
 SVars.h:132
 SVars.h:133
 SVars.h:134
 SVars.h:135
 SVars.h:136
 SVars.h:137
 SVars.h:138
 SVars.h:139
 SVars.h:140
 SVars.h:141
 SVars.h:142
 SVars.h:143
 SVars.h:144
 SVars.h:145
 SVars.h:146
 SVars.h:147
 SVars.h:148
 SVars.h:149
 SVars.h:150
 SVars.h:151
 SVars.h:152
 SVars.h:153
 SVars.h:154
 SVars.h:155
 SVars.h:156
 SVars.h:157
 SVars.h:158
 SVars.h:159
 SVars.h:160
 SVars.h:161
 SVars.h:162
 SVars.h:163
 SVars.h:164
 SVars.h:165
 SVars.h:166
 SVars.h:167
 SVars.h:168
 SVars.h:169
 SVars.h:170
 SVars.h:171
 SVars.h:172
 SVars.h:173
 SVars.h:174
 SVars.h:175
 SVars.h:176
 SVars.h:177
 SVars.h:178
 SVars.h:179
 SVars.h:180
 SVars.h:181
 SVars.h:182
 SVars.h:183
 SVars.h:184
 SVars.h:185
 SVars.h:186
 SVars.h:187
 SVars.h:188
 SVars.h:189
 SVars.h:190
 SVars.h:191
 SVars.h:192
 SVars.h:193
 SVars.h:194
 SVars.h:195
 SVars.h:196
 SVars.h:197
 SVars.h:198
 SVars.h:199
 SVars.h:200
 SVars.h:201
 SVars.h:202
 SVars.h:203
 SVars.h:204
 SVars.h:205
 SVars.h:206
 SVars.h:207
 SVars.h:208
 SVars.h:209
 SVars.h:210
 SVars.h:211
 SVars.h:212
 SVars.h:213
 SVars.h:214
 SVars.h:215
 SVars.h:216
 SVars.h:217
 SVars.h:218
 SVars.h:219
 SVars.h:220
 SVars.h:221
 SVars.h:222
 SVars.h:223
 SVars.h:224
 SVars.h:225
 SVars.h:226
 SVars.h:227
 SVars.h:228
 SVars.h:229
 SVars.h:230
 SVars.h:231
 SVars.h:232
 SVars.h:233
 SVars.h:234
 SVars.h:235
 SVars.h:236
 SVars.h:237
 SVars.h:238
 SVars.h:239
 SVars.h:240
 SVars.h:241
 SVars.h:242
 SVars.h:243
 SVars.h:244
 SVars.h:245
 SVars.h:246
 SVars.h:247
 SVars.h:248
 SVars.h:249
 SVars.h:250
 SVars.h:251
 SVars.h:252
 SVars.h:253
 SVars.h:254
 SVars.h:255
 SVars.h:256
 SVars.h:257
 SVars.h:258
 SVars.h:259
 SVars.h:260
 SVars.h:261
 SVars.h:262
 SVars.h:263
 SVars.h:264
 SVars.h:265
 SVars.h:266
 SVars.h:267
 SVars.h:268
 SVars.h:269
 SVars.h:270
 SVars.h:271
 SVars.h:272
 SVars.h:273
 SVars.h:274
 SVars.h:275
 SVars.h:276
 SVars.h:277
 SVars.h:278
 SVars.h:279
 SVars.h:280
 SVars.h:281
 SVars.h:282
 SVars.h:283
 SVars.h:284
 SVars.h:285
 SVars.h:286
 SVars.h:287
 SVars.h:288
 SVars.h:289
 SVars.h:290
 SVars.h:291
 SVars.h:292
 SVars.h:293
 SVars.h:294
 SVars.h:295
 SVars.h:296
 SVars.h:297
 SVars.h:298
 SVars.h:299
 SVars.h:300
 SVars.h:301
 SVars.h:302
 SVars.h:303
 SVars.h:304
 SVars.h:305
 SVars.h:306
 SVars.h:307
 SVars.h:308
 SVars.h:309
 SVars.h:310
 SVars.h:311
 SVars.h:312
 SVars.h:313
 SVars.h:314
 SVars.h:315
 SVars.h:316
 SVars.h:317
 SVars.h:318
 SVars.h:319
 SVars.h:320
 SVars.h:321
 SVars.h:322
 SVars.h:323
 SVars.h:324
 SVars.h:325
 SVars.h:326
 SVars.h:327
 SVars.h:328
 SVars.h:329
 SVars.h:330
 SVars.h:331
 SVars.h:332
 SVars.h:333
 SVars.h:334
 SVars.h:335
 SVars.h:336
 SVars.h:337
 SVars.h:338
 SVars.h:339
 SVars.h:340
 SVars.h:341
 SVars.h:342
 SVars.h:343
 SVars.h:344
 SVars.h:345
 SVars.h:346
 SVars.h:347
 SVars.h:348
 SVars.h:349
 SVars.h:350
 SVars.h:351
 SVars.h:352
 SVars.h:353
 SVars.h:354
 SVars.h:355
 SVars.h:356
 SVars.h:357
 SVars.h:358
 SVars.h:359
 SVars.h:360
 SVars.h:361
 SVars.h:362
 SVars.h:363
 SVars.h:364
 SVars.h:365
 SVars.h:366
 SVars.h:367
 SVars.h:368
 SVars.h:369
 SVars.h:370
 SVars.h:371
 SVars.h:372
 SVars.h:373
 SVars.h:374
 SVars.h:375
 SVars.h:376
 SVars.h:377
 SVars.h:378