Grail (C++)  1.3.0
A multi-platform, modular, universal engine for embedding advanced AI in games.
StaircaseFunction.hh
1 // Copyright QED Software 2023.
2 
3 #ifndef GRAIL_STEP_FUNCTION_H
4 #define GRAIL_STEP_FUNCTION_H
5 
6 #include "Curve.hh"
7 
8 namespace grail
9 {
10 namespace evaluator
11 {
15  struct StepData
16  {
20  float value = 0.0f;
24  float startPoint = 0.0f;
28  bool inclusiveStartPoint = false;
29  };
30 
31  template <typename ContextType>
36  class StaircaseFunction final : public Curve<ContextType>
37  {
38  public:
44  StaircaseFunction(std::shared_ptr<Evaluator<ContextType>> childEvaluator,
45  const std::vector<StepData>& data)
46  : Curve<ContextType>{childEvaluator}, data{data}
47  {
48  #ifndef NDEBUG
49  assert(data.size() >= 1);
50  float previousX = data[0].startPoint;
51  for(size_t i = 1; i < data.size(); ++i)
52  {
53  assert(previousX < data[i].startPoint);
54  previousX = data[i].startPoint;
55  }
56  #endif //NDEBUG
57  }
58 
59  virtual float Sample(float argument) const override final
60  {
61  for(std::size_t i = data.size() - 1; i > 0; --i)
62  {
63  if(argument > data[i].startPoint || (argument == data[i].startPoint && data[i].inclusiveStartPoint))
64  {
65  return data[i].value;
66  }
67  }
68  return data[0].value;
69  }
70 
75  std::vector<StepData>& GetData() { return data; }
80  const std::vector<StepData>& GetData() const { return data; }
81 
82  virtual data::EvaluatorType GetEvaluatorType() const override final { return data::EvaluatorType::CURVE_STAIRCASE; }
83 
84  private:
85  std::vector<StepData> data{};
86  };
87 }
88 }
89 #endif // GRAIL_STEP_FUNCTION_H
grail::evaluator::StaircaseFunction::Sample
virtual float Sample(float argument) const override final
Sample - Transforms argument into output value depending on the type of Curve.
Definition: StaircaseFunction.hh:59
grail::evaluator::StepData
The StepData struct - Helper structure describing discrete values used in Staircase function.
Definition: StaircaseFunction.hh:15
grail::evaluator::StaircaseFunction::GetData
std::vector< StepData > & GetData()
GetData.
Definition: StaircaseFunction.hh:75
grail::evaluator::StepData::startPoint
float startPoint
startPoint - Start point of half-line extending to the right and having constant given value.
Definition: StaircaseFunction.hh:24
grail::evaluator::Evaluator
The Evaluator class - base class being able to evaluate given context and output the result.
Definition: Evaluator.hh:22
grail::evaluator::StaircaseFunction::GetData
const std::vector< StepData > & GetData() const
GetData.
Definition: StaircaseFunction.hh:80
grail::evaluator::StepData::value
float value
value - Y-axis value.
Definition: StaircaseFunction.hh:20
grail::evaluator::StaircaseFunction
The StaircaseFunction class - Function consisting of multiple discrete values.
Definition: StaircaseFunction.hh:36
grail::evaluator::StaircaseFunction::StaircaseFunction
StaircaseFunction(std::shared_ptr< Evaluator< ContextType >> childEvaluator, const std::vector< StepData > &data)
StaircaseFunction - Constructor.
Definition: StaircaseFunction.hh:44
grail::evaluator::StepData::inclusiveStartPoint
bool inclusiveStartPoint
inclusiveStartPoint - Determines whether exact start point also has given value. If not,...
Definition: StaircaseFunction.hh:28
grail::evaluator::Curve
The Curve class - Defines objects transforming one value into the other.
Definition: Curve.hh:21