PostGIS  3.0.6dev-r@@SVN_REVISION@@

◆ test_median_robustness()

static void test_median_robustness ( void  )
static

Definition at line 1470 of file cu_algorithm.c.

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

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: