Rev 5013 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed
[[ This file 'Done' lists items that were in file ./TODO at some time ]]- Sparse matrix methods can now be based on the CHOLMOD package. Wewill need to migrate from the current code to CHOLMOD-based codeusing #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 adgCMatrix or lgCMatrix (or zgCMatrix) object without copying andallocating.- Start adding simple S4 methods ( %*%, +, cbind, t) forCsparseMatrix 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 thecblas.-- 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 organizedaccording to class (e.g. dgeMatrix.R, dgeMatrix.h, dgeMatrix.c). Isthere a better way?-- This seems ok.- Fix the calculation of the Dim slot for the crossprod method fordgCMatrix 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 changingsrc/Metis/*.c does not lead to recompilation.--DB - it seems both Makefiles need fixing. I think I have thesrc/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 thenlme package.- create a class of permutation matrices for use in expand. Thecurrent expand method for the LU factorization is not completebecause 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 changethem so that having a negative last element of nc means use theresponse 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")) # BADstr(sy) # looks fineorexample(expand) # -> ex$L and ex$U look bad, howeveras(ex$L, "dgeMatrix") # `works'{Of course, we don't need a workaround but must understandand 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 defaultmethods [following John Chambers's proposition], and we have implementedmethods 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" etcusing 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 mer2representation and the use of the CHOLMOD code for the sparsematrix decomposition. Some of the things that need to be done.- Matrices in the mer2 representation are classed matrices, in themer representation they were unclassed. Any parts inside the Ccode that would access, for example,REAL(GET_SLOT(x, Matrix_RXXSym))need to be modified to accessREAL(GET_SLOT(GET_SLOT(x, Matrix_RXXSym), Matrix_xSym))This is especially important for Omega but I think I have donethose changes already.- The components named *X* in an mer object refers to an augmenteddesign matrix of p+1 columns. In the mer2 object there areseparate slots for rZy and rXy. The scalar y'y is the firstelement of devComp.- Presently nc is of length nf+1 and the last element is n, thenumber of observations. This value should be moved to devComp andnc made of length nf.- The slot L is a list of length 1 that contains an ExternalPointerto a cholmod_factor object. This contains a permutation which ismost easily accessible through cholmod_solve(CHOLMOD_P,...) orcholmod_solve(CHOLMOD_Pt,...). The ZtX, Zty, RZX and rZy slots actuallycontain P%*%RZX and P%*%rZy- "[<-" Methods for dgC* and dgT* the former building on the latterusing 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 allsparse 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 matrixbut, if that fails its test, fall back on a general matrix class. -- for denseThat is, the fallback class for dsyMatrix, etc. is dgeMatrix; thefallback 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 sparsematrices. --> provide generic functionsupperTriMatrix(), lowerTriMatrix() both with argument 'diag = TRUE'(which can be set to FALSE of course) which are used to extract atriangle 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)) orDiagonal(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 severalcircumstances; 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 Matlabtoolbox where he uses symmpart(A) := (A + A') /. 2 andskewpart(A) := (A - A') /. 2.Hence defined symmpart() and skewpart().- fixed '*HORRENDOUSLY* slow' in tests/simple.Rand do better thanunlist(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.RdenseMatrices 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.