AutoPas  3.0.0
Loading...
Searching...
No Matches
NumberInterval.h
Go to the documentation of this file.
1
7#pragma once
8#include "NumberSet.h"
9
10namespace autopas {
14template <class Number>
15class NumberInterval final : public NumberSet<Number> {
16 public:
20 NumberInterval() : _min(0.), _max(0.) {}
25 NumberInterval(Number val) : _min(val), _max(val) {}
31 NumberInterval(Number min, Number max) : _min(min), _max(max) {
32 if (min > max) {
33 utils::ExceptionHandler::exception("NumberInterval: Invalid interval [{}, {}]", _min, _max);
34 }
35 }
36
37 std::unique_ptr<NumberSet<Number>> clone() const override { return std::make_unique<NumberInterval>(*this); }
38
44 inline void resetValues(const std::set<Number> &numbers) override {
45 if (numbers.size() == 1) {
46 _min = *numbers.begin();
47 _max = *numbers.begin();
48 } else if (numbers.size() == 2) {
49 _min = std::min(*numbers.begin(), *++numbers.begin());
50 _max = std::max(*numbers.begin(), *++numbers.begin());
51
52 } else {
54 "NumberInterval::resetValues: NumberInterval constructor takes exactly"
55 " one or two values");
56 }
57 }
58
59 std::string to_string() const override {
60 std::ostringstream ss;
61 ss << _min << "-" << _max;
62 return ss.str();
63 }
64
65 inline bool isEmpty() const override { return false; }
66 inline bool isFinite() const override { return _max == _min; }
67 inline bool isInterval() const override { return true; }
68 size_t size() const override {
69 if (isFinite()) return 1ul;
70
71 utils::ExceptionHandler::exception("NumberInterval.size: Interval is not finite [{}, {}]", _min, _max);
72 return 0ul;
73 }
74
75 inline Number getMin() const override { return _min; }
76 inline Number getMax() const override { return _max; }
77
78 std::set<Number> getAll() const override {
79 if (isFinite()) return {_min};
80
81 utils::ExceptionHandler::exception("NumberInterval.getAll: Interval is not finite [{}, {}]", _min, _max);
82 return {};
83 }
84
85 inline Number getRandom(Random &rng) const override {
86 std::uniform_real_distribution<Number> distr(_min, _max);
87 return distr(rng);
88 }
89 std::vector<Number> uniformSample(size_t n, Random &rng) const override {
90 std::vector<Number> result;
91 if (n == 0) {
92 return result;
93 } else if (n == 1) {
94 // if only one sample choose middle
95 result.reserve(1);
96 result.push_back((_max + _min) / 2);
97 return result;
98 }
99
100 result.reserve(n);
101
102 Number distance = (_max - _min) / (n - 1);
103 for (size_t i = 0; i < (n - 1); ++i) {
104 result.push_back(_min + distance * i);
105 }
106 // add max separately, avoiding possible rounding errors
107 result.push_back(_max);
108
109 // randomize the sample
110 std::shuffle(std::begin(result), std::end(result), rng);
111
112 return result;
113 }
114
115 std::set<Number> uniformSampleSet(size_t n, Random &rng) const override {
116 std::set<Number> result;
117 if (n == 0) {
118 return result;
119 } else if (isFinite()) {
120 result.insert(_min);
121 return result;
122 } else if (n == 1) {
123 // if only one sample choose median
124 result.insert(getMedian());
125 return result;
126 }
127
128 Number distance = (_max - _min) / (n - 1);
129 for (size_t i = 0; i < (n - 1); ++i) {
130 result.insert(_min + distance * i);
131 }
132 // add max separately, avoiding possible rounding errors
133 result.insert(_max);
134
135 return result;
136 }
137
138 Number getMedian() const override { return (_max + _min) / 2; }
139
140 bool operator==(const NumberSet<Number> &rhs) const override {
141 return this->isInterval() == rhs.isInterval() and this->_min == rhs.getMin() and this->_max == rhs.getMax();
142 }
143
149 bool overlaps(const NumberInterval<Number> &other) const { return (_min <= other._max) and (_max >= other._min); }
150
156 bool includes(const NumberInterval<Number> &other) const { return (_min <= other._min) and (_max >= other._max); }
157
158 private:
159 Number _min;
160 Number _max;
161};
162} // namespace autopas
Class describing an interval.
Definition: NumberInterval.h:15
bool isEmpty() const override
Indicates if the set is empty.
Definition: NumberInterval.h:65
bool includes(const NumberInterval< Number > &other) const
Check if the other interval is fully included in this interval.
Definition: NumberInterval.h:156
std::unique_ptr< NumberSet< Number > > clone() const override
Create a copy of a NumberSet.
Definition: NumberInterval.h:37
void resetValues(const std::set< Number > &numbers) override
Setter for NumberInterval.
Definition: NumberInterval.h:44
Number getMin() const override
Get the smallest number in the set.
Definition: NumberInterval.h:75
Number getMedian() const override
Get the median of the set.
Definition: NumberInterval.h:138
bool operator==(const NumberSet< Number > &rhs) const override
Comparison operator.
Definition: NumberInterval.h:140
bool isInterval() const override
Function to distinguish between NumberSetFinite and NumberInterval.
Definition: NumberInterval.h:67
NumberInterval()
Default Constructor: Create a range which only contains 0.
Definition: NumberInterval.h:20
std::set< Number > uniformSampleSet(size_t n, Random &rng) const override
Sample up to n points from the set.
Definition: NumberInterval.h:115
NumberInterval(Number val)
Create a range which only contains given value.
Definition: NumberInterval.h:25
size_t size() const override
Get size of set.
Definition: NumberInterval.h:68
std::set< Number > getAll() const override
Get all numbers in the set.
Definition: NumberInterval.h:78
Number getMax() const override
Get the largest number in the set.
Definition: NumberInterval.h:76
bool overlaps(const NumberInterval< Number > &other) const
Check if this and another interval overlap.
Definition: NumberInterval.h:149
std::vector< Number > uniformSample(size_t n, Random &rng) const override
Sample n points from the set.
Definition: NumberInterval.h:89
bool isFinite() const override
Indicates if the set is finite.
Definition: NumberInterval.h:66
NumberInterval(Number min, Number max)
Create a range with given bounds.
Definition: NumberInterval.h:31
std::string to_string() const override
Get a string representation of the set.
Definition: NumberInterval.h:59
Number getRandom(Random &rng) const override
Get a random number in the set.
Definition: NumberInterval.h:85
Virtual class describing a finite or infinite set of numbers.
Definition: NumberSet.h:22
virtual Number getMin() const =0
Get the smallest number in the set.
virtual Number getMax() const =0
Get the largest number in the set.
virtual bool isInterval() const =0
Function to distinguish between NumberSetFinite and NumberInterval.
Class for random algorithms.
Definition: Random.h:22
static void exception(const Exception e)
Handle an exception derived by std::exception.
Definition: ExceptionHandler.h:63
This is the main namespace of AutoPas.
Definition: AutoPasDecl.h:32