12 m4_include(`SQLCommon.m4
')
247 -- -----------------------------------------------------------------------
248 -- Main function for SVD (Dense format)
249 -- -----------------------------------------------------------------------
251 @brief Compute an singular value decomposition for a dense matrix stored in a
254 CREATE OR REPLACE FUNCTION
256 source_table TEXT, -- Source table name (dense array-format matrix)
257 output_table_prefix TEXT, -- Prefix for output tables
258 row_id TEXT, -- ID for each row
259 k INTEGER, -- Number of singular vectors to compute
260 lanczos_iter INTEGER, -- Iteration number of Lanczos
261 result_summary_table TEXT -- Table name to store result summary
264 PythonFunctionBodyOnly(`linalg', `svd
')
266 schema_madlib, source_table, output_table_prefix,
267 row_id, k, lanczos_iter, result_summary_table)
268 $$ LANGUAGE plpythonu;
270 -- -----------------------------------------------------------------------
271 -- Main function for SVD (Block format)
272 -- Each row in the input table is a triple: <row_id, col_id, block>
273 -- -----------------------------------------------------------------------
274 CREATE OR REPLACE FUNCTION
275 MADLIB_SCHEMA.svd_block(
276 source_table TEXT, -- Source table name (dense block-format matrix)
277 output_table_prefix TEXT, -- Prefix for output tables
278 k INTEGER, -- Number of singular vectors to compute
279 lanczos_iter INTEGER, -- Iteration number of Lanczos
280 result_summary_table TEXT -- Table name to store result summary
283 PythonFunctionBodyOnly(`linalg', `svd
')
284 return svd.svd_block(
285 schema_madlib, source_table, output_table_prefix, k, lanczos_iter, result_summary_table)
286 $$ LANGUAGE plpythonu;
288 CREATE OR REPLACE FUNCTION
289 MADLIB_SCHEMA.svd_block(
290 source_table TEXT, -- Source table name (dense block-format matrix)
291 output_table_prefix TEXT, -- Prefix for output tables
292 k INTEGER, -- Number of singular vectors to compute
293 lanczos_iter INTEGER -- Iteration number of Lanczos
296 SELECT MADLIB_SCHEMA.svd_block($1, $2, $3, $4, NULL)
299 CREATE OR REPLACE FUNCTION
300 MADLIB_SCHEMA.svd_block(
301 source_table TEXT, -- Source table name (dense block-format matrix)
302 output_table_prefix TEXT, -- Prefix for output tables
303 k INTEGER -- Number of singular vectors to compute
306 SELECT MADLIB_SCHEMA.svd_block($1, $2, $3, NULL, NULL)
309 -- -----------------------------------------------------------------------
310 -- Main Function for SVD (sparse format)
311 -- -----------------------------------------------------------------------
313 @brief Compute an singular value decomposition for a sparse matrix stored in a
315 ('input_table
', 'output_table_prefix
', ’row_id', ’col_id
', 'value
', row_dim, col_dim, k, 'result_summary_table
')
317 CREATE OR REPLACE FUNCTION
318 MADLIB_SCHEMA.svd_sparse(
319 source_table TEXT, -- Source table name (dense matrix)
320 output_table_prefix TEXT, -- Prefix for output tables
321 row_id TEXT, -- Name of ‘row_id’ column in sparse matrix representation
322 col_id TEXT, -- Name of 'col_id
' column in sparse matrix representation
323 val_id TEXT, -- Name of 'val_id
' column in sparse matrix representation
324 row_dim INTEGER, -- row dimension of sparse matrix
325 col_dim INTEGER, -- col dimension of sparse matrix
326 k INTEGER, -- Number of singular vectors with dominant singular values, sorted decreasingly
327 lanczos_iter INTEGER, -- Iteration number of Lanczos
328 result_summary_table TEXT -- Table name to store result summary
331 PythonFunctionBodyOnly(`linalg', `svd
')
332 return svd.svd_sparse(
333 schema_madlib, source_table, output_table_prefix,
334 row_id, col_id, val_id, row_dim, col_dim, k,
335 lanczos_iter, result_summary_table)
336 $$ LANGUAGE plpythonu;
338 CREATE OR REPLACE FUNCTION
339 MADLIB_SCHEMA.svd_sparse_native(
340 source_table TEXT, -- Source table name (dense matrix)
341 output_table_prefix TEXT, -- Prefix for output tables
342 row_id TEXT, -- Name of ‘row_id’ column in sparse matrix representation
343 col_id TEXT, -- Name of 'col_id
' column in sparse matrix representation
344 val_id TEXT, -- Name of 'val_id
' column in sparse matrix representation
345 row_dim INTEGER, -- row dimension of sparse matrix
346 col_dim INTEGER, -- col dimension of sparse matrix
347 k INTEGER, -- Number of singular vectors with dominant singular values,
348 -- sorted decreasingly
349 lanczos_iter INTEGER, -- Iteration number of Lanczos
350 result_summary_table TEXT -- Table name to store result summary
353 PythonFunctionBodyOnly(`linalg', `svd
')
354 return svd.svd_sparse_native(
355 schema_madlib, source_table, output_table_prefix,
356 row_id, col_id, val_id, row_dim, col_dim, k, lanczos_iter, result_summary_table)
357 $$ LANGUAGE plpythonu;
359 -- -----------------------------------------------------------------------
360 -- Overloaded functions for optional parameters
361 -- -----------------------------------------------------------------------
362 CREATE OR REPLACE FUNCTION
364 source_table TEXT, -- Source table name (dense matrix)
365 output_table_prefix TEXT, -- Prefix for output tables
366 row_id TEXT, -- ID for each row
367 k INTEGER -- Number of singular vectors to compute
370 SELECT MADLIB_SCHEMA.svd($1, $2, $3, $4, NULL, NULL)
374 CREATE OR REPLACE FUNCTION
375 MADLIB_SCHEMA.svd_sparse(
376 source_table TEXT, -- Source table name (dense matrix)
377 output_table_prefix TEXT, -- Prefix for output tables
378 row_id TEXT, -- Name of ‘row_id’ column in sparse matrix representation
379 col_id TEXT, -- Name of 'col_id
' column in sparse matrix representation
380 val_id TEXT, -- Name of 'val_id
' column in sparse matrix representation
381 row_dim INTEGER, -- row dimension of sparse matrix
382 col_dim INTEGER, -- col dimension of sparse matrix
383 k INTEGER -- Number of singular vectors with dominant singular values, sorted decreasingly
386 SELECT MADLIB_SCHEMA.svd_sparse($1, $2, $3, $4, $5, $6, $7, $8, NULL, NULL)
389 CREATE OR REPLACE FUNCTION
391 source_table TEXT, -- Source table name (dense matrix)
392 output_table_prefix TEXT, -- Prefix for output tables
393 row_id TEXT, -- ID for each row
394 k INTEGER, -- Number of singular vectors to compute
395 lanczos_iter INTEGER -- Iteration number of Lanczos
398 SELECT MADLIB_SCHEMA.svd($1, $2, $3, $4, $5, NULL)
402 CREATE OR REPLACE FUNCTION
403 MADLIB_SCHEMA.svd_sparse(
404 source_table TEXT, -- Source table name (dense matrix)
405 output_table_prefix TEXT, -- Prefix for output tables
406 row_id TEXT, -- Name of ‘row_id’ column in sparse matrix representation
407 col_id TEXT, -- Name of 'col_id
' column in sparse matrix representation
408 val_id TEXT, -- Name of 'val_id
' column in sparse matrix representation
409 row_dim INTEGER, -- row dimension of sparse matrix
410 col_dim INTEGER, -- col dimension of sparse matrix
411 k INTEGER, -- Number of singular vectors with dominant singular values, sorted decreasingly
412 lanczos_iter INTEGER -- Iteration number of Lanczos
415 SELECT MADLIB_SCHEMA.svd_sparse($1, $2, $3, $4, $5, $6, $7, $8, $9, NULL)
418 CREATE OR REPLACE FUNCTION
419 MADLIB_SCHEMA.svd_sparse_native(
420 source_table TEXT, -- Source table name (dense matrix)
421 output_table_prefix TEXT, -- Prefix for output tables
422 row_id TEXT, -- Name of ‘row_id’ column in sparse matrix representation
423 col_id TEXT, -- Name of 'col_id
' column in sparse matrix representation
424 val_id TEXT, -- Name of 'val_id
' column in sparse matrix representation
425 row_dim INTEGER, -- row dimension of sparse matrix
426 col_dim INTEGER, -- col dimension of sparse matrix
427 k INTEGER -- Number of singular vectors with dominant singular
428 -- values, sorted decreasingly
431 SELECT MADLIB_SCHEMA.svd_sparse_native($1, $2, $3, $4, $5, $6, $7, $8, NULL, NULL)
434 CREATE OR REPLACE FUNCTION
435 MADLIB_SCHEMA.svd_sparse_native(
436 source_table TEXT, -- Source table name (dense matrix)
437 output_table_prefix TEXT, -- Prefix for output tables
438 row_id TEXT, -- Name of ‘row_id’ column in sparse matrix representation
439 col_id TEXT, -- Name of 'col_id
' column in sparse matrix representation
440 val_id TEXT, -- Name of 'val_id
' column in sparse matrix representation
441 row_dim INTEGER, -- row dimension of sparse matrix
442 col_dim INTEGER, -- col dimension of sparse matrix
443 k INTEGER, -- Number of singular vectors with dominant singular values, sorted decreasingly
444 lanczos_iter INTEGER -- Iteration number of Lanczos
447 SELECT MADLIB_SCHEMA.svd_sparse_native($1, $2, $3, $4, $5, $6, $7, $8, $9, NULL)
450 ---------------------------------------------------------------------
451 ------------------------Internal Functions---------------------------
452 ---------------------------------------------------------------------
454 CREATE OR REPLACE FUNCTION
455 MADLIB_SCHEMA.__svd_unit_vector
457 dim INT -- Dimension of the vector
459 -- RETURNS MADLIB_SCHEMA.__svd_unit_vector_result
460 RETURNS DOUBLE PRECISION[]
461 AS 'MODULE_PATHNAME
', 'svd_unit_vector
'
464 DROP TYPE IF EXISTS MADLIB_SCHEMA.__svd_lanczos_result;
465 CREATE TYPE MADLIB_SCHEMA.__svd_lanczos_result AS
467 scalar FLOAT8, -- alpha/beta
468 vec FLOAT8[] -- pvec/qvec
471 ---------------------------------------------------------------------
472 -------Common Aggregator for Computing Lanzcos P/Q Vectors-----------
473 ---------------------------------------------------------------------
475 ---------------------------------------------------------------------
476 ---------------------For Array-Format Matrix-------------------------
477 ---------------------------------------------------------------------
478 CREATE OR REPLACE FUNCTION
479 MADLIB_SCHEMA.__svd_lanczos_sfunc
481 state FLOAT8[], -- A * q_j OR A_Trans * p_(j-1)
482 row_id INT, -- Matrix row id
483 row_array FLOAT8[], -- Matrix row array
484 vector FLOAT8[], -- q_j OR p_(j-1)
485 dimension INT -- row_dim OR col_dim
488 AS 'MODULE_PATHNAME
', 'svd_lanczos_sfunc
'
491 ---------------------------------------------------------------------
492 ---------------------For Block-Format Matrix-------------------------
493 ---------------------------------------------------------------------
494 CREATE OR REPLACE FUNCTION
495 MADLIB_SCHEMA.__svd_block_lanczos_sfunc
497 state FLOAT8[], -- A * q_j OR A_Trans * p_(j-1)
498 row_id INT4, -- Matrix block row id
499 col_id INT4, -- Matrix block col id
500 block FLOAT8[], -- Matrix block
501 vector FLOAT8[], -- q_j OR p_(j-1)
502 dimension INT4 -- row_dim OR col_dim
505 AS 'MODULE_PATHNAME
', 'svd_block_lanczos_sfunc
'
508 ---------------------------------------------------------------------
509 ---------------------For Sparse-Format Matrix-------------------------
510 ---------------------------------------------------------------------
511 CREATE OR REPLACE FUNCTION
512 MADLIB_SCHEMA.__svd_sparse_lanczos_sfunc
514 state FLOAT8[], -- A * q_j OR A_Trans * p_(j-1)
515 row_id INT4, -- row id
516 col_id INT4, -- col id
518 vector FLOAT8[], -- q_j OR p_(j-1)
519 dimension INT4 -- row_dim OR col_dim
522 AS 'MODULE_PATHNAME
', 'svd_sparse_lanczos_sfunc
'
525 CREATE OR REPLACE FUNCTION
526 MADLIB_SCHEMA.__svd_lanczos_prefunc
532 AS 'MODULE_PATHNAME
', 'svd_lanczos_prefunc
'
535 ---------------------------------------------------------------------
536 ---------------------For Array-Format Matrix-------------------------
537 ---------------------------------------------------------------------
538 DROP AGGREGATE IF EXISTS
539 MADLIB_SCHEMA.__svd_lanczos_agg
541 INT, -- Matrix row id
542 FLOAT8[], -- Matrix row array
543 FLOAT8[], -- q_j OR p_(j-1)
544 INT -- row_dim OR col_dim
548 MADLIB_SCHEMA.__svd_lanczos_agg
550 INT, -- Matrix row id
551 FLOAT8[], -- Matrix row array
552 FLOAT8[], -- q_j OR p_(j-1)
553 INT -- row_dim OR col_dim
557 sfunc = MADLIB_SCHEMA.__svd_lanczos_sfunc
560 `, prefunc = MADLIB_SCHEMA.__svd_lanczos_prefunc
'
564 ---------------------------------------------------------------------
565 ---------------------For Block-Format Matrix-------------------------
566 ---------------------------------------------------------------------
567 DROP AGGREGATE IF EXISTS
568 MADLIB_SCHEMA.__svd_block_lanczos_agg
570 INT4, -- Matrix block row id
571 INT4, -- Matrix block col id
572 FLOAT8[], -- Matrix block
573 FLOAT8[], -- q_j OR p_(j-1)
574 INT4 -- row_dim OR col_dim
578 MADLIB_SCHEMA.__svd_block_lanczos_agg
580 INT, -- Matrix block row id
581 INT4, -- Matrix block col id
582 FLOAT8[], -- Matrix row array
583 FLOAT8[], -- q_j OR p_(j-1)
584 INT -- row_dim OR col_dim
588 --Note that only the sfunc is different
589 sfunc = MADLIB_SCHEMA.__svd_block_lanczos_sfunc
592 `, prefunc = MADLIB_SCHEMA.__svd_lanczos_prefunc
'
596 ---------------------------------------------------------------------
597 ---------------------For Sparse-Format Matrix-------------------------
598 ---------------------------------------------------------------------
599 DROP AGGREGATE IF EXISTS
600 MADLIB_SCHEMA.__svd_sparse_lanczos_agg
605 FLOAT8[], -- q_j OR p_(j-1)
606 INT4 -- row_dim OR col_dim
610 MADLIB_SCHEMA.__svd_sparse_lanczos_agg
615 FLOAT8[], -- q_j OR p_(j-1)
616 INT4 -- row_dim OR col_dim
620 --Note that only the sfunc is different
621 sfunc = MADLIB_SCHEMA.__svd_sparse_lanczos_sfunc
624 `, prefunc = MADLIB_SCHEMA.__svd_lanczos_prefunc
'
628 ---------------------------------------------------------------------
629 --------Postproce Function for Computing Lanzcos P/V Vectors---------
630 ---------------------------------------------------------------------
631 CREATE OR REPLACE FUNCTION
632 MADLIB_SCHEMA.__svd_lanczos_pvec
634 vector FLOAT8[], -- Partial result from the aggregator
635 pvec FLOAT8[], -- Previous P vector
636 beta FLOAT8 -- Previous beta
638 RETURNS MADLIB_SCHEMA.__svd_lanczos_result
639 AS 'MODULE_PATHNAME
', 'svd_lanczos_pvec
'
642 CREATE OR REPLACE FUNCTION
643 MADLIB_SCHEMA.__svd_lanczos_qvec
645 vector FLOAT8[], -- Partial result from the aggregator
646 qvec FLOAT8[], -- Previous P vector
647 alpha FLOAT8 -- Previous beta
650 AS 'MODULE_PATHNAME
', 'svd_lanczos_qvec
'
652 ---------------------------------------------------------------------
653 -----------------Gram-Schmidt Orthogonilization----------------------
654 ---------------------------------------------------------------------
655 CREATE OR REPLACE FUNCTION
656 MADLIB_SCHEMA.__svd_gram_schmidt_orthogonalize_sfunc
659 vec_unorthogonalized FLOAT8[],
660 vec_orthogonalized FLOAT8[]
663 AS 'MODULE_PATHNAME
', 'svd_gram_schmidt_orthogonalize_sfunc
'
666 CREATE OR REPLACE FUNCTION
667 MADLIB_SCHEMA.__svd_gram_schmidt_orthogonalize_prefunc
673 AS 'MODULE_PATHNAME
', 'svd_gram_schmidt_orthogonalize_prefunc
'
676 -- This function will also do the normalization
677 CREATE OR REPLACE FUNCTION
678 MADLIB_SCHEMA.__svd_gram_schmidt_orthogonalize_ffunc
682 RETURNS MADLIB_SCHEMA.__svd_lanczos_result
683 AS 'MODULE_PATHNAME
', 'svd_gram_schmidt_orthogonalize_ffunc
'
686 DROP AGGREGATE IF EXISTS
687 MADLIB_SCHEMA.__svd_gram_schmidt_orthogonalize_agg
689 FLOAT8[], -- Unorthogonalized vector
690 FLOAT8[] -- Orthogonalized vector
694 MADLIB_SCHEMA.__svd_gram_schmidt_orthogonalize_agg
696 FLOAT8[], -- Unorthogonalized vector
697 FLOAT8[] -- Orthogonalized vector
701 sfunc = MADLIB_SCHEMA.__svd_gram_schmidt_orthogonalize_sfunc,
702 finalfunc = MADLIB_SCHEMA.__svd_gram_schmidt_orthogonalize_ffunc
705 `, prefunc = MADLIB_SCHEMA.__svd_gram_schmidt_orthogonalize_prefunc
'
709 ---------------------------------------------------------------------
710 --------------------Lanczos Bidiagonalization------------------------
711 ---------------------------------------------------------------------
712 CREATE OR REPLACE FUNCTION
713 MADLIB_SCHEMA.__svd_lanczos_bidiagonalize
716 output_table_prefix TEXT,
722 PythonFunctionBodyOnly(`linalg', `svd
')
723 return svd.lanczos_bidiagonalize(
724 schema_madlib, source_table,
725 output_table_prefix, iter_num, k, is_block)
726 $$ LANGUAGE plpythonu;
728 CREATE OR REPLACE FUNCTION
729 MADLIB_SCHEMA.__svd_lanczos_bidiagonalize_sparse
735 output_table_prefix TEXT,
740 PythonFunctionBodyOnly(`linalg', `svd
')
741 return svd.lanczos_bidiagonalize_sparse(
742 schema_madlib, source_table, row_id, col_id,
743 val, output_table_prefix, iter_num, k)
744 $$ LANGUAGE plpythonu;
746 ---------------------------------------------------------------------
747 -------------------- SVD of Bidiagonal matrix ------------------------
748 ---------------------------------------------------------------------
749 DROP TYPE IF EXISTS MADLIB_SCHEMA.__svd_bidiagonal_matrix_result;
750 CREATE TYPE MADLIB_SCHEMA.__svd_bidiagonal_matrix_result AS
752 left_matrix FLOAT8[][],
753 right_matrix FLOAT8[][],
754 singular_values FLOAT8[]
757 ------------------------------------------------------------------------------
758 --The bidiagonal matrix is represented as a tripe: <row_ids, col_ids, vals>
760 -- row_ids is an array of integers representing row_ids of non-zero elements
761 -- col_ids is an array of integers representing col_ids of non-zero elements
762 -- vals is an array of doubles representing values of non-zero elements
763 --Note that we don't need the aggregator to convert the sparse bidiagonal
764 --matrix into a dense matrix
765 ------------------------------------------------------------------------------
766 CREATE OR REPLACE FUNCTION MADLIB_SCHEMA.__svd_decompose_bidiag(
771 RETURNS MADLIB_SCHEMA.__svd_bidiagonal_matrix_result
772 AS
'MODULE_PATHNAME',
'svd_decompose_bidiag'
775 -----------------------------------------------------------------------
776 -- Special Vector-Matrix Multiplication Functions
777 -----------------------------------------------------------------------
784 CREATE OR REPLACE FUNCTION MADLIB_SCHEMA.__svd_vec_mult_matrix(
790 AS
'MODULE_PATHNAME',
'svd_vec_mult_matrix'
793 DROP TYPE IF EXISTS MADLIB_SCHEMA.__svd_vec_mat_mult_result;
794 CREATE TYPE MADLIB_SCHEMA.__svd_vec_mat_mult_result AS
800 --Multiplication of a column vector with an in-memory matrix
801 --Return a set of m row vector of the size 1 * k
802 CREATE OR REPLACE FUNCTION MADLIB_SCHEMA.__svd_vec_trans_mult_matrix_internal(
803 vector FLOAT8[], -- m * l row vector
804 matrix FLOAT8[][], -- l * l in-memory matrix
805 col_id INT4, -- Column ID
806 k INT4 -- Specify the size of submatrix l * k
808 RETURNS SETOF MADLIB_SCHEMA.__svd_vec_mat_mult_result
809 AS
'MODULE_PATHNAME',
'svd_vec_trans_mult_matrix'
812 --Multiplication of P/Q vectors with Left/Right Singular Matrix of B
813 CREATE OR REPLACE FUNCTION MADLIB_SCHEMA.__svd_vec_trans_mult_matrix(
814 vec_table TEXT, -- P/Q column vectors
815 mat_table TEXT, -- (svd_output).left_matrix/right_matrix
816 k INT4, -- Number of singular values
817 is_left BOOLEAN, -- Left matrix?
818 res_table TEXT -- Result
821 PythonFunctionBodyOnly(`linalg
', `svd')
822 return svd.svd_vec_trans_mult_matrix(
823 schema_madlib, vec_table, mat_table, k, res_table, is_left)
824 $$ LANGUAGE plpythonu;
826 -----------------------------------------------------------------------
828 -----------------------------------------------------------------------
829 CREATE OR REPLACE FUNCTION MADLIB_SCHEMA.svd(
833 PythonFunctionBodyOnly(`linalg', `svd')
834 return svd.svd_help_message(schema_madlib, input_message)
835 $$ LANGUAGE plpythonu;
838 CREATE OR REPLACE FUNCTION MADLIB_SCHEMA.svd()
840 PythonFunctionBodyOnly(`linalg', `svd')
841 return svd.svd_help_message(schema_madlib, None)
842 $$ LANGUAGE plpythonu;