random_test.cpp
Go to the documentation of this file.
1 //=============================================================================
2 // Copyright (C) 2021-2024 Wageningen University - All Rights Reserved
3 // Author: Gonzalo Mier
4 // BSD-3 License
5 //=============================================================================
6 
7 #include <gtest/gtest.h>
9 #include "fields2cover/types.h"
10 
11 TEST(fields2cover_utils_Random, init) {
12  f2c::Random rand1(1);
13  double d1 = rand1.getRandomDouble();
14  double d2 = rand1.getRandomDouble();
15  EXPECT_NE(d1, d2);
16 
17  f2c::Random rand2(rand1);
18  d1 = rand1.getRandomDouble();
19  d2 = rand2.getRandomDouble();
20  EXPECT_EQ(d1, d2);
21 
22  f2c::Random rand3 {rand1};
23  d1 = rand1.getRandomDouble();
24  d2 = rand3.getRandomDouble();
25  EXPECT_EQ(d1, d2);
26 
27  rand2 = rand1;
28  d1 = rand1.getRandomDouble();
29  d2 = rand2.getRandomDouble();
30  EXPECT_EQ(d1, d2);
31 
32  std::vector<f2c::Random> v_rand {rand1, rand2, rand3};
33 
34 
35  for (auto&& r : v_rand) {
36  auto r2 = r;
37  d1 = r.getRandomDouble();
38  d2 = r2.getRandomDouble();
39  EXPECT_EQ(d1, d2);
40 
41  f2c::Random r3 = r;
42  d1 = r.getRandomDouble();
43  d2 = r3.getRandomDouble();
44  EXPECT_EQ(d1, d2);
45  }
46 }
47 
48 
49 TEST(fields2cover_utils_Random, get_angle_random) {
51  auto rand_val {0.0};
52  auto two_pi = boost::math::constants::two_pi<double>();
53  for (int i = 0; i < 10000; ++i) {
54  rand_val = rand.getAngleRandom();
55  EXPECT_LT( rand_val, two_pi);
56  EXPECT_GE( rand_val, 0.0);
57  }
58 }
59 
60 TEST(fields2cover_utils_Random, get_random_double) {
62  const int N = 10000;
63  double sum_val {0.0};
64  for (int i = 0; i < N; ++i) {
65  auto rand_val = rand.getRandomDouble();
66  EXPECT_LT( rand_val, 1.0);
67  EXPECT_GT( rand_val, 0.0);
68  sum_val += rand_val;
69  }
70  EXPECT_NEAR(sum_val, N/2, N/10);
71 
72 }
73 
74 TEST(fields2cover_utils_Random, get_linear_random) {
76  auto rand_val {0.0};
77  for (int i = 0; i < 10000; ++i) {
78  double max_rand = rand.getRandomDouble();
79  double min_rand = rand.getRandomDouble() - 1.0;
80  rand_val = rand.getRandomLinear(min_rand, max_rand);
81  EXPECT_LT( rand_val, max_rand);
82  EXPECT_GE( rand_val, min_rand);
83  }
84 }
85 
86 TEST(fields2cover_utils_Random, get_exp_random) {
87  f2c::Random rand (42);
88  auto rand_val {0.0};
89  for (int i = 0; i < 100; ++i) {
90  double max_rand = rand.getRandomDouble() + 1.5;
91  double min_rand = rand.getRandomDouble() + 0.5;
92  rand_val = rand.getRandomExp(min_rand, max_rand);
93  EXPECT_LT( rand_val, max_rand);
94  EXPECT_GE( rand_val, min_rand);
95  }
96 }
97 
98 TEST(fields2cover_utils_Random, get_random_exp_dist) {
99  f2c::Random rand (42);
100  size_t count0To1 = 0;
101  size_t count1To2 = 0;
102  size_t count2To3 = 0;
103  size_t count3To4 = 0;
104  size_t count4ToInf = 0;
105  size_t n = 1e4;
106  for (size_t i = 0; i < n; ++i) {
107  auto d = rand.getRandomExpDist(1.0);
108  EXPECT_GE(d, 0.0);
109  if (d <= 1) {
110  ++count0To1;
111  } else if (d <= 2.0) {
112  ++count1To2;
113  } else if (d <= 3.0) {
114  ++count2To3;
115  } else if (d <= 4.0) {
116  ++count3To4;
117  } else {
118  ++count4ToInf;
119  }
120  }
121  EXPECT_EQ(n, count0To1 + count1To2 + count2To3 + count3To4 + count4ToInf);
122  EXPECT_GT(count0To1, count1To2);
123  EXPECT_GT(count1To2, count2To3);
124  EXPECT_GT(count2To3, count3To4);
125  EXPECT_GT(count3To4, count4ToInf);
126 }
127 
128 
129 TEST(fields2cover_utils_Random, mod_2pi) {
130  const double two_pi {boost::math::constants::two_pi<double>()};
131  for (double i = 0.01; i < 100.0; i += 0.1) {
132  auto ang = i;
133  EXPECT_NEAR(fmod(ang, two_pi), F2CPoint::mod_2pi(ang), 1e-3);
134  EXPECT_EQ(i, ang);
135  EXPECT_NEAR(fmod(1e5 * two_pi - i, two_pi),
136  F2CPoint::mod_2pi(-i), 1e-3);
137  }
138 }
139 
140 TEST(fields2cover_utils_Random, genRandField) {
142  auto field = rand.generateRandField(1e2, 4);
143  EXPECT_NEAR(field.area(), 1e2 , 1e-6);
144  EXPECT_THROW(rand.generateRandField(1e2, -2), std::invalid_argument);
145  EXPECT_THROW(rand.generateRandField(1e2, 0), std::invalid_argument);
146  EXPECT_THROW(rand.generateRandField(1e2, 2), std::invalid_argument);
147  EXPECT_THROW(rand.generateRandField(-1e2, 6), std::invalid_argument);
148 }
149 
150 TEST(fields2cover_utils_Random, isConvex) {
151  f2c::Random rand(4);
152  int n {100};
153  auto field = rand.generateRandField(1e2, 3);
154  auto poly = field.getField().getCell(0);
155  int convex_fields {0}, non_convex_fields {0};
156  for (int i = 0; i < n; ++i) {
157  field = rand.genConvexField(1e2);
158  if (field.getField().isConvex()) {
159  ++convex_fields;
160  }
161  }
162  EXPECT_GT(static_cast<double>(convex_fields) / n, 0.9999);
163 
164  for (int i = 0; i < n; ++i) {
165  field = rand.genNonConvexField(1e2);
166  if (!field.getField().isConvex()) {
167  ++non_convex_fields;
168  }
169  }
170  EXPECT_GT(static_cast<double>(non_convex_fields) / n, 0.9999);
171 
172  EXPECT_FALSE(F2CCell().isConvex());
173 }
174 
175 
176 
types.h
TEST
TEST(fields2cover_utils_Random, init)
Definition: random_test.cpp:11
F2CCell
f2c::types::Cell F2CCell
Definition: types.h:43
3_headland_generator.rand
rand
Definition: 3_headland_generator.py:11
f2c::Random::getRandomDouble
double getRandomDouble()
Definition: random.cpp:18
random.h
f2c::types::Geometry< OGRPoint, wkbPoint >::mod_2pi
static double mod_2pi(double val)
Definition: Geometry_impl.hpp:174
f2c::Random
Definition: random.h:23
2_objective_functions.field
field
Definition: 2_objective_functions.py:16


fields2cover
Author(s):
autogenerated on Fri Apr 25 2025 02:18:31