VIPRA Documentation
Loading...
Searching...
No Matches
behavior_builder.hpp
1#pragma once
2
3#include <filesystem>
4
5#include "vipra/vipra_behaviors/attributes/attributes.hpp"
6#include "vipra/vipra_behaviors/conditions/subconditions/subcondition_enter_objective.hpp"
7#include "vipra/vipra_behaviors/conditions/subconditions/subcondition_event_occurring.hpp"
8#include "vipra/vipra_behaviors/conditions/subconditions/subcondition_event_starting.hpp"
9#include "vipra/vipra_behaviors/conditions/subconditions/subcondition_exists.hpp"
10#include "vipra/vipra_behaviors/conditions/subconditions/subcondition_in_location.hpp"
11
12#include "vipra/vipra_behaviors/behavior/human_behavior.hpp"
13#include "vipra/vipra_behaviors/builder/behavior_error_listener.hpp"
14#include "vipra/vipra_behaviors/builder/builder_maps.hpp"
15#include "vipra/vipra_behaviors/builder/declaration_components.hpp"
16
17#include "vipra/vipra_behaviors/conditions/condition.hpp"
18#include "vipra/vipra_behaviors/conditions/subconditions/subcondition_attribute.hpp"
19#include "vipra/vipra_behaviors/conditions/subconditions/subcondition_elapsed_time.hpp"
20#include "vipra/vipra_behaviors/conditions/subconditions/subcondition_enter.hpp"
21#include "vipra/vipra_behaviors/conditions/subconditions/subcondition_event.hpp"
22#include "vipra/vipra_behaviors/conditions/subconditions/subcondition_event_ending.hpp"
23#include "vipra/vipra_behaviors/conditions/subconditions/subcondition_leave.hpp"
24#include "vipra/vipra_behaviors/conditions/subconditions/subcondition_spatial.hpp"
25
26#include "vipra/vipra_behaviors/targets/target_modifier.hpp"
27
28#include "vipra/vipra_behaviors/values/direction.hpp"
29
30#include "vipra/vipra_behaviors/_grammar/generated/BehaviorBaseVisitor.h"
31#include "vipra/vipra_behaviors/_grammar/generated/BehaviorLexer.h"
32#include "vipra/vipra_behaviors/_grammar/generated/BehaviorParser.h"
33
34#include "vipra/geometry/f3d.hpp"
35#include "vipra/logging/logging.hpp"
36
37// TODO(rolland): give proper errors and logging
38
39namespace VIPRA::Behaviors {
44
45class BehaviorBuilder : public BehaviorBaseVisitor {
46 DEFAULT_CONSTRUCTIBLE(BehaviorBuilder)
47 COPYABLE(BehaviorBuilder)
48 MOVEABLE(BehaviorBuilder)
49
50 public:
51 [[nodiscard]] auto build(std::string name, std::filesystem::path const& filepath,
52 Modules::Map const& map, VIPRA::seed seed) -> HumanBehavior;
53
54 private:
55 BehaviorErrorListener _errorListener;
56
57 StateMap _states;
58 TypeMap _types;
59 EventMap _eventsMap;
60 LocationMap _locations;
61
62 Condition _startCond;
63 Event _startEvent;
64 HumanBehavior _currentBehavior;
65
66 Behaviors::stateUID _currState{};
67 Behaviors::typeUID _currType{};
68 VIPRA::seed _currSeed{};
69
70 void initial_behavior_setup(std::string const& behaviorName, Modules::Map const& map,
71 VIPRA::seed seedNum);
72 void initialize_types();
73 void initialize_events();
74 void initialize_states();
75 void initialize_locations(Modules::Map const& map);
76 void end_behavior_check();
77
78 // ------------------------------- UTIL -----------------------------------------------------------------------------------------
79
80 void add_atom_to_action(Action& action, BehaviorParser::Action_atomContext* atom);
81 void add_target_to_action(Action& action, BehaviorParser::TargetContext* ctx);
82
83 [[nodiscard]] auto add_event(BehaviorParser::Event_nameContext* ctx) -> VIPRA::idx;
84
85 [[nodiscard]] auto build_condition(BehaviorParser::ConditionContext* cond) -> Condition;
86 void condition_tree_condition(BehaviorParser::ConditionContext* condition,
87 Condition& tree);
88 void condition_tree_unary(BehaviorParser::UnaryContext* unary, Condition& tree);
89 void condition_tree_primary(BehaviorParser::PrimaryContext* primary, Condition& tree);
90 void add_sub_condition(Condition& condTree,
91 BehaviorParser::Sub_conditionContext* subcond);
92
93 [[nodiscard]] auto build_sub_selector(slType type, slSelector selector,
94 std::optional<slGroup> group,
95 bool required) -> SubSelector;
96
97 [[nodiscard]] auto get_location(std::string const& name) const
98 -> std::optional<VIPRA::idx>;
99 [[nodiscard]] auto get_state(std::string const& state) const
100 -> std::optional<Behaviors::stateUID>;
101 [[nodiscard]] auto get_event(std::string const& name) const
102 -> std::optional<VIPRA::idx>;
103 [[nodiscard]] auto get_range(BehaviorParser::Value_numberContext* ctx) const
104 -> VIPRA::time_range_s;
105 [[nodiscard]] auto get_type(std::string const& type) const
106 -> std::optional<Behaviors::typeUID>;
107 [[nodiscard]] auto get_group(std::optional<slGroup> group) const
108 -> std::pair<Behaviors::typeUID, std::string>;
109 [[nodiscard]] auto get_composite_type(
110 std::vector<antlr4::tree::TerminalNode*> const& types) const -> Behaviors::Ptype;
111 [[nodiscard]] static auto get_attribute(std::string attr) -> Behaviors::Attribute;
112
113 [[nodiscard]] auto get_check_location(std::string const& name) const -> VIPRA::idx;
114 [[nodiscard]] auto get_check_state(std::string const& name) const
115 -> Behaviors::stateUID;
116 [[nodiscard]] auto get_check_event(std::string const& name) const -> VIPRA::idx;
117 [[nodiscard]] auto get_check_type(std::string const& name) const -> Behaviors::typeUID;
118
119 [[nodiscard]] auto make_attribute_value(BehaviorParser::Attr_valueContext* ctx)
121 [[nodiscard]] static auto make_attribute_str(BehaviorParser::AttributeContext* ctx)
122 -> std::string;
123 [[nodiscard]] static auto make_list_strs(
124 std::vector<antlr4::tree::TerminalNode*> const& types) -> std::vector<std::string>;
125 [[nodiscard]] auto make_target_modifier(std::vector<BehaviorParser::ModifierContext*>&
126 modifiers) -> std::optional<TargetModifier>;
127 [[nodiscard]] static auto make_direction(BehaviorParser::DirectionContext* ctx)
128 -> Direction;
129 [[nodiscard]] auto make_dimensions(BehaviorParser::Loc_dimensionsContext* ctx) const
130 -> std::tuple<VIPRA::f3d, VIPRA::f3d, VIPRA::f_pnt>;
131
139 template <typename... args_t>
140 [[noreturn]] static void error(fmt::format_string<args_t...> message,
141 args_t&&... values)
142 {
143 VIPRA::Log::error(message, std::forward<args_t>(values)...);
144 BuilderException::error();
145 }
146
147 // ------------------------------- ANTLR FUNCTIONS -----------------------------------------------------------------------------------------
148
149 auto visitEvent(BehaviorParser::EventContext* /*ctx*/) -> antlrcpp::Any override;
150 auto visitPed_Selector(BehaviorParser::Ped_SelectorContext* /*ctx*/)
151 -> antlrcpp::Any override;
152 auto visitAction(BehaviorParser::ActionContext* /*ctx*/) -> antlrcpp::Any override;
153 auto visitDecl_Ped_State(BehaviorParser::Decl_Ped_StateContext* /*ctx*/)
154 -> antlrcpp::Any override;
155 auto visitDecl_Ped(BehaviorParser::Decl_PedContext* /*ctx*/) -> antlrcpp::Any override;
156 auto visitLocation(BehaviorParser::LocationContext* /*ctx*/) -> antlrcpp::Any override;
157
158 // --------------------------------- ATOMS ------------------------------------------------------------------------------------------------
159
160 void add_set_atom(Action& /*action*/, BehaviorParser::Set_atomContext* /*ctx*/);
161 void add_scale_atom(Action& /*action*/, BehaviorParser::Scale_atomContext* /*ctx*/);
162 static void add_set_obj_atom(Action& /*action*/,
163 BehaviorParser::Set_objective_atomContext* /*ctx*/);
164
165 // --------------------------------- TARGET SELECTORS ------------------------------------------------------------------------------------------------
166
167 void add_nearest_type_target(Action& /*action*/,
168 BehaviorParser::Nearest_typeContext* /*ctx*/,
169 std::optional<TargetModifier>& /*modifier*/);
170
171 // --------------------------------- TARGET MODIFIERS ------------------------------------------------------------------------------------------------
172
173 void add_modifier(TargetModifier& /*targetModifier*/,
174 BehaviorParser::ModifierContext* /*modifier*/) const;
175
176 void add_distance_modifier(TargetModifier& /*modifier*/,
177 BehaviorParser::DistanceContext* /*ctx*/) const;
178 static void add_direction_modifier(TargetModifier& /*modifier*/,
179 BehaviorParser::DirectionContext* /*ctx*/);
180 void add_location_modifier(TargetModifier& /*modifier*/,
181 BehaviorParser::Location_modifierContext* /*ctx*/) const;
182
183 // --------------------------------- SUBCONDITIONS ------------------------------------------------------------------------------------------------
184
185 [[nodiscard]] auto build_enter_obj_subcond(
186 BehaviorParser::Condition_Enter_LocationContext* /*ctx*/) -> SubConditionEnterObj;
187 [[nodiscard]] auto build_enter_subcond(
188 BehaviorParser::Condition_Enter_LocationContext* /*ctx*/) -> SubConditionEnter;
189 [[nodiscard]] auto build_exit_subcond(
190 BehaviorParser::Condition_Exit_LocationContext* /*ctx*/) -> SubConditionLeave;
191 [[nodiscard]] auto build_time_elapsed_subcond(
192 BehaviorParser::Condition_Time_Elapsed_From_EventContext* /*ctx*/)
194 [[nodiscard]] auto build_event_occurred_subcond(
195 BehaviorParser::Condition_Event_OccurredContext* /*ctx*/)
197 [[nodiscard]] auto build_event_occurring_subcond(
198 BehaviorParser::Condition_Event_OccurringContext* /*ctx*/)
200 [[nodiscard]] auto build_event_starting_subcond(
201 BehaviorParser::Condition_Event_StartingContext* /*ctx*/)
203 [[nodiscard]] auto build_event_ending_subcond(
204 BehaviorParser::Condition_Event_EndingContext* /*ctx*/) -> SubConditionEventEnding;
205 [[nodiscard]] auto build_spatial_subcond(
206 BehaviorParser::Condition_SpatialContext* /*ctx*/) -> SubConditionSpatial;
207 [[nodiscard]] auto build_in_location_subcond(
208 BehaviorParser::Condition_Inside_LocationContext* /*ctx*/)
210 [[nodiscard]] auto build_attribute_subcond(
211 BehaviorParser::Condition_AttributeContext* /*ctx*/) -> SubConditionAttribute;
212 [[nodiscard]] auto build_exists_subcond(
213 BehaviorParser::Condition_ExistsContext* /*ctx*/) -> SubConditionExists;
214
215 // --------------------------------- SUBSELECTORS ------------------------------------------------------------------------------------------------
216
217 auto build_everyone_selector(slType /*type*/, bool /*required*/) -> SubSelector;
218 auto build_exactly_n_selector(slType /*type*/, slSelector /*selector*/,
219 std::optional<slGroup> /*group*/,
220 bool /*required*/) -> SubSelector;
221 auto build_percent_selector(slType /*type*/, slSelector /*selector*/,
222 std::optional<slGroup> /*group*/,
223 bool /*required*/) -> SubSelector;
224 auto build_location_selector(slType /*type*/, slSelector /*selector*/,
225 std::optional<slGroup> /*group*/,
226 bool /*required*/) -> SubSelector;
227
228 // --------------------------------- LOCATION ------------------------------------------------------------------------------------------------
229
230 // -------------------------------- FINDERS ------------------------------------------------------------------------------------------------
231
239 template <typename comp_t>
240 [[nodiscard]] static auto find_event_component(BehaviorParser::EventContext* ctx)
241 -> std::optional<comp_t>
242 {
243 for ( auto const& attr : ctx->event_attribute() ) {
244 // Name
245 if constexpr ( std::is_same_v<comp_t, std::string> )
246 if ( attr->event_name() ) return attr->event_name()->ID()->toString();
247
248 // Start Condition
249 if constexpr ( std::is_same_v<comp_t, evStart> )
250 if ( attr->event_start() ) return attr->event_start();
251
252 // End Condition
253 if constexpr ( std::is_same_v<comp_t, evEnd> )
254 if ( attr->event_end() ) return attr->event_end();
255 }
256
257 return std::nullopt;
258 }
259
267 template <typename comp_t>
268 [[nodiscard]] static auto find_action_component(BehaviorParser::ActionContext* ctx)
269 -> std::optional<comp_t>
270 {
271 for ( auto const& attr : ctx->action_attribute() ) {
272 // Stimulus
273 if constexpr ( std::is_same_v<comp_t, acStimulus> )
274 if ( attr->action_stimulus() ) return attr->action_stimulus();
275
276 // Response
277 if constexpr ( std::is_same_v<comp_t, acResponse> )
278 if ( attr->action_response() ) return attr->action_response();
279
280 // Target
281 if constexpr ( std::is_same_v<comp_t, acTarget> )
282 if ( attr->action_target() ) return attr->action_target();
283
284 // Duration
285 if constexpr ( std::is_same_v<comp_t, acDuration> )
286 if ( attr->action_duration() ) return attr->action_duration();
287 }
288
289 return std::nullopt;
290 }
291
299 template <typename comp_t>
300 [[nodiscard]] static auto find_selector_component(
301 BehaviorParser::Ped_SelectorContext* ctx) -> std::optional<comp_t>
302 {
303 for ( auto const& attr : ctx->selector_attribute() ) {
304 // Type
305 if constexpr ( std::is_same_v<comp_t, slType> )
306 if ( attr->selector_type() ) return attr->selector_type();
307
308 // Selector
309 if constexpr ( std::is_same_v<comp_t, slSelector> )
310 if ( attr->selector_selector() ) return attr->selector_selector();
311
312 // Group
313 if constexpr ( std::is_same_v<comp_t, slGroup> )
314 if ( attr->selector_from() ) return attr->selector_from();
315
316 // Required
317 if constexpr ( std::is_same_v<comp_t, slRequired> )
318 if ( attr->selector_required() ) return attr->selector_required();
319 }
320
321 return std::nullopt;
322 }
323
331 template <typename comp_t>
332 [[nodiscard]] static auto find_location_component(BehaviorParser::LocationContext* ctx)
333 -> std::optional<comp_t>
334 {
335 for ( auto const& attr : ctx->location_attribute() ) {
336 // Name
337 if constexpr ( std::is_same_v<comp_t, lcName> )
338 if ( attr->loc_name() ) return attr->loc_name();
339
340 // Dimensions
341 if constexpr ( std::is_same_v<comp_t, lcDimensions> )
342 if ( attr->loc_dimensions() ) return attr->loc_dimensions();
343 }
344
345 return std::nullopt;
346 }
347};
348
349} // namespace VIPRA::Behaviors
Definition action.hpp:17
Parses Behavior Files and Creates the Runtime Functionality they describe.
Definition behavior_builder.hpp:45
auto build(std::string name, std::filesystem::path const &filepath, Modules::Map const &map, VIPRA::seed seed) -> HumanBehavior
Parses the behavior file at filepath, returns the behavior it describes.
Definition behavior_builder.cpp:31
Definition behavior_error_listener.hpp:10
Definition condition.hpp:14
An Event is something that occurs during a simulation, when an event starts it notifies it's subscrib...
Definition event.hpp:19
Definition human_behavior.hpp:22
Pedestrian Type, used as a composite of typeUIDs.
Definition pedestrian_types.hpp:23
SubCondition for target attribute to equal a value.
Definition subcondition_attribute.hpp:14
SubCondition for target attribute to equal a value.
Definition subcondition_elapsed_time.hpp:12
Definition subcondition_enter_objective.hpp:11
Definition subcondition_enter.hpp:8
Definition subcondition_event_ending.hpp:10
SubCondition for target attribute to equal a value.
Definition subcondition_event.hpp:15
Definition subcondition_event_occurring.hpp:11
Definition subcondition_event_starting.hpp:10
SubCondition for target attribute to equal a value.
Definition subcondition_exists.hpp:13
SubCondition for target being in a location.
Definition subcondition_in_location.hpp:12
Definition subcondition_leave.hpp:8
Definition subcondition_spatial.hpp:10
Selects pedestrians for one type, gets combined with other SubSelectors in Selector.
Definition subselector.hpp:33
Modifies who can be a target for an action, by distance, direction, etc.
Definition target_modifier.hpp:17
static VIPRA_INLINE void error(fmt::format_string< param_ts... > message, param_ts &&... params)
Calls the provided Logger with Level DEBUG.
Definition logging.hpp:102
Base Map Module Class.
Definition map.hpp:23
Holds an immutable attribute value and its type.
Definition attributes.hpp:57