[[ This file 'Done' lists items that were in file ./TODO at some time ]]
- Sparse matrix methods can now be based on the CHOLMOD package. We
will need to migrate from the current code to CHOLMOD-based code
using #ifdef USE_CHOLMOD. Some of the things to be done
- Move documentation from subdirectories of src to inst/doc
- Write utilities to create a cholmod_sparse pointer from a
dgCMatrix or lgCMatrix (or zgCMatrix) object without copying and
allocating.
- Start adding simple S4 methods ( %*%, +, cbind, t) for
CsparseMatrix using CHOLMOD.
- check to see if the .onLoad function to require the methods package
(in the AllClass.R file) is needed
-- no, it is not: "Depends: " in DESCRIPTION suffices.
- Should the uplo and diag slots continue to be stored as character?
An alternative is to use a factor as in the enum values for the
cblas.
-- Leave as character but use care in determining the default cases
-- E.g. Checks for diag slot should check for 'U' or 'u' vs. anything else
- Organization of the source code files - right now they are organized
according to class (e.g. dgeMatrix.R, dgeMatrix.h, dgeMatrix.c). Is
there a better way?
-- This seems ok.
- Fix the calculation of the Dim slot for the crossprod method for
dgCMatrix objects (too tired to do that now).
-- Done
- spelling style: Should "coersion" be "coercion" ?
-- Yes. Watch for this.
- src/Metis/ : one of the two Makefiles needs fixing, as changing
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
--DB - now have both working, I believe.
- man/Matrix.Rd : has example with dimnames, but we just drop them!
MM thinks dimnames should be supported (but then ...)
-- added 'Dimnames' slot (2005-02-10)
- bCrosstab(): yes, we really do want the diagonal "V:V" crosstabs.
-- explained a bit more in man/bCrosstab.Rd
- Clean up vestigial functions (pdFactor, pdMatrix, matrix<-) from the
nlme package.
- create a class of permutation matrices for use in expand. The
current expand method for the LU factorization is not complete
because it does not provide the permutation.
- tcrossprod() now works: C code now "exported" via init.c
- Fixed: dtpMatrix(... diag = "U") (i.e., unit-diagonal packed triangular)
*does* need 'x' entries for the diagonal but these are never looked at.
-> changed doc -- Lapack also says they are not referenced but assumed 1.
- in lmer.c check all instances of the use of ZtX and XtX and change
them so that having a negative last element of nc means use the
response only (but look for it in the right place).
- Solved:
Currently the show() method fail sometime after coercion:
e.g. 'sy' show()s wrongly, even though it "str()" fine :
(po <- crossprod(Matrix(0:3, 2))) # ok
(ge <- as(po, "dgeMatrix")) # ok
(sy <- as(po, "dsyMatrix")) # BAD
str(sy) # looks fine
or
example(expand) # -> ex$L and ex$U look bad, however
as(ex$L, "dgeMatrix") # `works'
{Of course, we don't need a workaround but must understand
and solve the problem}
- slot "factors" maybe should move up to "Matrix" -- done, 2005-09-28
- group generics: "Arith", also "Compare", "Math" etc;
see ?Math and the examples in ?SetGeneric
- methods for rbind and cbind where they make sense:
R 2.2.0 (and newer) provide cbind2() and rbind2() generics and default
methods [following John Chambers's proposition], and we have implemented
methods for them.
- arithmetic for sparse matrices:
done for <sparseMatrix> o <scalar>
{more needed: see TODO}
- rcond() of a singular dpoMatrix gives a LaPack error instead of just 0:
MM <- crossprod(M <- Matrix(c(1:4,9:6), 2,4)) ; rcond(MM)
Done(2005-10-03): The error message is more helpful now.
- implement diagonal Matrix class "ddiMatrix" etc
using constructor function Diagonal() {and extractor diag()}.
Done(2006-01-03)
- new("ltTMatrix") now at least prints
-- Done by version 0.995-1 ---
- Migration of lmer from the mer representation to the mer2
representation and the use of the CHOLMOD code for the sparse
matrix decomposition. Some of the things that need to be done.
- Matrices in the mer2 representation are classed matrices, in the
mer representation they were unclassed. Any parts inside the C
code that would access, for example,
REAL(GET_SLOT(x, Matrix_RXXSym))
need to be modified to access
REAL(GET_SLOT(GET_SLOT(x, Matrix_RXXSym), Matrix_xSym))
This is especially important for Omega but I think I have done
those changes already.
- The components named *X* in an mer object refers to an augmented
design matrix of p+1 columns. In the mer2 object there are
separate slots for rZy and rXy. The scalar y'y is the first
element of devComp.
- Presently nc is of length nf+1 and the last element is n, the
number of observations. This value should be moved to devComp and
nc made of length nf.
- The slot L is a list of length 1 that contains an ExternalPointer
to a cholmod_factor object. This contains a permutation which is
most easily accessible through cholmod_solve(CHOLMOD_P,...) or
cholmod_solve(CHOLMOD_Pt,...). The ZtX, Zty, RZX and rZy slots actually
contain P%*%RZX and P%*%rZy
- "[<-" Methods for dgC* and dgT* the former building on the latter
using j = .Call("Matrix_expand_pointers", x@p, PACKAGE = "Matrix")
where needed
- Put the matrix 'mm' and the response vector 'y' into 'KNex', a list.
Modified all examples and tests that used them and the Comparisons vignette.
- rowSums(), colSums(), rowMeans & colMeans() now should work for all
sparse and dense matrices, via "dgeMatrix", "dgC*" and "dgT*".
- Suitably adjust classes of matrices after subscripting.
head(Hilbert(9)) and the equivalent expression Hilbert(9)[1:4,]
now work and return "dgeMatrix" (and not ..symmetric..).
We try to propagate the class to the subscripted matrix
but, if that fails its test, fall back on a general matrix class. -- for dense
That is, the fallback class for dsyMatrix, etc. is dgeMatrix; the
fallback class for dsCMatrix is dgCMatrix, etc.
- tril(), triu() now return matrices of *triangular* classes.
Note that these also solve the following former "TODO":
Things like M[upper.tri(M)] are not really most useful for sparse
matrices. --> provide generic functions
upperTriMatrix(), lowerTriMatrix() both with argument 'diag = TRUE'
(which can be set to FALSE of course) which are used to extract a
triangle from an arbitrary sparse matrix and return a "dtCMatrix".
- Factorizations: LU and solve() for *sparse* Matrices is now done,
----------------- using CSparse (and not UMFPACK as originally thought)
- M[i,j] <- "sub-Matrix" now works.
- "Compare" for dgC & dgT --- to be able to do M[M > 10] etc
- new("ltTMatrix", diag = "U", Dim = c(2:2, 2:2)) now works
- Diagonal(3) - toeplitz(c(0,1,0)) or
Diagonal(4) >= 0 now work
- .Call(Csparse_Csparse_crossprod, ...) for crossprod(x,y) {2-args}
- When 'x' is a symmetric matrix,
a) x[i,i] should return a *symmetric* matrix too (when 'i' has length > 1)
b) x[i,i] <- scalar_value should ``keep x symmetric'',
i.e. also return symmetricM*
- Fully implement "Logic" methods - now (R 2.4.1) that the group is in S4
- when printing sparse matrices column names are suppressed.
For matrices *with* non-empty column names, this is now message()d.
Alternatively, can now print(<sparseMatrix>, col.names = TRUE, .....)
- Fast colSums(), rowSums() etc : first for dgCMatrix, but then
'arules' needs fast colSums() and rowSums() - for ngCMatrix;
do it for "nMatrix" and "lMatrix" and return *integer*
- now check for DimNames propagation in coercions, at least by using a
"dimnamed" matrix in tstMatrixClass() in tests/Class+Meth.R
- moved alloc3DArray() from ./src/Mutils.c to $(RSRC)/src/main/array.c
- norm() methods for all Matrices, notably sparse "now too".
- check all "Summary" group methods for all matrices in ./tests/Class+Meth.R
- log1p(<sparseMatrix>) now gives <dsparseMatrix>
simply via "Math" group generic -- only from R 2.6.0 on.
- image(M, aspect= "iso", colorkey = FALSE)
is now default; {aspect: non-back comptible for users !!}
*and* documented, using man/image-methods.Rd
- rcond methods for sparseMatrix : helpful message about alternatives
- ensuring that M[0], M[FALSE], M[1:2] now work as for traditional matrices
- [,] indexing: works for sparse, in all cases ((we have seen ..))
- arithmetic for sparse matrices:
<sparseMatrix> o <same-dim-sparseMatrix>
returns a sparse matrix for at least "+" and "*" , also %%,
and "/" and "%/%" at least when the RHS is a non-zero scalar.
- Schur() now returns a proper class extending "MatrixFactorization".
- added more comprehensive examples and tests for Schur decomposition
- speedup: pass class definition to non0ind() [check all calls ..]
- M[FALSE, FALSE] now works for Matrices M with all(dim(M) > 0)
{no longer fails for M <- Diagonal(4), or dgR* }
- band(), triu(), tril() now work for "matrix" and all "dense*"
- For a square sparse matrix 'b' {typically dgCMatrix or dgTMatrix},
we'd want a function "Mat_plus_t_Mat" <- function(b) {....}
which computes the symmetric sparse matrix b + t(b)
in way that never works with size-doubled vectors from b@i etc..
2nd version:
(A + tr(A))/2 := the symmetric part of A, is needed in several
circumstances; unfortunately it's not "smart" (preserving symmetry, ...)
--> define a generic and methods for it!
Googling around I found that Nick Higham has a GPL contributed Matlab
toolbox where he uses symmpart(A) := (A + A') /. 2 and
skewpart(A) := (A - A') /. 2.
Hence defined symmpart() and skewpart().
- fixed '*HORRENDOUSLY* slow' in tests/simple.R
and do better than
unlist(lapply(seq_len(m), function(j) x[i1[j], i2[j]]))
in R/Matrix.R
--> now fixed for sparseMatrices : 'ss <- slp[ij]' in tests/simple.R
denseMatrices have their own method,
and m[ <ij-matrix> ] <- value seems more or less ok.
- dtC Matrices now preserve (unit-) triangularity in %*% and crossprod
- Cholesky() generalized: provide R interface cholmod_factorize_p()
which factorizes |A + m*I| ==> R interface to fast det|A + m*I|
- chol() and qr() are now longer made into explicit generics
(they both had *two* argument signatures: (x,pivot) & (x,tol)
respectively, and gave the msg
> New generic for "chol" does not agree with implicit generic from package
> "base"; a new generic will be assigned with package "Matrix"
(and ditto for "qr")
Now they are *implicit generics* and methods all have just (x= *Matrix)
signature and default argument (pivot=FALSE) or (tol=1e-7) respectively.