SCM

SCM Repository

[matrix] Diff of /pkg/TODO
ViewVC logotype

Diff of /pkg/TODO

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 530, Mon Feb 7 10:58:27 2005 UTC revision 2137, Mon Mar 17 22:21:24 2008 UTC
# Line 1  Line 1 
1    - Check for DimNames propagation in coercion and other operations.
2    
3  - Report the problem in the Linux ldexp manual page.  The second and  - Report the problem in the Linux ldexp manual page.  The second and
4    third calls in the Synopsis should be to ldexpf and ldexpl.    third calls in the Synopsis should be to ldexpf and ldexpl.
5    
6  - [,] indexing  - provide methods for "dspMatrix" and "dppMatrix"!
7    
8    - implement (more) methods for supporting "packed" (symmetric / triangular)
9      matrices; particularly something like pack() and unpack()  [to/from our
10      classes from/to "numeric"] --- have already man/unpack.Rd but no method yet!
11    
12      (have some dtr* <-> dtp*)
13    
14    - combine the C functions for multiplication by special forms and
15      solution wrt special forms by using a 'right' argument and a
16      'classed' argument.
17       [done with dgeMatrix_matrix_mm();  not yet for other classes;
18        and for _crossprod()]
19    
20    -----
21    
22    - "Math2" , "Math", "Arith":
23       keep triangular and symmetric Matrices when appropriate:
24       particularly desirable for  "Math2": round(), signif()
25    
26      For triangular matrices, more specifically make sure the four rules of
27      "triangular matrix algebra" (Golub+Van Loan 1996, 3.1.8, p.93) are
28      fulfilled; now(2008-03-06) ok for Csparse; not yet for <dtr> %*% <dtr>
29    
30    - "d" <-> "l" coercion for all "[TCR]" sparse matrices is really trivial:
31      "d" -> "l" : drops the 'x' slot
32      "l" -> "d" : construct an 'x' slot of all '1'
33      We currently have many of these conversions explicitly, e.g.
34       setAs("dsTMatrix", "lsTMatrix",
35          function(from) new("lsTMatrix", i = from@i, j = from@j, uplo = from@uplo,
36                             Dim = from@Dim, Dimnames = from@Dimnames))
37      but I would rather want to automatically construct all these coercion
38      methods at once by a ``method constructor'', i.e.,
39      for all  "dsparse*" -> "lsparse*" and vice versa.
40      How can one do this {in a documented way} ?
41    
42    - Think of constructing  setAs(...) calls automatically in order to
43      basically enable all ``sensible'' as(fromMatrix, toMatrix)  calls,
44      possibly using canCoerce(.)
45    
46    - setAs(<Mcl>,  "[dln]Matrix") for <Mcl> in {Matrix or denseMatrix + sparseMatrix}
47    
48    - When we have a packed matrix, it's a waste to go through "full" to "sparse":
49      ==> implement
50            setAs("dspMatrix", "sparseMatrix")
51            setAs("dppMatrix", "sparseMatrix")
52            setAs("dtpMatrix", "sparseMatrix")
53      and the same for "lsp" , "ltp"  and  "nsp" , "ntp" !
54    
55    - tcrossprod(x, y) : do provide methods for y != NULL
56      calling Lapack's DGEMM for "dense"
57      [2005-12-xx: done for dgeMatrix at least]
58    
59    - BUGlet:  Shouldn't lose factorization here:
60      h6 <- Hilbert(6); chol(h6) ; str(h6) # has factor
61      str(H6 <- as(h6, "dspMatrix"))       # has lost factor
62      ## and the same in a similar situation involving  "dpo", "dpp"
63    
64    - Factorizations: LU done; also Schur()  for  *sparse*  Matrices.
65    
66    - is.na() method for all our matrices [ ==> which(*, arr.ind=TRUE) might work ]
67    
68    - use  .Call(Csparse_drop, M, tol) in more places,
69      both with 'tol = 0.' to drop "values that happen to be 0" and for
70      zapsmall() methods for Csparse*
71    
72    - implement .Call(Csparse_scale, ....) interfacing to cholmod_scale()
73      in src/CHOLMOD/Include/cholmod_matrixops.h : for another function
74      specifically for multiplying a cholmod_sparse object by a diagonal matrix.
75      Use it in %*% and [t]crossprod methods.
76    
77    - chol() and determinant() should ``work'': proper result or "good" error
78      message.
79    
80    - make sure *all* group methods have (maybe "bail-out") setMethod for "Matrix".
81      e.g. zapsmall(<pMatrix>) fails "badly"
82    
83    - sum(): implement methods which work for *all* our matrices.
84    
85    - Implement  expand(.) for the Cholesky() results
86      "dCHMsimpl" and  "dCHMsuper"  -- currently have no *decent* way to get at
87      the matrix factors of the corresponding matrix factorization !!
88    
89    - rbind2(<sparse>, <dense>) does not work  (e.g. <dgC>, <dge>)
90    
91    - <sparse> %*% <dense>  {also in crossprod/tcrossprod}  currently always
92      returns <dense>, since --> Csparse_dense_prod --> cholmod_sdmult
93      and that does only return dense.
94      When the sparse matrix is very sparse, i.e. has many rows with only zero
95      entries, it would make much sense to return sparse.
96    
97    - sparse-symmetric + diagonal should stay sparse-symmetric
98      (only stays sparse): Matrix(0, 4, 4) + Diagonal(4, 1:4)
99      --> R/diagMatrix.R ('FIXME')
100      but also R/Ops.R  to ensure  sp-sym. + sp-sym. |-> sp-sym.  etc
101    
102    - Diagonal(n) %*% A ---  too slow!! --> ~/R/MM/Pkg-ex/Matrix/diag-Tamas-ex.R
103    
104    - ! <symmetricMatrix>  loses symmetry, both for dense and sparse matrices.
105      !M  where M is "sparseMatrix", currently always gives dense. This only
106      makes sense when M is ``really sparse''.
107    
108    - msy <- as(matrix(c(2:1,1:2),2), "dsyMatrix"); str(msy)
109    
110      shows that the Cholesky factorization is computed ``too quickly''.
111      Can be a big pain for largish matrices, when it is unneeded.
112    
113    - example(Cholesky, echo=FALSE) ; cm <- chol(mtm); str(cm); str(mtm)
114    
115      shows that chol() does not seems to make use of an already
116      present factorization and rather uses one with more '0' in x slot.
117    
118    - diag(m) <- val    currently automatically works via  m[cbind(i,i)] <- val
119      This (`[<-` method) is now "smart" for diagonalMatrix, but needs also to
120      be for triangularMatrix, and probably also "dense*general*Matrix" since the
121      above currently goes via "matrix" and back instead of using the 'x' slot
122      directly; in particular, the triangular* "class property" is lost!
123    
124    - image(M, ..): Think about an optional smart option which keeps
125       "0 |-> transparent" and allows colors to differentiate negative and
126       positive entries.
127    
128    - examples for solve( Cholesky(.), b, system = c("A", "LDLt"....))
129      probably rather in man/CHMfactor-class.Rd than man/Cholesky.Rd
130    
131    - LDL(<CHMsimpl>) looks relatively easy; via  "tCsparse_diag()"
132       {diagonal entries of *triangular* Csparse}
133      --> see comment in determinant(<dsC>) in R/dsCMatrix.R, will give
134      faster determinant
135    
136    - Cholesky() generalized: provide R interface cholmod_factorize_p()
137      which factorizes |A + beta*I| ==> R interface to fast det|A + b*I|
138    
139  - group generics: "Arith", but also "Ops" and "Math";  see  - tr(A %*% B) {and even  tr(A %*% B %*% C) ...} are also needed
140    ?Math.data.frame  and the examples in    frequently in some computations {conditional normal distr. ...}.
141    ?SetGeneric    Since this can be done faster than by
142        sum(diag(A %*% B))  even for traditional matrices, e.g.
143                   sum(A * t(B)) or {even faster for "full" mat}
144                   crossprod(as.vector(A), as.vector(B))
145      and even more so for, e.g.  <sparse> %*% <dense>
146      {used in Soeren's 'gR' computations},
147      we should also provide a generic and methods.
148    
149  - bCrosstab(): do we really want the diagonal "V:V" crosstabs?  - qr.R(qr(x)) may differ for the "same" matrix, depending on it being
150                 (if so or in any case: add to  man/bCrosstab.Rd )    sparse or dense:
151        "qr.R(<sparse>) may differ from qr.R(<dense>) because of permutations"
152    
153  - src/Metis/ : one of the two Makefiles needs fixing, as changing    This is not really acceptable and currently influences  rcond() as well.
              src/Metis/*.c  does not lead to recompilation.  
   --DB - it seems both Makefiles need fixing.  I think I have the  
              src/Metis/Makefile fixed but not src/Makefile  
154    
155  - man/Matrix.Rd :  has example with dimnames, but we just drop them!  - chol() and qr() generic:  currently have *two* arguments, and give the msg
                 MM thinks dimnames should be supported (but then ...)  
156    
157  - data/ : names 'mm' and even more 'y' are  ``too short''.    >  New generic for "chol" does not agree with implicit generic from package
158          If we really want to keep them, don't use "LazyData"    >  "base"; a new generic will be assigned with package "Matrix"
         (such that one needs  data(*) explicitly);  
         But MM would rather want something like  ex.mm and ex.y  
159    
160  - "factors" maybe should move up to "Matrix"    (and ditto for "qr")
161    
162  -------    It was mentioned by an R-core member that he thought it did not make
163      sense to also dispatch on 'tol' or 'pivot' ...  --> maybe change that..
164    
165  We have a (at least one) basic problem :  - eigen() should become generic, and get a method at least for diagonal,
166     Currently the show() method fail sometime after coercion:    but also for symmetric -> dsyMatrix  [LAPACK dsyev() uses UPLO !],
167     e.g. 'sy' show()s wrongly, even though it "str()" fine :    but also simply for dgeMatrix (without going via tradition matrices).
168      What about Sparse?  There's fill-in, but it may still be sensible, e.g.
169      mlist <- list(1, 2:3, diag(x=5:3), 27, cbind(1,3:6), 100:101)
170      ee <- eigen(tcrossprod(bdiag(lapply(mlist, as.matrix))))
171      Matrix( signif(ee$vectors, 3) )
172    
173        (po <- crossprod(Matrix(0:3, 2))) # ok  - facmul() has no single method defined;  it looks like a good idea though
174        (ge <- as(po, "dgeMatrix")) # ok    (instead of the infamous qr.qy, qr.qty,.... functions)
       (sy <- as(po, "dsyMatrix")) # BAD  
       str(sy) # looks fine  
175    
176    or  - symmpart() and skewpart()  for *sparse* matrices still use (x +/- t(x))/2
177        example(expand) # -> ex$L and ex$U look bad, however    and could be made more efficient.
178        as(ex$L, "dgeMatrix") # `works'    Consider going via  asTuniq() or something very close to
179      .Arith.Csparse() in R/Ops.R
180    
181    {Of course, we don't need a workaround but must understand  - many setAs(*, "[dl]..Matrix") are still needed, as long as e.g.
182     and solve the problem}    replCmat() uses as_CspClass() and drop0(.) which itself call
183      as_CspClass() quite a bit.  --> try to replace these by
184      as(*, "CsparseMatrix"); forceSymmetric, etc.

Legend:
Removed from v.530  
changed lines
  Added in v.2137

root@r-forge.r-project.org
ViewVC Help
Powered by ViewVC 1.0.0  
Thanks to:
Vienna University of Economics and Business Powered By FusionForge