Grail (C++)  1.3.0
A multi-platform, modular, universal engine for embedding advanced AI in games.
Curve.hh
1 // Copyright QED Software 2023.
2 
3 #ifndef GRAIL_CURVE_H
4 #define GRAIL_CURVE_H
5 
6 #include "../Evaluator.hh"
7 #include "../../libs/vector2/vector2.h"
8 
9 #include <utility>
10 #include <vector>
11 
12 namespace grail
13 {
14 namespace evaluator
15 {
20  template <typename ContextType>
21  class Curve : public Evaluator<ContextType>
22  {
23  public:
28  explicit Curve(std::shared_ptr<Evaluator<ContextType>> childEvaluator)
29  : childEvaluator{childEvaluator}
30  {
31  }
32 
33  Curve(const Curve<ContextType>& other) = default;
34  Curve(Curve<ContextType>&& other) = default;
35  virtual ~Curve() = default;
36 
42  virtual float Sample(float argument) const = 0;
43 
44  virtual float
45  Evaluate(const ContextType& context, data::UtilityEvaluatorSnapshot* const snapshot) const override final
46  {
47  return Sample(childEvaluator->EvaluateContext(context, snapshot));
48  }
49 
50  protected:
51  virtual void DebugDump(const std::map<const void*, unsigned int>& nodeMapping,
52  data::EvaluationDebugData& debugData) const override final
53  {
54  debugData.AddChildNode(nodeMapping.at(childEvaluator.get()));
55  }
56 
57  private:
58  std::shared_ptr<Evaluator<ContextType>> childEvaluator{};
59  };
60 
61  template <typename ContextType>
66  class LowerBound final : public Curve<ContextType>
67  {
68  public:
74  LowerBound(std::shared_ptr<Evaluator<ContextType>> childEvaluator, float lowerBound)
75  : Curve<ContextType>(childEvaluator), lowerBound{lowerBound}
76  {
77  }
78 
79  virtual float Sample(float argument) const override final
80  {
81  return std::max(lowerBound, argument);
82  }
83 
84  virtual data::EvaluatorType GetEvaluatorType() const override final { return data::EvaluatorType::CURVE_LOWER_BOUND; }
85 
86  private:
87  float lowerBound = 0.0f;
88  };
89 
90  template <typename ContextType>
95  class UpperBound final : public Curve<ContextType>
96  {
97  public:
103  UpperBound(std::shared_ptr<Evaluator<ContextType>> childEvaluator, float upperBound)
104  : Curve<ContextType>(childEvaluator), upperBound{upperBound}
105  {
106  }
107 
108  virtual float Sample(float argument) const override final
109  {
110  return std::min(upperBound, argument);
111  }
112 
113  virtual data::EvaluatorType GetEvaluatorType() const override final { return data::EvaluatorType::CURVE_UPPER_BOUND; }
114 
115  private:
116  float upperBound = 0.0f;
117  };
118 
119  template <typename ContextType>
124  class DoubleSidedBound final : public Curve<ContextType>
125  {
126  public:
133  DoubleSidedBound(std::shared_ptr<Evaluator<ContextType>> childEvaluator,
134  float lowerBound,
135  float upperBound)
136  : Curve<ContextType>{childEvaluator}, lowerBound{lowerBound}, upperBound{upperBound}
137  {
138  }
139 
140  virtual float Sample(float argument) const override final
141  {
142  return std::min(upperBound, std::max(lowerBound, argument));
143  }
144 
145  virtual data::EvaluatorType GetEvaluatorType() const override final
146  {
147  return data::EvaluatorType::CURVE_DOUBLE_SIDED_BOUND;
148  }
149 
150  private:
151  float lowerBound = 0.0f;
152  float upperBound = 0.0f;
153  };
154 
155  template <typename ContextType>
162  std::vector<Vector2> DiscretizeCurve(const Curve<ContextType>& curve, std::size_t samplesQuantity)
163  {
164  std::vector<Vector2> controlPoints;
165  float increment = 1.0f / (samplesQuantity - 1);
166  for(float i = 0; i <= 1; i += increment)
167  {
168  controlPoints.push_back({i, curve.Sample(i)});
169  }
170  return controlPoints;
171  }
172 }
173 }
174 #endif //GRAIL_CURVE_H
grail::evaluator::Curve::Evaluate
virtual float Evaluate(const ContextType &context, data::UtilityEvaluatorSnapshot *const snapshot) const override final
Evaluate - Called from EvaluateContext which also evaluates context, but without automatically fillin...
Definition: Curve.hh:45
grail::data::EvaluationDebugData
The EvaluationDebugData class - debug data describing singular evaluator.
Definition: EvaluationDebugData.h:24
grail::evaluator::UpperBound
The UpperBound class - Upper-bounds output of provided Evaluator.
Definition: Curve.hh:95
grail::evaluator::UpperBound::UpperBound
UpperBound(std::shared_ptr< Evaluator< ContextType >> childEvaluator, float upperBound)
UpperBound - Constructor.
Definition: Curve.hh:103
grail::evaluator::Curve::Curve
Curve(std::shared_ptr< Evaluator< ContextType >> childEvaluator)
Curve - Constructor.
Definition: Curve.hh:28
grail::evaluator::DoubleSidedBound::Sample
virtual float Sample(float argument) const override final
Sample - Transforms argument into output value depending on the type of Curve.
Definition: Curve.hh:140
grail::evaluator::Curve::DebugDump
virtual void DebugDump(const std::map< const void *, unsigned int > &nodeMapping, data::EvaluationDebugData &debugData) const override final
DebugDump - Called from EvaluateContext, which generates additional debug data for each evaluator....
Definition: Curve.hh:51
grail::evaluator::Curve::Sample
virtual float Sample(float argument) const =0
Sample - Transforms argument into output value depending on the type of Curve.
grail::evaluator::LowerBound
The LowerBound class - Lower-bounds output of provided Evaluator.
Definition: Curve.hh:66
grail::evaluator::Evaluator
The Evaluator class - base class being able to evaluate given context and output the result.
Definition: Evaluator.hh:22
grail::evaluator::UpperBound::Sample
virtual float Sample(float argument) const override final
Sample - Transforms argument into output value depending on the type of Curve.
Definition: Curve.hh:108
grail::evaluator::LowerBound::Sample
virtual float Sample(float argument) const override final
Sample - Transforms argument into output value depending on the type of Curve.
Definition: Curve.hh:79
grail::data::UtilityEvaluatorSnapshot
The UtilityEvaluatorSnapshot class - debug snapshot of whole evaluator tree assigned to evaluated obj...
Definition: UtilityEvaluatorSnapshot.h:26
grail::evaluator::DoubleSidedBound::DoubleSidedBound
DoubleSidedBound(std::shared_ptr< Evaluator< ContextType >> childEvaluator, float lowerBound, float upperBound)
DoubleSidedBound - Constructor.
Definition: Curve.hh:133
grail::evaluator::LowerBound::LowerBound
LowerBound(std::shared_ptr< Evaluator< ContextType >> childEvaluator, float lowerBound)
LowerBound - Constructor.
Definition: Curve.hh:74
grail::evaluator::DoubleSidedBound
The DoubleSidedBound class - Bounds output of provided Evaluator from both sides.
Definition: Curve.hh:124
grail::evaluator::Curve
The Curve class - Defines objects transforming one value into the other.
Definition: Curve.hh:21