User Documentation
 All Files Functions Groups
matrix_op.sql_in
1 m4_include(`SQLCommon.m4')
2 
3 CREATE TYPE MADLIB_SCHEMA.matrix_result AS(
4  output_table TEXT
5 );
6 
7 CREATE OR REPLACE FUNCTION
8 MADLIB_SCHEMA.matrix_mult
9 (
10  matrix_a TEXT,
11  a_row TEXT,
12  a_col TEXT,
13  a_val TEXT,
14  a_trans BOOLEAN,
15  matrix_b TEXT,
16  b_row TEXT,
17  b_col TEXT,
18  b_val TEXT,
19  b_trans BOOLEAN,
20  matrix_r TEXT
21 )
22 RETURNS MADLIB_SCHEMA.matrix_result AS $$
23  PythonFunctionBodyOnly(`linalg', `matrix_op')
24  matrix_op.matrix_mult(schema_madlib,
25  matrix_a, a_row, a_col, a_val, a_trans,
26  matrix_b, b_row, b_col, b_val, b_trans,
27  matrix_r)
28  return [matrix_r]
29 $$ LANGUAGE plpythonu;
30 
31 CREATE OR REPLACE FUNCTION
32 MADLIB_SCHEMA.matrix_mult
33 (
34  matrix_a TEXT,
35  a_trans BOOLEAN,
36  matrix_b TEXT,
37  b_trans BOOLEAN,
38  matrix_r TEXT
39 )
40 RETURNS MADLIB_SCHEMA.matrix_result AS $$
41  SELECT
42  MADLIB_SCHEMA.matrix_mult(
43  $1, NULL, NULL, NULL, $2,
44  $3, NULL, NULL, NULL, $4,
45  $5);
46 $$ LANGUAGE sql;
47 
48 CREATE OR REPLACE FUNCTION
49 MADLIB_SCHEMA.matrix_block_mult
50 (
51  matrix_a TEXT,
52  matrix_b TEXT,
53  matrix_r TEXT
54 )
55 RETURNS MADLIB_SCHEMA.matrix_result AS $$
56  PythonFunctionBodyOnly(`linalg', `matrix_op')
57  matrix_op.matrix_block_mult(schema_madlib,
58  matrix_a, matrix_b, matrix_r)
59  return [matrix_r]
60 $$ LANGUAGE plpythonu;
61 
62 CREATE OR REPLACE FUNCTION
63 MADLIB_SCHEMA.matrix_block_square
64 (
65  matrix_in TEXT,
66  matrix_out TEXT
67 )
68 RETURNS MADLIB_SCHEMA.matrix_result AS $$
69  PythonFunctionBodyOnly(`linalg', `matrix_op')
70  matrix_op.matrix_block_square(schema_madlib, matrix_in, matrix_out)
71  return [matrix_out]
72 $$ LANGUAGE plpythonu;
73 
74 CREATE OR REPLACE FUNCTION
75 MADLIB_SCHEMA.matrix_block_trans
76 (
77  matrix_in TEXT,
78  matrix_out TEXT,
79  use_temp_table BOOLEAN
80 )
81 RETURNS MADLIB_SCHEMA.matrix_result AS $$
82  PythonFunctionBodyOnly(`linalg', `matrix_op')
83  matrix_op.matrix_block_trans(schema_madlib, matrix_in, matrix_out, use_temp_table)
84  return [matrix_out]
85 $$ LANGUAGE plpythonu;
86 
87 CREATE OR REPLACE FUNCTION
88 MADLIB_SCHEMA.matrix_block_trans
89 (
90  matrix_in TEXT,
91  matrix_out TEXT
92 )
93 RETURNS MADLIB_SCHEMA.matrix_result AS $$
94  select MADLIB_SCHEMA.matrix_block_trans($1, $2, FALSE)
95 $$ LANGUAGE SQL;
96 
97 CREATE OR REPLACE FUNCTION
98 MADLIB_SCHEMA.matrix_square
99 (
100  matrix_in TEXT,
101  matrix_out TEXT
102 )
103 RETURNS MADLIB_SCHEMA.matrix_result AS $$
104  PythonFunctionBodyOnly(`linalg', `matrix_op')
105  matrix_op.matrix_square(schema_madlib,
106  matrix_in, matrix_out)
107  return [matrix_out]
108 $$ LANGUAGE plpythonu;
109 
110 CREATE OR REPLACE FUNCTION
111 MADLIB_SCHEMA.matrix_trans
112 (
113  matrix_in TEXT,
114  in_row TEXT,
115  in_col TEXT,
116  in_val TEXT,
117  matrix_out TEXT,
118  use_temp_table BOOLEAN
119 )
120 RETURNS MADLIB_SCHEMA.matrix_result AS $$
121  PythonFunctionBodyOnly(`linalg', `matrix_op')
122  matrix_op.matrix_trans(schema_madlib,
123  matrix_in, in_row, in_col, in_val, matrix_out, use_temp_table)
124  return [matrix_out]
125 $$ LANGUAGE plpythonu;
126 
127 CREATE OR REPLACE FUNCTION
128 MADLIB_SCHEMA.matrix_trans
129 (
130  matrix_in TEXT,
131  matrix_out TEXT,
132  use_temp_table BOOLEAN
133 )
134 RETURNS MADLIB_SCHEMA.matrix_result AS $$
135  SELECT
136  MADLIB_SCHEMA.matrix_trans(
137  $1, NULL, NULL, NULL, $2, $3);
138 $$ LANGUAGE sql;
139 
140 CREATE OR REPLACE FUNCTION
141 MADLIB_SCHEMA.matrix_sparsify
142 (
143  matrix_in TEXT,
144  matrix_out TEXT,
145  use_temp_table BOOLEAN
146 )
147 RETURNS MADLIB_SCHEMA.matrix_result AS $$
148  PythonFunctionBodyOnly(`linalg', `matrix_op')
149  matrix_op.matrix_sparsify(matrix_in, matrix_out, use_temp_table)
150  return [matrix_out]
151 $$ LANGUAGE plpythonu;
152 
153 CREATE OR REPLACE FUNCTION
154 MADLIB_SCHEMA.matrix_densify
155 (
156  matrix_in TEXT,
157  in_row TEXT,
158  in_col TEXT,
159  in_val TEXT,
160  matrix_out TEXT,
161  use_temp_table BOOLEAN
162 )
163 RETURNS MADLIB_SCHEMA.matrix_result AS $$
164  PythonFunctionBodyOnly(`linalg', `matrix_op')
165  matrix_op.matrix_densify(schema_madlib,
166  matrix_in, in_row, in_col, in_val, matrix_out, use_temp_table)
167  return [matrix_out]
168 $$ LANGUAGE plpythonu;
169 
170 CREATE OR REPLACE FUNCTION
171 MADLIB_SCHEMA.__matrix_densify_sfunc
172 (
173  state FLOAT8[],
174  col_dim INT4,
175  col INT4,
176  val FLOAT8
177 )
178 RETURNS FLOAT8[]
179 AS 'MODULE_PATHNAME', 'matrix_densify_sfunc'
180 LANGUAGE C;
181 
182 CREATE OR REPLACE FUNCTION
183 MADLIB_SCHEMA.__rand_vector
184 (
185  dim INT4
186 )
187 RETURNS INT4[]
188 AS 'MODULE_PATHNAME', 'rand_vector'
189 LANGUAGE C STRICT;
190 
191 CREATE OR REPLACE FUNCTION
192 MADLIB_SCHEMA.__rand_block
193 (
194  row_dim INT4,
195  col_dim INT4
196 )
197 RETURNS INT4[]
198 AS 'MODULE_PATHNAME', 'rand_block'
199 LANGUAGE C STRICT;
200 
201 CREATE OR REPLACE FUNCTION
202 MADLIB_SCHEMA.__rand_block
203 (
204  dim INT4
205 )
206 RETURNS INT4[] AS $$
207  SELECT MADLIB_SCHEMA.__rand_block($1, $1);
208 $$ LANGUAGE sql STRICT;
209 
210 CREATE OR REPLACE FUNCTION
211 MADLIB_SCHEMA.__matrix_row_split
212 (
213  row_in FLOAT8[],
214  size INT4
215 )
216 RETURNS SETOF FLOAT8[]
217 AS 'MODULE_PATHNAME', 'row_split'
218 LANGUAGE C STRICT;
219 
220 CREATE OR REPLACE FUNCTION
221 MADLIB_SCHEMA.__matrix_blockize_sfunc
222 (
223  state FLOAT8[],
224  row_id INT4,
225  row_vec FLOAT8[],
226  rsize INT4
227 )
228 RETURNS FLOAT8[]
229 AS 'MODULE_PATHNAME', 'matrix_blockize_sfunc'
230 LANGUAGE C;
231 
232 CREATE OR REPLACE FUNCTION
233 MADLIB_SCHEMA.__matrix_unblockize_sfunc
234 (
235  state FLOAT8[],
236  total_col_dim INT4,
237  col_id INT4,
238  row_vec FLOAT8[]
239 )
240 RETURNS FLOAT8[]
241 AS 'MODULE_PATHNAME', 'matrix_unblockize_sfunc'
242 LANGUAGE C;
243 
244 DROP AGGREGATE IF EXISTS
245 MADLIB_SCHEMA.__matrix_densify_agg
246 (
247  INT4,
248  INT4,
249  FLOAT8
250 );
251 
252 CREATE AGGREGATE
253 MADLIB_SCHEMA.__matrix_densify_agg
254 (
255  INT4,
256  INT4,
257  FLOAT8
258 )
259 (
260  stype = FLOAT8[],
261  sfunc = MADLIB_SCHEMA.__matrix_densify_sfunc
262 );
263 
264 DROP AGGREGATE IF EXISTS
265 MADLIB_SCHEMA.__matrix_blockize_agg
266 (
267  INT4,
268  FLOAT8[],
269  INT4
270 );
271 
272 CREATE AGGREGATE
273 MADLIB_SCHEMA.__matrix_blockize_agg
274 (
275  INT4,
276  FLOAT8[],
277  INT4
278 )
279 (
280  stype = FLOAT8[],
281  sfunc = MADLIB_SCHEMA.__matrix_blockize_sfunc
282 );
283 
284 DROP AGGREGATE IF EXISTS
285 MADLIB_SCHEMA.__matrix_unblockize_agg
286 (
287  INT4,
288  INT4,
289  FLOAT8[]
290 );
291 
292 CREATE AGGREGATE
293 MADLIB_SCHEMA.__matrix_unblockize_agg
294 (
295  INT4,
296  INT4,
297  FLOAT8[]
298 )
299 (
300  stype = FLOAT8[],
301  sfunc = MADLIB_SCHEMA.__matrix_unblockize_sfunc
302 );
303 
304 CREATE OR REPLACE FUNCTION
305 MADLIB_SCHEMA.matrix_mem_mult
306 (
307  matrix_a FLOAT[],
308  matrix_b FLOAT[],
309  trans_b BOOLEAN
310 )
311 RETURNS FLOAT8[]
312 AS 'MODULE_PATHNAME', 'matrix_mem_mult'
313 LANGUAGE C;
314 
315 CREATE OR REPLACE FUNCTION
316 MADLIB_SCHEMA.matrix_mem_mult
317 (
318  matrix_a FLOAT[],
319  matrix_b FLOAT[]
320 )
321 RETURNS FLOAT8[] AS $$
322  SELECT MADLIB_SCHEMA.matrix_mem_mult($1, $2, false);
323 $$ LANGUAGE sql;
324 
325 CREATE OR REPLACE FUNCTION
326 MADLIB_SCHEMA.matrix_mem_trans
327 (
328  matrix FLOAT[]
329 )
330 RETURNS FLOAT8[]
331 AS 'MODULE_PATHNAME', 'matrix_mem_trans'
332 LANGUAGE C;
333 
334 CREATE OR REPLACE FUNCTION
335 MADLIB_SCHEMA.__matrix_mem_sum_sfunc
336 (
337  state FLOAT[],
338  matrix FLOAT[]
339 )
340 RETURNS FLOAT8[]
341 AS 'MODULE_PATHNAME', 'matrix_mem_sum_sfunc'
342 LANGUAGE C;
343 
344 DROP AGGREGATE IF EXISTS
345 MADLIB_SCHEMA.__matrix_mem_sum
346 (
347  FLOAT8[]
348 );
349 
350 CREATE AGGREGATE
351 MADLIB_SCHEMA.__matrix_mem_sum
352 (
353  FLOAT8[]
354 )
355 (
356  stype = FLOAT8[],
357  sfunc = MADLIB_SCHEMA.__matrix_mem_sum_sfunc
358 );
359 
360 CREATE OR REPLACE FUNCTION
361 MADLIB_SCHEMA.__matrix_column_to_array_format
362 (
363  matrix_in TEXT,
364  row_id TEXT,
365  matrix_out TEXT,
366  istemp BOOLEAN
367 )
368 RETURNS MADLIB_SCHEMA.matrix_result AS $$
369  PythonFunctionBodyOnly(`linalg', `matrix_op')
370  matrix_op.__matrix_column_to_array_format(matrix_in, row_id, matrix_out, istemp)
371  return [matrix_out]
372 $$ LANGUAGE plpythonu STRICT;
373 
374 CREATE OR REPLACE FUNCTION
375 MADLIB_SCHEMA.matrix_blockize
376 (
377  matrix_in TEXT,
378  rsize INT4,
379  csize INT4,
380  matrix_out TEXT
381 )
382 RETURNS MADLIB_SCHEMA.matrix_result AS $$
383  PythonFunctionBodyOnly(`linalg', `matrix_op')
384  matrix_op.matrix_blockize(schema_madlib, matrix_in, rsize, csize, matrix_out)
385  return [matrix_out]
386 $$ LANGUAGE plpythonu;
387 
388 CREATE OR REPLACE FUNCTION
389 MADLIB_SCHEMA.matrix_unblockize
390 (
391  matrix_in TEXT,
392  matrix_out TEXT
393 )
394 RETURNS MADLIB_SCHEMA.matrix_result AS $$
395  PythonFunctionBodyOnly(`linalg', `matrix_op')
396  matrix_op.matrix_unblockize(schema_madlib, matrix_in, matrix_out)
397  return [matrix_out]
398 $$ LANGUAGE plpythonu;
399 
400 CREATE OR REPLACE FUNCTION
401 MADLIB_SCHEMA.__matrix_unnest_block
402 (
403  block FLOAT8[]
404 )
405 RETURNS SETOF FLOAT8[]
406 AS 'MODULE_PATHNAME', 'unnest_block'
407 LANGUAGE C IMMUTABLE STRICT;
408 
409 ------------------ Scale and add matrices ------------------------------
410 /**
411  * @brief Scale and add matrix operation ( R <- A + sB)
412  *
413  * @param matrix_a Source matrix table A (dense matrix format)
414  * @param matrix_b Source matrix table B (dense matrix format)
415  * @param scale Scale for matrix B
416  * @param matrix_r Output table for matrix R <- A + sB
417  *
418  * @return VOID
419  *
420  * @usage
421  * For matrix addition and subtration, you can use the same function
422  * with different values of scalar
423  * <pre>
424  * SELECT matrix_scale_and_add('matrix_a', 'matrix_b', 1, 'matrix_r');
425  * SELECT matrix_scale_and_add('matrix_a', 'matrix_b', -1, 'matrix_r');
426  * </pre>
427  */
428 
429 CREATE OR REPLACE FUNCTION MADLIB_SCHEMA.matrix_scale_and_add(
430  matrix_a TEXT,
431  matrix_b TEXT,
432  scale DOUBLE PRECISION,
433  matrix_r TEXT
434 )
435 RETURNS VOID AS $$
436 PythonFunction(linalg, matrix_op, matrix_scale_and_add)
437 $$ LANGUAGE plpythonu;
438 
439 
440 ------------------ Matrix Norms ------------------------------
441 
442 /**
443  * @brief Compute matrix norm (of various types)
444  *
445  * @param source_table Source matrix table (dense matrix format)
446  * @param norm_type Type of norm used (default: fro)
447  *
448  * @return DOUBLE PRECISION
449  *
450  * @usage Currenty, we support the following norms
451  * (a) 'fro': Computes the frobenius norm
452  *
453  * <pre>
454  * SELECT matrix_norm('<em>matrix_table_name</em>', 'fro');
455  * </pre>
456  */
457 
458 CREATE OR REPLACE FUNCTION MADLIB_SCHEMA.matrix_norm(
459  matrix_a TEXT,
460  norm_type TEXT
461 )
462 RETURNS DOUBLE PRECISION AS $$
463 PythonFunction(linalg, matrix_op, matrix_norm)
464 $$ LANGUAGE plpythonu;
465 
466 CREATE OR REPLACE FUNCTION
467 MADLIB_SCHEMA.matrix_norm(
468  matrix_a TEXT
469 )
470 RETURNS DOUBLE PRECISION AS $$
471  SELECT MADLIB_SCHEMA.matrix_norm($1, NULL)
472 $$ LANGUAGE SQL;