3#ifndef __PERCEMON_AST_FUNCTIONS_HPP__
4#define __PERCEMON_AST_FUNCTIONS_HPP__
6#include "percemon/ast/primitives.hpp"
10namespace percemon::ast::functions {
12using namespace primitives;
19 enum Bound { OPEN, LOPEN, ROPEN, CLOSED };
39 enum Bound { OPEN, LOPEN, ROPEN, CLOSED };
65 ComparisonOp op = ComparisonOp::GE;
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.");
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;
86 throw std::invalid_argument(
87 "TimeBound (Var_x - C_TIME ~ c) cannot have == and != constraints.");
93 inline bool operator==(
const TimeBound& other)
const {
94 return (x == other.x) && (op == other.op) && (bound == other.bound);
97 inline bool operator!=(
const TimeBound& other)
const {
return !(*
this == other); };
118 ComparisonOp op = ComparisonOp::GE;
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.");
133 inline bool operator==(
const FrameBound& other)
const {
134 return (f == other.f) && (op == other.op) && (bound == other.bound);
137 inline bool operator!=(
const FrameBound& other)
const {
return !(*
this == other); };
149using TemporalBoundExpr = std::variant<TimeBound, FrameBound>;
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");
190 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)");
217 Prob(
Var_id id_,
double scale_ = 1.0) :
id{std::move(id_)}, scale{scale_} {}
219 Prob& operator*=(
const double rhs) {
223 friend Prob operator*(
const Prob& lhs,
const double rhs) {
224 return Prob{lhs.id, lhs.scale * rhs};
227 friend Prob operator*(
const double lhs,
const Prob& rhs) {
return rhs * lhs; }
233 std::variant<double, Prob> rhs;
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)");
266 ED(
Var_id id1_, CRT crt1_,
Var_id id2_, CRT crt2_,
double scale_ = 1.0) :
267 id1{std::move(id1_)},
269 id2{std::move(id2_)},
273 ED& operator*=(
const double rhs) {
277 friend ED operator*(
const ED& lhs,
const double rhs) {
278 return ED{lhs.id1, lhs.crt1, lhs.id2, lhs.crt2, lhs.scale * rhs};
281 friend ED operator*(
const double lhs,
const ED& rhs) {
return rhs * lhs; }
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");
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);
318 Lat(
Var_id id_, CRT crt_,
double scale_ = 1.0) :
319 id{std::move(id_)}, crt{crt_}, scale{scale_} {}
321 Lat& operator*=(
const double rhs) {
325 friend Lat operator*(
Lat lhs,
const double rhs) {
330 friend Lat operator*(
const double lhs,
const Lat& rhs) {
return rhs * lhs; }
339 Lon(
Var_id id_, CRT crt_,
double scale_ = 1.0) :
340 id{std::move(id_)}, crt{crt_}, scale{scale_} {}
342 Lon& operator*=(
const double rhs) {
346 friend Lon operator*(
Lon lhs,
const double rhs) {
351 friend Lon operator*(
const double lhs,
const Lon& rhs) {
return rhs * lhs; }
357 std::variant<double, Lat, Lon> rhs;
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)");
372 std::variant<double, Lat, Lon> rhs;
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)");
423 AreaOf(
Var_id id_,
double scale_ = 1.0) :
id{std::move(id_)}, scale{scale_} {}
425 AreaOf& operator*=(
const double rhs) {
429 friend AreaOf operator*(
const AreaOf& lhs,
const double rhs) {
430 return AreaOf{lhs.id, lhs.scale * rhs};
433 friend AreaOf operator*(
const double lhs,
const AreaOf& rhs) {
return rhs * lhs; }
439 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)");
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