PostGIS  3.4.0dev-r@@SVN_REVISION@@

◆ test_median_robustness()

static void test_median_robustness ( void  )
static

Definition at line 1495 of file cu_algorithm.c.

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