PerceMon
functions.hpp
1#pragma once
2
3#ifndef __PERCEMON_AST_FUNCTIONS_HPP__
4#define __PERCEMON_AST_FUNCTIONS_HPP__
5
6#include "percemon/ast/primitives.hpp"
7
8#include <stdexcept>
9
10namespace percemon::ast::functions {
11
12using namespace primitives;
13
14// Primitive operations on Time/Frames
15
17 double low, high;
18
19 enum Bound { OPEN, LOPEN, ROPEN, CLOSED };
20 Bound bound;
21
22 static TimeInterval open(double low, double high) {
23 return TimeInterval{low, high, OPEN};
24 }
25 static TimeInterval lopen(double low, double high) {
26 return TimeInterval{low, high, LOPEN};
27 }
28 static TimeInterval ropen(double low, double high) {
29 return TimeInterval{low, high, ROPEN};
30 }
31 static TimeInterval closed(double low, double high) {
32 return TimeInterval{low, high, CLOSED};
33 }
34};
35
37 size_t low, high;
38
39 enum Bound { OPEN, LOPEN, ROPEN, CLOSED };
40 Bound bound;
41
42 static FrameInterval open(size_t low, size_t high) {
43 return FrameInterval{low, high, OPEN};
44 }
45 static FrameInterval lopen(size_t low, size_t high) {
46 return FrameInterval{low, high, LOPEN};
47 }
48 static FrameInterval ropen(size_t low, size_t high) {
49 return FrameInterval{low, high, ROPEN};
50 }
51 static FrameInterval closed(size_t low, size_t high) {
52 return FrameInterval{low, high, CLOSED};
53 }
54};
55
63struct TimeBound {
64 Var_x x;
65 ComparisonOp op = ComparisonOp::GE;
66 double bound = 0.0;
67
68 TimeBound() = delete;
70 Var_x x_,
71 const ComparisonOp op_ = ComparisonOp::GE,
72 const double bound_ = 0.0) :
73 x{std::move(x_)}, op{op_}, bound{bound_} {
74 if (op == ComparisonOp::EQ || op == ComparisonOp::NE) {
75 throw std::invalid_argument(
76 "TimeBound (Var_x - C_TIME ~ c) cannot have == and != constraints.");
77 }
78 if (bound_ <= 0.0) {
79 bound = -bound_;
80 switch (op_) {
81 case ComparisonOp::GE: op = ComparisonOp::LE; break;
82 case ComparisonOp::GT: op = ComparisonOp::LT; break;
83 case ComparisonOp::LE: op = ComparisonOp::GE; break;
84 case ComparisonOp::LT: op = ComparisonOp::GT; break;
85 default: {
86 throw std::invalid_argument(
87 "TimeBound (Var_x - C_TIME ~ c) cannot have == and != constraints.");
88 }
89 }
90 }
91 };
92
93 inline bool operator==(const TimeBound& other) const {
94 return (x == other.x) && (op == other.op) && (bound == other.bound);
95 };
96
97 inline bool operator!=(const TimeBound& other) const { return !(*this == other); };
98};
99TimeBound operator-(const Var_x& lhs, C_TIME);
100TimeBound operator>(const TimeBound& lhs, const double bound);
101TimeBound operator>=(const TimeBound& lhs, const double bound);
102TimeBound operator<(const TimeBound& lhs, const double bound);
103TimeBound operator<=(const TimeBound& lhs, const double bound);
104TimeBound operator>(const double bound, const TimeBound& rhs);
105TimeBound operator>=(const double bound, const TimeBound& rhs);
106TimeBound operator<(const double bound, const TimeBound& rhs);
107TimeBound operator<=(const double bound, const TimeBound& rhs);
108
117 Var_f f;
118 ComparisonOp op = ComparisonOp::GE;
119 size_t bound = 0;
120
121 FrameBound() = delete;
123 Var_f f_,
124 const ComparisonOp op_ = ComparisonOp::GE,
125 const size_t bound_ = 0) :
126 f{std::move(f_)}, op{op_}, bound{bound_} {
127 if (op == ComparisonOp::EQ || op == ComparisonOp::NE) {
128 throw std::invalid_argument(
129 "FrameBound (Var_f - C_FRAME ~ c) cannot have == and != constraints.");
130 }
131 };
132
133 inline bool operator==(const FrameBound& other) const {
134 return (f == other.f) && (op == other.op) && (bound == other.bound);
135 };
136
137 inline bool operator!=(const FrameBound& other) const { return !(*this == other); };
138};
139FrameBound operator-(const Var_f& lhs, C_FRAME);
140FrameBound operator>(const FrameBound& lhs, const size_t bound);
141FrameBound operator>=(const FrameBound& lhs, const size_t bound);
142FrameBound operator<(const FrameBound& lhs, const size_t bound);
143FrameBound operator<=(const FrameBound& lhs, const size_t bound);
144FrameBound operator>(const size_t bound, const FrameBound& rhs);
145FrameBound operator>=(const size_t bound, const FrameBound& rhs);
146FrameBound operator<(const size_t bound, const FrameBound& rhs);
147FrameBound operator<=(const size_t bound, const FrameBound& rhs);
148
149using TemporalBoundExpr = std::variant<TimeBound, FrameBound>;
150
151// Some primitive operations on IDs
152
156struct CompareId {
157 Var_id lhs;
158 ComparisonOp op;
159 Var_id rhs;
160
161 CompareId() = delete;
162 CompareId(Var_id lhs_, ComparisonOp op_, Var_id rhs_) :
163 lhs{std::move(lhs_)}, op{op_}, rhs{std::move(rhs_)} {
164 if (op != ComparisonOp::EQ && op != ComparisonOp::NE) {
165 throw std::invalid_argument(
166 "Cannot use relational operators <, >, <=, >= to compare Var_id");
167 }
168 };
169};
170CompareId operator==(const Var_id& lhs, const Var_id& rhs);
171CompareId operator!=(const Var_id& lhs, const Var_id& rhs);
172
176struct Class {
177 Var_id id;
178
179 Class() = delete;
180 Class(Var_id id_) : id{std::move(id_)} {}
181};
182
188 Class lhs;
189 ComparisonOp op;
190 std::variant<int, Class> rhs;
191
192 CompareClass() = delete;
193 CompareClass(Class lhs_, ComparisonOp op_, std::variant<int, Class> rhs_) :
194 lhs{std::move(lhs_)}, op{op_}, rhs{std::move(rhs_)} {
195 if (op != ComparisonOp::EQ && op != ComparisonOp::NE) {
196 throw std::invalid_argument(
197 "Cannot use relational operators <, >, <=, >= to compare Class(id)");
198 }
199 };
200};
201CompareClass operator==(const Class& lhs, const int rhs);
202CompareClass operator==(const int lhs, const Class& rhs);
203CompareClass operator==(const Class& lhs, const Class& rhs);
204CompareClass operator!=(const Class& lhs, const int rhs);
205CompareClass operator!=(const int lhs, const Class& rhs);
206CompareClass operator!=(const Class& lhs, const Class& rhs);
207
212struct Prob {
213 Var_id id;
214 double scale = 1.0;
215
216 Prob() = delete;
217 Prob(Var_id id_, double scale_ = 1.0) : id{std::move(id_)}, scale{scale_} {}
218
219 Prob& operator*=(const double rhs) {
220 this->scale *= rhs;
221 return *this;
222 };
223 friend Prob operator*(const Prob& lhs, const double rhs) {
224 return Prob{lhs.id, lhs.scale * rhs};
225 }
226
227 friend Prob operator*(const double lhs, const Prob& rhs) { return rhs * lhs; }
228};
229
231 Prob lhs;
232 ComparisonOp op;
233 std::variant<double, Prob> rhs;
234
235 CompareProb() = delete;
236 CompareProb(Prob lhs_, ComparisonOp op_, std::variant<double, Prob> rhs_) :
237 lhs{std::move(lhs_)}, op{op_}, rhs{std::move(rhs_)} {
238 if (op == ComparisonOp::EQ || op == ComparisonOp::NE) {
239 throw std::invalid_argument(
240 "Cannot use relational operators ==, != to compare Prob(id)");
241 }
242 };
243};
244CompareProb operator>(const Prob& lhs, const double rhs);
245CompareProb operator>=(const Prob& lhs, const double rhs);
246CompareProb operator<(const Prob& lhs, const double rhs);
247CompareProb operator<=(const Prob& lhs, const double rhs);
248CompareProb operator>(const Prob& lhs, const Prob& rhs);
249CompareProb operator>=(const Prob& lhs, const Prob& rhs);
250CompareProb operator<(const Prob& lhs, const Prob& rhs);
251CompareProb operator<=(const Prob& lhs, const Prob& rhs);
252
253// Spatial primitive operations
254struct BBox {
255 Var_id id;
256};
257
258struct ED {
259 Var_id id1;
260 CRT crt1;
261 Var_id id2;
262 CRT crt2;
263 double scale = 1.0;
264
265 ED() = delete;
266 ED(Var_id id1_, CRT crt1_, Var_id id2_, CRT crt2_, double scale_ = 1.0) :
267 id1{std::move(id1_)},
268 crt1{crt1_},
269 id2{std::move(id2_)},
270 crt2{crt2_},
271 scale{scale_} {}
272
273 ED& operator*=(const double rhs) {
274 this->scale *= rhs;
275 return *this;
276 };
277 friend ED operator*(const ED& lhs, const double rhs) {
278 return ED{lhs.id1, lhs.crt1, lhs.id2, lhs.crt2, lhs.scale * rhs};
279 }
280
281 friend ED operator*(const double lhs, const ED& rhs) { return rhs * lhs; }
282};
283
284struct CompareED {
285 ED lhs;
286 ComparisonOp op;
287 double rhs;
288
289 CompareED() = delete;
290 CompareED(ED lhs_, ComparisonOp op_, double rhs_) :
291 lhs{std::move(lhs_)}, op{op_}, rhs{rhs_} {
292 if (op == ComparisonOp::EQ || op == ComparisonOp::NE) {
293 throw std::invalid_argument(
294 "Cannot use relational operators ==, != to compare Euclidean Distance");
295 }
296 };
297};
298
299CompareED operator>(const ED& lhs, const double rhs);
300CompareED operator>=(const ED& lhs, const double rhs);
301CompareED operator<(const ED& lhs, const double rhs);
302CompareED operator<=(const ED& lhs, const double rhs);
303CompareED operator>(const double lhs, const ED& rhs);
304CompareED operator>=(const double lhs, const ED& rhs);
305CompareED operator<(const double lhs, const ED& rhs);
306CompareED operator<=(const double lhs, const ED& rhs);
307CompareED operator>(const ED& lhs, const ED& rhs);
308CompareED operator>=(const ED& lhs, const ED& rhs);
309CompareED operator<(const ED& lhs, const ED& rhs);
310CompareED operator<=(const ED& lhs, const ED& rhs);
311
312struct Lat {
313 Var_id id;
314 CRT crt;
315 double scale = 1.0;
316
317 Lat() = delete;
318 Lat(Var_id id_, CRT crt_, double scale_ = 1.0) :
319 id{std::move(id_)}, crt{crt_}, scale{scale_} {}
320
321 Lat& operator*=(const double rhs) {
322 this->scale *= rhs;
323 return *this;
324 };
325 friend Lat operator*(Lat lhs, const double rhs) {
326 lhs *= rhs;
327 return lhs;
328 }
329
330 friend Lat operator*(const double lhs, const Lat& rhs) { return rhs * lhs; }
331};
332
333struct Lon {
334 Var_id id;
335 CRT crt;
336 double scale = 1.0;
337
338 Lon() = delete;
339 Lon(Var_id id_, CRT crt_, double scale_ = 1.0) :
340 id{std::move(id_)}, crt{crt_}, scale{scale_} {}
341
342 Lon& operator*=(const double rhs) {
343 this->scale *= rhs;
344 return *this;
345 };
346 friend Lon operator*(Lon lhs, const double rhs) {
347 lhs *= rhs;
348 return lhs;
349 }
350
351 friend Lon operator*(const double lhs, const Lon& rhs) { return rhs * lhs; }
352};
353
355 Lat lhs;
356 ComparisonOp op;
357 std::variant<double, Lat, Lon> rhs;
358
359 CompareLat() = delete;
360 CompareLat(Lat lhs_, ComparisonOp op_, std::variant<double, Lat, Lon> rhs_) :
361 lhs{std::move(lhs_)}, op{op_}, rhs{std::move(rhs_)} {
362 if (op == ComparisonOp::EQ || op == ComparisonOp::NE) {
363 throw std::invalid_argument(
364 "Cannot use relational operators ==, != to compare Lat(id)");
365 }
366 };
367};
368
370 Lon lhs;
371 ComparisonOp op;
372 std::variant<double, Lat, Lon> rhs;
373
374 CompareLon() = delete;
375 CompareLon(Lon lhs_, ComparisonOp op_, std::variant<double, Lat, Lon> rhs_) :
376 lhs{std::move(lhs_)}, op{op_}, rhs{std::move(rhs_)} {
377 if (op == ComparisonOp::EQ || op == ComparisonOp::NE) {
378 throw std::invalid_argument(
379 "Cannot use relational operators ==, != to compare Lon(id)");
380 }
381 };
382};
383
384CompareLat operator>(const double lhs, const Lat& rhs);
385CompareLat operator>=(const double lhs, const Lat& rhs);
386CompareLat operator<(const double lhs, const Lat& rhs);
387CompareLat operator<=(const double lhs, const Lat& rhs);
388CompareLat operator>(const Lat& lhs, const double rhs);
389CompareLat operator>=(const Lat& lhs, const double rhs);
390CompareLat operator<(const Lat& lhs, const double rhs);
391CompareLat operator<=(const Lat& lhs, const double rhs);
392CompareLat operator>(const Lat& lhs, const Lat& rhs);
393CompareLat operator>=(const Lat& lhs, const Lat& rhs);
394CompareLat operator<(const Lat& lhs, const Lat& rhs);
395CompareLat operator<=(const Lat& lhs, const Lat& rhs);
396CompareLat operator>(const Lat& lhs, const Lon& rhs);
397CompareLat operator>=(const Lat& lhs, const Lon& rhs);
398CompareLat operator<(const Lat& lhs, const Lon& rhs);
399CompareLat operator<=(const Lat& lhs, const Lon& rhs);
400
401CompareLon operator>(const double lhs, const Lon& rhs);
402CompareLon operator>=(const double lhs, const Lon& rhs);
403CompareLon operator<(const double lhs, const Lon& rhs);
404CompareLon operator<=(const double lhs, const Lon& rhs);
405CompareLon operator>(const Lon& lhs, const double rhs);
406CompareLon operator>=(const Lon& lhs, const double rhs);
407CompareLon operator<(const Lon& lhs, const double rhs);
408CompareLon operator<=(const Lon& lhs, const double rhs);
409CompareLon operator>(const Lon& lhs, const Lon& rhs);
410CompareLon operator>=(const Lon& lhs, const Lon& rhs);
411CompareLon operator<(const Lon& lhs, const Lon& rhs);
412CompareLon operator<=(const Lon& lhs, const Lon& rhs);
413CompareLon operator>(const Lon& lhs, const Lat& rhs);
414CompareLon operator>=(const Lon& lhs, const Lat& rhs);
415CompareLon operator<(const Lon& lhs, const Lat& rhs);
416CompareLon operator<=(const Lon& lhs, const Lat& rhs);
417
418struct AreaOf {
419 Var_id id;
420 double scale = 1.0;
421
422 AreaOf() = delete;
423 AreaOf(Var_id id_, double scale_ = 1.0) : id{std::move(id_)}, scale{scale_} {}
424
425 AreaOf& operator*=(const double rhs) {
426 this->scale *= rhs;
427 return *this;
428 };
429 friend AreaOf operator*(const AreaOf& lhs, const double rhs) {
430 return AreaOf{lhs.id, lhs.scale * rhs};
431 }
432
433 friend AreaOf operator*(const double lhs, const AreaOf& rhs) { return rhs * lhs; }
434};
435
437 AreaOf lhs;
438 ComparisonOp op;
439 std::variant<double, AreaOf> rhs;
440
441 CompareArea() = delete;
442 CompareArea(AreaOf lhs_, ComparisonOp op_, std::variant<double, AreaOf> rhs_) :
443 lhs{std::move(lhs_)}, op{op_}, rhs{std::move(rhs_)} {
444 if (op == ComparisonOp::EQ || op == ComparisonOp::NE) {
445 throw std::invalid_argument(
446 "Cannot use relational operators ==, != to compare AreaOf(id)");
447 }
448 };
449};
450CompareArea operator>(const AreaOf& lhs, const double rhs);
451CompareArea operator>=(const AreaOf& lhs, const double rhs);
452CompareArea operator<(const AreaOf& lhs, const double rhs);
453CompareArea operator<=(const AreaOf& lhs, const double rhs);
454CompareArea operator>(const double lhs, const AreaOf& rhs);
455CompareArea operator>=(const double lhs, const AreaOf& rhs);
456CompareArea operator<(const double lhs, const AreaOf& rhs);
457CompareArea operator<=(const double lhs, const AreaOf& rhs);
458CompareArea operator>(const AreaOf& lhs, const AreaOf& rhs);
459CompareArea operator>=(const AreaOf& lhs, const AreaOf& rhs);
460CompareArea operator<(const AreaOf& lhs, const AreaOf& rhs);
461CompareArea operator<=(const AreaOf& lhs, const AreaOf& rhs);
462
463} // namespace percemon::ast::functions
464
465#endif /* end of include guard: __PERCEMON_AST_FUNCTIONS_HPP__ */
Definition: functions.hpp:418
Definition: functions.hpp:254
Definition: functions.hpp:176
Definition: functions.hpp:436
Definition: functions.hpp:187
Definition: functions.hpp:284
Definition: functions.hpp:156
Definition: functions.hpp:354
Definition: functions.hpp:369
Definition: functions.hpp:230
Definition: functions.hpp:258
Definition: functions.hpp:116
Definition: functions.hpp:36
Definition: functions.hpp:312
Definition: functions.hpp:333
Definition: functions.hpp:212
Definition: functions.hpp:63
Definition: functions.hpp:16
Definition: primitives.hpp:40
Definition: primitives.hpp:36
Definition: primitives.hpp:45
Definition: primitives.hpp:71
Definition: primitives.hpp:58