Changeset: 9c605d6f19c5 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=9c605d6f19c5
Modified Files:
        sql/test/sciql/Tests/teleios_noa_bsm.sql
Branch: SciQL-2
Log Message:

teleios_noa_bsm.sql: revised implementation of BSM connect nearby fires filter:

given the following constellations of fires being less than 3 pixels apart
(modulo symmetry, these are all possible constellations):

  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  
.  .  .
  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  
.  .  .
  .  .  1  .  2  .  .  .  .  3  .  .  .  .  .  .  5  .  .  .  .  .  .  .  .  .  
.  .  .
  .  .  .  .  .  .  .  .  .  .  .  4  .  .  .  .  .  .  .  .  .  .  .  .  .  .  
.  .  .
  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  6  .  .  .  .  .  .  .  
.  .  .
  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  
.  .  .
  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  
.  .  .
  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  
.  .  .
  .  .  7  .  .  8  .  .  .  9  .  .  .  .  .  . 11  .  .  .  .  .  . 13  .  .  
.  .  .
  .  .  .  .  .  .  .  .  .  .  .  . 10  .  .  .  .  .  .  .  .  .  .  .  .  .  
.  .  .
  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  . 12  .  .  .  .  .  .  
.  .  .
  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  . 
14  .  .
  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  
.  .  .
  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  
.  .  .

the previous implementation generated this (not fully satisfactory) result:

  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  
.  .  .
  .  .  2  2  2  .  .  .  . 10 10  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  
.  .  .
  .  .  2  2  2  .  .  .  . 10 10 10  .  .  .  .  6  6  .  .  .  .  .  .  .  .  
.  .  .
  .  .  2  2  2  .  .  .  . 10 10 10  .  .  .  .  6  6  6  .  .  .  .  .  .  .  
.  .  .
  .  .  .  .  .  .  .  .  .  . 10 10  .  .  .  .  .  6  6  .  .  .  .  .  .  .  
.  .  .
  .  .  .  .  .  .  .  .  . 10 10 10 10  .  .  .  .  .  .  .  .  .  .  .  .  .  
.  .  .
  .  .  .  .  .  .  .  .  . 10 10 10  .  .  .  .  .  .  .  .  .  .  .  .  .  .  
.  .  .
  .  .  .  8  8  .  .  .  .  . 10  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  
.  .  .
  .  .  8  8  8  8  .  .  . 10 10 10  .  .  .  . 12 12  .  .  .  .  . 14  .  .  
.  .  .
  .  .  .  8  8  .  .  .  .  . 10 10 10  .  .  .  . 12 12  .  .  .  .  . 14  .  
.  .  .
  .  .  .  .  .  .  .  .  .  .  . 10  .  .  .  .  .  . 12 12  .  .  .  .  . 14  
.  .  .
  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  . 
14  .  .
  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  
.  .  .
  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  
.  .  .

This new implementation generates this (hopefully fully satisfactory) result:

  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  
.  .  .
  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  
.  .  .
  .  .  2  2  2  .  .  .  .  4  4  .  .  .  .  .  6  .  .  .  .  .  .  .  .  .  
.  .  .
  .  .  .  .  .  .  .  .  .  .  4  4  .  .  .  .  .  6  .  .  .  .  .  .  .  .  
.  .  .
  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  6  .  .  .  .  .  .  .  
.  .  .
  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  
.  .  .
  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  
.  .  .
  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  
.  .  .
  .  .  8  8  8  8  .  .  . 10 10  .  .  .  .  . 12 12  .  .  .  .  . 14  .  .  
.  .  .
  .  .  .  .  .  .  .  .  .  .  . 10 10  .  .  .  . 12 12  .  .  .  .  . 14  .  
.  .  .
  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  . 12 12  .  .  .  .  . 14  
.  .  .
  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  . 
14  .  .
  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  
.  .  .
  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  
.  .  .


CAVEAT:

On machines with not too much memory (<= 16 GB for the images we have seen so 
far),
you want to limit mserver5 to using 2 threads (`mserver5 --set 
gdk_nr_threads=2`)
in order to achieve best performance.


diffs (236 lines):

diff --git a/sql/test/sciql/Tests/teleios_noa_bsm.sql 
b/sql/test/sciql/Tests/teleios_noa_bsm.sql
--- a/sql/test/sciql/Tests/teleios_noa_bsm.sql
+++ b/sql/test/sciql/Tests/teleios_noa_bsm.sql
@@ -253,72 +253,157 @@ UPDATE fire SET f = NULL WHERE f IN (
 
 -- BSM connect nearby fires filter --
 
----- Union fires which are less that 3 pixels apart (using 8-CONNECTED)
+---- Union fires which are less than 3 pixels apart (using 8-CONNECTED)
 ---- Add fire bridge between them
-CREATE FUNCTION connect_neighbors_1()
+--
+-- Using these 12 different tile "patterns":
+--  x...   xx..   ..xx   ...x   x...   xx..   ..xx   ...x   ....   ....   .x.. 
  .x..
+--  xx..   .x..   ..x.   ..xx   xo..   .o..   ..o.   ..ox   ....   ....   .x.. 
  .o..
+--  ..ox   ..o.   .o..   xo..   ..xx   ..x.   .x..   xx..   xoxx   xxox   .o.. 
  .x..
+--  ...x   ..xx   xx..   x...   ...x   ..xx   xx..   x...   ....   ....   .x.. 
  .x..
+--
+-- we achieve that for these constellations of fires being less than 3
+-- pixels apart (modulo symmetry, these are all possible constellations):
+--  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  
.  .  .  .
+--  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  
.  .  .  .
+--  .  .  1  .  2  .  .  .  .  3  .  .  .  .  .  .  5  .  .  .  .  .  .  .  .  
.  .  .  .
+--  .  .  .  .  .  .  .  .  .  .  .  4  .  .  .  .  .  .  .  .  .  .  .  .  .  
.  .  .  .
+--  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  6  .  .  .  .  .  .  
.  .  .  .
+--  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  
.  .  .  .
+--  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  
.  .  .  .
+--  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  
.  .  .  .
+--  .  .  7  .  .  8  .  .  .  9  .  .  .  .  .  . 11  .  .  .  .  .  . 13  .  
.  .  .  .
+--  .  .  .  .  .  .  .  .  .  .  .  . 10  .  .  .  .  .  .  .  .  .  .  .  .  
.  .  .  .
+--  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  . 12  .  .  .  .  .  
.  .  .  .
+--  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  
. 14  .  .
+--  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  
.  .  .  .
+--  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  
.  .  .  .
+--
+-- we create the following result:
+--  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  
.  .  .  .
+--  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  
.  .  .  .
+--  .  .  2  2  2  .  .  .  .  4  4  .  .  .  .  .  6  .  .  .  .  .  .  .  .  
.  .  .  .
+--  .  .  .  .  .  .  .  .  .  .  4  4  .  .  .  .  .  6  .  .  .  .  .  .  .  
.  .  .  .
+--  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  6  .  .  .  .  .  .  
.  .  .  .
+--  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  
.  .  .  .
+--  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  
.  .  .  .
+--  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  
.  .  .  .
+--  .  .  8  8  8  8  .  .  . 10 10  .  .  .  .  . 12 12  .  .  .  .  . 14  .  
.  .  .  .
+--  .  .  .  .  .  .  .  .  .  .  . 10 10  .  .  .  . 12 12  .  .  .  .  . 14  
.  .  .  .
+--  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  . 12 12  .  .  .  .  . 
14  .  .  .
+--  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  
. 14  .  .
+--  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  
.  .  .  .
+--  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  
.  .  .  .
+--
+CREATE FUNCTION connect_neighbors_A()
 RETURNS TABLE (x SMALLINT, y SMALLINT, i INT, a INT)
 BEGIN
   RETURN
     SELECT x, y, MIN(f) AS i, MAX(f) AS a
     FROM fire
-    GROUP BY fire[x-2:x+2][y-2:y+2]
+    GROUP BY 
fire[x-2][y+2],fire[x-2][y+1],fire[x-1][y+1],fire[x+1][y],fire[x+1][y-1]
     HAVING f IS NULL AND MIN(f) <> MAX(f);
 END;
-CREATE FUNCTION connect_neighbors_2()
+CREATE FUNCTION connect_neighbors_B()
 RETURNS TABLE (x SMALLINT, y SMALLINT, i INT, a INT)
 BEGIN
   RETURN
     SELECT x, y, MIN(f) AS i, MAX(f) AS a
     FROM fire
-    GROUP BY fire[x-1:x+3][y-2:y+2]
+    GROUP BY 
fire[x+2][y+2],fire[x+1][y+2],fire[x+1][y+1],fire[x][y-1],fire[x-1][y-1]
     HAVING f IS NULL AND MIN(f) <> MAX(f);
 END;
-CREATE FUNCTION connect_neighbors_3()
+CREATE FUNCTION connect_neighbors_C()
 RETURNS TABLE (x SMALLINT, y SMALLINT, i INT, a INT)
 BEGIN
   RETURN
     SELECT x, y, MIN(f) AS i, MAX(f) AS a
     FROM fire
-    GROUP BY fire[x-2:x+2][y-1:y+3]
+    GROUP BY 
fire[x+2][y-2],fire[x+2][y-1],fire[x+1][y-1],fire[x-1][y],fire[x-1][y+1]
     HAVING f IS NULL AND MIN(f) <> MAX(f);
 END;
-CREATE FUNCTION connect_neighbors_4()
+CREATE FUNCTION connect_neighbors_D()
 RETURNS TABLE (x SMALLINT, y SMALLINT, i INT, a INT)
 BEGIN
   RETURN
     SELECT x, y, MIN(f) AS i, MAX(f) AS a
     FROM fire
-    GROUP BY fire[x-1:x+3][y-1:y+3]
+    GROUP BY 
fire[x-2][y-2],fire[x-1][y-2],fire[x-1][y-1],fire[x][y+1],fire[x+1][y+1]
     HAVING f IS NULL AND MIN(f) <> MAX(f);
 END;
-CREATE FUNCTION connect_neighbors_5()
-RETURNS TABLE (x SMALLINT, y SMALLINT)
-BEGIN
-  RETURN
-    SELECT x, y
-    FROM fire
-    GROUP BY fire[x-1:x+2][y-1:y+2]
-    HAVING f IS NULL AND SUM(f) IS NOT NULL;
-END;
-CREATE FUNCTION connect_neighbors_6()
+CREATE FUNCTION connect_neighbors_E()
 RETURNS TABLE (x SMALLINT, y SMALLINT, i INT, a INT)
 BEGIN
   RETURN
-    SELECT t1.x, t1.y, t1.i, t1.a
-    FROM (
-      SELECT * FROM connect_neighbors_1()
-      UNION ALL
-      SELECT * FROM connect_neighbors_2()
-      UNION ALL
-      SELECT * FROM connect_neighbors_3()
-      UNION ALL
-      SELECT * FROM connect_neighbors_4()
-    ) AS t1
-    JOIN (
-      SELECT * FROM connect_neighbors_5()
-    ) AS t2
-    ON t1.x = t2.x AND t1.y = t2.y;
+    SELECT x, y, MIN(f) AS i, MAX(f) AS a
+    FROM fire
+    GROUP BY 
fire[x-2][y+2],fire[x-1][y+2],fire[x-1][y+1],fire[x][y-1],fire[x+1][y-1]
+    HAVING f IS NULL AND MIN(f) <> MAX(f);
 END;
+CREATE FUNCTION connect_neighbors_F()
+RETURNS TABLE (x SMALLINT, y SMALLINT, i INT, a INT)
+BEGIN
+  RETURN
+    SELECT x, y, MIN(f) AS i, MAX(f) AS a
+    FROM fire
+    GROUP BY 
fire[x+2][y+2],fire[x+2][y+1],fire[x+1][y+1],fire[x-1][y],fire[x-1][y-1]
+    HAVING f IS NULL AND MIN(f) <> MAX(f);
+END;
+CREATE FUNCTION connect_neighbors_G()
+RETURNS TABLE (x SMALLINT, y SMALLINT, i INT, a INT)
+BEGIN
+  RETURN
+    SELECT x, y, MIN(f) AS i, MAX(f) AS a
+    FROM fire
+    GROUP BY 
fire[x+2][y-2],fire[x+1][y-2],fire[x+1][y-1],fire[x][y+1],fire[x-1][y+1]
+    HAVING f IS NULL AND MIN(f) <> MAX(f);
+END;
+CREATE FUNCTION connect_neighbors_H()
+RETURNS TABLE (x SMALLINT, y SMALLINT, i INT, a INT)
+BEGIN
+  RETURN
+    SELECT x, y, MIN(f) AS i, MAX(f) AS a
+    FROM fire
+    GROUP BY 
fire[x-2][y-2],fire[x-2][y-1],fire[x-1][y-1],fire[x+1][y],fire[x+1][y+1]
+    HAVING f IS NULL AND MIN(f) <> MAX(f);
+END;
+CREATE FUNCTION connect_neighbors_I()
+RETURNS TABLE (x SMALLINT, y SMALLINT, i INT, a INT)
+BEGIN
+  RETURN
+    SELECT x, y, MIN(f) AS i, MAX(f) AS a
+    FROM fire
+    GROUP BY fire[x-1][y],fire[x+1][y],fire[x+2][y]
+    HAVING f IS NULL AND MIN(f) <> MAX(f);
+END;
+CREATE FUNCTION connect_neighbors_J()
+RETURNS TABLE (x SMALLINT, y SMALLINT, i INT, a INT)
+BEGIN
+  RETURN
+    SELECT x, y, MIN(f) AS i, MAX(f) AS a
+    FROM fire
+    GROUP BY fire[x-2][y],fire[x-1][y],fire[x+1][y]
+    HAVING f IS NULL AND MIN(f) <> MAX(f);
+END;
+CREATE FUNCTION connect_neighbors_K()
+RETURNS TABLE (x SMALLINT, y SMALLINT, i INT, a INT)
+BEGIN
+  RETURN
+    SELECT x, y, MIN(f) AS i, MAX(f) AS a
+    FROM fire
+    GROUP BY fire[x][y-2],fire[x][y-1],fire[x][y+1]
+    HAVING f IS NULL AND MIN(f) <> MAX(f);
+END;
+CREATE FUNCTION connect_neighbors_L()
+RETURNS TABLE (x SMALLINT, y SMALLINT, i INT, a INT)
+BEGIN
+  RETURN
+    SELECT x, y, MIN(f) AS i, MAX(f) AS a
+    FROM fire
+    GROUP BY fire[x][y-1],fire[x][y+1],fire[x][y+2]
+    HAVING f IS NULL AND MIN(f) <> MAX(f);
+END;
+--
 CREATE FUNCTION connect_neighbors()
 RETURNS TABLE (i1 INT, i2 INT)
 BEGIN
@@ -334,10 +419,30 @@ BEGIN
 
     -- find neighboring fire clumps
     DELETE FROM bridges;
-    -- 3x3 window is too small and 5x5 is too large; hence,
-    -- we need to union the four possible 4x4 windows ...
     INSERT INTO bridges (
-      SELECT * FROM connect_neighbors_6()
+      SELECT * FROM connect_neighbors_A()
+      UNION ALL
+      SELECT * FROM connect_neighbors_B()
+      UNION ALL
+      SELECT * FROM connect_neighbors_C()
+      UNION ALL
+      SELECT * FROM connect_neighbors_D()
+      UNION ALL
+      SELECT * FROM connect_neighbors_E()
+      UNION ALL
+      SELECT * FROM connect_neighbors_F()
+      UNION ALL
+      SELECT * FROM connect_neighbors_G()
+      UNION ALL
+      SELECT * FROM connect_neighbors_H()
+      UNION ALL
+      SELECT * FROM connect_neighbors_I()
+      UNION ALL
+      SELECT * FROM connect_neighbors_J()
+      UNION ALL
+      SELECT * FROM connect_neighbors_K()
+      UNION ALL
+      SELECT * FROM connect_neighbors_L()
     );
 
     SELECT COUNT(*) INTO merge_more FROM bridges;
@@ -386,6 +491,7 @@ END;
 -- SciQL used here, in particular conjunctive HAVING predicates, correctly
 -- (or vice versa).
 set optimizer='no_mitosis_pipe';
+select now();
 SELECT * FROM connect_neighbors();
 set optimizer='default_pipe';
 
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to