12 const std::vector<Interval>& intervals,
14 const std::string& operation) {
18 normalized.error().code, normalized.error().message, operation);
21 std::vector<CheckedInterval> checked;
22 auto normalized_intervals = std::move(normalized.value());
23 checked.reserve(normalized_intervals.size());
24 for (
auto&
interval : normalized_intervals) {
43 lower.is_neg_infinity =
false;
44 lower.is_pos_infinity =
false;
52 upper.is_neg_infinity =
false;
53 upper.is_pos_infinity =
false;
58 int lower_order,
int upper_order) {
60 lower_order >= 0 ?
a.interval.lower :
b.interval.lower,
61 upper_order <= 0 ?
a.interval.upper :
b.interval.upper
63 if (lower_order == 0) {
64 candidate.lower.is_open =
a.interval.lower.is_open ||
b.interval.lower.is_open;
66 if (upper_order == 0) {
67 candidate.upper.is_open =
a.interval.upper.is_open ||
b.interval.upper.is_open;
74Result<IntervalUnion> IntervalUnion::intersect_checked(
75 const IntervalUnion& other,
76 ComputationContext&
context)
const {
77 constexpr const char* operation =
"interval_union_intersect";
78 auto left = checked_interval_views(intervals_,
context, operation);
87 const auto& a_intervals = left.value();
88 const auto& b_intervals =
right.value();
89 std::vector<Interval> result;
92 while (i < a_intervals.size() && j < b_intervals.size()) {
93 const auto&
a = a_intervals[i];
94 const auto&
b = b_intervals[j];
104 a,
b, lower_order.value(), upper_order.value());
108 empty.error().code, empty.error().message, operation);
110 if (!empty.value()) {
111 result.push_back(std::move(candidate));
114 if (upper_order.value() < 0) {
124 normalized.error().code, normalized.error().message, operation);
127 IntervalUnion::from_checked_normalized(std::move(normalized.value())));
131 const IntervalUnion& other)
const {
133 return intersect_checked(other,
context);
137 const IntervalUnion& other,
139 constexpr const char*
operation =
"interval_union_unite";
140 std::vector<Interval> all;
141 all.reserve(intervals_.size() + other.intervals_.size());
142 all.insert(all.end(), intervals_.begin(), intervals_.end());
143 all.insert(all.end(), other.intervals_.begin(), other.intervals_.end());
145 auto step =
context.consume_steps(all.size(), operation);
154 IntervalUnion::from_checked_normalized(std::move(normalized.value())));
158 const IntervalUnion& other)
const {
160 return unite_checked(other,
context);
165 constexpr const char*
operation =
"interval_union_complement";
170 const auto& intervals = checked.value();
172 if (intervals.empty()) {
174 IntervalUnion::from_checked_normalized({Interval::entire_line()}));
176 if (intervals.size() == 1 &&
177 intervals[0].interval.lower.is_neg_infinity &&
178 intervals[0].interval.upper.is_pos_infinity) {
182 std::vector<Interval> result;
183 const Interval& first = intervals.front().interval;
184 if (!first.lower.is_neg_infinity) {
185 result.push_back(Interval{
191 for (std::size_t i = 0; i + 1 < intervals.size(); ++i) {
192 const Interval& current = intervals[i].interval;
193 const Interval& next = intervals[i + 1].interval;
194 result.push_back(Interval{
200 const Interval& last = intervals.back().interval;
201 if (!last.upper.is_pos_infinity) {
202 result.push_back(Interval{
213 IntervalUnion::from_checked_normalized(std::move(normalized.value())));
218 return complement_checked(
context);
static Result failure(CasErrc code, std::string message, std::string operation={})
static Result success(T value)
Result< std::vector< CheckedInterval > > checked_interval_views(const std::vector< Interval > &intervals, ComputationContext &context, const std::string &operation)
Interval intersection_candidate(const CheckedInterval &a, const CheckedInterval &b, int lower_order, int upper_order)
Endpoint complement_lower_from_upper(const Endpoint &upper)
Endpoint complement_upper_from_lower(const Endpoint &lower)
Result< ComparableEndpoint > comparable_endpoint(const Endpoint &endpoint, ComputationContext &context, const std::string &operation)
ComputationContext const std::string & operation
Result< int > compare_comparable(const ComparableEndpoint &left, const ComparableEndpoint &right, ComputationContext &context)
Result< ComparableEndpoint > comparable_endpoint(const Endpoint &endpoint, ComputationContext &context, const std::string &operation)
__attribute__((visibility("default"))) ExprResult function(const std __attribute__((visibility("default"))) ExprResult finite_set(std ExprPtr upper
const std::vector< Polynomial< BigInt > > const BigInt ComputationContext & context
ExprResult interval(ExprPtr lower, ExprPtr upper, bool lower_closed, bool upper_closed)
Result< bool > interval_is_empty_checked(const Interval &interval, ComputationContext &context)
Result< std::vector< Interval > > normalize_intervals_checked(std::vector< Interval > intervals, ComputationContext &context)
__attribute__((visibility("default"))) VectorCalculusExprResult curve_integral_scalar_checked(const std __attribute__((visibility("default"))) VectorCalculusExprResult curve_integral_scalar_checked(const std __attribute__((visibility("default"))) std const VectorField const std::string const std::shared_ptr< SymbolicExpr > & a
Result< int > compare_comparable(const ComparableEndpoint &left, const ComparableEndpoint &right, ComputationContext &context)