PostGIS  3.3.9dev-r@@SVN_REVISION@@

◆ test_median_robustness()

static void test_median_robustness ( void  )
static

Definition at line 1487 of file cu_algorithm.c.

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

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: