blob: 624ef117aa13fef53a36b96b9b37b7da24ac77fc [file] [log] [blame]
-- Unit-Testing checklist
-- 1. Make sure the function does the right thing on normal input(s).
-- 2. Make sure the function is non-destructive to the input(s).
-- 3. Make sure the function handles null values in svecs correctly.
-- 4. Make sure the function handles length-1 svecs correctly.
-- 5. Make sure the function handles null svecs properly.
-- 6. For functions that handle float8[] input(s), make sure the two
-- representations of null values are handled properly.
-- \timing
-- \i gp_svec.sql_in
set search_path to "$user",madlib,public;
select madlib.dmin(1000,1000.1);
dmin
------
1000
(1 row)
select madlib.dmin(1000,NULL);
dmin
------
1000
(1 row)
select madlib.dmin(NULL,1000);
dmin
------
1000
(1 row)
select madlib.dmin(NULL,NULL);
dmin
------
(1 row)
select madlib.dmax(1000,1000.1);
dmax
--------
1000.1
(1 row)
select madlib.dmax(1000,NULL);
dmax
------
1000
(1 row)
select madlib.dmax(NULL,1000);
dmax
------
1000
(1 row)
select madlib.dmax(NULL,NULL);
dmax
------
(1 row)
drop table if exists madlib.test_pairs;
create table madlib.test_pairs( id int, a madlib.svec, b madlib.svec ) distributed by (id);
insert into madlib.test_pairs values
(0, '{1,100,1}:{5,0,5}', '{50,50,2}:{1,2,10}'),
(1, '{1,100,1}:{-5,0,-5}', '{50,50,2}:{-1,-2,-10}');
insert into madlib.test_pairs values
-- (10, null, null),
(11, '{1}:{0}', '{1}:{1}'),
(12, '{1}:{5}', '{3}:{-8}'),
(13, '{1}:{0}', '{1}:{NULL}'),
(14, '{1,2,1}:{2,4,2}', '{2,1,1}:{0,3,5}'),
(15, '{1,2,1}:{2,4,2}', '{2,1,1}:{NULL,3,5}');
select id, madlib.svec_count(a,b) from madlib.test_pairs where madlib.dimension(a) = madlib.dimension(b) order by id;
id | svec_count
----+---------------------
0 | {1,100,1}:{6,1,6}
1 | {1,100,1}:{-4,1,-4}
11 | {1}:{1}
13 | {1}:{0}
14 | {1,1,1,1}:{2,4,5,3}
15 | {1,1,1,1}:{2,4,5,3}
(6 rows)
select id, madlib.svec_plus(a,b) from madlib.test_pairs order by id;
id | svec_plus
----+----------------------------------
0 | {1,49,50,1,1}:{6,1,2,10,15}
1 | {1,49,50,1,1}:{-6,-1,-2,-10,-15}
11 | {1}:{1}
12 | {3}:{-3}
13 | {1}:{NVP}
14 | {1,1,2}:{2,4,7}
15 | {2,2}:{NVP,7}
(7 rows)
select id, madlib.svec_plus(a,b) = madlib.svec_plus(b,a) from madlib.test_pairs order by id;
id | ?column?
----+----------
0 | t
1 | t
11 | t
12 | t
13 | t
14 | t
15 | t
(7 rows)
select id, madlib.svec_mult(a,b) from madlib.test_pairs order by id;
id | svec_mult
----+---------------------
0 | {1,100,1}:{5,0,50}
1 | {1,100,1}:{5,-0,50}
11 | {1}:{0}
12 | {3}:{-40}
13 | {1}:{NVP}
14 | {2,1,1}:{0,12,10}
15 | {2,1,1}:{NVP,12,10}
(7 rows)
select id, madlib.svec_mult(a,b) = madlib.svec_mult(b,a) from madlib.test_pairs order by id;
id | ?column?
----+----------
0 | t
1 | t
11 | t
12 | t
13 | t
14 | t
15 | t
(7 rows)
select id, madlib.svec_div(a,b) = madlib.svec_mult(a, madlib.svec_pow(b,(-1)::svec)) from madlib.test_pairs order by id;
id | ?column?
----+----------
0 | t
1 | t
11 | t
12 | t
13 | t
14 | t
15 | t
(7 rows)
select id, madlib.svec_minus(a, b) = madlib.svec_plus(madlib.svec_mult((-1)::svec,b), a) from madlib.test_pairs order by id;
id | ?column?
----+----------
0 | t
1 | t
11 | t
12 | t
13 | t
14 | t
15 | t
(7 rows)
select id, madlib.svec_pow(a,2::svec) = madlib.svec_mult(a,a) from madlib.test_pairs order by id;
id | ?column?
----+----------
0 | t
1 | t
11 | t
12 | t
13 | t
14 | t
15 | t
(7 rows)
select id, madlib.dot(a,b) from madlib.test_pairs where madlib.dimension(a) = madlib.dimension(b) order by id;
id | dot
----+-----
0 | 55
1 | 55
11 | 0
13 |
14 | 22
15 |
(6 rows)
select id, madlib.dot(a,b) = madlib.dot(b,a) from madlib.test_pairs where madlib.dimension(a) = madlib.dimension(b) order by id;
id | ?column?
----+----------
0 | t
1 | t
11 | t
13 |
14 | t
15 |
(6 rows)
select id, madlib.dot(a,b::float8[]) = madlib.dot(b,a::float8[]) from madlib.test_pairs where madlib.dimension(a) = madlib.dimension(b) order by id;
id | ?column?
----+----------
0 | t
1 | t
11 | t
13 |
14 | t
15 |
(6 rows)
select id, madlib.dot(a::float8[],b) = madlib.dot(b::float8[],a) from madlib.test_pairs where madlib.dimension(a) = madlib.dimension(b) order by id;
id | ?column?
----+----------
0 | t
1 | t
11 | t
13 |
14 | t
15 |
(6 rows)
select id, madlib.dot(a::float8[],b::float8[]) = madlib.dot(b::float8[],a::float8[]) from madlib.test_pairs where madlib.dimension(a) = madlib.dimension(b) order by id;
id | ?column?
----+----------
0 | t
1 | t
11 | t
13 |
14 | t
15 |
(6 rows)
select id, madlib.l2norm(a), madlib.l2norm(a::float[]), madlib.l2norm(b), madlib.l2norm(b::float8[]) from madlib.test_pairs order by id;
id | l2norm | l2norm | l2norm | l2norm
----+------------------+------------------+------------------+------------------
0 | 7.07106781186548 | 7.07106781186548 | 21.2132034355964 | 21.2132034355964
1 | 7.07106781186548 | 7.07106781186548 | 21.2132034355964 | 21.2132034355964
11 | 0 | 0 | 1 | 1
12 | 5 | 5 | 13.856406460551 | 13.856406460551
13 | 0 | 0 | |
14 | 6.32455532033676 | 6.32455532033676 | 5.8309518948453 | 5.8309518948453
15 | 6.32455532033676 | 6.32455532033676 | |
(7 rows)
select id, madlib.l1norm(a), madlib.l1norm(a::float[]), madlib.l1norm(b), madlib.l1norm(b::float8[]) from madlib.test_pairs order by id;
id | l1norm | l1norm | l1norm | l1norm
----+--------+--------+--------+--------
0 | 10 | 10 | 170 | 170
1 | 10 | 10 | 170 | 170
11 | 0 | 0 | 1 | 1
12 | 5 | 5 | 24 | 24
13 | 0 | 0 | |
14 | 12 | 12 | 8 | 8
15 | 12 | 12 | |
(7 rows)
select madlib.svec_plus('{1,2,3}:{4,5,6}', 5::madlib.svec);
svec_plus
-------------------
{1,2,3}:{9,10,11}
(1 row)
select madlib.svec_plus(5::madlib.svec, '{1,2,3}:{4,5,6}');
svec_plus
-------------------
{1,2,3}:{9,10,11}
(1 row)
select madlib.svec_plus(500::madlib.svec, '{1,2,3}:{4,null,6}');
svec_plus
-----------------------
{1,2,3}:{504,NVP,506}
(1 row)
select madlib.svec_div(500::madlib.svec, '{1,2,3}:{4,null,6}');
svec_div
------------------------------------
{1,2,3}:{125,NVP,83.3333333333333}
(1 row)
select madlib.svec_div('{1,2,3}:{4,null,6}', 500::madlib.svec);
svec_div
---------------------------
{1,2,3}:{0.008,NVP,0.012}
(1 row)
-- Test operators between svec and float8[]
select ('{1,2,3,4}:{3,4,5,6}'::madlib.svec) %*% ('{1,2,3,4}:{3,4,5,6}'::madlib.svec)::float8[];
?column?
----------
260
(1 row)
select ('{1,2,3,4}:{3,4,5,6}'::madlib.svec)::float8[] %*% ('{1,2,3,4}:{3,4,5,6}'::madlib.svec);
?column?
----------
260
(1 row)
select ('{1,2,3,4}:{3,4,5,6}'::madlib.svec) / ('{1,2,3,4}:{3,4,5,6}'::madlib.svec)::float8[];
?column?
----------
{10}:{1}
(1 row)
select ('{1,2,3,4}:{3,4,5,6}'::madlib.svec)::float8[] / ('{1,2,3,4}:{3,4,5,6}'::madlib.svec);
?column?
----------
{10}:{1}
(1 row)
select ('{1,2,3,4}:{3,4,5,6}'::madlib.svec) * ('{1,2,3,4}:{3,4,5,6}'::madlib.svec)::float8[];
?column?
------------------------
{1,2,3,4}:{9,16,25,36}
(1 row)
select ('{1,2,3,4}:{3,4,5,6}'::madlib.svec)::float8[] * ('{1,2,3,4}:{3,4,5,6}'::madlib.svec);
?column?
------------------------
{1,2,3,4}:{9,16,25,36}
(1 row)
select ('{1,2,3,4}:{3,4,5,6}'::madlib.svec) + ('{1,2,3,4}:{3,4,5,6}'::madlib.svec)::float8[];
?column?
-----------------------
{1,2,3,4}:{6,8,10,12}
(1 row)
select ('{1,2,3,4}:{3,4,5,6}'::madlib.svec)::float8[] + ('{1,2,3,4}:{3,4,5,6}'::madlib.svec);
?column?
-----------------------
{1,2,3,4}:{6,8,10,12}
(1 row)
select ('{1,2,3,4}:{3,4,5,6}'::madlib.svec) - ('{1,2,3,4}:{3,4,5,6}'::madlib.svec)::float8[];
?column?
----------
{10}:{0}
(1 row)
select ('{1,2,3,4}:{3,4,5,6}'::madlib.svec)::float8[] - ('{1,2,3,4}:{3,4,5,6}'::madlib.svec);
?column?
----------
{10}:{0}
(1 row)
-- these should produce error messages
/*
select '{10000000000000000000}:{1}'::madlib.svec ;
select '{1,null,2}:{2,3,4}'::madlib.svec;
select madlib.svec_count('{1,1,1}:{3,4,5}', '{2,2}:{1,3}');
select madlib.svec_plus('{1,1,1}:{3,4,5}', '{2,2}:{1,3}');
select madlib.svec_minus('{1,1,1}:{3,4,5}', '{2,2}:{1,3}');
select madlib.svec_mult('{1,1,1}:{3,4,5}', '{2,2}:{1,3}');
select madlib.svec_div('{1,1,1}:{3,4,5}', '{2,2}:{1,3}');
*/
select madlib.unnest('{1}:{5}'::madlib.svec);
unnest
--------
5
(1 row)
select madlib.unnest('{1,2,3,4}:{5,6,7,8}'::madlib.svec);
unnest
--------
5
6
6
7
7
7
8
8
8
8
(10 rows)
select madlib.unnest('{1,2,3,4}:{5,6,null,8}'::madlib.svec);
unnest
--------
5
6
6
8
8
8
8
(10 rows)
select id, madlib.unnest(a),a from madlib.test_pairs where id >= 10 order by id;
id | unnest | a
----+--------+-----------------
11 | 0 | {1}:{0}
12 | 5 | {1}:{5}
13 | 0 | {1}:{0}
14 | 4 | {1,2,1}:{2,4,2}
14 | 2 | {1,2,1}:{2,4,2}
14 | 2 | {1,2,1}:{2,4,2}
14 | 4 | {1,2,1}:{2,4,2}
15 | 2 | {1,2,1}:{2,4,2}
15 | 4 | {1,2,1}:{2,4,2}
15 | 2 | {1,2,1}:{2,4,2}
15 | 4 | {1,2,1}:{2,4,2}
(11 rows)
select madlib.vec_pivot('{1}:{5}', 2);
vec_pivot
-------------
{1,1}:{5,2}
(1 row)
select madlib.vec_pivot('{1}:{5}', 5);
vec_pivot
-----------
{2}:{5}
(1 row)
select madlib.vec_pivot('{1}:{5}', null);
vec_pivot
---------------
{1,1}:{5,NVP}
(1 row)
select madlib.vec_pivot('{1}:{null}', 5);
vec_pivot
---------------
{1,1}:{NVP,5}
(1 row)
select madlib.vec_pivot('{1}:{null}', null);
vec_pivot
-----------
{2}:{NVP}
(1 row)
select madlib.vec_pivot('{1,2,3,4}:{5,6,7,8}'::madlib.svec, 2);
vec_pivot
-------------------------
{1,2,3,4,1}:{5,6,7,8,2}
(1 row)
select id, madlib.vec_pivot(a, 5), a, madlib.vec_pivot(a,6), a, madlib.vec_pivot(a,2) from madlib.test_pairs order by id;
id | vec_pivot | a | vec_pivot | a | vec_pivot
----+-------------------------+---------------------+-------------------------+---------------------+-------------------------
0 | {1,100,2}:{5,0,5} | {1,100,1}:{5,0,5} | {1,100,1,1}:{5,0,5,6} | {1,100,1}:{5,0,5} | {1,100,1,1}:{5,0,5,2}
1 | {1,100,1,1}:{-5,0,-5,5} | {1,100,1}:{-5,0,-5} | {1,100,1,1}:{-5,0,-5,6} | {1,100,1}:{-5,0,-5} | {1,100,1,1}:{-5,0,-5,2}
11 | {1,1}:{0,5} | {1}:{0} | {1,1}:{0,6} | {1}:{0} | {1,1}:{0,2}
12 | {2}:{5} | {1}:{5} | {1,1}:{5,6} | {1}:{5} | {1,1}:{5,2}
13 | {1,1}:{0,5} | {1}:{0} | {1,1}:{0,6} | {1}:{0} | {1,1}:{0,2}
14 | {1,2,1,1}:{2,4,2,5} | {1,2,1}:{2,4,2} | {1,2,1,1}:{2,4,2,6} | {1,2,1}:{2,4,2} | {1,2,2}:{2,4,2}
15 | {1,2,1,1}:{2,4,2,5} | {1,2,1}:{2,4,2} | {1,2,1,1}:{2,4,2,6} | {1,2,1}:{2,4,2} | {1,2,2}:{2,4,2}
(7 rows)
select id, madlib.vec_pivot(b, 5), b, madlib.vec_pivot(b,6), b, madlib.vec_pivot(b,null) from madlib.test_pairs order by id;
id | vec_pivot | b | vec_pivot | b | vec_pivot
----+---------------------------+-----------------------+---------------------------+-----------------------+-----------------------------
0 | {50,50,2,1}:{1,2,10,5} | {50,50,2}:{1,2,10} | {50,50,2,1}:{1,2,10,6} | {50,50,2}:{1,2,10} | {50,50,2,1}:{1,2,10,NVP}
1 | {50,50,2,1}:{-1,-2,-10,5} | {50,50,2}:{-1,-2,-10} | {50,50,2,1}:{-1,-2,-10,6} | {50,50,2}:{-1,-2,-10} | {50,50,2,1}:{-1,-2,-10,NVP}
11 | {1,1}:{1,5} | {1}:{1} | {1,1}:{1,6} | {1}:{1} | {1,1}:{1,NVP}
12 | {3,1}:{-8,5} | {3}:{-8} | {3,1}:{-8,6} | {3}:{-8} | {3,1}:{-8,NVP}
13 | {1,1}:{NVP,5} | {1}:{NVP} | {1,1}:{NVP,6} | {1}:{NVP} | {2}:{NVP}
14 | {2,1,2}:{0,3,5} | {2,1,1}:{0,3,5} | {2,1,1,1}:{0,3,5,6} | {2,1,1}:{0,3,5} | {2,1,1,1}:{0,3,5,NVP}
15 | {2,1,2}:{NVP,3,5} | {2,1,1}:{NVP,3,5} | {2,1,1,1}:{NVP,3,5,6} | {2,1,1}:{NVP,3,5} | {2,1,1,1}:{NVP,3,5,NVP}
(7 rows)
select madlib.vec_sum('{1}:{-5}'::madlib.svec);
vec_sum
---------
-5
(1 row)
select id, a, madlib.vec_sum(a), a, b, madlib.vec_sum(b), b from madlib.test_pairs order by id;
id | a | vec_sum | a | b | vec_sum | b
----+---------------------+---------+---------------------+-----------------------+---------+-----------------------
0 | {1,100,1}:{5,0,5} | 10 | {1,100,1}:{5,0,5} | {50,50,2}:{1,2,10} | 170 | {50,50,2}:{1,2,10}
1 | {1,100,1}:{-5,0,-5} | -10 | {1,100,1}:{-5,0,-5} | {50,50,2}:{-1,-2,-10} | -170 | {50,50,2}:{-1,-2,-10}
11 | {1}:{0} | 0 | {1}:{0} | {1}:{1} | 1 | {1}:{1}
12 | {1}:{5} | 5 | {1}:{5} | {3}:{-8} | -24 | {3}:{-8}
13 | {1}:{0} | 0 | {1}:{0} | {1}:{NVP} | | {1}:{NVP}
14 | {1,2,1}:{2,4,2} | 12 | {1,2,1}:{2,4,2} | {2,1,1}:{0,3,5} | 8 | {2,1,1}:{0,3,5}
15 | {1,2,1}:{2,4,2} | 12 | {1,2,1}:{2,4,2} | {2,1,1}:{NVP,3,5} | | {2,1,1}:{NVP,3,5}
(7 rows)
select id, madlib.vec_sum(a) = madlib.vec_sum(a::float8[]) from madlib.test_pairs order by id;
id | ?column?
----+----------
0 | t
1 | t
11 | t
12 | t
13 | t
14 | t
15 | t
(7 rows)
select id, madlib.vec_sum(b) = madlib.vec_sum(b::float8[]) from madlib.test_pairs order by id;
id | ?column?
----+----------
0 | t
1 | t
11 | t
12 | t
13 |
14 | t
15 |
(7 rows)
select id, a, madlib.vec_median(a), a from madlib.test_pairs order by id;
id | a | vec_median | a
----+---------------------+------------+---------------------
0 | {1,100,1}:{5,0,5} | 0 | {1,100,1}:{5,0,5}
1 | {1,100,1}:{-5,0,-5} | 0 | {1,100,1}:{-5,0,-5}
11 | {1}:{0} | 0 | {1}:{0}
12 | {1}:{5} | 5 | {1}:{5}
13 | {1}:{0} | 0 | {1}:{0}
14 | {1,2,1}:{2,4,2} | 2 | {1,2,1}:{2,4,2}
15 | {1,2,1}:{2,4,2} | 2 | {1,2,1}:{2,4,2}
(7 rows)
select id, b, madlib.vec_median(b), b from madlib.test_pairs order by id;
id | b | vec_median | b
----+-----------------------+------------+-----------------------
0 | {50,50,2}:{1,2,10} | 2 | {50,50,2}:{1,2,10}
1 | {50,50,2}:{-1,-2,-10} | -2 | {50,50,2}:{-1,-2,-10}
11 | {1}:{1} | 1 | {1}:{1}
12 | {3}:{-8} | -8 | {3}:{-8}
13 | {1}:{NVP} | | {1}:{NVP}
14 | {2,1,1}:{0,3,5} | 0 | {2,1,1}:{0,3,5}
15 | {2,1,1}:{NVP,3,5} | | {2,1,1}:{NVP,3,5}
(7 rows)
select id, madlib.vec_median(a) = madlib.vec_median(a::float8[]),
madlib.vec_median(b) = madlib.vec_median(b::float8[]) from madlib.test_pairs order by id;
id | ?column? | ?column?
----+----------+----------
0 | t | t
1 | t | t
11 | t | t
12 | t | t
13 | t |
14 | t | t
15 | t |
(7 rows)
select id, a, b, madlib.svec_concat(a,b), a, b from madlib.test_pairs order by id;
id | a | b | svec_concat | a | b
----+---------------------+-----------------------+---------------------------------------+---------------------+-----------------------
0 | {1,100,1}:{5,0,5} | {50,50,2}:{1,2,10} | {1,100,1,50,50,2}:{5,0,5,1,2,10} | {1,100,1}:{5,0,5} | {50,50,2}:{1,2,10}
1 | {1,100,1}:{-5,0,-5} | {50,50,2}:{-1,-2,-10} | {1,100,1,50,50,2}:{-5,0,-5,-1,-2,-10} | {1,100,1}:{-5,0,-5} | {50,50,2}:{-1,-2,-10}
11 | {1}:{0} | {1}:{1} | {1,1}:{0,1} | {1}:{0} | {1}:{1}
12 | {1}:{5} | {3}:{-8} | {1,3}:{5,-8} | {1}:{5} | {3}:{-8}
13 | {1}:{0} | {1}:{NVP} | {1,1}:{0,NVP} | {1}:{0} | {1}:{NVP}
14 | {1,2,1}:{2,4,2} | {2,1,1}:{0,3,5} | {1,2,1,2,1,1}:{2,4,2,0,3,5} | {1,2,1}:{2,4,2} | {2,1,1}:{0,3,5}
15 | {1,2,1}:{2,4,2} | {2,1,1}:{NVP,3,5} | {1,2,1,2,1,1}:{2,4,2,NVP,3,5} | {1,2,1}:{2,4,2} | {2,1,1}:{NVP,3,5}
(7 rows)
select id, madlib.svec_concat_replicate(0, b), b from madlib.test_pairs order by id;
id | svec_concat_replicate | b
----+-----------------------+-----------------------
0 | {}:{} | {50,50,2}:{1,2,10}
1 | {}:{} | {50,50,2}:{-1,-2,-10}
11 | {}:{} | {1}:{1}
12 | {}:{} | {3}:{-8}
13 | {}:{} | {1}:{NVP}
14 | {}:{} | {2,1,1}:{0,3,5}
15 | {}:{} | {2,1,1}:{NVP,3,5}
(7 rows)
select id, madlib.svec_concat_replicate(1, b) = b from madlib.test_pairs order by id;
id | ?column?
----+----------
0 | t
1 | t
11 | t
12 | t
13 | t
14 | t
15 | t
(7 rows)
select id, madlib.svec_concat_replicate(3, b), b from madlib.test_pairs order by id;
id | svec_concat_replicate | b
----+-----------------------------------------------------------+-----------------------
0 | {50,50,2,50,50,2,50,50,2}:{1,2,10,1,2,10,1,2,10} | {50,50,2}:{1,2,10}
1 | {50,50,2,50,50,2,50,50,2}:{-1,-2,-10,-1,-2,-10,-1,-2,-10} | {50,50,2}:{-1,-2,-10}
11 | {1,1,1}:{1,1,1} | {1}:{1}
12 | {3,3,3}:{-8,-8,-8} | {3}:{-8}
13 | {1,1,1}:{NVP,NVP,NVP} | {1}:{NVP}
14 | {2,1,1,2,1,1,2,1,1}:{0,3,5,0,3,5,0,3,5} | {2,1,1}:{0,3,5}
15 | {2,1,1,2,1,1,2,1,1}:{NVP,3,5,NVP,3,5,NVP,3,5} | {2,1,1}:{NVP,3,5}
(7 rows)
-- select id, madlib.svec_concat_replicate(-2, b), b from madlib.test_pairs order by id; -- this should produce error message
select id, madlib.dimension(a), a, madlib.dimension(b), b from madlib.test_pairs order by id;
id | dimension | a | dimension | b
----+-----------+---------------------+-----------+-----------------------
0 | 102 | {1,100,1}:{5,0,5} | 102 | {50,50,2}:{1,2,10}
1 | 102 | {1,100,1}:{-5,0,-5} | 102 | {50,50,2}:{-1,-2,-10}
11 | 1 | {1}:{0} | 1 | {1}:{1}
12 | 1 | {1}:{5} | 3 | {3}:{-8}
13 | 1 | {1}:{0} | 1 | {1}:{NVP}
14 | 4 | {1,2,1}:{2,4,2} | 4 | {2,1,1}:{0,3,5}
15 | 4 | {1,2,1}:{2,4,2} | 4 | {2,1,1}:{NVP,3,5}
(7 rows)
select madlib.svec_lapply('sqrt', null);
svec_lapply
-------------
(1 row)
select id, madlib.svec_lapply('sqrt', madlib.svec_lapply('abs', a)), a from madlib.test_pairs order by id;
id | svec_lapply | a
----+-------------------------------------------------+---------------------
0 | {1,100,1}:{2.23606797749979,0,2.23606797749979} | {1,100,1}:{5,0,5}
1 | {1,100,1}:{2.23606797749979,0,2.23606797749979} | {1,100,1}:{-5,0,-5}
11 | {1}:{0} | {1}:{0}
12 | {1}:{2.23606797749979} | {1}:{5}
13 | {1}:{0} | {1}:{0}
14 | {1,2,1}:{1.4142135623731,2,1.4142135623731} | {1,2,1}:{2,4,2}
15 | {1,2,1}:{1.4142135623731,2,1.4142135623731} | {1,2,1}:{2,4,2}
(7 rows)
select id, madlib.svec_lapply('sqrt', madlib.svec_lapply('abs', b)), b from madlib.test_pairs order by id;
id | svec_lapply | b
----+-------------------------------------------------+-----------------------
0 | {50,50,2}:{1,1.4142135623731,3.16227766016838} | {50,50,2}:{1,2,10}
1 | {50,50,2}:{1,1.4142135623731,3.16227766016838} | {50,50,2}:{-1,-2,-10}
11 | {1}:{1} | {1}:{1}
12 | {3}:{2.82842712474619} | {3}:{-8}
13 | {1}:{NVP} | {1}:{NVP}
14 | {2,1,1}:{0,1.73205080756888,2.23606797749979} | {2,1,1}:{0,3,5}
15 | {2,1,1}:{NVP,1.73205080756888,2.23606797749979} | {2,1,1}:{NVP,3,5}
(7 rows)
select madlib.svec_append(null::madlib.svec, 220::float8, 20::int8);
svec_append
-------------
{20}:{220}
(1 row)
select id, madlib.svec_append(a, 50, 100), a, madlib.svec_append(b, null, 50), b from madlib.test_pairs order by id;
id | svec_append | a | svec_append | b
----+----------------------------+---------------------+------------------------------+-----------------------
0 | {1,100,1,100}:{5,0,5,50} | {1,100,1}:{5,0,5} | {50,50,2,50}:{1,2,10,NVP} | {50,50,2}:{1,2,10}
1 | {1,100,1,100}:{-5,0,-5,50} | {1,100,1}:{-5,0,-5} | {50,50,2,50}:{-1,-2,-10,NVP} | {50,50,2}:{-1,-2,-10}
11 | {1,100}:{0,50} | {1}:{0} | {1,50}:{1,NVP} | {1}:{1}
12 | {1,100}:{5,50} | {1}:{5} | {3,50}:{-8,NVP} | {3}:{-8}
13 | {1,100}:{0,50} | {1}:{0} | {1,50}:{NVP,NVP} | {1}:{NVP}
14 | {1,2,1,100}:{2,4,2,50} | {1,2,1}:{2,4,2} | {2,1,1,50}:{0,3,5,NVP} | {2,1,1}:{0,3,5}
15 | {1,2,1,100}:{2,4,2,50} | {1,2,1}:{2,4,2} | {2,1,1,50}:{NVP,3,5,NVP} | {2,1,1}:{NVP,3,5}
(7 rows)
select madlib.svec_proj(a,1), a, madlib.svec_proj(b,1), b from madlib.test_pairs order by id;
svec_proj | a | svec_proj | b
-----------+---------------------+-----------+-----------------------
5 | {1,100,1}:{5,0,5} | 1 | {50,50,2}:{1,2,10}
-5 | {1,100,1}:{-5,0,-5} | -1 | {50,50,2}:{-1,-2,-10}
0 | {1}:{0} | 1 | {1}:{1}
5 | {1}:{5} | -8 | {3}:{-8}
0 | {1}:{0} | | {1}:{NVP}
2 | {1,2,1}:{2,4,2} | 0 | {2,1,1}:{0,3,5}
2 | {1,2,1}:{2,4,2} | | {2,1,1}:{NVP,3,5}
(7 rows)
-- select madlib.svec_proj(a,2), a, madlib.svec_proj(b,2), b from madlib.test_pairs order by id; -- this should result in an appropriate error message
select madlib.svec_subvec('{1,20,30,10,600,2}:{1,2,3,4,5,6}', 3,69);
svec_subvec
------------------------
{19,30,10,8}:{2,3,4,5}
(1 row)
select madlib.svec_subvec('{1,20,30,10,600,2}:{1,2,3,4,5,6}', 69,3);
svec_subvec
------------------------
{8,10,30,19}:{5,4,3,2}
(1 row)
select madlib.svec_subvec(a,2,4), a from madlib.test_pairs where madlib.dimension(a) >= 4 order by id;
svec_subvec | a
-------------+---------------------
{3}:{0} | {1,100,1}:{5,0,5}
{3}:{0} | {1,100,1}:{-5,0,-5}
{2,1}:{4,2} | {1,2,1}:{2,4,2}
{2,1}:{4,2} | {1,2,1}:{2,4,2}
(4 rows)
select madlib.svec_subvec(a,2,madlib.dimension(a)-1), a from madlib.test_pairs where madlib.dimension(a) >= 2 order by id;
svec_subvec | a
-------------+---------------------
{100}:{0} | {1,100,1}:{5,0,5}
{100}:{0} | {1,100,1}:{-5,0,-5}
{2}:{4} | {1,2,1}:{2,4,2}
{2}:{4} | {1,2,1}:{2,4,2}
(4 rows)
-- select madlib.svec_subvec(a,madlib.dimension(a)-1,0), a from madlib.test_pairs where madlib.dimension(a) >= 2 order by id;
select madlib.svec_reverse(a), a, madlib.svec_reverse(b), b from madlib.test_pairs order by id;
svec_reverse | a | svec_reverse | b
---------------------+---------------------+-----------------------+-----------------------
{1,100,1}:{5,0,5} | {1,100,1}:{5,0,5} | {2,50,50}:{10,2,1} | {50,50,2}:{1,2,10}
{1,100,1}:{-5,0,-5} | {1,100,1}:{-5,0,-5} | {2,50,50}:{-10,-2,-1} | {50,50,2}:{-1,-2,-10}
{1}:{0} | {1}:{0} | {1}:{1} | {1}:{1}
{1}:{5} | {1}:{5} | {3}:{-8} | {3}:{-8}
{1}:{0} | {1}:{0} | {1}:{NVP} | {1}:{NVP}
{1,2,1}:{2,4,2} | {1,2,1}:{2,4,2} | {1,1,2}:{5,3,0} | {2,1,1}:{0,3,5}
{1,2,1}:{2,4,2} | {1,2,1}:{2,4,2} | {1,1,2}:{5,3,NVP} | {2,1,1}:{NVP,3,5}
(7 rows)
select madlib.svec_subvec('{1,20,30,10,600,2}:{1,2,3,4,5,6}', 3,69) =
madlib.svec_reverse(madlib.svec_subvec('{1,20,30,10,600,2}:{1,2,3,4,5,6}', 69,3));
?column?
----------
t
(1 row)
select madlib.svec_change('{1,20,30,10,600,2}:{1,2,3,4,5,6}', 3, '{2,3}:{4,null}');
svec_change
------------------------------------------------
{1,1,2,3,14,30,10,600,2}:{1,2,4,NVP,2,3,4,5,6}
(1 row)
select madlib.svec_change(a,1,'{1}:{-50}'), a from madlib.test_pairs order by id;
svec_change | a
----------------------+---------------------
{1,100,1}:{-50,0,5} | {1,100,1}:{5,0,5}
{1,100,1}:{-50,0,-5} | {1,100,1}:{-5,0,-5}
{1}:{-50} | {1}:{0}
{1}:{-50} | {1}:{5}
{1}:{-50} | {1}:{0}
{1,2,1}:{-50,4,2} | {1,2,1}:{2,4,2}
{1,2,1}:{-50,4,2} | {1,2,1}:{2,4,2}
(7 rows)
-- Test the multi-concatenation and show sizes compared with a normal array
drop table if exists corpus_proj;
psql:sql/gp_svec_test.sql:142: NOTICE: table "corpus_proj" does not exist, skipping
drop table if exists corpus_proj_array;
psql:sql/gp_svec_test.sql:143: NOTICE: table "corpus_proj_array" does not exist, skipping
create table corpus_proj as (select 10000 *|| ('{45,2,35,4,15,1}:{0,1,0,1,0,2}'::madlib.svec) result ) distributed randomly;
create table corpus_proj_array as (select result::float8[] from corpus_proj) distributed randomly;
-- Calculate on-disk size of sparse vector
select pg_size_pretty(pg_total_relation_size('corpus_proj'));
pg_size_pretty
----------------
192 kB
(1 row)
-- Calculate on-disk size of normal array
select pg_size_pretty(pg_total_relation_size('corpus_proj_array'));
pg_size_pretty
----------------
288 kB
(1 row)
-- Calculate L1 norm from sparse vector
select madlib.l1norm(result) from corpus_proj;
l1norm
--------
80000
(1 row)
-- Calculate L1 norm from float8[]
select madlib.l1norm(result) from corpus_proj_array;
l1norm
--------
80000
(1 row)
-- Calculate L2 norm from sparse vector
select madlib.l2norm(result) from corpus_proj;
l2norm
------------------
316.227766016838
(1 row)
-- Calculate L2 norm from float8[]
select madlib.l2norm(result) from corpus_proj_array;
l2norm
------------------
316.227766016838
(1 row)
drop table corpus_proj;
drop table corpus_proj_array;
-- -- Test the pivot operator
drop table if exists pivot_test;
psql:sql/gp_svec_test.sql:165: NOTICE: table "pivot_test" does not exist, skipping
create table pivot_test(a float8) distributed randomly;
insert into pivot_test values (0),(1),(0),(2),(3);
-- select madlib.array_agg(a) from pivot_test;
select madlib.l1norm(madlib.array_agg(a)) from pivot_test;
l1norm
--------
6
(1 row)
drop table if exists pivot_test;
-- Answer should be 5
select madlib.vec_median(madlib.array_agg(a)) from (select generate_series(1,9) a) foo;
vec_median
------------
5
(1 row)
-- Answer should be a 10-wide vector
-- select madlib.array_agg(a) from (select trunc(random()*10) a,generate_series(1,100000) order by a) foo;
-- Average is 4.50034, median is 5
select madlib.vec_median('{9960,9926,10053,9993,10080,10050,9938,9941,10030,10029}:{1,9,8,7,6,5,4,3,2,0}'::madlib.svec);
vec_median
------------
5
(1 row)
select madlib.vec_median('{9960,9926,10053,9993,10080,10050,9938,9941,10030,10029}:{1,9,8,7,6,5,4,3,2,0}'::madlib.svec::float8[]);
vec_median
------------
5
(1 row)