changeset 12534:1b88d712f0fc octave-forge

in a skeletal implementation of rsboi_spsm for complex.
author michelemartone
date Sat, 18 Oct 2014 13:00:35 +0000
parents 06385baaee3e
children 1c5a3153ba3a
files main/sparsersb/src/sparsersb.cc
diffstat 1 files changed, 45 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/main/sparsersb/src/sparsersb.cc	Sat Oct 18 12:52:09 2014 +0000
+++ b/main/sparsersb/src/sparsersb.cc	Sat Oct 18 13:00:35 2014 +0000
@@ -56,7 +56,7 @@
  * after file read, return various structural info
  * norm computation
  * format spacings for readability
- * TODO: spsm against complex is missing
+ * TODO: rsboi_spsm against complex is missing
  * Note: although librsb has been optimized for performance, sparsersb is not.
 
  * Developer notes:
@@ -1339,6 +1339,7 @@
 	RSBOI_DEBUG_NOTICE(RSBOI_D_EMPTY_MSG);
 	if(v1.is_complex_type())
 	{
+	/* FIXME: useless case. */
 	ComplexMatrix retval= v2.complex_matrix_value();
 	octave_idx_type b_nc = retval.cols ();
 	octave_idx_type b_nr = retval.rows ();
@@ -1389,6 +1390,15 @@
 	}
 }
 
+#if RSBOI_WANT_DOUBLE_COMPLEX
+octave_value rsboi_spsm(const octave_sparsersb_mtx&v1, const octave_complex_matrix&v2, rsb_trans_t transA)
+{
+	rsb_err_t errval = RSB_ERR_NO_ERROR;
+	/* FIXME: implementation missing */
+	return errval;
+}
+#endif /* RSBOI_WANT_DOUBLE_COMPLEX */
+
 DEFBINOP(ldiv, sparse_rsb_mtx, matrix)
 {
 	RSBOI_DEBUG_NOTICE(RSBOI_D_EMPTY_MSG);
@@ -1417,6 +1427,38 @@
 	//RSBOI_RSB_MATRIX_SOLVE(v1,v2);
 }
 
+#if RSBOI_WANT_DOUBLE_COMPLEX
+DEFBINOP(c_ldiv, sparse_rsb_mtx, matrix)
+{
+	RSBOI_DEBUG_NOTICE(RSBOI_D_EMPTY_MSG);
+	CAST_BINOP_ARGS (const octave_sparsersb_mtx&, const octave_complex_matrix&);
+	if(v1.is__triangular()) 
+		return rsboi_spsm(v1,v2,RSB_TRANSPOSITION_N);
+
+	if(v1.is_complex_type() || v2.is_complex_type())
+		return (v1.sparse_complex_matrix_value()).solve(v2.sparse_complex_matrix_value());
+	else
+		return (v1.sparse_matrix_value()).solve(v2.matrix_value());
+	//RSBOI_RSB_MATRIX_SOLVE(v1,v2);
+}
+
+DEFBINOP(trans_c_ldiv, sparse_rsb_mtx, matrix)
+{
+	RSBOI_DEBUG_NOTICE(RSBOI_D_EMPTY_MSG);
+	CAST_BINOP_ARGS (const octave_sparsersb_mtx&, const octave_complex_matrix&);
+	if(v1.is__triangular()) 
+		return rsboi_spsm(v1,v2,RSB_TRANSPOSITION_T);
+
+	if(v1.is_complex_type() || v2.is_complex_type())
+		return (v1.sparse_complex_matrix_value().transpose()).solve(v2.sparse_complex_matrix_value());
+	else
+		return (v1.sparse_matrix_value().transpose()).solve(v2.matrix_value());
+	//RSBOI_RSB_MATRIX_SOLVE(v1,v2);
+}
+#endif /* RSBOI_WANT_DOUBLE_COMPLEX */
+
+
+
 DEFBINOP(el_div, sparse_rsb_mtx, matrix)
 {
 	Matrix retval;
@@ -1757,6 +1799,8 @@
 	INSTALL_BINOP (op_mul, octave_sparsersb_mtx, octave_complex, rsb_c_mul);
 	INSTALL_BINOP (op_mul, octave_sparsersb_mtx, octave_complex_matrix, op_c_mul);
 	INSTALL_BINOP (op_trans_mul, octave_sparsersb_mtx, octave_complex_matrix, op_c_trans_mul);
+	INSTALL_BINOP (op_ldiv, octave_sparsersb_mtx, octave_complex_matrix, c_ldiv);
+	INSTALL_BINOP (op_trans_ldiv, octave_sparsersb_mtx, octave_complex_matrix, trans_c_ldiv);
 #endif /* RSBOI_WANT_DOUBLE_COMPLEX */
 	//INSTALL_BINOP (op_pow, octave_sparsersb_mtx, octave_scalar, rsb_s_pow);
 	INSTALL_BINOP (op_el_div, octave_sparsersb_mtx, octave_matrix, el_div);