Mercurial > forge
changeset 11581:4c91dd3872e0 octave-forge
more test cases using pcg.
testing normest.
fix to make A(idx) work, in read mode (for trace()).
fixes for no-complex builds.
author | michelemartone |
---|---|
date | Sun, 31 Mar 2013 15:57:29 +0000 |
parents | 7f7e874d2572 |
children | dbc62fd39423 |
files | main/sparsersb/src/sparsersb.cc main/sparsersb/src/sparsersbtester.m |
diffstat | 2 files changed, 74 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- a/main/sparsersb/src/sparsersb.cc Sun Mar 31 12:07:47 2013 +0000 +++ b/main/sparsersb/src/sparsersb.cc Sun Mar 31 15:57:29 2013 +0000 @@ -17,6 +17,8 @@ /* * TODO wishlist: + * (.) is incomplete. it is needed by trace() + * (:,:) , (:,p) ... do not work, test with octave's bicg, bicgstab, cgs, ... * hints about how to influence caching blocking policy * compound_binary_op * for thorough testing, see Octave's test/build_sparse_tests.sh @@ -177,6 +179,11 @@ rsb_bool_t rsb_is_correctly_built_rcsr_matrix(const struct rsb_mtx_t *matrix); // forward declaration } #endif +#if defined(RSB_LIBRSB_VER) && (RSB_LIBRSB_VER>=10100) +extern "C" { + int rsb_do_get_nnz_element(struct rsb_mtx_t*,void*,void*,void*,int); +} +#endif #if RSBOI_WANT_DOUBLE_COMPLEX #define RSBOI_BINOP_PREVAILING_TYPE(V1,V2) (((V1).is_complex_type()||(V2).is_complex_type())?RSB_NUMERICAL_TYPE_DOUBLE_COMPLEX:RSB_NUMERICAL_TYPE_DOUBLE) #else @@ -520,6 +527,7 @@ octave_value retval; int skip = 1; RSBOI_DEBUG_NOTICE(RSBOI_D_EMPTY_MSG); + rsb_err_t errval=RSB_ERR_NO_ERROR; switch (type[0]) { @@ -527,6 +535,37 @@ if (type.length () == 1) { octave_idx_type n_idx = idx.front().length (); + if (n_idx == 1 ) + { + RSBOI_DEBUG_NOTICE(RSBOI_D_EMPTY_MSG); + idx_vector i = idx.front() (0).index_vector (); + octave_idx_type ii=i(0); +#if defined(RSB_LIBRSB_VER) && (RSB_LIBRSB_VER< 10100) + RSBOI_ERROR(""); +#elif defined(RSB_LIBRSB_VER) && (RSB_LIBRSB_VER>=10100) + RSBOI_DEBUG_NOTICE("get_element (%d)\n",ii); + if(is_real_type()) + { + RSBOI_T rv; + errval = rsb_do_get_nnz_element(this->A,&rv,NULL,NULL,ii); + retval=rv; + } + else + { + Complex rv; + errval = rsb_do_get_nnz_element(this->A,&rv,NULL,NULL,ii); + retval=rv; + } + if(RSBOI_SOME_ERROR(errval)) + { + if(ii>=this->nnz() || ii<0) + error ("trying accessing element %d: index out of bounds !",ii+1); + else + error ("trying accessing element %d: this seems bug!",ii+1); + } +#endif + } + else if (n_idx == 2 ) { idx_vector i = idx.front() (0).index_vector (); @@ -540,7 +579,6 @@ idx_vector j = idx.front() (1).index_vector (); RSBOI_T rv; octave_idx_type ii=-1,jj=-1; - rsb_err_t errval=RSB_ERR_NO_ERROR; ii=i(0); jj=j(0); RSBOI_DEBUG_NOTICE("get_elements (%d %d)\n",ii,jj); errval = rsb_mtx_get_values(this->A,&rv,&ii,&jj,1,RSBOI_NF); @@ -553,7 +591,6 @@ idx_vector j = idx.front() (1).index_vector (); Complex rv; octave_idx_type ii=-1,jj=-1; - rsb_err_t errval=RSB_ERR_NO_ERROR; ii=i(0); jj=j(0); RSBOI_DEBUG_NOTICE("get_elements (%d %d) complex\n",ii,jj); errval = rsb_mtx_get_values(this->A,&rv,&ii,&jj,1,RSBOI_NF); @@ -1503,20 +1540,28 @@ //INSTALL_UNOP (op_incr, octave_sparse_rsb_mtx, op_incr); //INSTALL_UNOP (op_decr, octave_sparse_rsb_mtx, op_decr); INSTALL_BINOP (op_el_mul, octave_sparse_rsb_mtx, octave_scalar, rsb_el_mul_s); +#if RSBOI_WANT_DOUBLE_COMPLEX INSTALL_BINOP (op_el_mul, octave_sparse_rsb_mtx, octave_complex, rsb_el_mul_c); +#endif // INSTALL_ASSIGNOP (op_mul_eq, octave_sparse_rsb_mtx, octave_scalar, rsb_op_mul_eq_s); // 20110313 not effective // INSTALL_ASSIGNOP (op_div_eq, octave_sparse_rsb_mtx, octave_scalar, rsb_op_div_eq_s); // 20110313 not effective INSTALL_BINOP (op_el_div, octave_sparse_rsb_mtx, octave_scalar, rsb_el_div_s); +#if RSBOI_WANT_DOUBLE_COMPLEX INSTALL_BINOP (op_el_div, octave_sparse_rsb_mtx, octave_complex, rsb_el_div_c); +#endif INSTALL_BINOP (op_el_pow, octave_sparse_rsb_mtx, octave_scalar, el_pow); INSTALL_UNOP (op_uminus, octave_sparse_rsb_mtx, uminus); INSTALL_BINOP (op_ldiv, octave_sparse_rsb_mtx, octave_matrix, ldiv); INSTALL_BINOP (op_el_ldiv, octave_sparse_rsb_mtx, octave_matrix, el_ldiv); INSTALL_BINOP (op_div, octave_sparse_rsb_mtx, octave_matrix, div); INSTALL_BINOP (op_div, octave_sparse_rsb_mtx, octave_scalar, rsb_s_div); +#if RSBOI_WANT_DOUBLE_COMPLEX INSTALL_BINOP (op_div, octave_sparse_rsb_mtx, octave_complex, rsb_c_div); +#endif INSTALL_BINOP (op_mul, octave_sparse_rsb_mtx, octave_scalar, rsb_s_mul); +#if RSBOI_WANT_DOUBLE_COMPLEX INSTALL_BINOP (op_mul, octave_sparse_rsb_mtx, octave_complex, rsb_c_mul); +#endif //INSTALL_BINOP (op_pow, octave_sparse_rsb_mtx, octave_scalar, rsb_s_pow); INSTALL_BINOP (op_el_div, octave_sparse_rsb_mtx, octave_matrix, el_div); INSTALL_UNOP (op_transpose, octave_sparse_rsb_mtx, transpose);
--- a/main/sparsersb/src/sparsersbtester.m Sun Mar 31 12:07:47 2013 +0000 +++ b/main/sparsersb/src/sparsersbtester.m Sun Mar 31 15:57:29 2013 +0000 @@ -170,7 +170,7 @@ end function match=testpcgm(OM,XM) - # FIXME! + # FIXME! This test ignores OM and XM ! match=1; A=sparse ([11,12;21,23]);X=[11;22];B=A*X;X=[0;0]; [OX, OFLAG, ORELRES, OITER, ORESVEC, OEIGEST]=pcg(A,B); @@ -178,6 +178,25 @@ [XX, XFLAG, XRELRES, XITER, XRESVEC, XEIGEST]=pcg(A,B); match&=(OFLAG==XFLAG);# FIXME: a very loose check! match&=(OITER==XITER);# FIXME: a very loose check! + # + # http://www.gnu.org/software/octave/doc/interpreter/Iterative-Techniques.html#Iterative-Techniques + #n = 10; + n = 10+size(XM)(1,1) + clear A OX XX; + A = diag (sparse (1:n)); + #A = A + A'; + b = rand (n, 1); + [l, u, p, q] = luinc (A, 1.e-3); + [OX, OFLAG, ORELRES, OITER, ORESVEC, OEIGEST]= pcg ( A ,b); + [XX, XFLAG, XRELRES, XITER, XRESVEC, XEIGEST]= pcg (sparsersb(A),b); + match&=(sum(OX-XX)==0.0);# FIXME: a very brittle check! + # + #function y = apply_a (x) + # y = [1:N]' .* x; + #endfunction + [OX, OFLAG, ORELRES, OITER, ORESVEC, OEIGEST]= pcg ( A ,b, 1.e-6, 500, l,u); + [XX, XFLAG, XRELRES, XITER, XRESVEC, XEIGEST]= pcg (sparsersb(A),b, 1.e-6, 500, l,u); + match&=(sum(OX-XX)==0.0);# FIXME: a very brittle check! testmsg(match,"pcg"); end @@ -259,6 +278,12 @@ OM=OB; XM=XB; end +function match=testnorm(OM,XM) + match=1; + match&=isequal(normest(OM),normest(XM)); + testmsg(match,"norms"); +end + function match=testadds(OM,XM) match=1; OB=OM; @@ -308,6 +333,7 @@ match&=testpcgm(OM,XM); match&=testmult(OM,XM); match&=testspsv(OM,XM); + match&=testnorm(OM,XM); end match&=testscal(OM,XM); match&=testadds(OM,XM);