Grail (C++)  1.2.0
A multi-platform, modular, universal engine for embedding advanced AI in games.
UtilityReasoner.hh
1 // Copyright QED Software 2023.
2 
3 #ifndef GRAIL_UTILITY_REASONER_H
4 #define GRAIL_UTILITY_REASONER_H
5 
6 #include "../Selector.hh"
7 #include "../../GrailCore/Reasoner.hh"
8 #include "../../GrailData/DebugInfo/UtilityReasonerSnapshot.h"
9 #include "../../GrailData/UtilityModel/UtilitySelectorModel.h"
10 #include "../../GrailEvaluators/Evaluator.hh"
11 
12 #include <functional>
13 #include <map>
14 #include <mutex>
15 #include <stack>
16 #include <tuple>
17 
18 namespace grail
19 {
20 namespace utility
21 {
22  template <typename InstanceType, typename ContextType, typename DataType>
24  {
28  std::shared_ptr<evaluator::Evaluator<ContextType>> evaluator;
36  int rank;
37 
40  int rank)
42  {
43  }
44 
47  int rank)
49  {
50  }
51  };
52 
58  class UtilityReasoner : public Reasoner
59  {
60  public:
67 
70  data::SelectionMethod selectionMethod = data::SelectionMethod::MAX,
71  float persistence = 0.1f);
72  UtilityReasoner(const UtilityReasoner& other) = delete;
73  UtilityReasoner(UtilityReasoner&& other) = delete;
74 
75  virtual ~UtilityReasoner() override = default;
76 
77  UtilityReasoner& operator =(const UtilityReasoner& other) = delete;
78  UtilityReasoner& operator =(UtilityReasoner&& other) = delete;
79 
84  virtual void SelectBehavior(AIEntity& entity) override;
85 
91  virtual std::unique_ptr<ISnapshotGenerator> CreateSnapshotGenerator(size_t entityId) override;
101  void SetSnapshotProduction(bool isEnabled);
102 
103  private:
104  void AssignBehaviorInstance(AIEntity& entity,
105  std::unique_ptr<Behavior> instance,
107  std::vector<std::unique_ptr<Behavior>> GenerateContextsAndInstances(const AIEntity& entity);
108  void ValidateOperationStack(const AIEntity& entity);
109  void SelectBehaviorFromStack(AIEntity& entity);
110 
111  std::vector<BlueprintOption<Behavior, EntityBlackboardPair, grail::AIEntity>> blueprintOptions = {};
112  std::stack<std::pair<std::unique_ptr<Behavior>, utility::Option<EntityBlackboardPair>>> operationStack
113  {};
114  std::vector<utility::Option<EntityBlackboardPair>> generatedOptions{};
115  utility::Option<EntityBlackboardPair> currentBehaviorOption{{}, nullptr, "", "", 0};
116  utility::Option<EntityBlackboardPair> previousBehaviorOption{{}, nullptr, "", "", 0};
117 
118  data::SelectionMethod selectionMethod = data::SelectionMethod::MAX;
119 
120  float persistence = 0.0f;
121 
122  bool produceSnapshot = false;
123  data::UtilityReasonerSnapshot cachedSnapshot{};
124  mutable std::mutex snapshotMutex;
125  };
126 }
127 }
128 
129 #endif //GRAIL_UTILITY_REASONER_H
grail::AIEntity
The AIEntity class - Defines a basic object which can execute behaviors.
Definition: AIEntity.hh:50
grail::utility::BlueprintOption::rank
int rank
Rank - measure of importance of evaluated object. Only objects with highest available rank may be sel...
Definition: UtilityReasoner.hh:36
grail::Reasoner
The Reasoner class - Entity's "brain", assigns them behaviors chosen by user-defined algorithms.
Definition: Reasoner.hh:21
grail::utility::BlueprintOption
Definition: UtilityReasoner.hh:23
grail::utility::BlueprintOption::evaluator
std::shared_ptr< evaluator::Evaluator< ContextType > > evaluator
Evaluator for this option.
Definition: UtilityReasoner.hh:28
grail::data::UtilityReasonerSnapshot
Definition: UtilityReasonerSnapshot.h:14
grail::evaluator::Evaluator
The Evaluator class - base class being able to evaluate given context and output the result.
Definition: Evaluator.hh:22
grail::utility::UtilityReasoner
The UtilityReasoner class - Class responsible for assigning behaviors using Utility System algorithm....
Definition: UtilityReasoner.hh:58
grail::utility::UtilityReasoner::SelectBehavior
virtual void SelectBehavior(AIEntity &entity) override
SelectBehavior - Selects behavior, if able, and assigns it to entity.
Definition: UtilityReasoner.cpp:24
grail::utility::Option< EntityBlackboardPair >
grail::utility::UtilityReasoner::UtilityReasoner
UtilityReasoner(std::vector< BlueprintOption< Behavior, EntityBlackboardPair, grail::AIEntity >> &&blueprintOptions, data::SelectionMethod selectionMethod=data::SelectionMethod::MAX, float persistence=0.1f)
UtilityReasoner - Constructor.
Definition: UtilityReasoner.cpp:13
grail::utility::UtilityReasoner::GetUtilityReasonerSnapshot
data::UtilityReasonerSnapshot GetUtilityReasonerSnapshot() const
GetUtilityReasonerSnapshot - Returns copy of current snapshot and clear the original data.
Definition: UtilityReasoner.cpp:170
grail::utility::BlueprintOption::behaviorBlueprint
utility::Blueprint< InstanceType, ContextType, DataType > behaviorBlueprint
Blueprint for this option.
Definition: UtilityReasoner.hh:32
grail::utility::UtilityReasoner::SetSnapshotProduction
void SetSnapshotProduction(bool isEnabled)
SetSnapshotProduction - Tells reasoner whether it should produce debug snapshots of its state.
Definition: UtilityReasoner.cpp:177
grail::utility::Blueprint< InstanceType, ContextType, DataType >
grail::utility::UtilityReasoner::CreateSnapshotGenerator
virtual std::unique_ptr< ISnapshotGenerator > CreateSnapshotGenerator(size_t entityId) override
CreateSnapshotGenerator - Creates object responsible for producing snapshots for this reasoner assign...
Definition: UtilityReasoner.cpp:165