Spaces:
Runtime error
Runtime error
Delete ag4masses/alphageometry/numericals_test.py
Browse files
ag4masses/alphageometry/numericals_test.py
DELETED
|
@@ -1,313 +0,0 @@
|
|
| 1 |
-
# Copyright 2023 DeepMind Technologies Limited
|
| 2 |
-
#
|
| 3 |
-
# Licensed under the Apache License, Version 2.0 (the "License");
|
| 4 |
-
# you may not use this file except in compliance with the License.
|
| 5 |
-
# You may obtain a copy of the License at
|
| 6 |
-
#
|
| 7 |
-
# http://www.apache.org/licenses/LICENSE-2.0
|
| 8 |
-
#
|
| 9 |
-
# Unless required by applicable law or agreed to in writing, software
|
| 10 |
-
# distributed under the License is distributed on an "AS IS" BASIS,
|
| 11 |
-
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
| 12 |
-
# See the License for the specific language governing permissions and
|
| 13 |
-
# limitations under the License.
|
| 14 |
-
# ==============================================================================
|
| 15 |
-
|
| 16 |
-
"""Unit testing for the geometry numericals code."""
|
| 17 |
-
|
| 18 |
-
import unittest
|
| 19 |
-
|
| 20 |
-
from absl.testing import absltest
|
| 21 |
-
import numericals as nm
|
| 22 |
-
|
| 23 |
-
np = nm.np
|
| 24 |
-
|
| 25 |
-
unif = nm.unif
|
| 26 |
-
Point = nm.Point
|
| 27 |
-
Line = nm.Line
|
| 28 |
-
Circle = nm.Circle
|
| 29 |
-
HalfLine = nm.HalfLine
|
| 30 |
-
|
| 31 |
-
line_circle_intersection = nm.line_circle_intersection
|
| 32 |
-
line_line_intersection = nm.line_line_intersection
|
| 33 |
-
|
| 34 |
-
check_coll = nm.check_coll
|
| 35 |
-
check_eqangle = nm.check_eqangle
|
| 36 |
-
|
| 37 |
-
random_points = nm.random_points
|
| 38 |
-
ang_between = nm.ang_between
|
| 39 |
-
head_from = nm.head_from
|
| 40 |
-
|
| 41 |
-
|
| 42 |
-
class NumericalTest(unittest.TestCase):
|
| 43 |
-
|
| 44 |
-
def test_sketch_ieq_triangle(self):
|
| 45 |
-
a, b, c = nm.sketch_ieq_triangle([])
|
| 46 |
-
self.assertAlmostEqual(a.distance(b), b.distance(c))
|
| 47 |
-
self.assertAlmostEqual(c.distance(a), b.distance(c))
|
| 48 |
-
|
| 49 |
-
def test_sketch_2l1c(self):
|
| 50 |
-
p = nm.Point(0.0, 0.0)
|
| 51 |
-
pi = np.pi
|
| 52 |
-
anga = unif(-0.4 * pi, 0.4 * pi)
|
| 53 |
-
a = Point(np.cos(anga), np.sin(anga))
|
| 54 |
-
angb = unif(0.6 * pi, 1.4 * pi)
|
| 55 |
-
b = Point(np.cos(angb), np.sin(angb))
|
| 56 |
-
|
| 57 |
-
angc = unif(anga + 0.05 * pi, angb - 0.05 * pi)
|
| 58 |
-
c = Point(np.cos(angc), np.sin(angc)) * unif(0.2, 0.8)
|
| 59 |
-
|
| 60 |
-
x, y, z, i = nm.sketch_2l1c([a, b, c, p])
|
| 61 |
-
self.assertTrue(check_coll([x, c, a]))
|
| 62 |
-
self.assertTrue(check_coll([y, c, b]))
|
| 63 |
-
self.assertAlmostEqual(z.distance(p), 1.0)
|
| 64 |
-
self.assertTrue(check_coll([p, i, z]))
|
| 65 |
-
self.assertTrue(Line(i, x).is_perp(Line(c, a)))
|
| 66 |
-
self.assertTrue(Line(i, y).is_perp(Line(c, b)))
|
| 67 |
-
self.assertAlmostEqual(i.distance(x), i.distance(y))
|
| 68 |
-
self.assertAlmostEqual(i.distance(x), i.distance(z))
|
| 69 |
-
|
| 70 |
-
def test_sketch_3peq(self):
|
| 71 |
-
a, b, c = random_points(3)
|
| 72 |
-
x, y, z = nm.sketch_3peq([a, b, c])
|
| 73 |
-
|
| 74 |
-
self.assertTrue(check_coll([a, b, x]))
|
| 75 |
-
self.assertTrue(check_coll([a, c, y]))
|
| 76 |
-
self.assertTrue(check_coll([b, c, z]))
|
| 77 |
-
self.assertTrue(check_coll([x, y, z]))
|
| 78 |
-
self.assertAlmostEqual(z.distance(x), z.distance(y))
|
| 79 |
-
|
| 80 |
-
def test_sketch_aline(self):
|
| 81 |
-
a, b, c, d, e = random_points(5)
|
| 82 |
-
ex = nm.sketch_aline([a, b, c, d, e])
|
| 83 |
-
self.assertIsInstance(ex, HalfLine)
|
| 84 |
-
self.assertEqual(ex.tail, e)
|
| 85 |
-
x = ex.head
|
| 86 |
-
self.assertAlmostEqual(ang_between(b, a, c), ang_between(e, d, x))
|
| 87 |
-
|
| 88 |
-
def test_sketch_amirror(self):
|
| 89 |
-
a, b, c = random_points(3)
|
| 90 |
-
bx = nm.sketch_amirror([a, b, c])
|
| 91 |
-
self.assertIsInstance(bx, HalfLine)
|
| 92 |
-
assert bx.tail == b
|
| 93 |
-
x = bx.head
|
| 94 |
-
|
| 95 |
-
ang1 = ang_between(b, a, c)
|
| 96 |
-
ang2 = ang_between(b, c, x)
|
| 97 |
-
self.assertAlmostEqual(ang1, ang2)
|
| 98 |
-
|
| 99 |
-
def test_sketch_bisect(self):
|
| 100 |
-
a, b, c = random_points(3)
|
| 101 |
-
line = nm.sketch_bisect([a, b, c])
|
| 102 |
-
self.assertAlmostEqual(b.distance(line), 0.0)
|
| 103 |
-
|
| 104 |
-
l = a.perpendicular_line(line)
|
| 105 |
-
x = line_line_intersection(l, Line(b, c))
|
| 106 |
-
self.assertAlmostEqual(a.distance(line), x.distance(line))
|
| 107 |
-
|
| 108 |
-
d, _ = line_circle_intersection(line, Circle(b, radius=1))
|
| 109 |
-
ang1 = ang_between(b, a, d)
|
| 110 |
-
ang2 = ang_between(b, d, c)
|
| 111 |
-
self.assertAlmostEqual(ang1, ang2)
|
| 112 |
-
|
| 113 |
-
def test_sketch_bline(self):
|
| 114 |
-
a, b = random_points(2)
|
| 115 |
-
l = nm.sketch_bline([a, b])
|
| 116 |
-
self.assertTrue(Line(a, b).is_perp(l))
|
| 117 |
-
self.assertAlmostEqual(a.distance(l), b.distance(l))
|
| 118 |
-
|
| 119 |
-
def test_sketch_cc_tangent(self):
|
| 120 |
-
o = Point(0.0, 0.0)
|
| 121 |
-
w = Point(1.0, 0.0)
|
| 122 |
-
|
| 123 |
-
ra = unif(0.0, 0.6)
|
| 124 |
-
rb = unif(0.4, 1.0)
|
| 125 |
-
|
| 126 |
-
a = unif(0.0, np.pi)
|
| 127 |
-
b = unif(0.0, np.pi)
|
| 128 |
-
|
| 129 |
-
a = o + ra * Point(np.cos(a), np.sin(a))
|
| 130 |
-
b = w + rb * Point(np.sin(b), np.cos(b))
|
| 131 |
-
|
| 132 |
-
x, y, z, t = nm.sketch_cc_tangent([o, a, w, b])
|
| 133 |
-
xy = Line(x, y)
|
| 134 |
-
zt = Line(z, t)
|
| 135 |
-
self.assertAlmostEqual(o.distance(xy), o.distance(a))
|
| 136 |
-
self.assertAlmostEqual(o.distance(zt), o.distance(a))
|
| 137 |
-
self.assertAlmostEqual(w.distance(xy), w.distance(b))
|
| 138 |
-
self.assertAlmostEqual(w.distance(zt), w.distance(b))
|
| 139 |
-
|
| 140 |
-
def test_sketch_circle(self):
|
| 141 |
-
a, b, c = random_points(3)
|
| 142 |
-
circle = nm.sketch_circle([a, b, c])
|
| 143 |
-
self.assertAlmostEqual(circle.center.distance(a), 0.0)
|
| 144 |
-
self.assertAlmostEqual(circle.radius, b.distance(c))
|
| 145 |
-
|
| 146 |
-
def test_sketch_e5128(self):
|
| 147 |
-
b = Point(0.0, 0.0)
|
| 148 |
-
c = Point(0.0, 1.0)
|
| 149 |
-
ang = unif(-np.pi / 2, 3 * np.pi / 2)
|
| 150 |
-
d = head_from(c, ang, 1.0)
|
| 151 |
-
a = Point(unif(0.5, 2.0), 0.0)
|
| 152 |
-
|
| 153 |
-
e, g = nm.sketch_e5128([a, b, c, d])
|
| 154 |
-
ang1 = ang_between(a, b, d)
|
| 155 |
-
ang2 = ang_between(e, a, g)
|
| 156 |
-
self.assertAlmostEqual(ang1, ang2)
|
| 157 |
-
|
| 158 |
-
def test_sketch_eq_quadrangle(self):
|
| 159 |
-
a, b, c, d = nm.sketch_eq_quadrangle([])
|
| 160 |
-
self.assertAlmostEqual(a.distance(d), c.distance(b))
|
| 161 |
-
ac = Line(a, c)
|
| 162 |
-
assert ac.diff_side(b, d), (ac(b), ac(d))
|
| 163 |
-
bd = Line(b, d)
|
| 164 |
-
assert bd.diff_side(a, c), (bd(a), bd(c))
|
| 165 |
-
|
| 166 |
-
def test_sketch_eq_trapezoid(self):
|
| 167 |
-
a, b, c, d = nm.sketch_eq_trapezoid([])
|
| 168 |
-
assert Line(a, b).is_parallel(Line(c, d))
|
| 169 |
-
self.assertAlmostEqual(a.distance(d), b.distance(c))
|
| 170 |
-
|
| 171 |
-
def test_sketch_eqangle3(self):
|
| 172 |
-
points = random_points(5)
|
| 173 |
-
x = nm.sketch_eqangle3(points).sample_within(points)[0]
|
| 174 |
-
a, b, d, e, f = points
|
| 175 |
-
self.assertTrue(check_eqangle([x, a, x, b, d, e, d, f]))
|
| 176 |
-
|
| 177 |
-
def test_sketch_eqangle2(self):
|
| 178 |
-
a, b, c = random_points(3)
|
| 179 |
-
x = nm.sketch_eqangle2([a, b, c])
|
| 180 |
-
ang1 = ang_between(a, b, x)
|
| 181 |
-
ang2 = ang_between(c, x, b)
|
| 182 |
-
self.assertAlmostEqual(ang1, ang2)
|
| 183 |
-
|
| 184 |
-
def test_sketch_edia_quadrangle(self):
|
| 185 |
-
a, b, c, d = nm.sketch_eqdia_quadrangle([])
|
| 186 |
-
assert Line(a, c).diff_side(b, d)
|
| 187 |
-
assert Line(b, d).diff_side(a, c)
|
| 188 |
-
self.assertAlmostEqual(a.distance(c), b.distance(d))
|
| 189 |
-
|
| 190 |
-
def test_sketch_isos(self):
|
| 191 |
-
a, b, c = nm.sketch_isos([])
|
| 192 |
-
self.assertAlmostEqual(a.distance(b), a.distance(c))
|
| 193 |
-
self.assertAlmostEqual(ang_between(b, a, c), ang_between(c, b, a))
|
| 194 |
-
|
| 195 |
-
def test_sketch_quadrange(self):
|
| 196 |
-
a, b, c, d = nm.sketch_quadrangle([])
|
| 197 |
-
self.assertTrue(Line(a, c).diff_side(b, d))
|
| 198 |
-
self.assertTrue(Line(b, d).diff_side(a, c))
|
| 199 |
-
|
| 200 |
-
def test_sketch_r_trapezoid(self):
|
| 201 |
-
a, b, c, d = nm.sketch_r_trapezoid([])
|
| 202 |
-
self.assertTrue(Line(a, b).is_perp(Line(a, d)))
|
| 203 |
-
self.assertTrue(Line(a, b).is_parallel(Line(c, d)))
|
| 204 |
-
self.assertTrue(Line(a, c).diff_side(b, d))
|
| 205 |
-
self.assertTrue(Line(b, d).diff_side(a, c))
|
| 206 |
-
|
| 207 |
-
def test_sketch_r_triangle(self):
|
| 208 |
-
a, b, c = nm.sketch_r_triangle([])
|
| 209 |
-
self.assertTrue(Line(a, b).is_perp(Line(a, c)))
|
| 210 |
-
|
| 211 |
-
def test_sketch_rectangle(self):
|
| 212 |
-
a, b, c, d = nm.sketch_rectangle([])
|
| 213 |
-
self.assertTrue(Line(a, b).is_perp(Line(b, c)))
|
| 214 |
-
self.assertTrue(Line(b, c).is_perp(Line(c, d)))
|
| 215 |
-
self.assertTrue(Line(c, d).is_perp(Line(d, a)))
|
| 216 |
-
|
| 217 |
-
def test_sketch_reflect(self):
|
| 218 |
-
a, b, c = random_points(3)
|
| 219 |
-
x = nm.sketch_reflect([a, b, c])
|
| 220 |
-
self.assertTrue(Line(a, x).is_perp(Line(b, c)))
|
| 221 |
-
self.assertAlmostEqual(x.distance(Line(b, c)), a.distance(Line(b, c)))
|
| 222 |
-
|
| 223 |
-
def test_sketch_risos(self):
|
| 224 |
-
a, b, c = nm.sketch_risos([])
|
| 225 |
-
self.assertAlmostEqual(a.distance(b), a.distance(c))
|
| 226 |
-
self.assertTrue(Line(a, b).is_perp(Line(a, c)))
|
| 227 |
-
|
| 228 |
-
def test_sketch_rotaten90(self):
|
| 229 |
-
a, b = random_points(2)
|
| 230 |
-
x = nm.sketch_rotaten90([a, b])
|
| 231 |
-
self.assertAlmostEqual(a.distance(x), a.distance(b))
|
| 232 |
-
self.assertTrue(Line(a, x).is_perp(Line(a, b)))
|
| 233 |
-
d = Point(0.0, 0.0)
|
| 234 |
-
e = Point(0.0, 1.0)
|
| 235 |
-
f = Point(1.0, 0.0)
|
| 236 |
-
self.assertAlmostEqual(ang_between(d, e, f), ang_between(a, b, x))
|
| 237 |
-
|
| 238 |
-
def test_sketch_rotatep90(self):
|
| 239 |
-
a, b = random_points(2)
|
| 240 |
-
x = nm.sketch_rotatep90([a, b])
|
| 241 |
-
self.assertAlmostEqual(a.distance(x), a.distance(b))
|
| 242 |
-
self.assertTrue(Line(a, x).is_perp(Line(a, b)))
|
| 243 |
-
d = Point(0.0, 0.0)
|
| 244 |
-
e = Point(0.0, 1.0)
|
| 245 |
-
f = Point(1.0, 0.0)
|
| 246 |
-
self.assertAlmostEqual(ang_between(d, f, e), ang_between(a, b, x))
|
| 247 |
-
|
| 248 |
-
def test_sketch_s_angle(self):
|
| 249 |
-
a, b = random_points(2)
|
| 250 |
-
y = unif(0.0, np.pi)
|
| 251 |
-
bx = nm.sketch_s_angle([a, b, y / np.pi * 180])
|
| 252 |
-
self.assertIsInstance(bx, HalfLine)
|
| 253 |
-
self.assertEqual(bx.tail, b)
|
| 254 |
-
x = bx.head
|
| 255 |
-
|
| 256 |
-
d = Point(1.0, 0.0)
|
| 257 |
-
e = Point(0.0, 0.0)
|
| 258 |
-
f = Point(np.cos(y), np.sin(y))
|
| 259 |
-
self.assertAlmostEqual(ang_between(e, d, f), ang_between(b, a, x))
|
| 260 |
-
|
| 261 |
-
def test_sketch_shift(self):
|
| 262 |
-
a, b, c = random_points(3)
|
| 263 |
-
x = nm.sketch_shift([a, b, c])
|
| 264 |
-
self.assertTrue((b - a).close(x - c))
|
| 265 |
-
|
| 266 |
-
def test_sketch_square(self):
|
| 267 |
-
a, b = random_points(2)
|
| 268 |
-
c, d = nm.sketch_square([a, b])
|
| 269 |
-
self.assertTrue(Line(a, b).is_perp(Line(b, c)))
|
| 270 |
-
self.assertTrue(Line(b, c).is_perp(Line(c, d)))
|
| 271 |
-
self.assertTrue(Line(c, d).is_perp(Line(d, a)))
|
| 272 |
-
self.assertAlmostEqual(a.distance(b), b.distance(c))
|
| 273 |
-
|
| 274 |
-
def test_sketch_isquare(self):
|
| 275 |
-
a, b, c, d = nm.sketch_isquare([])
|
| 276 |
-
self.assertTrue(Line(a, b).is_perp(Line(b, c)))
|
| 277 |
-
self.assertTrue(Line(b, c).is_perp(Line(c, d)))
|
| 278 |
-
self.assertTrue(Line(c, d).is_perp(Line(d, a)))
|
| 279 |
-
self.assertAlmostEqual(a.distance(b), b.distance(c))
|
| 280 |
-
|
| 281 |
-
def test_sketch_trapezoid(self):
|
| 282 |
-
a, b, c, d = nm.sketch_trapezoid([])
|
| 283 |
-
self.assertTrue(Line(a, b).is_parallel(Line(c, d)))
|
| 284 |
-
self.assertTrue(Line(a, c).diff_side(b, d))
|
| 285 |
-
self.assertTrue(Line(b, d).diff_side(a, c))
|
| 286 |
-
|
| 287 |
-
def test_sketch_triangle(self):
|
| 288 |
-
a, b, c = nm.sketch_triangle([])
|
| 289 |
-
self.assertFalse(check_coll([a, b, c]))
|
| 290 |
-
|
| 291 |
-
def test_sketch_triangle12(self):
|
| 292 |
-
a, b, c = nm.sketch_triangle12([])
|
| 293 |
-
self.assertAlmostEqual(a.distance(b) * 2, a.distance(c))
|
| 294 |
-
|
| 295 |
-
def test_sketch_trisect(self):
|
| 296 |
-
a, b, c = random_points(3)
|
| 297 |
-
x, y = nm.sketch_trisect([a, b, c])
|
| 298 |
-
self.assertAlmostEqual(ang_between(b, a, x), ang_between(b, x, y))
|
| 299 |
-
self.assertAlmostEqual(ang_between(b, x, y), ang_between(b, y, c))
|
| 300 |
-
self.assertAlmostEqual(ang_between(b, a, x) * 3, ang_between(b, a, c))
|
| 301 |
-
|
| 302 |
-
def test_sketch_trisegment(self):
|
| 303 |
-
a, b = random_points(2)
|
| 304 |
-
x, y = nm.sketch_trisegment([a, b])
|
| 305 |
-
self.assertAlmostEqual(
|
| 306 |
-
a.distance(x) + x.distance(y) + y.distance(b), a.distance(b)
|
| 307 |
-
)
|
| 308 |
-
self.assertAlmostEqual(a.distance(x), x.distance(y))
|
| 309 |
-
self.assertAlmostEqual(x.distance(y), y.distance(b))
|
| 310 |
-
|
| 311 |
-
|
| 312 |
-
if __name__ == '__main__':
|
| 313 |
-
absltest.main()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|