PostGIS 3.7.0dev-r@@SVN_REVISION@@
Loading...
Searching...
No Matches

◆ test_median_robustness()

static void test_median_robustness ( void  )
static

Definition at line 1494 of file cu_algorithm.c.

1495{
1496 /* A simple implementation of Weiszfeld's algorithm will fail if the median is equal
1497 * to any one of the inputs, during any iteration of the algorithm.
1498 *
1499 * Because the algorithm uses the centroid as a starting point, this situation will
1500 * occur in the test case below.
1501 */
1502 do_median_test("MULTIPOINT ((0 -1), (0 0), (0 1))", "POINT (0 0)", LW_TRUE, 1000);
1503
1504 /* Same as above but 3D, and shifter */
1505 do_median_test("MULTIPOINT ((1 -1 3), (1 0 2), (2 1 1))", "POINT (1 0 2)", LW_TRUE, 1000);
1506
1507 /* Starting point is duplicated */
1508 do_median_test("MULTIPOINT ((0 -1), (0 0), (0 0), (0 1))", "POINT (0 0)", LW_TRUE, 1000);
1509
1510 /* Cube */
1511 do_median_test("MULTIPOINT ((10 10 10), (10 20 10), (20 10 10), (20 20 10), (10 10 20), (10 20 20), (20 10 20), (20 20 20))",
1512 "POINT (15 15 15)", LW_TRUE, 1000);
1513
1514 /* Some edge cases */
1515 do_median_test("POINT (7 6)", "POINT (7 6)", LW_TRUE, 1000);
1516 do_median_test("POINT (7 6 2)", "POINT (7 6 2)", LW_TRUE, 1000);
1517 do_median_test("MULTIPOINT ((7 6 2), EMPTY)", "POINT (7 6 2)", LW_TRUE, 1000);
1518
1519 /* Empty input */
1520 do_median_test("MULTIPOINT EMPTY", "POINT EMPTY", LW_FALSE, 1000);
1521 do_median_test("MULTIPOINT (EMPTY)", "POINT EMPTY", LW_FALSE, 1000);
1522 do_median_test("MULTIPOINT EMPTY", "POINT EMPTY", LW_TRUE, 1000);
1523 do_median_test("MULTIPOINT (EMPTY)", "POINT EMPTY", LW_TRUE, 1000);
1524 do_median_test("MULTIPOINT ZM (1 -1 3 1, 1 0 2 7, 2 1 1 1, EMPTY)", "POINT (1 0 2)", LW_TRUE, 1000);
1525
1526 /* Weighted input */
1527 do_median_test("MULTIPOINT ZM (1 -1 3 1, 1 0 2 7, 2 1 1 1)", "POINT (1 0 2)", LW_TRUE, 1000);
1528 do_median_test("MULTIPOINT ZM (-1 1 -3 1, -1 0 -2 7, -2 -1 -1 1)", "POINT (-1 0 -2)", LW_TRUE, 1000);
1529 do_median_test("MULTIPOINT ZM (-1 1 -3 1, -1 0 -2 7, -2 -1 -1 0.5, -2 -1 -1 0.5)", "POINT (-1 0 -2)", LW_TRUE, 1000);
1530
1531 /* Point that is replaced by two half-weighted */
1532 do_median_test("MULTIPOINT ZM ((0 -1 0 1), (0 0 0 1), (0 1 0 0.5), (0 1 0 0.5))", "POINT (0 0 0)", LW_TRUE, 1000);
1533 /* Point is doubled and then erased by negative weight */
1534 do_median_test("MULTIPOINT ZM ((1 -1 3 1), (1 0 2 7), (2 1 1 2), (2 1 1 -1))", NULL, LW_TRUE, 1000);
1535 do_median_test("MULTIPOINT ZM ((1 -1 3 1), (1 0 2 7), (2 1 1 2), (2 1 1 -1))", NULL, LW_FALSE, 1000);
1536 /* Weightless input won't converge */
1537 do_median_test("MULTIPOINT ZM ((0 -1 0 0), (0 0 0 0), (0 0 0 0), (0 1 0 0))", NULL, LW_FALSE, 1000);
1538 do_median_test("MULTIPOINT ZM ((0 -1 0 0), (0 0 0 0), (0 0 0 0), (0 1 0 0))", NULL, LW_TRUE, 1000);
1539 /* Negative weight won't converge */
1540 do_median_test("MULTIPOINT ZM ((0 -1 0 -1), (0 0 0 -1), (0 1 0 -1))", NULL, LW_FALSE, 1000);
1541 do_median_test("MULTIPOINT ZM ((0 -1 0 -1), (0 0 0 -1), (0 1 0 -1))", NULL, LW_TRUE, 1000);
1542
1543 /* Bind convergence too tightly */
1544 do_median_test("MULTIPOINT ((0 0), (1 1), (0 1), (2 2))", "POINT(0.75 1.0)", LW_FALSE, 0);
1545 do_median_test("MULTIPOINT ((0 0), (1 1), (0 1), (2 2))", NULL, LW_TRUE, 1);
1546 /* Unsupported geometry type */
1547 do_median_test("POLYGON((1 0,0 1,1 2,2 1,1 0))", NULL, LW_TRUE, 1000);
1548 do_median_test("POLYGON((1 0,0 1,1 2,2 1,1 0))", NULL, LW_FALSE, 1000);
1549
1550 /* Median point is included */
1551 do_median_test("MULTIPOINT ZM ("
1552 "(1480 0 200 100),"
1553 "(620 0 200 100),"
1554 "(1000 0 -200 100),"
1555 "(1000 0 -590 100),"
1556 "(1025 0 65 100),"
1557 "(1025 0 -65 100)"
1558 ")",
1559 "POINT (1025 0 -65)", LW_TRUE, 10000);
1560
1561#if 0
1562 /* Leads to invalid result (0 0 0) with 80bit (fmulp + faddp) precision. ok with 64 bit float ops */
1563 do_median_test("MULTIPOINT ZM ("
1564 "(0 0 20000 0.5),"
1565 "(0 0 59000 0.5),"
1566 "(0 -3000 -3472.22222222222262644208967685699462890625 1),"
1567 "(0 3000 3472.22222222222262644208967685699462890625 1),"
1568 "(0 0 -1644.736842105263121993630193173885345458984375 1),"
1569 "(0 0 1644.736842105263121993630193173885345458984375 1),"
1570 "(0 48000 -20000 1.3),"
1571 "(0 -48000 -20000 1.3)"
1572 ")",
1573 "POINT (0 0 0)", LW_TRUE, 10000);
1574#endif
1575
1576#if 0
1577 /* Leads to invalid result (0 0 0) with 64bit (vfmadd231sd) precision. Ok with 80 bit float ops */
1578 do_median_test("MULTIPOINT ZM ("
1579 "(0 0 20000 0.5),"
1580 "(0 0 59000 0.5),"
1581 "(0 -3000 -3472.22222222222262644208967685699462890625 1),"
1582 "(0 3000 3472.22222222222262644208967685699462890625 1),"
1583 "(0 -0.00000000000028047739569477638384522295466033823196 -1644.736842105263121993630193173885345458984375 1),"
1584 "(0 0.00000000000028047739569477638384522295466033823196 1644.736842105263121993630193173885345458984375 1),"
1585 "(0 48000 -20000 1.3),"
1586 "(0 -48000 -20000 1.3)"
1587 ")",
1588 "POINT (0 0 0)", LW_TRUE, 10000);
1589#endif
1590}
static void do_median_test(char *input, char *expected, int fail_if_not_converged, int iter_count)
#define LW_FALSE
Definition liblwgeom.h:94
#define LW_TRUE
Return types for functions with status returns.
Definition liblwgeom.h:93

References do_median_test(), LW_FALSE, and LW_TRUE.

Referenced by algorithms_suite_setup().

Here is the call graph for this function:
Here is the caller graph for this function: