(C++)  1.1.0
A multi-platform, modular, universal engine for embedding advanced AI in games.
Selector.hh
1 #ifndef GRAIL_SELECTOR_H
2 #define GRAIL_SELECTOR_H
3 
4 #include "../GrailEvaluators/Evaluator.hh"
5 #include "Blueprint.hh"
6 #include "../GrailData/DebugInfo/UtilityReasonerSnapshot.h"
7 #include "../GrailData/UtilityModel/UtilitySelectorModel.h"
8 
9 #include <limits>
10 #include <random>
11 #include <vector>
12 #include <functional>
13 
14 namespace grail
15 {
16  namespace utility
17  {
18  static const std::string MAX = "Max";
19  static const std::string ROULETTE = "Roulette";
20 
21  template <typename ContextType>
26  struct Option
27  {
31  ContextType context{};
35  std::shared_ptr<Evaluator<ContextType>> evaluator{};
39  std::string evaluatedObjectName{};
43  std::string evaluatedObjectMetadata{};
47  int rank{};
48  };
49 
50 
55  {
60  SelectionResult(bool isDebugging = false)
61  {
62  if(isDebugging)
63  {
64  snapshot = std::make_unique<UtilityReasonerSnapshot>();
65  }
66  }
67 
74  UtilityEvaluatorSnapshot* FetchNextEvaluatorSnapshot(const std::string& evaluatedObjectName,
75  const std::string& evaluatedObjectMetadata, int rank)
76  {
77  if(snapshot != nullptr)
78  {
79  snapshot->evaluatorSnapshots.emplace_back(evaluatedObjectName, evaluatedObjectMetadata, rank);
80  return &snapshot->evaluatorSnapshots.back();
81  }
82  return nullptr;
83  }
84 
89  bool IsValid() const
90  {
91  return optionIndex != std::numeric_limits<std::size_t>::max();
92  }
93 
97  std::unique_ptr<UtilityReasonerSnapshot> snapshot{nullptr};
101  std::size_t optionIndex = std::numeric_limits<std::size_t>::max();
102  };
103 
107  namespace selector
108  {
109  template <typename ContextType>
110  void SelectMaxUtility(const std::vector<Option<ContextType>>& options,
111  SelectionResult& result,
112  std::function<bool(const std::size_t&)> validator)
113  {
114 
115  float bestWeight = std::numeric_limits<float>::min();
116  int bestRank = std::numeric_limits<int>::min();
117 
118  for (std::size_t i = 0; i < options.size(); ++i)
119  {
120  if (!validator(i))
121  continue;
122 
123  auto& option = options[i];
124 
125  int rank = option.rank;
126  float weight = option.evaluator->EvaluateContext(option.context,
127  result.FetchNextEvaluatorSnapshot(option.evaluatedObjectName,
128  option.evaluatedObjectMetadata, rank));
129 
130  if (rank > bestRank || (rank == bestRank && weight > bestWeight))
131  {
132  bestRank = rank;
133  bestWeight = weight;
134  result.optionIndex = i;
135  }
136  }
137  }
138 
139  template <typename ContextType>
148  void GetBestOption(SelectionMethod selectionMethod,
149  const std::vector<Option<ContextType>>& options,
150  SelectionResult& result,
151  std::function<bool(const std::size_t&)> validator = [](const std::size_t&) -> bool { return true; })
152  {
153  switch (selectionMethod)
154  {
155  case SelectionMethod::MAX:
156  SelectMaxUtility<ContextType>(options, result, validator);
157  break;
158  default:
159  break; //TODO: crash?
160  //REVIEW: resolve todo above
161  }
162  }
163  }
164  }
165 }
166 #endif //GRAIL_SELECTOR_H
The UtilityEvaluatorSnapshot class - debug snapshot of whole evaluator tree assigned to evaluated obj...
Definition: UtilityEvaluatorSnapshot.h:22
void GetBestOption(SelectionMethod selectionMethod, const std::vector< Option< ContextType >> &options, SelectionResult &result, std::function< bool(const std::size_t &)> validator=[](const std::size_t &) -> bool { return true;})
GetBestOption - Selects most suitable option. Provides different context for each evaluated objects.
Definition: Selector.hh:148
The Option struct - Helper structure describing one of the options being selected by Selector.
Definition: Selector.hh:27
int rank
rank - Measure of importance of evaluated object. Only objects with highest available rank may be sel...
Definition: Selector.hh:47
std::string evaluatedObjectMetadata
evaluatedObjectMetadata - additional data describing the evaluated object
Definition: Selector.hh:43
std::shared_ptr< Evaluator< ContextType > > evaluator
evaluator - Object responsible for evaluation of provided context.
Definition: Selector.hh:35
std::string evaluatedObjectName
evaluatedObjectName - Name of the evaluated object.
Definition: Selector.hh:39
ContextType context
context - Context to be evaluated.
Definition: Selector.hh:31
The SelectionResult struct - Structure containing results of operations done by Selector.
Definition: Selector.hh:55
bool IsValid() const
IsValid - Checks whether Selector already finished it's calculations and encountered no errors.
Definition: Selector.hh:89
SelectionResult(bool isDebugging=false)
SelectionResult - Constructor.
Definition: Selector.hh:60
std::size_t optionIndex
optionIndex - Index of option selected by Selector.
Definition: Selector.hh:101
UtilityEvaluatorSnapshot * FetchNextEvaluatorSnapshot(const std::string &evaluatedObjectName, const std::string &evaluatedObjectMetadata, int rank)
FetchNextEvaluatorSnapshot - If debugging mode was enabled in constructor, creates an empty snapshot ...
Definition: Selector.hh:74
std::unique_ptr< UtilityReasonerSnapshot > snapshot
snapshot - If debugging mode was enabled in constructor, contains debug snapshot of whole UtilityReas...
Definition: Selector.hh:97