80 CREATE OR REPLACE FUNCTION MADLIB_SCHEMA.conjugate_gradient(Matrix TEXT, val_id TEXT, row_id TEXT, b FLOAT[], precision_limit FLOAT, verbosity INT) RETURNS FLOAT[] AS $$
87 recidual_refresh INT := 30;
95 exit_if_no_progess_in INT := 15;
97 DROP TABLE IF EXISTS X_val;
98 CREATE TEMP TABLE X_val(
102 DROP TABLE IF EXISTS P_val;
103 CREATE TEMP TABLE P_val(
107 SELECT INTO k array_upper(b,1);
108 --INSERT INTO X_val SELECT ARRAY(SELECT random() FROM generate_series(1, k));
109 EXECUTE
'INSERT INTO X_val SELECT ARRAY(SELECT random() FROM generate_series(1,' ||k||
'))';
111 IF(iter%recidual_refresh = 0)THEN
112 EXECUTE 'SELECT ARRAY(SELECT MADLIB_SCHEMA.
array_dot('||val_id||', j.x) FROM (SELECT value AS x FROM X_val) AS j, '|| Matrix ||' ORDER BY '||row_id||' LIMIT '|| k ||')' INTO Ax;
113 SELECT INTO r MADLIB_SCHEMA.
array_sub(b, Ax);
114 SELECT INTO r_size MADLIB_SCHEMA.
array_dot(r, r);
115 IF(verbosity > 0) THEN
116 RAISE INFO 'COMPUTE RESIDUAL ERROR %', r_size;
121 TRUNCATE TABLE P_val;
122 --INSERT INTO P_val VALUES(p);
123 EXECUTE 'INSERT INTO P_val(value) VALUES(array['|| array_to_string(p,',') ||'])';
124 EXECUTE 'SELECT ARRAY(SELECT MADLIB_SCHEMA.
array_dot('||val_id||', j.p) FROM (SELECT value AS p FROM P_val) AS j,'|| Matrix ||' ORDER BY '||row_id||' LIMIT '|| k ||')' INTO Ap;
125 SELECT INTO pAp_size MADLIB_SCHEMA.
array_dot(p, Ap);
126 alpha = r_size/pAp_size;
129 EXECUTE 'SELECT MADLIB_SCHEMA.
array_add(value, MADLIB_SCHEMA.
array_scalar_mult(array['|| array_to_string(p,',') ||']::
float[],'||alpha||'::
float)) FROM X_val' INTO x;
130 TRUNCATE TABLE X_val;
131 --INSERT INTO X_val VALUES(x);
132 EXECUTE 'INSERT INTO X_val VALUES(array['|| array_to_string(x,',') ||'])';
135 SELECT INTO r_new_size MADLIB_SCHEMA.
array_dot(r,r);
137 IF(verbosity > 0) THEN
138 RAISE INFO 'ERROR %',r_new_size;
140 IF (r_new_size < precision_limit) THEN
141 EXECUTE 'SELECT ARRAY(SELECT MADLIB_SCHEMA.
array_dot('||val_id||', j.x) FROM (SELECT value AS x FROM X_val) AS j, '|| Matrix ||' ORDER BY '||row_id||' LIMIT '|| k ||')' INTO Ax;
142 SELECT INTO r MADLIB_SCHEMA.
array_sub(b, Ax);
143 SELECT INTO r_new_size MADLIB_SCHEMA.
array_dot(r, r);
144 IF(verbosity > 0) THEN
145 RAISE INFO 'TEST FINAL ERROR %', r_new_size;
147 IF (r_new_size < precision_limit) THEN
152 IF(r_size < r_new_size) THEN
153 exit_if_no_progess_in = exit_if_no_progess_in-1;
154 RAISE INFO 'No progress! count = %',exit_if_no_progess_in;
156 IF(exit_if_no_progess_in <= 0) THEN
157 RAISE EXCEPTION 'Algorithm failed to converge. Check is input is positive definate.';
160 exit_if_no_progess_in = 15;
164 IF(verbosity > 1) THEN
165 RETURN ARRAY[r_new_size];
167 --SELECT INTO x value FROM X_val;
168 EXECUTE 'SELECT value FROM X_val' INTO x;
173 CREATE OR REPLACE FUNCTION MADLIB_SCHEMA.
conjugate_gradient(Matrix TEXT, val_id TEXT, row_id TEXT, b FLOAT[], precision_limit FLOAT) RETURNS FLOAT[] AS $$
176 RETURN MADLIB_SCHEMA.
conjugate_gradient(Matrix, val_id, row_id, b, precision_limit,0);