21#ifndef OPENSWMM_CONTROLS_HPP
22#define OPENSWMM_CONTROLS_HPP
27#include <unordered_map>
28#include "../math/MathExpr.hpp"
32struct SimulationContext;
169 void init(
const std::vector<Rule>&
rules);
195 int addExpression(
const std::string& name,
const std::string& formula);
197 std::vector<Rule>&
rules() {
return rules_; }
253 double current_time,
double half_step);
256 int last_action_count_ = 0;
257 std::vector<Rule> rules_;
258 std::vector<PIDState> pid_states_;
259 std::vector<NamedVariable> named_vars_;
260 std::vector<mathexpr::Expression> expressions_;
261 std::unordered_map<std::string, int> expr_index_;
264 std::vector<PremiseSoA> premise_groups_;
277 std::vector<uint8_t> premise_results_;
278 std::vector<int> rule_premise_offset_;
279 int total_premises_ = 0;
282 std::vector<bool> rule_results_;
287 std::vector<double> link_time_last_set_;
292 double next_rule_eval_time_ = -1.0;
295 double control_value_ = 0.0;
296 double set_point_ = 0.0;
299 struct PendingAction {
306 std::vector<PendingAction> pending_actions_;
310 double current_time,
int param = 0)
const;
313 const Premise& p,
double current_time,
double half_step);
315 bool compareValues(
double lhs,
CompareOp op,
double rhs)
const;
316 bool compareTimes(
double lhs,
CompareOp op,
double rhs,
double half_step)
const;
318 double computePIDSetting(
PIDState& pid,
double control_value,
319 double current_setting,
bool is_pump,
double dt);
322 double current_time,
double dt);
328 double getNamedVariableValue(
const std::string& name,
330 double current_time)
const;
Definition Controls.hpp:167
void resetRuleStep()
Definition Controls.hpp:205
int parseRuleText(const std::string &text, SimulationContext &ctx)
Definition Controls.cpp:897
std::vector< Rule > & rules()
Definition Controls.hpp:197
void buildPremiseSoA()
Build SoA index from rules. Called once at init().
Definition Controls.cpp:51
int addExpression(const std::string &name, const std::string &formula)
Definition Controls.cpp:633
void init(const std::vector< Rule > &rules)
Definition Controls.cpp:33
int lastActionCount() const
Number of actions taken in the last evaluate() call.
Definition Controls.hpp:200
int evaluate(SimulationContext &ctx, double current_time, double dt)
Evaluate all control rules and set link target settings.
Definition Controls.cpp:180
void batchEvaluateGroup(PremiseSoA &group, const SimulationContext &ctx, double current_time, double half_step)
Batch evaluate all premises of one variable type.
Definition Controls.cpp:132
void addNamedVariable(const std::string &name, ConditionVar var, int idx)
Definition Controls.cpp:629
ConditionVar
Definition Controls.hpp:47
@ GAGE_RAIN_PAST
Past n-hours rainfall (n stored in idx field)
@ GAGE_RAIN
Current rainfall intensity.
@ SIM_DAYOFYEAR
Day of year (1-365)
@ SIM_DAY
Day of week (1-7, Sun=1)
LogicOp
Definition Controls.hpp:41
CompareOp
Definition Controls.hpp:40
ActionType
Definition Controls.hpp:85
@ CURVE
Setting from curve lookup(ControlValue)
@ PID
PID controller output.
@ TIMESERIES
Setting from timeseries lookup(currentTime)
@ NUMERIC
Direct numeric setting value.
Definition NodeCoupling.cpp:15
Central, reentrant simulation context.
Definition SimulationContext.hpp:274
Definition Controls.hpp:117
int rule_idx
Parent rule index (for priority lookup)
Definition Controls.hpp:119
int link_idx
Link being controlled.
Definition Controls.hpp:118
ActionType type
Definition Controls.hpp:120
int curve_idx
Curve index (for CURVE type)
Definition Controls.hpp:122
int pid_idx
PID state index (for PID type)
Definition Controls.hpp:124
double value
Direct value or computed result.
Definition Controls.hpp:121
int tseries_idx
Timeseries index (for TIMESERIES type)
Definition Controls.hpp:123
Pre-sorted premise index for batch evaluation.
Definition Controls.hpp:226
ConditionVar var_type
All premises in this group test this variable.
Definition Controls.hpp:227
std::vector< bool > rhs_is_variable
True if RHS is a variable (not batch-able)
Definition Controls.hpp:239
std::vector< int > premise_idx
Position within the rule's premise list.
Definition Controls.hpp:232
std::vector< int > flat_idx
Position in flat premise_results_ cache.
Definition Controls.hpp:234
std::vector< int > op
CompareOp as int.
Definition Controls.hpp:235
std::vector< bool > results
Comparison results.
Definition Controls.hpp:244
std::vector< bool > is_expression
True if LHS is an expression.
Definition Controls.hpp:240
std::vector< double > rhs_value
RHS threshold value.
Definition Controls.hpp:236
std::vector< double > lhs_values
Gathered LHS values.
Definition Controls.hpp:243
std::vector< int > obj_idx
Object index (node/link/gage)
Definition Controls.hpp:233
std::vector< int > rule_idx
Which rule this premise belongs to.
Definition Controls.hpp:231
int count
Definition Controls.hpp:228
Definition Controls.hpp:145
int idx
Definition Controls.hpp:148
ConditionVar var
Definition Controls.hpp:147
std::string name
Definition Controls.hpp:146
Definition Controls.hpp:131
double kd
Definition Controls.hpp:134
double kp
Definition Controls.hpp:132
double e2
Error two steps back.
Definition Controls.hpp:137
double ki
Integral time (minutes, 0=disable)
Definition Controls.hpp:133
int action_idx
Associated action index.
Definition Controls.hpp:138
double setpoint
Definition Controls.hpp:135
double e1
Previous error.
Definition Controls.hpp:136
Definition Controls.hpp:96
int lhs_param
Extra parameter (e.g. n-hours for GAGE_RAIN_PAST)
Definition Controls.hpp:103
double rhs_value
Definition Controls.hpp:110
ConditionVar lhs_var
Definition Controls.hpp:101
int expr_idx
Index into expressions_ (-1 if N/A)
Definition Controls.hpp:99
int lhs_idx
Object index (node/link/gage)
Definition Controls.hpp:102
bool is_expression
True if LHS is a math expression.
Definition Controls.hpp:98
ConditionVar rhs_var
Definition Controls.hpp:108
int rhs_idx
Definition Controls.hpp:109
bool rhs_is_variable
Definition Controls.hpp:107
LogicOp logic
Definition Controls.hpp:97
CompareOp op
Definition Controls.hpp:105
Definition Controls.hpp:155
std::string name
Definition Controls.hpp:156
double priority
Definition Controls.hpp:160
std::vector< Action > else_actions
Definition Controls.hpp:159
std::vector< Action > then_actions
Definition Controls.hpp:158
std::vector< Premise > premises
Definition Controls.hpp:157