From 5c56ec1d51403088c96593c2458bbf653ee145f9 Mon Sep 17 00:00:00 2001 From: Edzer Pebesma Date: Fri, 19 Sep 2014 20:57:48 +0200 Subject: [PATCH] fix to R 3.1.0 --- DESCRIPTION | 17 + MD5 | 62 +++ NAMESPACE | 65 ++++ NEWS | 74 ++++ R/Intervals-class.R | 351 +++++++++++++++++ R/as.matrix.R | 5 + R/c.R | 63 +++ R/close_intervals-methods.R | 57 +++ R/closed-methods.R | 40 ++ R/clusters.R | 34 ++ R/distance_to_nearest-methods.R | 11 + R/empty-methods.R | 32 ++ R/expand-methods.R | 59 +++ R/head-methods.R | 20 + R/interval_complement-methods.R | 44 +++ R/interval_difference-methods.R | 17 + R/interval_included-methods.R | 61 +++ R/interval_intersection-methods.R | 37 ++ R/interval_overlap-methods.R | 30 ++ R/interval_union-methods.R | 30 ++ R/is.na-methods.R | 5 + R/plot.Intervals_virtual.R | 78 ++++ R/reduce-methods.R | 25 ++ R/show-methods.R | 24 ++ R/size-methods.R | 37 ++ R/split.R | 6 + R/t-methods.R | 7 + R/type-methods.R | 21 + R/which_nearest-methods.R | 83 ++++ data/sgd.rdata | Bin 0 -> 166595 bytes man/Intervals-class.Rd | 218 +++++++++++ man/Intervals_virtual-class.Rd | 99 +++++ man/Intervals_virtual_or_numeric-class.Rd | 23 ++ man/as.matrix.Intervals.Rd | 29 ++ man/c.Intervals.Rd | 74 ++++ man/close_intervals-methods.Rd | 87 +++++ man/clusters-methods.Rd | 109 ++++++ man/distance_to_nearest-methods.Rd | 58 +++ man/empty-methods.Rd | 76 ++++ man/expand-methods.Rd | 96 +++++ man/interval_complement-methods.Rd | 38 ++ man/interval_difference-methods.Rd | 40 ++ man/interval_included-methods.Rd | 138 +++++++ man/interval_intersection-methods.Rd | 43 ++ man/interval_overlap-methods.Rd | 128 ++++++ man/interval_union-methods.Rd | 55 +++ man/intervals-package.Rd | 69 ++++ man/plot.Intervals.Rd | 152 ++++++++ man/reduce-methods.Rd | 42 ++ man/sgd.Rd | 91 +++++ man/size-methods.Rd | 73 ++++ man/split.Intervals_virtual.Rd | 37 ++ man/which_nearest-methods.Rd | 108 ++++++ src/Endpoint.cpp | 73 ++++ src/Endpoint.h | 69 ++++ src/plot_overlap.cpp | 85 ++++ src/reduce.cpp | 97 +++++ src/which_nearest.cpp | 215 ++++++++++ tests/intervals_test_code.R | 140 +++++++ vignettes/intervals_overview.R | 167 ++++++++ vignettes/intervals_overview.Rnw | 453 ++++++++++++++++++++++ vignettes/intervals_overview.pdf | Bin 0 -> 131707 bytes 62 files changed, 4577 insertions(+) create mode 100755 DESCRIPTION create mode 100644 MD5 create mode 100644 NAMESPACE create mode 100644 NEWS create mode 100644 R/Intervals-class.R create mode 100644 R/as.matrix.R create mode 100644 R/c.R create mode 100644 R/close_intervals-methods.R create mode 100644 R/closed-methods.R create mode 100644 R/clusters.R create mode 100644 R/distance_to_nearest-methods.R create mode 100644 R/empty-methods.R create mode 100644 R/expand-methods.R create mode 100644 R/head-methods.R create mode 100644 R/interval_complement-methods.R create mode 100644 R/interval_difference-methods.R create mode 100644 R/interval_included-methods.R create mode 100644 R/interval_intersection-methods.R create mode 100644 R/interval_overlap-methods.R create mode 100644 R/interval_union-methods.R create mode 100644 R/is.na-methods.R create mode 100644 R/plot.Intervals_virtual.R create mode 100644 R/reduce-methods.R create mode 100644 R/show-methods.R create mode 100644 R/size-methods.R create mode 100644 R/split.R create mode 100644 R/t-methods.R create mode 100644 R/type-methods.R create mode 100644 R/which_nearest-methods.R create mode 100755 data/sgd.rdata create mode 100644 man/Intervals-class.Rd create mode 100644 man/Intervals_virtual-class.Rd create mode 100644 man/Intervals_virtual_or_numeric-class.Rd create mode 100644 man/as.matrix.Intervals.Rd create mode 100644 man/c.Intervals.Rd create mode 100644 man/close_intervals-methods.Rd create mode 100644 man/clusters-methods.Rd create mode 100644 man/distance_to_nearest-methods.Rd create mode 100644 man/empty-methods.Rd create mode 100644 man/expand-methods.Rd create mode 100644 man/interval_complement-methods.Rd create mode 100644 man/interval_difference-methods.Rd create mode 100644 man/interval_included-methods.Rd create mode 100644 man/interval_intersection-methods.Rd create mode 100644 man/interval_overlap-methods.Rd create mode 100644 man/interval_union-methods.Rd create mode 100644 man/intervals-package.Rd create mode 100644 man/plot.Intervals.Rd create mode 100644 man/reduce-methods.Rd create mode 100644 man/sgd.Rd create mode 100644 man/size-methods.Rd create mode 100644 man/split.Intervals_virtual.Rd create mode 100644 man/which_nearest-methods.Rd create mode 100644 src/Endpoint.cpp create mode 100644 src/Endpoint.h create mode 100644 src/plot_overlap.cpp create mode 100644 src/reduce.cpp create mode 100644 src/which_nearest.cpp create mode 100644 tests/intervals_test_code.R create mode 100644 vignettes/intervals_overview.R create mode 100644 vignettes/intervals_overview.Rnw create mode 100644 vignettes/intervals_overview.pdf diff --git a/DESCRIPTION b/DESCRIPTION new file mode 100755 index 0000000..64837d1 --- /dev/null +++ b/DESCRIPTION @@ -0,0 +1,17 @@ +Package: intervals +Version: 0.15.0 +Date: 2014-09-19 +Type: Package +Title: Tools for working with points and intervals +Author: Richard Bourgon +Maintainer: Edzer Pebesma +Depends: R (>= 2.9.0), methods +Suggests: +Description: Tools for working with and comparing sets of points and intervals. +License: Artistic-2.0 +LazyLoad: yes +URL: http://github.com/edzer/intervals +Packaged: 2013-11-03 17:10:26 UTC; hornik +NeedsCompilation: yes +Repository: CRAN +Date/Publication: 2013-11-03 18:23:55 diff --git a/MD5 b/MD5 new file mode 100644 index 0000000..797f767 --- /dev/null +++ b/MD5 @@ -0,0 +1,62 @@ +e3b52f25c29216dab4411db63fc9924d *DESCRIPTION +8fad5c1380be8ac95292709b667580c0 *NAMESPACE +395419ebcf2325cd51382cf869b7ce5c *NEWS +5d3f4dfbcb8c9119dd1562ccbc412467 *R/Intervals-class.R +b324268152a9423e6c65c0c988d6c54b *R/as.matrix.R +38bfefc3e9a840c8c923c89880c1587c *R/c.R +34cd12ab4fe68a81147862e97b15949f *R/close_intervals-methods.R +b3eb24412f49233d264cfa4b59d7e2e4 *R/closed-methods.R +ff9d706b9f496d57e129b6900b73f897 *R/clusters.R +bf6fd3b2e3d8a0423e0d5cc56886861b *R/distance_to_nearest-methods.R +eab17d98c078805adf0e123cb637cc15 *R/empty-methods.R +fc7e40041f4ae6b2796830c2fa03fd59 *R/expand-methods.R +af2a9dcabf565023997fdd01481ebd1c *R/head-methods.R +36b33045bde48137c282a6019157e0c9 *R/interval_complement-methods.R +90cc9b22d5562826c992b7e8afb189d6 *R/interval_difference-methods.R +521baba587949ec360abde100182c525 *R/interval_included-methods.R +1564356296f5c31f7f4b8e2af3f81198 *R/interval_intersection-methods.R +22e0554a7dd6017d28ed6af0b739a005 *R/interval_overlap-methods.R +c4db0a892e9af14025c7140d24cbc146 *R/interval_union-methods.R +606491d4aac135785542a9ccfc8a3070 *R/is.na-methods.R +c0676ed4c23fb7e3ddbc2943706e449e *R/plot.Intervals_virtual.R +c98be2c3ff6e8bb290722d3b0d7cb40f *R/reduce-methods.R +dd2d5638db27a01280f3ba7b51499ca2 *R/show-methods.R +9fb026e61d588212f18e5ce675e25b6d *R/size-methods.R +f60a5d3db5f7ffdc7b2e2f89ad73aa8e *R/split.R +1f063de2558da95b89939fe6ded3cb17 *R/t-methods.R +269d9904ee4f9077977318a06c0ea80b *R/type-methods.R +68f0dd826dd4eacc4f1dd5b9563ca0a6 *R/which_nearest-methods.R +27f6ca46de01553328e15e76bebe5643 *build/vignette.rds +92331b5a7c5d0c6c690134be22d279fd *data/sgd.rdata +a2f1dae28510f0ca5a3cb5089741ff79 *inst/doc/intervals_overview.R +61b77aed42f5d4a9517527dfd20dcd9f *inst/doc/intervals_overview.Rnw +746f4bf572ae118beddaa1361890addd *inst/doc/intervals_overview.pdf +35de4238afd3ef852acdffeaee785700 *man/Intervals-class.Rd +0177e9e1b85eacda57458bfe8298c35c *man/Intervals_virtual-class.Rd +e3e3202f6d824d8f23a435eb9ebf58d1 *man/Intervals_virtual_or_numeric-class.Rd +fa157f068564f9751e7a820fd76113cc *man/as.matrix.Intervals.Rd +fbfe10a5da6b8e08f574a14e7f6a3e5e *man/c.Intervals.Rd +90ca50aa8682d0b5d29a7296a7ae6452 *man/close_intervals-methods.Rd +2abf435889e72a82124c8500f4be5c98 *man/clusters-methods.Rd +75da89fdf7d4e884ff0d8d194d6e1f01 *man/distance_to_nearest-methods.Rd +1dba3b2837c85159bbaf2688ae0adbad *man/empty-methods.Rd +e382cd554673c0068670a67278c6115a *man/expand-methods.Rd +096699acb78d27aa015bfcf956f4f557 *man/interval_complement-methods.Rd +d5e010258d8a735cf40deb9f5a46dfaf *man/interval_difference-methods.Rd +f294dea1388f4faa935666279c852ceb *man/interval_included-methods.Rd +5795101b91efd8d1858b2a883716d9da *man/interval_intersection-methods.Rd +0800a00a632882b9723a3df5d80d3160 *man/interval_overlap-methods.Rd +8c3d9577d7b5ee414115951dc669f921 *man/interval_union-methods.Rd +e4fe3b5b457265fdfc8bf6b6ff82ae8b *man/intervals-package.Rd +a0f85d87af5844eb046f54e67d62331a *man/plot.Intervals.Rd +5c627704aac7e9dcaea89534d6a7a6fe *man/reduce-methods.Rd +27dce9eb576a05a2deaa48fd10c8c4d2 *man/sgd.Rd +c02935db7a4e097bf4316e967f41cb67 *man/size-methods.Rd +4a9e6b81bd312461016f35fa3b3909b0 *man/split.Intervals_virtual.Rd +32a4b517594cd57c13e31a54ce542808 *man/which_nearest-methods.Rd +8e00c2c424c18850880d2273098bfa60 *src/Endpoint.cpp +7a32b00c4f944861c37a65658958b93c *src/Endpoint.h +21e3c6ce0a8cb6f07ce6e0e0cc049316 *src/plot_overlap.cpp +07904a7e49cad3fa6b13cb957818460b *src/reduce.cpp +5419ee07a71faefc60ec68a9dd67d451 *src/which_nearest.cpp +477a72cf673ae334fb367f84bc7870e0 *tests/intervals_test_code.R diff --git a/NAMESPACE b/NAMESPACE new file mode 100644 index 0000000..367056c --- /dev/null +++ b/NAMESPACE @@ -0,0 +1,65 @@ +######## Compiled code + +useDynLib( "intervals" ) + +######## Imports + +# Class, method, and regular imports from the methods package are not listed +# here, since we depend on the package. + +import("methods") + +importFrom( "utils", "head", "tail" ) + +######## Exports + +export( "Intervals", "Intervals_full" ) + +S3method( "split", "Intervals_virtual" ) +S3method( "as.matrix", "Intervals_virtual" ) +S3method( "c", "Intervals" ) +S3method( "c", "Intervals_full" ) +S3method( "plot", "Intervals" ) +S3method( "plot", "Intervals_full" ) +exportClasses( + "Intervals", + "Intervals_full", + "Intervals_virtual", + "Intervals_virtual_or_numeric" +) + +exportMethods( + "[", + "[<-", + "as.matrix", + "adjust_closure", + "close_intervals", + "closed", + "closed<-", + "clusters", + "coerce", + "contract", + "distance_to_nearest", + "empty", + "expand", + "head", + "initialize", + "interval_complement", + "interval_difference", + "interval_included", + "interval_intersection", + "interval_overlap", + "interval_union", + "is.na", + "open_intervals", + "plot", + "reduce", + "show", + "size", + "split", + "t", + "tail", + "type", + "type<-", + "which_nearest" +) diff --git a/NEWS b/NEWS new file mode 100644 index 0000000..6e0a514 --- /dev/null +++ b/NEWS @@ -0,0 +1,74 @@ + ******** VERSION 0.13.3 ******** + +BUG FIXES + + - The S3 plot() method for class Intervals was ignoring the y argument. (The + method for class Intervals_full did, however, use the argument properly.) + This has been fixed. + + ******** VERSION 0.13.2 ******** + +BUG FIXES + + - The initialization method for the Intervals class threw errors when empty + objects were created. This has been fixed. + + ******** VERSION 0.13.0 ******** +NEW FEATURES + + - New interval_included methods, similar to interval_overlap, but requiring + full inclusion. + + ******** VERSION 0.12.3 ******** +NEW FEATURES + + - S3 as.matrix methods for Intervals and Intervals_full objects. + + ******** VERSION 0.12.0 ******** +NEW FEATURES + + - S3 plot methods for Intervals and Intervals_full objects. + + ******** VERSION 0.11.1 ******** + +SIGNIFICANT USER-VISIBLE CHANGES + + - The interval_overlap and distance_to_nearest methods are now just wrappers + for which_nearest. Because of this, the argument names for interval_overlap, + have been changed from 'target' and 'query' to 'from' and 'to', + respectively, in order to match the other two functions. Argument order is + the same as before, but functions which call arguments by name and use the + old names will now generate an (informative) error message. + +BUG FIXES + + - The C++ code for interval_overlap correctly handles all varieties of + endpoint closure, but does not handle cases like (0,2) vs. (1,3) over + Z. (These intervals do not overlap, even though the right endpoint of the + first interval is nominally after the left endpoint of the second interval.) + This should have been handled by the R wrapper -- by applying + close_intervals before passing on to compiled code -- but this step had + previously been omitted. This is now fixed. + +NEW FEATURES + + - The interval_overlap, which_nearest, and distance_to_nearest methods now all + accept a numeric vector in both the 'from' and 'to' arguments. + +IMPROVEMENTS + + - The distance_to_nearest methods were previously based on old code using + approxfun(). They now work of the same algorithm used for interval_overlap + and which_nearest. This algorithm simultaneously generates all three types + of information: identity of overlaps and nearest neighbors, as well as + distance to nearest neighbors. + + ******** VERSION 0.11.0 ******** + +NEW FEATURES + + - Adding a NEWS file! + + - Added which_nearest methods, as a complement to distance_to_nearest. The C++ + code previously used for interval_overlap calculations was augmented to + provide this functionality. \ No newline at end of file diff --git a/R/Intervals-class.R b/R/Intervals-class.R new file mode 100644 index 0000000..7a260bf --- /dev/null +++ b/R/Intervals-class.R @@ -0,0 +1,351 @@ +# We define two classes for two-column interval endpoint matrices. The basic class +# has a two-element boolean vector indicating whether endpoints are closed or +# not. The full class caries a matrix with one boolean per endpoint, permitting +# full control. + + + + +######## Class definitions + +#### Virtual + +# (R 2.6.2) If I add the "VIRTUAL" tag to the representation, I am not able to +# extend this class! I believe this arises because I am already extending a base +# class, but I am not sure. This tag would be more appropriate, but I leave it +# off... + +setClass( + "Intervals_virtual", + representation( type = "character" ), + prototype( + matrix( 0, 0, 2 ), + type = "R" + ), + contains = "matrix", + validity = function( object ) { + # Check main matrix + if ( !is.double( object@.Data ) || ncol( object@.Data ) != 2 ) + return( "The 'Intervals' classes are based on two-column, numeric matrices." ) + # Check 'type' string + if ( length( object@type ) != 1 || !( object@type %in% c( "Z", "R" ) ) ) + return( "The 'type' slot should be 'Z' or 'R'." ) + # For type 'Z', check for integral endpoints + if ( object@type == "Z" && !all( object@.Data[ is.finite( object@.Data ) ] %% 1 == 0 ) ) + return( "Non-integer-valued endpoints not permitted for type 'Z'." ) + # Check for valid intervals + if ( any( object@.Data[,2] < object@.Data[,1], na.rm = TRUE ) ) + return( "One or more intervals with second endpoint before first." ) + return( TRUE ) + } + ) + +setMethod( + "initialize", + signature( "Intervals_virtual" ), + function( .Object, .Data, ... ) { + if ( missing( .Data ) ) callNextMethod( .Object, ... ) + else { + if ( is.data.frame( .Data ) ) + .Data <- as.matrix( .Data ) + if ( !is.matrix( .Data ) ) + .Data <- matrix( .Data, ncol = 2 ) + if ( is.integer( .Data ) ) { + # warning( "Converting endpoints from 'integer' to 'numeric' data type. See class documentation.", call. = FALSE ) + .Data <- matrix( as.numeric( .Data ), nrow( .Data ), ncol( .Data ) ) + } + callNextMethod( .Object, .Data, ... ) + } + } + ) + +#### Intervals + +# Common endpoint closure state for all intervals + +setClass( + "Intervals", + representation( closed = "logical" ), + prototype( closed = c( TRUE, TRUE ) ), + contains = "Intervals_virtual", + validity = function( object ) { + # Check 'closed' slot + if ( length( object@closed ) != 2 || any( is.na( object@closed ) ) ) + return( "The 'closed' slot should be a logical of length 2. NA values are not permitted." ) + return( TRUE ) + } + ) + +setMethod( + "initialize", + signature( "Intervals" ), + function( .Object, .Data, closed, ... ) { + if ( missing( .Data ) ) + callNextMethod( .Object, ... ) + else { + if ( missing( closed ) ) + callNextMethod( .Object, .Data, ... ) + else { + if ( length( closed ) == 1 ) closed <- c( closed, closed ) + callNextMethod( .Object, .Data, closed = closed, ... ) + } + } + } + ) + +#### Intervals_full + +# Full control of endpoint closure. Note that if the 'closed' slot is omitted, +# we use an 'initialize' method to create an appropriately sized matrix of TRUE +# values. We also permit vector input, with recycling, for the 'closed' slot. + +setClass( + "Intervals_full", + representation( closed = "matrix" ), + prototype( closed = matrix( TRUE, 0, 2 ) ), + contains = "Intervals_virtual", + validity = function( object ) { + # Check 'closed' slot + if ( + !is.logical( object@closed ) || + dim( object@.Data ) != dim( object@closed ) || + any( is.na( object@closed ) ) + ) + return( "The 'closed' slot should be a logical matrix with the same dimensions as the main endpoints matrix. NA values are not permitted." ) + return( TRUE ) + } + ) + +setMethod( + "initialize", + signature( "Intervals_full" ), + function( .Object, .Data, closed, ... ) { + if ( missing( .Data ) ) + callNextMethod( .Object, ... ) + else { + if ( !is.matrix( .Data ) ) + .Data <- matrix( .Data, ncol = 2 ) + if ( missing( closed ) ) + closed <- matrix( TRUE, nrow( .Data ), 2 ) + if ( is.vector( closed ) ) { + if ( length( closed ) > 2 ) + stop( "The 'closed' argument should be a matrix, or a vector of length 1 or 2." ) + closed <- matrix( + if ( nrow( .Data ) == 0 ) logical() else closed, + nrow( .Data ), + 2, + byrow = TRUE + ) + } + callNextMethod( .Object, .Data, closed = closed, ... ) + } + } + ) + + + + +######## Constructor functions + +Intervals <- function( ... ) + new( "Intervals", ... ) + +Intervals_full <- function( ... ) + new( "Intervals_full", ... ) + + + + +######## Subsetting + +setMethod( + "[", + signature( "Intervals" ), + function( x, i, j, ..., drop ) { + if ( missing(i) ) i <- rep( TRUE, nrow(x) ) + if ( missing(j) ) { + # Preserve class. Note that both [i,] and [i] syntax subset rows. + if ( any( is.na( i ) ) ) + warning( "NA indices encountered.", call. = FALSE ) + x@.Data <- x@.Data[i,,drop=FALSE] + return( x ) + } + else return( x@.Data[i,j] ) + } + ) + +# Note: row name handling for matices is completely inadequate for our purposes +# here. Lots of obviously desirable behavior (like setting rownames(x)[i] when x +# doesn't yet have rownames) tends to produce errors. + +setMethod( + "[<-", + signature( x = "Intervals", i = "ANY", j = "missing", value = "Intervals_virtual" ), + function( x, i, j, value ) { + #### Error checking + if ( type(x) != type(value) ) + stop( "Types do not match (Z vs. R)." ) + if ( is.character(i) ) i <- match( i, rownames( x ) ) + if ( any( is.na( i ) ) ) + stop( "Cannot assign to NA indices or row names which do not exist." ) + n <- length( (1:nrow(x))[i] ) + if ( n != nrow( value ) ) + stop( "Replacement object is of the wrong size." ) + #### Coerce up? + coerce_x <- FALSE + if ( is( value, "Intervals_full" ) ) coerce_x <- TRUE + else { + matches <- all( closed(x) == closed(value) ) + if ( !matches ) { + if ( type(x) == "Z" ) value <- adjust_closure( value, closed(x)[1], closed(x)[2] ) + else coerce_x <- TRUE + } + } + if ( coerce_x ) { + warning( "Coercion to 'Intervals_full' required.", call. = FALSE ) + x <- as( x, "Intervals_full" ) + x[ i, ] <- value + return(x) + } + #### Data + x@.Data[i,] <- value@.Data + #### Rownames + has_names_x <- !is.null( rownames(x) ) + has_names_value <- !is.null( rownames(value) ) + if ( has_names_x ) { + if ( has_names_value ) rownames(x)[i] <- rownames(value) + else rownames(x)[i] <- "" + } + else { + if ( has_names_value ) { + rownames(x) <- rep( "", nrow(x) ) + rownames(x)[i] <- rownames(value) + } + } + return(x) + } + ) + +setMethod( + "[", + signature( "Intervals_full" ), + function( x, i, j, ..., drop ) { + if ( missing(i) ) i <- rep( TRUE, nrow(x) ) + if ( missing(j) ) { + # Preserve class. Note that both [i,] and [i] syntax subset rows. + if ( is.character(i) ) i <- match( i, rownames( x ) ) + if ( any( is.na( i ) ) ) + warning( "NA indices encountered.", call. = FALSE ) + x@.Data <- x@.Data[i,,drop=FALSE] + x@closed <- x@closed[i,,drop=FALSE] + # We may have NAs in closed if present in i, if any(is.na(i)) == TRUE + x@closed[ is.na(x@closed) ] <- TRUE + return( x ) + } + else return( x@.Data[i,j] ) + } + ) + +setMethod( + "[<-", + signature( x = "Intervals_full", i = "ANY", j = "missing", value = "Intervals_virtual" ), + function( x, i, j, value ) { + #### Error checking + if ( type(x) != type(value) ) + stop( "Types do not match (Z vs. R)." ) + if ( is.character(i) ) i <- match( i, rownames( x ) ) + if ( any( is.na( i ) ) ) + stop( "Cannot assign to NA indices or row names which do not exist." ) + n <- length( (1:nrow(x))[i] ) + if ( n != nrow( value ) ) + stop( "Replacement object is of the wrong size." ) + #### Data + x@.Data[i,] <- value@.Data + if ( is( value, "Intervals" ) ) + x@closed[i,] <- matrix( value@closed, n, 2, byrow = TRUE ) + else + x@closed[i,] <- value@closed + #### Rownames + has_names_x <- !is.null( rownames(x) ) + has_names_value <- !is.null( rownames(value) ) + if ( has_names_x ) { + if ( has_names_value ) rownames(x)[i] <- rownames(value) + else rownames(x)[i] <- "" + } + else { + if ( has_names_value ) { + rownames(x) <- rep( "", nrow(x) ) + rownames(x)[i] <- rownames(value) + } + } + return(x) + } + ) + + + + +######## Coercion + +setMethod( + "coerce", + signature( from = "Intervals", to = "Intervals_full" ), + function( from, to, strict ) { + new( + "Intervals_full", + from@.Data, + type = type( from ), + closed = cbind( + rep( closed(from)[1], nrow( from ) ), + rep( closed(from)[2], nrow( from ) ) + ) + ) + } + ) + +setMethod( + "coerce", + signature( from = "Intervals_full", to = "Intervals" ), + function( from, to, strict ) { + if ( nrow( from ) == 0 ) new_closed <- rep( TRUE, 2 ) + else new_closed <- closed( from )[1,] + if ( !all( t( closed( from ) ) == new_closed ) ) + stop( "Intervals do not all have the same endpoint closure." ) + new( + "Intervals", + from@.Data, + type = type( from ), + closed = new_closed + ) + } + ) + +setMethod( + "coerce", + signature( from = "Intervals_virtual", to = "character" ), + function( from, to, strict ) { + if ( nrow( from ) == 0 ) + return( character() ) + else { + cl <- closed( from ) + # So we only write main code once + if ( is( from, "Intervals" ) ) + cl <- matrix( cl, nrow(from), 2, byrow = TRUE ) + result <- paste( + ifelse( cl[,1], "[", "(" ), + from[,1], ", ", from[,2], + ifelse( cl[,2], "]", ")" ), + sep = "" + ) + names( result ) <- rownames( from ) + return( result ) + } + } + ) + + + + +######## Union + +setClassUnion( "Intervals_virtual_or_numeric", c( "Intervals_virtual", "numeric" ) ) diff --git a/R/as.matrix.R b/R/as.matrix.R new file mode 100644 index 0000000..5c7cec6 --- /dev/null +++ b/R/as.matrix.R @@ -0,0 +1,5 @@ +# S3 methods + +as.matrix.Intervals_virtual <- function( x, ... ) as( x, "matrix" ) + +setMethod( "as.matrix", "Intervals_virtual", as.matrix.Intervals_virtual ) diff --git a/R/c.R b/R/c.R new file mode 100644 index 0000000..c062421 --- /dev/null +++ b/R/c.R @@ -0,0 +1,63 @@ +# As of 2.8.1, we are still not able to write S4 methods for rbind(). Our +# original plan was to use combine() as in biobase, but this seems to be causing +# clashes for the generic function when both packages are loaded. Improved S4 +# support for functions whose first argument is ... seems to be on the way, so +# we'll just do S3 for now, and move up to S4 once it's implemented. Note that +# as of 2.8.1, rbind.data.frame() still exists and is used for data frames. + +# Update! S3 method dispatch for rbind() is non-standard (see its documentation) +# and it produced unexpected dispatch to the matrix method when presented with a +# mix of Intervals and Intervals_full objects. As a consequence, we switched to +# c(), which uses standard S3 dispatch. + +c.Intervals <- function( ... ) { + args <- list(...) + # Drop NULL arguments + if ( any( sapply( args, is.null ) ) ) + args <- args[ !sapply( args, is.null ) ] + # Check if we should just return a list + classes <- sapply( args, class ) + if ( !all( classes %in% c( "Intervals", "Intervals_full" ) ) ) + return( list( ... ) ) + same_class <- all( classes == "Intervals" ) + # We are in fact dealing with intervals only... + if ( !all( sapply( args, type ) == type( args[[1]] ) ) ) + stop( "All arguments should have the same 'type' slot." ) + # Check for common closure + same_closed <- all( sapply( args[-1], function(x) identical( closed( args[[1]] ), closed( x ) ) ) ) + # Coerce up if necessary + if ( !same_class || ( type( args[[1]] ) == "R" & !same_closed ) ) { + warning( "Coercion to 'Intervals_full' required.", call. = FALSE ) + return( do.call( c, lapply( args, as, "Intervals_full" ) ) ) + } + # Convert to common closure for Z + if ( type( args[[1]] ) == "Z" & !same_closed ) + args <- lapply( + args, + adjust_closure, + close_left = closed( args[[1]] )[1], + close_right = closed( args[[1]] )[2] + ) + result <- args[[1]] + result@.Data <- do.call( rbind, lapply( args, function(x) x@.Data ) ) + return( result ) +} + +c.Intervals_full <- function( ... ) { + args <- list(...) + if ( any( sapply( args, is.null ) ) ) + args <- args[ !sapply( args, is.null ) ] + classes <- sapply( args, class ) + if ( !all( classes %in% c( "Intervals", "Intervals_full" ) ) ) + return( list( ... ) ) + if ( !all( sapply( args, type ) == type( args[[1]] ) ) ) + stop( "All arguments should have the same 'type' slot." ) + if ( !all( classes == "Intervals_full" ) ) { + warning( "Coercion to 'Intervals_full' required.", call. = FALSE ) + args <- lapply( args, as, "Intervals_full" ) + } + result <- args[[1]] + result@.Data <- do.call( rbind, lapply( args, function(y) y@.Data ) ) + closed(result) <- do.call( rbind, lapply( args, closed ) ) + return(result) +} diff --git a/R/close_intervals-methods.R b/R/close_intervals-methods.R new file mode 100644 index 0000000..fdde110 --- /dev/null +++ b/R/close_intervals-methods.R @@ -0,0 +1,57 @@ +setGeneric( "close_intervals", def = function(x) standardGeneric( "close_intervals" ) ) + +setMethod( + "close_intervals", + signature( "Intervals_virtual" ), + function( x ) adjust_closure( x, close_left = TRUE, close_right = TRUE ) + ) + +setGeneric( "open_intervals", def = function(x) standardGeneric( "open_intervals" ) ) + +setMethod( + "open_intervals", + signature( "Intervals_virtual" ), + function( x ) adjust_closure( x, close_left = FALSE, close_right = FALSE ) + ) + +setGeneric( "adjust_closure", def = function(x, ...) standardGeneric( "adjust_closure" ) ) + +setMethod( + "adjust_closure", + signature( "Intervals" ), + function(x, close_left = TRUE, close_right = TRUE) { + if ( type(x) == "R" ) + stop( "Only applicable to type 'Z'." ) + if ( any( empty(x), na.rm = TRUE ) ) { + warning( "Empty intervals encountered and removed.", call. = FALSE ) + x <- x[ is.na(x) | !empty(x), ] + } + if ( !closed(x)[1] && close_left ) x[,1] <- x[,1] + 1 + if ( closed(x)[1] && !close_left ) x[,1] <- x[,1] - 1 + if ( !closed(x)[2] && close_right ) x[,2] <- x[,2] - 1 + if ( closed(x)[2] && !close_right ) x[,2] <- x[,2] + 1 + closed(x) <- c( close_left, close_right ) + return( x ) + } + ) + +setMethod( + "adjust_closure", + signature( "Intervals_full" ), + function(x, close_left = TRUE, close_right = TRUE) { + if ( type(x) == "R" ) + stop( "Only applicable to type 'Z'." ) + if ( any( empty(x), na.rm = TRUE ) ) { + warning( "Empty intervals encountered and removed.", call. = FALSE ) + x <- x[ is.na(x) | !empty(x), ] + } + # Left side + if ( close_left ) x[ !closed(x)[,1], 1 ] <- x[ !closed(x)[,1], 1 ] + 1 + else x[ closed(x)[,1], 1 ] <- x[ closed(x)[,1], 1 ] - 1 + # Right side + if ( close_right ) x[ !closed(x)[,2], 2 ] <- x[ !closed(x)[,2], 2 ] - 1 + else x[ closed(x)[,2], 2 ] <- x[ closed(x)[,2], 2 ] + 1 + closed(x) <- c( close_left, close_right ) + return( x ) + } + ) diff --git a/R/closed-methods.R b/R/closed-methods.R new file mode 100644 index 0000000..0ece401 --- /dev/null +++ b/R/closed-methods.R @@ -0,0 +1,40 @@ +setGeneric( "closed", function(x) standardGeneric( "closed" ) ) + +setMethod( + "closed", + signature( "Intervals_virtual" ), + function( x ) x@closed + ) + +setGeneric( "closed<-", function( x, value ) standardGeneric( "closed<-" ) ) + +setReplaceMethod( + "closed", "Intervals", + function( x, value ) { + if ( !is.vector( value ) || !( length( value ) %in% 1:2 ) ) + stop( "The 'closed' argument should be a vector of length 1 or 2." ) + x@closed[ 1:2 ] <- value + return(x) + } + ) + +setReplaceMethod( + "closed", "Intervals_full", + function( x, value ) { + error_msg <- "The 'value' argument should be a matrix, or a vector of length 1 or 2." + if ( is.vector( value ) ) { + if ( length( value ) > 2 ) + stop( error_msg ) + value <- matrix( + if ( nrow( x ) == 0 ) logical() else value, + nrow( x ), + 2, + byrow = TRUE + ) + } + if ( !is.matrix( value ) || nrow( value ) != nrow( x ) || ncol( value ) != 2 ) + stop( error_msg ) + x@closed <- value + return(x) + } + ) diff --git a/R/clusters.R b/R/clusters.R new file mode 100644 index 0000000..7d2d503 --- /dev/null +++ b/R/clusters.R @@ -0,0 +1,34 @@ +setGeneric( "clusters", function( x, ... ) standardGeneric( "clusters" ) ) + +setMethod( + "clusters", + signature( "numeric" ), + function( x, w, which = FALSE, check_valid = TRUE ) { + if ( is.integer(x) ) x <- as.numeric(x) + regions <- reduce( Intervals( cbind( x, x + w ), type = "R" ), check_valid ) + clusters <- interval_overlap( regions, x, check_valid ) + clusters <- clusters[ sapply( clusters, length ) > 1 ] + if ( which ) return( clusters ) + else return( lapply( clusters, function(i) x[i] ) ) + } + ) + +setMethod( + "clusters", + signature( "Intervals_virtual" ), + function( x, w, which = FALSE, check_valid = TRUE ) { + if ( type(x) == "Z" && ( w %% 1 != 0 ) ) + stop( "Non-integer 'w' supplied for intervals over Z.", call. = FALSE ) + regions <- reduce( + new( + class(x), + cbind( x[,1], x[,2] + w ), closed = closed(x), type = type(x) + ), + check_valid + ) + clusters <- interval_overlap( regions, x, check_valid ) + clusters <- clusters[ sapply( clusters, length ) > 1 ] + if ( which ) return( clusters ) + else return( lapply( clusters, function(i) x[i,] ) ) + } + ) diff --git a/R/distance_to_nearest-methods.R b/R/distance_to_nearest-methods.R new file mode 100644 index 0000000..511dc8b --- /dev/null +++ b/R/distance_to_nearest-methods.R @@ -0,0 +1,11 @@ +setGeneric( "distance_to_nearest", function( from, to, ... ) standardGeneric( "distance_to_nearest" ) ) + +setMethod( + "distance_to_nearest", + signature( "Intervals_virtual_or_numeric", "Intervals_virtual_or_numeric" ), + function( from, to, check_valid = TRUE ) { + result <- which_nearest( from, to, check_valid )$distance_to_nearest + names( result ) <- rownames( from ) + return( result ) + } + ) diff --git a/R/empty-methods.R b/R/empty-methods.R new file mode 100644 index 0000000..d122d5a --- /dev/null +++ b/R/empty-methods.R @@ -0,0 +1,32 @@ +setGeneric( "empty", def = function(x) standardGeneric( "empty" ) ) + +setMethod( + "empty", + signature( "Intervals" ), + function(x) { + result <- rep( FALSE, nrow(x) ) + result[ is.na( x[,1] ) | is.na( x[,2] ) ] <- NA + if ( !all( closed(x) ) ) { + # Valid objects have x[,1] <= x[,2], so we only check this case. + result[ x[,1] == x[,2] ] <- TRUE + if ( type(x) == "Z" && !any( closed( x ) ) ) + result[ x[,1] + 1 == x[,2] ] <- TRUE + } + return( result ) + } + ) + +setMethod( + "empty", + signature( "Intervals_full" ), + function(x) { + result <- rep( FALSE, nrow(x) ) + result[ is.na( x[,1] ) | is.na( x[,2] ) ] <- NA + any_open <- !( closed(x)[,1] & closed(x)[,2] ) + both_open <- !closed(x)[,1] & !closed(x)[,2] + result[ any_open & ( x[,1] == x[,2] ) ] <- TRUE + if ( type(x) == "Z" ) + result[ both_open & ( x[,1] + 1 == x[,2] ) ] <- TRUE + return( result ) + } + ) diff --git a/R/expand-methods.R b/R/expand-methods.R new file mode 100644 index 0000000..0b42bf5 --- /dev/null +++ b/R/expand-methods.R @@ -0,0 +1,59 @@ +# Not exported +adjust <- function( x, delta, type, direction = 1 ) { + signs <- rep( c( direction, -direction ), c( nrow(x), nrow(x) ) ) + if ( nrow(x) %% length(delta) != 0 ) + warning( "Length of 'delta' does not evenly divide number of intervals.", call. = FALSE ) + delta <- rep( delta, length = nrow( x ) ) + switch( + type, + relative = x * ( 1 - delta ) ^ ( sign(x) * signs ), + absolute = x - delta * signs + ) +} + +setGeneric( "expand", def = function( x, ... ) standardGeneric( "expand" ) ) + +setMethod( + "expand", + signature( "Intervals_virtual" ), + function( + x, + delta = 0, + type = c( "absolute", "relative" ) + ) + { + if ( any( delta < 0, na.rm = TRUE ) ) + stop( "The 'delta' argument should not contain negative values." ) + type = match.arg( type ) + if ( type(x) == "Z" && ( type == "relative" || any( delta %% 1 != 0, na.rm = TRUE ) ) ) + stop( "Only absolute, integer-valued expansion permitted for type 'Z'." ) + x@.Data <- adjust( x, delta, type, 1 ) + return( x ) + } + ) + +setGeneric( "contract", def = function( x, ... ) standardGeneric( "contract" ) ) + +setMethod( + "contract", + signature( "Intervals_virtual" ), + function( + x, + delta = 0, + type = c( "absolute", "relative" ) + ) + { + if ( any( delta < 0, na.rm = TRUE ) ) + stop( "The 'delta' argument should not contain negative values." ) + type = match.arg( type ) + if ( type(x) == "Z" && ( type == "relative" || any( delta %% 1 != 0, na.rm = TRUE ) ) ) + stop( "Only absolute, integer-valued contraction permitted for type 'Z'." ) + x@.Data <- adjust( x, delta, type, -1 ) + drop <- x[,1] > x[,2] | empty(x) + if ( any( drop ) ) { + warning( "Some empty intervals eliminated.", call. = FALSE ) + x <- x[ !drop, ] + } + return( x ) + } + ) diff --git a/R/head-methods.R b/R/head-methods.R new file mode 100644 index 0000000..2fc1d77 --- /dev/null +++ b/R/head-methods.R @@ -0,0 +1,20 @@ +setGeneric( "head", function( x, ... ) standardGeneric( "head" ) ) + +setMethod( + "head", + signature( "Intervals_virtual" ), + function( x, n = 6 ) { + if ( nrow(x) > 0 ) x[ 1:min( n, nrow(x) ), ] else x + } + ) + +setGeneric( "tail", function( x, ... ) standardGeneric( "tail" ) ) + +setMethod( + "tail", + signature( "Intervals_virtual" ), + function( x, n = 6 ) { + if ( nrow(x) > 0 ) x[ max( 1, nrow(x) - n + 1 ):nrow(x), ] else x + } + ) + diff --git a/R/interval_complement-methods.R b/R/interval_complement-methods.R new file mode 100644 index 0000000..1cfdce2 --- /dev/null +++ b/R/interval_complement-methods.R @@ -0,0 +1,44 @@ +setGeneric( "interval_complement", def = function(x, ...) standardGeneric( "interval_complement" ) ) + +setMethod( + "interval_complement", + signature( "Intervals_virtual" ), + function(x, check_valid = TRUE) { + # Sort and clean up + x <- reduce( x, check_valid ) + # When the data type of the endpoints matrix is integer, + # complications arise from maximum/minimum representable integer + # values. For Intervals objects, the complement will often + # need to include the minimal/maximal represenable integer, but one + # or both endpoints may be open. In such cases, we adjust close with + # a warning. For the moment, we force numeric endpoints throughout + # the package. + endpoints <- + if ( nrow(x) == 0 ) + matrix( c( -Inf, Inf ), 1 ) + else + rbind( + if ( is.finite( x[1,1] ) ) c( -Inf, x[1,1] ) else NULL, + cbind( x[-nrow(x),2], x[-1,1] ), + if ( is.finite( x[nrow(x),2] ) ) c( x[nrow(x),2], Inf ) else NULL + ) + closed <- + if ( class(x) == "Intervals" ) + # Note that we ignore closure for non-finite endpoints. + !closed(x)[2:1] + else + if ( nrow(x) == 0 ) TRUE + else + !rbind( + if ( is.finite( x[1,1] ) ) c( TRUE, closed(x)[1,1] ) else NULL, + cbind( closed(x)[-nrow(x),2], closed(x)[-1,1] ), + if ( is.finite( x[nrow(x),2] ) ) c( closed(x)[nrow(x),2], TRUE ) else NULL + ) + new( + class(x), + endpoints, + type = type(x), + closed = closed + ) + } + ) diff --git a/R/interval_difference-methods.R b/R/interval_difference-methods.R new file mode 100644 index 0000000..d8185c6 --- /dev/null +++ b/R/interval_difference-methods.R @@ -0,0 +1,17 @@ +setGeneric( "interval_difference", def = function(x, y, ...) standardGeneric( "interval_difference" ) ) + +setMethod( + "interval_difference", + signature( "Intervals_virtual", "Intervals_virtual" ), + function(x, y, check_valid = TRUE) { + if ( check_valid ) { + validObject( x ) + validObject( y ) + } + interval_intersection( + x, + interval_complement( y, check_valid = FALSE ), + check_valid = FALSE + ) + } + ) diff --git a/R/interval_included-methods.R b/R/interval_included-methods.R new file mode 100644 index 0000000..f6d16d4 --- /dev/null +++ b/R/interval_included-methods.R @@ -0,0 +1,61 @@ +setGeneric( "interval_included", def = function( from, to, ... ) standardGeneric( "interval_included" ) ) + +setMethod( + "interval_included", + signature( "Intervals", "Intervals" ), + function( from, to, check_valid = TRUE ) { + # For inclusion, both endpoints from a "to" interval should be + # inside an particular "from" interval. Because interval_overlap + # treats numerics as double-closed single-point intervals, some care + # is required with open endpoints for "to": these should be + # considered to overlap closed OR open "from" endpoints with which + # they coincide. We handle this, over R, by adjusting the "from" + # closure. + if ( any( empty(to) ) ) { + warning( "Some empty 'to' intervals encountered. Setting to NA...", call. = FALSE ) + to[ empty(to), ] <- NA + } + if ( type(to) == "Z" ) + to <- close_intervals(to) + else + closed( from ) <- closed( from ) | !closed( to ) + mapply( + intersect, + interval_overlap( from, to[,1], check_valid ), + interval_overlap( from, to[,2], check_valid ) + ) + } + ) + +setMethod( + "interval_included", + signature( "Intervals_full", "Intervals_full" ), + function( from, to, check_valid = TRUE ) { + # For the same reasons given above, open endpoints in "to" need to + # be re-checked against open endpoints in "from", since equality of + # the endpoint value is consistent with inclusion. + if ( any( empty(to) ) ) { + warning( "Some empty 'to' intervals encountered. Setting to NA...", call. = FALSE ) + to[ empty(to), ] <- NA + } + if ( type(to) == "Z" ) + to <- close_intervals(to) + # Left side + left <- interval_overlap( from, to[,1], check_valid ) + to[ closed(to)[,1], 1 ] <- NA + left_open <- interval_overlap( from[,1], to[,1], check_valid ) + # Right side + right <- interval_overlap( from, to[,2], check_valid ) + to[ closed(to)[,2], 2 ] <- NA + right_open <- interval_overlap( from[,2], to[,2], check_valid ) + mapply( + function(l,lo,r,ro) intersect( c(l,lo), c(r,ro) ), + left, left_open, right, right_open + ) + } + ) + +# Note: there isn't much sense in asking what's included in a set of +# points. Further, overlap and inclusion are the same when "from" contains +# actual intervals while "to" contains point. For these reasons, there are no +# methods for class "numeric." diff --git a/R/interval_intersection-methods.R b/R/interval_intersection-methods.R new file mode 100644 index 0000000..79f29a8 --- /dev/null +++ b/R/interval_intersection-methods.R @@ -0,0 +1,37 @@ +setGeneric( "interval_intersection", def = function( x, ... ) standardGeneric( "interval_intersection" ) ) + +setMethod( + "interval_intersection", + signature( "Intervals_virtual" ), + function( x, ..., check_valid = TRUE ) { + args <- c( list(x), list(...) ) + if ( check_valid ) for ( y in args ) validObject( y ) + complements <- lapply( args, interval_complement, check_valid = FALSE ) + interval_complement( + do.call( + interval_union, + c( complements, list( check_valid = FALSE ) ) + ) + ) + } + ) + +setMethod( + "interval_intersection", + signature( "missing" ), + function( x, ..., check_valid = TRUE ) { + # Permitting do.call use with named lists, since do.call will put + # elements whose names are not "x" into the ... argument. Stripping + # names, however, puts arguments in place positionally. + args <- list(...) + names( args ) <- NULL + if ( length( args ) == 0 ) return ( NULL ) + else + return( + do.call( + interval_intersection, + c( args, list( check_valid = check_valid ) ) + ) + ) + } + ) diff --git a/R/interval_overlap-methods.R b/R/interval_overlap-methods.R new file mode 100644 index 0000000..5a5e3fe --- /dev/null +++ b/R/interval_overlap-methods.R @@ -0,0 +1,30 @@ +setGeneric( "interval_overlap", def = function( from, to, ... ) standardGeneric( "interval_overlap" ) ) + +setMethod( + "interval_overlap", + signature( "Intervals_virtual_or_numeric", "Intervals_virtual_or_numeric" ), + function( from, to, check_valid = TRUE ) { + result <- which_nearest( from, to, check_valid )$which_overlap + names( result ) <- rownames( from ) + return( result ) + } + ) + +argument_error <- paste( + "The 'from' and 'to' arguments are required. Note that the", + " interval_overlap argument names changed at v. 0.11.1.", + " See documentation.", + sep = "\n" + ) + +setMethod( + "interval_overlap", + signature( from = "missing", to = "ANY" ), + function( from, to, check_valid, ... ) stop( argument_error ) + ) + +setMethod( + "interval_overlap", + signature( from = "ANY", to = "missing" ), + function( from, to, check_valid, ... ) stop( argument_error ) + ) diff --git a/R/interval_union-methods.R b/R/interval_union-methods.R new file mode 100644 index 0000000..16a9768 --- /dev/null +++ b/R/interval_union-methods.R @@ -0,0 +1,30 @@ +setGeneric( "interval_union", def = function( x, ... ) standardGeneric( "interval_union" ) ) + +setMethod( + "interval_union", + signature( "Intervals_virtual" ), + function( x, ..., check_valid = TRUE ) { + reduce( c( x, ... ), check_valid ) + } + ) + +setMethod( + "interval_union", + signature( "missing" ), + function( x, ..., check_valid = TRUE ) { + # Permitting do.call use with named lists, since do.call will put + # elements whose names are not "x" into the ... argument. Stripping + # names, however, puts arguments in place positionally. + args <- list(...) + names( args ) <- NULL + if ( length( args ) == 0 ) return ( NULL ) + else + return( + do.call( + interval_union, + c( args, list( check_valid = check_valid ) ) + ) + ) + } + ) + diff --git a/R/is.na-methods.R b/R/is.na-methods.R new file mode 100644 index 0000000..685bd6e --- /dev/null +++ b/R/is.na-methods.R @@ -0,0 +1,5 @@ +setMethod( + "is.na", + signature( x = "Intervals_virtual" ), + function(x) is.na( x[,1] ) | is.na( x[,2] ) + ) diff --git a/R/plot.Intervals_virtual.R b/R/plot.Intervals_virtual.R new file mode 100644 index 0000000..d02c9a3 --- /dev/null +++ b/R/plot.Intervals_virtual.R @@ -0,0 +1,78 @@ +plot.Intervals_full <- function( + x, y = NULL, + axes = TRUE, + xlab = "", ylab = "", + xlim = NULL, ylim = NULL, + col = "black", lwd = 1, + cex = 1, + use_points = TRUE, + use_names = TRUE, + names_cex = 1, + ... + ) +{ + # Subset first, for efficiency, and so that the maximal y plotted is + # appropriate for the region shown. + + if ( any( is.na( x ) ) ) x <- x[ !is.na(x), ] + + if ( is.null(xlim) ) + xlim <- range( x@.Data ) + else + x <- x[ x[,2] >= xlim[1] & x[,1] <= xlim[2], ] + + if ( is.null(y) ) + y <- .Call( "_plot_overlap", x@.Data, closed(x), is( x, "Intervals_full" ) ) + + if ( is.null(ylim) ) + ylim <- c( 0, max( y ) ) + + plot( + 0, 0, + type = "n", + xlim = xlim, ylim = ylim, + axes = FALSE, + xlab = xlab, ylab = ylab, + ... + ) + # Careful with non-finite endpoints, which segments() ignores. + segments( + pmax( x[,1], par("usr")[1] ), y, + pmin( x[,2], par("usr")[2] ), y, + col = col, + lwd = lwd + ) + if ( use_points ) { + # Careful with points... + adjust <- ( x[,1] == x[,2] ) & !closed(x)[,1] + closed(x)[ adjust, 2 ] <- FALSE + points( + x@.Data, rep( y, 2 ), + pch = 21, cex = cex, + col = col, bg = ifelse( closed(x), col, "white" ) + ) + } + if ( use_names && !is.null( rownames(x) ) ) { + mids <- ( x[,1] + x[,2] ) / 2 + text( + mids, y, + rownames( x ), + pos = 3, offset = .5, + cex = names_cex, + xpd = NA + ) + } + if ( axes ) + axis( 1 ) +} + +plot.Intervals <- function( x, y = NULL, ... ) { + plot( as( x, "Intervals_full" ), y, ... ) +} + +setMethod( "plot", c( "Intervals", "missing" ), function( x, y, ... ) plot.Intervals( x, ... ) ) +setMethod( "plot", c( "Intervals", "ANY" ), function( x, y, ... ) plot.Intervals( x, y, ... ) ) + +setMethod( "plot", c( "Intervals_full", "missing" ), function( x, y, ... ) plot.Intervals_full( x, ... ) ) +setMethod( "plot", c( "Intervals_full", "ANY" ), function( x, y, ... ) plot.Intervals_full( x, y, ... ) ) + diff --git a/R/reduce-methods.R b/R/reduce-methods.R new file mode 100644 index 0000000..68efee4 --- /dev/null +++ b/R/reduce-methods.R @@ -0,0 +1,25 @@ +setGeneric( "reduce", def = function( x, ... ) standardGeneric( "reduce" ) ) + +setMethod( + "reduce", + signature( "Intervals_virtual" ), + function( x, check_valid = TRUE ) { + if ( check_valid ) validObject( x ) + has_na <- is.na( x[,1] ) | is.na( x[,2] ) + if ( any( has_na ) ) { + warning( "Intervals with NA endpoints removed.", call. = FALSE ) + x <- x[ !has_na, ] + } + if ( any( empty( x ) ) ) + x <- x[ !empty(x), ] + # In order to collapse over abutting intervals over Z + if ( type(x) == "Z" ) x <- open_intervals( x ) + result <- .Call( + "_reduce", + x@.Data, + closed( x ), + is( x, "Intervals_full" ) + ) + new( class(x), result[[1]], closed = result[[2]], type = type(x) ) + } + ) diff --git a/R/show-methods.R b/R/show-methods.R new file mode 100644 index 0000000..7ef5253 --- /dev/null +++ b/R/show-methods.R @@ -0,0 +1,24 @@ +setMethod( + "show", + signature( "Intervals_virtual" ), + function( object ) { + cat( + "Object of class ", + class( object ), + "\n", + nrow( object ), + " interval", + ifelse( nrow( object ) == 1, "", "s" ), + " over ", + type(object), + ":\n", + sep = "" + ) + ints <- as( object, "character") + if ( !is.null( rownames( object ) ) ) { + fmt <- sprintf( "%%%is", max( nchar( rownames( object ) ) ) ) + ints <- paste( sprintf( fmt, rownames( object ) ), ints ) + } + cat( ints, sep = "\n" ) + } + ) diff --git a/R/size-methods.R b/R/size-methods.R new file mode 100644 index 0000000..8f023ca --- /dev/null +++ b/R/size-methods.R @@ -0,0 +1,37 @@ +# For R, size is Lebesgue measure, so closure is irrelevant. Note that we don't +# use the close_intervals method here, which is important since this method +# requires empty, and empty currently uses size. We need to avoid circular +# dependency. + +setGeneric( "size", def = function( x, ... ) standardGeneric( "size" ) ) + +setMethod( + "size", + signature( "Intervals" ), + function( x, as = type(x) ) { + result <- x[,2] - x[,1] + if ( as == "Z" ) { + ties <- x[,2] == x[,1] + ties[ is.na( ties ) ] <- FALSE + result[ ties ] <- ifelse( all( closed(x) ), 1, 0 ) + result[ !ties ] <- result[ !ties ] + sum( closed(x) ) - 1 # NAs just stay NA + } + return( result ) + } + ) + +setMethod( + "size", + signature( "Intervals_full" ), + function( x, as = type(x) ) { + result <- x[,2] - x[,1] + if ( as == "Z" ) { + ties <- x[,2] == x[,1] + ties[ is.na( ties ) ] <- FALSE + rs <- rowSums( closed(x) ) + result[ ties ] <- ifelse( rs[ ties ] == 2, 1, 0 ) + result[ !ties ] <- result[ !ties ] + rs[ !ties ] - 1 + } + return( result ) + } + ) diff --git a/R/split.R b/R/split.R new file mode 100644 index 0000000..f568d10 --- /dev/null +++ b/R/split.R @@ -0,0 +1,6 @@ +# Cause split.data.frame to be used. See "Methods for S3 Generic Functions" in +# help for "Methods", for guidance and examples. + +split.Intervals_virtual <- split.data.frame + +setMethod( "split", "Intervals_virtual", split.Intervals_virtual ) diff --git a/R/t-methods.R b/R/t-methods.R new file mode 100644 index 0000000..bcfe483 --- /dev/null +++ b/R/t-methods.R @@ -0,0 +1,7 @@ +setGeneric( "t", function(x) standardGeneric( "t" ) ) + +setMethod( + "t", + signature( "Intervals_virtual" ), + function(x) t( x@.Data ) + ) diff --git a/R/type-methods.R b/R/type-methods.R new file mode 100644 index 0000000..653115d --- /dev/null +++ b/R/type-methods.R @@ -0,0 +1,21 @@ +setGeneric( "type", function(x) standardGeneric( "type" ) ) + +setMethod( + "type", + signature( "Intervals_virtual" ), + function( x ) x@type + ) + +setGeneric( "type<-", function( x, value ) standardGeneric( "type<-" ) ) + +setReplaceMethod( + "type", "Intervals_virtual", + function( x, value ) { + if ( length( value ) != 1 || !( value %in% c( "Z", "R" ) ) ) + stop( "The 'type' slot should be 'Z' or 'R'." ) + if ( value == "Z" && !all( x@.Data %% 1 == 0, na.rm = TRUE ) ) + stop( "Non-integer-valued endpoints not permitted for type 'Z'." ) + x@type <- value + return(x) + } + ) diff --git a/R/which_nearest-methods.R b/R/which_nearest-methods.R new file mode 100644 index 0000000..b58a8f9 --- /dev/null +++ b/R/which_nearest-methods.R @@ -0,0 +1,83 @@ +setGeneric( "which_nearest", def = function( from, to, ... ) standardGeneric( "which_nearest" ) ) + +setMethod( + "which_nearest", + signature( "Intervals_virtual", "Intervals_virtual" ), + function( from, to, check_valid = TRUE ) { + if ( check_valid && !( validObject(to) && validObject(from) ) ) + stop( "The 'to' and/or 'from' objects are invalid." ) + if ( type(to) != type(from) ) + stop( "Both 'to' and 'from' should have the same type." ) + if ( any( empty( to ), na.rm = TRUE ) ) { + warning( "Some empty 'to' intervals encountered. Setting to NA...", call. = FALSE ) + to[ empty(to), ] <- NA + } + if ( any( empty( from ), na.rm = TRUE ) ) { + warning( "Some empty 'from' intervals encountered. Setting to NA...", call. = FALSE ) + from[ empty(from), ] <- NA + } + if( type(to) == "Z" ) { + to <- close_intervals( to ) + from <- close_intervals( from ) + } + result <- .Call( + "_which_nearest", + to@.Data, from@.Data, + closed(to), closed(from), + class(to) == "Intervals_full", class(from) == "Intervals_full" + ) + result[[1]][ !is.finite( result[[1]] ) ] <- as.numeric( NA ) + data.frame( + distance_to_nearest = result[[1]], + which_nearest = I( result[[2]] ), + which_overlap = I( result[[3]] ), + row.names = rownames( from ) + ) + } + ) + +setMethod( + "which_nearest", + signature( "numeric", "Intervals_virtual" ), + function( from, to, check_valid = TRUE ) { + if ( type( to ) == "Z" ) { + non_int <- ( from %% 1 != 0 ) + if ( any( non_int, na.rm = TRUE ) ) + stop( "The 'to' object is of type 'Z'. Non-integral values are not permitted in 'from'.", call. = FALSE ) + } + which_nearest( + new( class( to ), cbind( from, from ), closed = TRUE, type = type( to ) ), + to, + check_valid = check_valid + ) + } + ) + +setMethod( + "which_nearest", + signature( "Intervals_virtual", "numeric" ), + function( from, to, check_valid = TRUE ) { + if ( type( from ) == "Z" ) { + non_int <- ( to %% 1 != 0 ) + if ( any( non_int, na.rm = TRUE ) ) + stop( "The 'from' object is of type 'Z'. Non-integral values are not permitted in 'to'.", call. = FALSE ) + } + which_nearest( + from, + new( class( from ), cbind( to, to ), closed = TRUE, type = type( from ) ), + check_valid = check_valid + ) + } + ) + +setMethod( + "which_nearest", + signature( "numeric", "numeric" ), + function( from, to, check_valid = TRUE ) { + which_nearest( + Intervals( cbind( from, from ) ), + Intervals( cbind( to, to ) ), + check_valid = FALSE + ) + } + ) diff --git a/data/sgd.rdata b/data/sgd.rdata new file mode 100755 index 0000000000000000000000000000000000000000..07bb309dec2271e34c022e2307d6aa568769290c GIT binary patch literal 166595 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ʟakqyygY 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 literal 0 HcmV?d00001 diff --git a/man/Intervals-class.Rd b/man/Intervals-class.Rd new file mode 100644 index 0000000..3185a2d --- /dev/null +++ b/man/Intervals-class.Rd @@ -0,0 +1,218 @@ +\name{Intervals-class} + +\docType{class} + +\alias{Intervals} +\alias{Intervals_full} + +\alias{Intervals-class} +\alias{Intervals_full-class} + +\alias{[,Intervals-method} +\alias{[,Intervals_full-method} +\alias{[<-,Intervals,ANY,missing,Intervals_virtual-method} +\alias{[<-,Intervals_full,ANY,missing,Intervals_virtual-method} +\alias{closed<-} +\alias{closed<-,Intervals-method} +\alias{closed<-,Intervals_full-method} +\alias{coerce,Intervals,Intervals_full-method} +\alias{coerce,Intervals_full,Intervals-method} +\alias{initialize,Intervals-method} +\alias{initialize,Intervals_full-method} + + + + +\title{Classes "Intervals" and "Intervals_full"} + +\description{ + \code{"Intervals"} objects are two-column matrices which represent + sets, possibly non-disjoint and in no particular order, of intervals + on either the integers or the real line. All intervals in each object + have the same endpoint closure pattern. \code{"Intervals_full"} + objects are similar, but permit interval-by-interval endpoint closure + specification. +} + +\section{Objects from the Class}{ + Objects can be created by calls of the form \code{new("Intervals", + \dots)}, or better, by using the constructor functions + \code{\link{Intervals}(\dots)} and + \code{\link{Intervals_full}(\dots)}. +} + +\section{Slots}{ + + \describe{ + + \item{\code{.Data}:}{See \code{"\linkS4class{Intervals_virtual}"}.} + + \item{\code{closed}:}{ + For \code{"Intervals"} objects, a two-element logical vector. For + \code{"Intervals_full"} objects, a two-column logical matrix with + the same dimensions as \code{.Data}. If omitted in a \code{new} + call, the \code{closed} slot will be initialized to an object of + appropriate type and size, with all entries \code{TRUE}. If + \code{closed} is a vector of length 1, or a vector of length 2 for + the \code{"Intervals_full"} class, an appropriate object will be + made by reusing the supplied values row-wise. See the example + below. + } + + \item{\code{type}:}{See \code{"\linkS4class{Intervals_virtual}"}.} + + } + +} + +\section{Extends}{ + + Class \code{"\linkS4class{Intervals_virtual}"}, directly. + + Class \code{"\linkS4class{matrix}"}, by class + \code{"Intervals_virtual"}, distance 2. + + Class \code{"\linkS4class{array}"}, by class + \code{"Intervals_virtual"}, distance 3. + + Class \code{"\linkS4class{structure}"}, by class + \code{"Intervals_virtual"}, distance 4. + + Class \code{"\linkS4class{vector}"}, by class + \code{"Intervals_virtual"}, distance 5, with explicit coerce. + +} + +\seealso{ + See \code{"\linkS4class{Intervals_virtual}"}. +} + +\section{S3 methods}{ + + As of R 2.8.1, it still does not seem possible to write S4 methods for + \code{rbind} or \code{c}. To concatenate sets of intervals into a + single sets, the S3 methods \code{\link{c.Intervals}} and + \code{\link{c.Intervals_full}} are provided. While \code{rbind} might + seem more natural, its S3 dispatch is non-standard and it could not be + used. Both methods are documented separately. + +} + +\section{S4 methods}{ + + \describe{ + + \item{[}{\code{ signature(x = "Intervals")} } + \item{[}{\code{ signature(x = "Intervals_full")} } + \item{[<-}{\code{ signature(x = "Intervals", i = "ANY", j = "missing", value = "Intervals_virtual")} } + \item{[<-}{\code{ signature(x = "Intervals_full", i = "ANY", j = "missing", value = "Intervals_virtual")} } + \item{adjust\_closure}{\code{ signature(x = "Intervals")} } + \item{adjust\_closure}{\code{ signature(x = "Intervals_full")} } + \item{closed<-}{\code{ signature(x = "Intervals")} } + \item{closed<-}{\code{ signature(x = "Intervals_full")} } + \item{coerce}{\code{ signature(from = "Intervals", to = "Intervals_full")} } + \item{coerce}{\code{ signature(from = "Intervals_full", to = "Intervals")} } + \item{empty}{\code{ signature(x = "Intervals")} } + \item{empty}{\code{ signature(x = "Intervals_full")} } + \item{initialize}{\code{ signature(.Object = "Intervals")} } + \item{initialize}{\code{ signature(.Object = "Intervals_full")} } + \item{size}{\code{ signature(x = "Intervals")} } + \item{size}{\code{ signature(x = "Intervals_full")} } + + % \item{\code{[}:}{ + % When used to subset rows, class is preserved; when used to subset + % columns, the \code{closed} and \code{type} slots are discarded and + % an appropriately subset version of \code{.Data} is returned. See + % example below. + % } + % + % \item{\code{closed<-}:}{ + % Replacement accessor for \code{closed} slot. See the example + % below. See description of the \code{closed} slot above for details + % on how one- or two-element logical vectors are interpreted. + % } + % + % \item{\code{coerce}:}{ + % Coercion methods are provided for converting back and forth + % between \code{"Intervals"} and \code{"Intervals_full"} + % objects. See example below. An error will be generated when + % attemption to down-class a \code{"Intervals_full"} object which + % does not have the same closure settings for every interval. + % + % A coercion method is also provided for pretty character strings. + % } + + } + +} + +\note{ + We do not currently permit an integer data type for the endpoints + matrix, even when \code{type == "Z"}, because this creates + complications when taking complements -- which is most easily handled + through the use of \code{-Inf} and \code{Inf}. This is particularly + awkward for objects of class \code{"Intervals"}, since current endpoint + closure settings may not permit inclusion of the minimal/maximal + integer. This issue may be addressed, however, in future updates. (We + do, however, check that endpoints are congruent to 0 mod 1 when + \code{type == "Z"}.) + + When creating object, non-matrix endpoint sources will be converted to + a two-column matrix, for convenience. Recycling is supported for the + \code{closed} slot when creating new objects. +} + +\section{Warning}{ + Validity checking takes place when, for example, using the + \code{type<-} replacement accessor: if one attempts to set type to + \code{"Z"} but the endpoint matrix contains non-integer values, an + error is generated. Because accessors are not used for the endpoint + matrix itself, though, it is possible to create invalid \code{"Z"} + objects by setting endpoints to inappropriate values. +} + +\examples{ + +# The "Intervals" class + +i <- Intervals( + matrix( + c(1,2, + 3,5, + 4,6, + 8,9 + ), + byrow = TRUE, + ncol = 2 + ), + closed = c( TRUE, TRUE ), + type = "Z" + ) + +# Row subsetting preserves class. Column subsetting causes coercion to +# "matrix" class. + +i +i[1:2,] +i[,1:2] + +# Full endpoint control + +j <- as( i, "Intervals_full" ) +closed(j)[ 3:4, 2 ] <- FALSE +closed(j)[ 4, 1 ] <- FALSE +j + +# Rownames may be used + +rownames(j) <- c( "apple", "banana", "cherry", "date" ) +j + +# Assignment preserves class, coercing if necessary + +j[2:3] <- i[1:2,] +j + +} + +\keyword{classes} diff --git a/man/Intervals_virtual-class.Rd b/man/Intervals_virtual-class.Rd new file mode 100644 index 0000000..3b7913c --- /dev/null +++ b/man/Intervals_virtual-class.Rd @@ -0,0 +1,99 @@ +\name{Intervals_virtual-class} + +\docType{class} + +\alias{Intervals_virtual-class} + +\alias{closed} +\alias{closed,Intervals_virtual-method} +\alias{closed,Intervals_virtual-method} +\alias{coerce,Intervals_virtual,character-method} +\alias{head,Intervals_virtual-method} +\alias{initialize,Intervals_virtual-method} +\alias{is.na,Intervals_virtual-method} +\alias{show,Intervals_virtual-method} +\alias{t,Intervals_virtual-method} +\alias{tail,Intervals_virtual-method} +\alias{type} +\alias{type,Intervals_virtual-method} +\alias{type<-} +\alias{type<-,Intervals_virtual-method} + +\title{Class "Intervals_virtual"} + +\description{ + A virtual class from which the \code{"Intervals"} and + \code{"Intervals_full"} classes derive. +} + +\section{Slots}{ + + \describe{ + + \item{\code{.Data}:}{ + Object of class \code{"matrix"}. A two-column, numeric (see below) + format is required. For a valid object, no value in the first + column may exceed its partner in the second column. (Note that + this \emph{does} permit empty interval rows, when both endpoints + are of equal value and not both closed.) Only integral (though not + \code{"integer"} class) endpoints are permitted if \code{type} is + \code{"Z"}. See the note on this point in documentation for + \code{"\linkS4class{Intervals}"}. + } + + \item{\code{type}:}{ + Object of class \code{"character"}. A one-element character vector + with either \code{"Z"} or \code{"R"} is required. + } + + } + +} + +\section{Extends}{ + + Class \code{"\linkS4class{matrix}"}, from data part. + + Class \code{"\linkS4class{array}"}, by class "matrix", distance 2. + + Class \code{"\linkS4class{structure}"}, by class "matrix", distance 3. + + Class \code{"\linkS4class{vector}"}, by class "matrix", distance 4, + with explicit coerce. + +} + +\section{Methods}{ + \describe{ + \item{close\_intervals}{ \code{signature(x = "Intervals_virtual")} } + \item{closed}{ \code{signature(x = "Intervals_virtual")} } + \item{clusters}{ \code{signature(x = "Intervals_virtual")} } + \item{coerce}{ \code{signature(from = "Intervals_virtual", to = "character")} } + \item{contract}{ \code{signature(x = "Intervals_virtual")} } + \item{expand}{ \code{signature(x = "Intervals_virtual")} } + \item{head}{ \code{signature(x = "Intervals_virtual")} } + \item{initialize}{ \code{signature(.Object = "Intervals_virtual")} } + \item{interval\_complement}{ \code{signature(x = "Intervals_virtual")} } + \item{interval\_difference}{ \code{signature(x = "Intervals_virtual", y = "Intervals_virtual")} } + \item{interval\_intersection}{ \code{signature(x = "Intervals_virtual")} } + \item{interval\_union}{ \code{signature(x = "Intervals_virtual")} } + \item{is.na}{ \code{signature(x = "Intervals_virtual")} } + \item{open\_intervals}{ \code{signature(x = "Intervals_virtual")} } + \item{reduce}{ \code{signature(x = "Intervals_virtual")} } + \item{show}{ \code{signature(object = "Intervals_virtual")} } + \item{t}{ \code{signature(x = "Intervals_virtual")} } + \item{tail}{ \code{signature(x = "Intervals_virtual")} } + \item{type}{ \code{signature(x = "Intervals_virtual")} } + \item{type<-}{ \code{signature(x = "Intervals_virtual")} } + \item{which\_nearest}{ \code{signature(from = "numeric", to = "Intervals_virtual")} } + \item{which\_nearest}{ \code{signature(from = "Intervals_virtual", to = "numeric")} } + \item{which\_nearest}{ \code{signature(from = "Intervals_virtual", to = "Intervals_virtual")} } + } +} + +\seealso{ + See the \code{"\linkS4class{Intervals}"} and + \code{"\linkS4class{Intervals_full}"} classes. +} + +\keyword{classes} diff --git a/man/Intervals_virtual_or_numeric-class.Rd b/man/Intervals_virtual_or_numeric-class.Rd new file mode 100644 index 0000000..a5bfe94 --- /dev/null +++ b/man/Intervals_virtual_or_numeric-class.Rd @@ -0,0 +1,23 @@ +\name{Intervals_virtual_or_numeric-class} + +\docType{class} + +\alias{Intervals_virtual_or_numeric-class} + +\title{Class "Intervals_virtual_or_numeric"} + +\description{ + A class union combining \code{"\linkS4class{Intervals_virtual}"} and + \code{"\linkS4class{numeric}"}. Used by, e.g., + \code{\link{distance_to_nearest}} and \code{\link{which_nearest}}. +} + +\section{Methods}{ + \describe{ + \item{distance_to_nearest}{\code{signature(from = "Intervals_virtual_or_numeric", to = "Intervals_virtual_or_numeric")}} + \item{interval_overlap}{\code{signature(from = "Intervals_virtual_or_numeric", to = "Intervals_virtual_or_numeric")}} + } +} + + +\keyword{classes} \ No newline at end of file diff --git a/man/as.matrix.Intervals.Rd b/man/as.matrix.Intervals.Rd new file mode 100644 index 0000000..57a77a3 --- /dev/null +++ b/man/as.matrix.Intervals.Rd @@ -0,0 +1,29 @@ +\name{as.matrix} + +\alias{as.matrix} +\alias{as.matrix.Intervals_virtual} +\alias{as.matrix,Intervals_virtual-method} + +\title{Extract matrix of endpoints} + +\description{ S3 and S4 methods for extracting the matrix of endpoints + from S4 objects. } + +\usage{ +\S3method{as.matrix}{Intervals_virtual}(x, ...) + +\S4method{as.matrix}{Intervals_virtual}(x, ...) +} + +\arguments{ + + \item{x}{\code{"Intervals"} or \code{"Intervals_full"} objects.} + + \item{...}{Unused, but required by the S3 generic.} + +} + +\value{ + A two-column matrix, equivalent to \code{x@.Data} or \code{as(x, + "matrix")}. +} diff --git a/man/c.Intervals.Rd b/man/c.Intervals.Rd new file mode 100644 index 0000000..fc4f0c1 --- /dev/null +++ b/man/c.Intervals.Rd @@ -0,0 +1,74 @@ +\name{c} + +\alias{c} +\alias{c.Intervals} +\alias{c.Intervals_full} + +\title{Combine different interval matrix objects} + +\description{ + S3 methods for concatenating sets of intervals into a single set. +} + +\usage{ +\S3method{c}{Intervals}(...) +\S3method{c}{Intervals_full}(...) +} + +\arguments{ + + \item{...}{\code{"Intervals"} or \code{"Intervals_full"} objects.} + +} + +\details{ + + All objects are expected to have the same value in the \code{type} + slot. If the \code{closed} slots differ for + \code{"\linkS4class{Intervals}"} objects and \code{type == "Z"}, the + objects will be adjusted to have \code{closed} values matching that of + \code{x}; if \code{type == "R"}, however, then all objects must first + be coerced to class \code{"\linkS4class{Intervals_full}"}, with a + warning. This coercion also occurs when a mixture of object types is + passed in. A \code{NULL} in any argument is ignored. + +} + +\value{ + A single \code{"\linkS4class{Intervals}"} or + \code{"\linkS4class{Intervals_full}"} object. Input objects are + concatenated in their order of appearance in the the argument list. + + If any input argument is not a set of intervals, \code{list(...)} is + returned instead. +} + +\note{ + These methods will be converted to S4 once the necessary dispatch on + \code{...} is supported. +} + +\examples{ +f1 <- Intervals( 1:2, type = "Z" ) +g1 <- open_intervals( f1 + 5 ) + +# Combining Intervals objects over Z may require closure adjustment +c( f1, g1 ) + +f2 <- f1; g2 <- g1 +type( f2 ) <- type( g2 ) <- "R" + +# Combine Intervals objects over R which have different closure requires +# coercion + +h <- c( f2, g2 ) + +# Coercion for mixed combinations as well +c( h, g2 + 10 ) + +\dontrun{ +# Combining different types is not permitted +c( h, g1 + 10 ) +} + +} \ No newline at end of file diff --git a/man/close_intervals-methods.Rd b/man/close_intervals-methods.Rd new file mode 100644 index 0000000..e7c2323 --- /dev/null +++ b/man/close_intervals-methods.Rd @@ -0,0 +1,87 @@ +\name{close_intervals} + +\alias{close_intervals} +\alias{close_intervals,Intervals_virtual-method} + +\alias{open_intervals} +\alias{open_intervals,Intervals_virtual-method} + +\alias{adjust_closure} +\alias{adjust_closure,Intervals-method} +\alias{adjust_closure,Intervals_full-method} + + +\title{Re-represent integer intervals with open or closed endpoints} + +\description{ + Given an integer interval matrix, adjust endpoints so that all + intervals have the requested closure status. +} + +\usage{ +\S4method{close_intervals}{Intervals_virtual}(x) + +\S4method{open_intervals}{Intervals_virtual}(x) + +\S4method{adjust_closure}{Intervals}(x, close_left = TRUE, close_right = TRUE) + +\S4method{adjust_closure}{Intervals_full}(x, close_left = TRUE, close_right = TRUE) +} + +\arguments{ + + \item{x}{ + An object of appropriate class, and for which \code{x@type == + "Z"}. If \code{x@type == "R"}, an error is generated. + } + + \item{close_left}{ + Should the left endpoints be closed or open? + } + + \item{close_right}{ + Should the right endpoints be closed or open? + } + +} + +\value{ + An object of the same class as \code{x}, with endpoints adjusted as + necessary and all \code{closed(x)} set to either \code{TRUE} or + \code{FALSE}, as appropriate. +} + +\note{ + The \code{close_intervals} and \code{open_intervals} are for + convenience, and just call \code{adjust_closure} with the approriate + arguments. + + The \code{x} object may contain empty intervals, with at least one + open endpoint, and still be valid. (Intervals are invalid if their + second endpoint is less than their first.) The \code{close_intervals} + method would, in such cases, create an invalid result; to prevent + this, empty intervals are detected and removed, with a warning. + + This package does not make a distinction between closed and open + infinite endpoints: an interval with an infinite endpoint extends to + (plus or minus) infinity regardless of the closure state. For example, + \code{\link{distance_to_nearest}} will return a \code{0} when + \code{Inf} is compared to both \code{"[0, Inf)"} and \code{"[0, Inf]"}. +} + +\examples{ +x <- Intervals( + c( 1, 5, 10, 1, 6, 20 ), + closed = c( TRUE, FALSE ), + type = "Z" + ) + +# Empties are dropped +close_intervals(x) +adjust_closure(x, FALSE, TRUE) + +# Intervals_full +y <- as( x, "Intervals_full" ) +closed(y)[1,2] <- TRUE +open_intervals(y) +} \ No newline at end of file diff --git a/man/clusters-methods.Rd b/man/clusters-methods.Rd new file mode 100644 index 0000000..41ac0a4 --- /dev/null +++ b/man/clusters-methods.Rd @@ -0,0 +1,109 @@ +\name{clusters} + +\alias{clusters} +\alias{clusters,numeric-method} +\alias{clusters,Intervals_virtual-method} + +\title{Identify clusters in a collection of positions or intervals} + +\description{ + This function uses tools in the \pkg{intervals} package to quickly + identify clusters -- contiguous collections of positions or intervals + which are separated by no more than a given distance from their + neighbors to either side. +} + +\usage{ +\S4method{clusters}{numeric}(x, w, which = FALSE, check_valid = TRUE) + +\S4method{clusters}{Intervals_virtual}(x, w, which = FALSE, check_valid = TRUE) +} + +\arguments{ + + \item{x}{An appropriate object.} + + \item{w}{ + Maximum permitted distance between a cluster member and its + neighbors to either side. + } + + \item{which}{ + Should indices into the \code{x} object be returned instead of + actual subsets? + } + + \item{check_valid}{ + Should \code{\link{validObject}} be called before passing to + compiled code? Also see \code{\link{interval_overlap}} and + \code{\link{reduce}}. + } + +} + +\details{ + A cluster is defined to be a maximal collection, with at least two + members, of components of \code{x} which are separated by no more than + \code{w}. Note that when \code{x} represents intervals, an interval + must actually \emph{contain a point} at distance \code{w} or less from + a neighboring interval to be assigned to the same cluster. If the ends + of both intervals in question are open and exactly at distance + \code{w}, they will not be deemed to be cluster co-members. See the + example below. +} + +\note{ + Implementation is by a call to \code{\link{reduce}} followed by a call + to \code{\link{interval_overlap}}. The \code{clusters} methods are + included to illustrate the utility of the core functions in the + \pkg{intervals} package, although they are also useful in their own + right. +} + +\value{ + A list whose components are the clusters. Each component is thus a + subset of \code{x}, or, if \code{which == TRUE}, a vector of + indices into the \code{x} object. (The indices correspond to row + numbers when \code{x} is of class \code{"Intervals_virtual"}.) +} + +\examples{ +# Numeric method +w <- 20 +x <- sample( 1000, 100 ) +c1 <- clusters( x, w ) + +# Check results +sapply( c1, function( x ) all( diff(x) <= w ) ) +d1 <- diff( sort(x) ) +all.equal( + as.numeric( d1[ d1 <= w ] ), + unlist( sapply( c1, diff ) ) + ) + +# Intervals method, starting with a reduced object so we know that all +# intervals are disjoint and sorted. +B <- 100 +left <- runif( B, 0, 1e4 ) +right <- left + rexp( B, rate = 1/10 ) +y <- reduce( Intervals( cbind( left, right ) ) ) + +gaps <- function(x) x[-1,1] - x[-nrow(x),2] +hist( gaps(y), breaks = 30 ) + +w <- 200 +c2 <- clusters( y, w ) +head( c2 ) +sapply( c2, function(x) all( gaps(x) <= w ) ) + +# Clusters and open end points. See "Details". +z <- Intervals( + matrix( 1:4, 2, 2, byrow = TRUE ), + closed = c( TRUE, FALSE ) + ) +z +clusters( z, 1 ) +closed(z)[1] <- FALSE +z +clusters( z, 1 ) +} \ No newline at end of file diff --git a/man/distance_to_nearest-methods.Rd b/man/distance_to_nearest-methods.Rd new file mode 100644 index 0000000..8eddaaa --- /dev/null +++ b/man/distance_to_nearest-methods.Rd @@ -0,0 +1,58 @@ +\name{distance_to_nearest} + +\alias{distance_to_nearest} +\alias{distance_to_nearest,Intervals_virtual_or_numeric,Intervals_virtual_or_numeric-method} + +\title{Compute distance to nearest position in a set of intervals} + +\description{ + For each point or interval in the \code{from} argument, compute the + distance to the nearest position in the \code{to} argument. +} + +\usage{ +\S4method{distance_to_nearest}{Intervals_virtual_or_numeric,Intervals_virtual_or_numeric}(from, to, check_valid = TRUE) +} + +\arguments{ + + \item{from}{An object of appropriate type.} + + \item{to}{An object of appropriate type.} + + \item{check_valid}{ + Should \code{\link{validObject}} be called before passing to + compiled code? Also see \code{\link{interval_overlap}}. + } + +} + +\value{ + A vector of distances, with one entry per point or interval in + \code{from}. Any intervals in \code{from} which are either empty (see + \code{\link{empty}}) or have \code{NA} endpoints produce a \code{NA} + result. +} + +\note{ + This function is now just a wrapper for \code{\link{which_nearest}}. +} + +\seealso{ + See \code{\link{which_nearest}}, which also returns indices for the + interval or intervals (in case of ties) at the distance reported. +} + +\examples{ +# Point to interval + +to <- Intervals( c(0,5,3,Inf) ) +from <- -5:10 +plot( from, distance_to_nearest( from, to ), type = "l" ) +segments( to[,1], 1, pmin(to[,2], par("usr")[2]), 1, col = "red" ) + +# Interval to interval + +from <- Intervals( c(-Inf,-Inf,3.5,-1,1,4) ) +distance_to_nearest( from, to ) +} diff --git a/man/empty-methods.Rd b/man/empty-methods.Rd new file mode 100644 index 0000000..edb40eb --- /dev/null +++ b/man/empty-methods.Rd @@ -0,0 +1,76 @@ +\name{empty} + +\alias{empty} +\alias{empty,Intervals-method} +\alias{empty,Intervals_full-method} + +\title{Identify empty interval rows} + +\description{ + A valid interval matrix may contain empty intervals: those with common + endpoints, at least one of which is open. The \code{empty} method + identifies these rows. +} + +\usage{ +\S4method{empty}{Intervals}(x) + +\S4method{empty}{Intervals_full}(x) +} + +\arguments{ + \item{x}{An \code{"Intervals"} or \code{"Intervals_full"} object.} +} + +\details{ + Intervals are deemed to be empty when their endpoints are equal and + not both closed, or for \code{type == "Z"}, when their endpoints differ + by 1 and both are open. The matrices \code{x} and \code{x[!empty(x),]} + represent the same subset of the integers or the real line. +} + +\value{ + A boolean vector with length equal to \code{nrow(x)}. +} + +\section{Warning}{ + Exact equality (\code{==}) comparisons are used by \code{empty}. See + the package vignette for a discussion of equality and floating point + numbers. +} + +\note{ + Note that intervals of size 0 may not be empty over the reals, and + intervals whose second endpoint is strictly greater than the first + \emph{may} be empty over the integers, if both endpoints are open. +} + +\seealso{ + See \code{\link{size}} to compute the size of each interval in an + object. +} + +\examples{ +z1 <- Intervals( cbind( 1, 1:3 ), type = "Z" ) +z2 <- z1; closed(z2)[1] <- FALSE +z3 <- z1; closed(z3) <- FALSE + +empty(z1) +empty(z2) +empty(z3) + +r1 <- z1; type(r1) <- "R" +r2 <- z2; type(r2) <- "R" +r3 <- z3; type(r3) <- "R" + +empty(r1) +empty(r2) +empty(r3) + +s1 <- Intervals_full( matrix( 1, 3, 2 ), type = "Z" ) +closed(s1)[2,2] <- FALSE +closed(s1)[3,] <- FALSE + +empty(s1) +} + diff --git a/man/expand-methods.Rd b/man/expand-methods.Rd new file mode 100644 index 0000000..ae5da1d --- /dev/null +++ b/man/expand-methods.Rd @@ -0,0 +1,96 @@ +\name{expand} + +\alias{expand} +\alias{expand,Intervals_virtual-method} + +\alias{contract} +\alias{contract,Intervals_virtual-method} + +\title{Expand or contract intervals} + +\description{ + It is often useful to shrink or grow each interval in a set of + intervals: to smooth over small, uninteresting gaps, or to address + possible imprecision resulting from floating point arithmetic. The + \code{expand} and \code{contract} methods implement this, using either + absolute or relative difference. +} + +\usage{ +\S4method{expand}{Intervals_virtual}(x, delta = 0, type = c("absolute", "relative")) + +\S4method{contract}{Intervals_virtual}(x, delta = 0, type = c("absolute", "relative")) +} + + +\arguments{ + + \item{x}{ An \code{"Intervals"} or \code{"Intervals_full"} object.} + + \item{delta}{ + A non-negative adjustement value. A vector is permitted, + and its entries will be recycled if necessary. + } + + \item{type}{ + Should adjustment be based on relative or absolute difference. When + \code{type == "relative"} intervals are expanded/contracted to + include/exclude points for which a relative difference with respect + to the nominal value is less than or equal to \code{delta}. (See the + note below.) When \code{type == "absolute"}, absolute rather than + relative difference is used, i.e., all intervals are expanded or + contracted by the same amount. + } + +} + +\value{ + A single object of appropriate class, with endpoint positions adjusted + as requested. Expansion returns an object with the same dimension as + \code{x}; contraction may lead to the elimination of now-empty rows. +} + +\note{ + Here, the relative difference between \emph{x} and \emph{y} is + |\emph{x} - \emph{y}|/max(|\emph{x}|, |\emph{y}|). +} + +\examples{ +# Using adjustment to remove small gaps + +x <- Intervals( c(1,10,100,8,50,200), type = "Z" ) +close_intervals( contract( reduce( expand(x, 1) ), 1 ) ) + +# Finding points for which, as a result of possible floating point +# error, intersection may be ambiguous. Whether y1 intersects y2[2,] +# depends on precision. + +delta <- .Machine$double.eps^0.5 +y1 <- Intervals( c( .5, 1 - delta / 2 ) ) +y2 <- Intervals( c( .25, 1, .75, 2 ) ) + +# Nominal + +interval_intersection( y1, y2 ) + +# Inner limit + +inner <- interval_intersection( + contract( y1, delta, "relative" ), + contract( y2, delta, "relative" ) + ) + +# Outer limit + +outer <- interval_intersection( + expand( y1, delta, "relative" ), + expand( y2, delta, "relative" ) + ) + +# The ambiguous set, corresponding to points which may or may not be in +# the intersection -- depending on numerical values for endpoints +# which are, with respect to relative difference, indistinguishable from +# the nominal values. + +interval_difference( outer, inner ) +} \ No newline at end of file diff --git a/man/interval_complement-methods.Rd b/man/interval_complement-methods.Rd new file mode 100644 index 0000000..2cd50f6 --- /dev/null +++ b/man/interval_complement-methods.Rd @@ -0,0 +1,38 @@ +\name{interval_complement} + +\alias{interval_complement} +\alias{interval_complement,Intervals_virtual-method} + +\title{Compute the complement of a set of intervals} + +\description{ + Compute the complement of a set of intervals. +} + +\usage{ +\S4method{interval_complement}{Intervals_virtual}(x, check_valid = TRUE) +} + +\arguments{ + \item{x}{An \code{"Intervals"} or \code{"Intervals_full"} object.} + + \item{check_valid}{ + Should \code{\link{validObject}} be called before passing to + compiled code? Also see \code{\link{interval_overlap}}. + } +} + +\value{ + An object of the same class as \code{x}, compactly representing the + complement of the intervals described in \code{x}. +} + +\note{ + For objects of class \code{"Intervals"}, closure on \code{-Inf} or + \code{Inf} endpoints is set to match that of all the intervals with + finite endpoints. For objects of class \code{"Intervals_full"}, + non-finite endpoints are left open (although in general, this package + does not make a distinction between closed and open infinite + endpoints). +} + diff --git a/man/interval_difference-methods.Rd b/man/interval_difference-methods.Rd new file mode 100644 index 0000000..9c0447f --- /dev/null +++ b/man/interval_difference-methods.Rd @@ -0,0 +1,40 @@ +\name{interval_difference} + +\alias{interval_difference} +\alias{interval_difference,Intervals_virtual,Intervals_virtual-method} + +\title{Compute set difference} + +\description{ + Compute the set difference between two objects. +} + +\usage{ +\S4method{interval_difference}{Intervals_virtual,Intervals_virtual}(x, y, check_valid = TRUE) +} + +\arguments{ + \item{x}{An \code{"Intervals"} or \code{"Intervals_full"} object.} + + \item{y}{ + An \code{"Intervals"} or \code{"Intervals_full"} object, with a + \code{type} slot matching that of \code{x}. + } + + \item{check_valid}{ + Should \code{\link{validObject}} be called on \code{x} and \code{y} + before passing to compiled code? Also see + \code{\link{interval_overlap}}. + } +} + +\value{ + An object representing the subset of the integers or real line, as + determined by \code{type(x)}, found in \code{x} but not in \code{y}. +} + +\seealso{ + These methods are just wrappers for + \code{\link{interval_intersection}} and + \code{\link{interval_complement}}. +} \ No newline at end of file diff --git a/man/interval_included-methods.Rd b/man/interval_included-methods.Rd new file mode 100644 index 0000000..795e536 --- /dev/null +++ b/man/interval_included-methods.Rd @@ -0,0 +1,138 @@ +\name{interval_included} + +\alias{interval_included} +\alias{interval_included,Intervals,Intervals-method} +\alias{interval_included,Intervals_full,Intervals_full-method} + +\title{Assess inclusion of one set of intervals with respect to another} + +\description{ + Determine which intervals in the one set are completely included in + the intervals of a second set. +} + +\usage{ +\S4method{interval_included}{Intervals,Intervals}(from, to, check_valid = TRUE) +\S4method{interval_included}{Intervals_full,Intervals_full}(from, to, check_valid = TRUE) +} + +\arguments{ + + \item{from}{ + An \code{"Intervals"} or \code{"Intervals_full"} object, or a + vector of class \code{"numeric"}. + } + + \item{to}{ + An \code{"Intervals"} or \code{"Intervals_full"} object, or a + vector of class \code{"numeric"}. + } + + \item{check_valid}{ + Should \code{\link{validObject}} be called before passing to + compiled code? This, among other things, verifies that endpoints are + of data type \code{"numeric"} and the \code{closed} vector/matrix is + appropriately sized and of the correct data type. (Compiled code + does no further checking.) + } + +} + +\value{ + A list, with one element for each row/component of \code{from}. The + elements are vectors of indices, indicating which \code{to} rows (or + components, for the \code{"numeric"} method) are completely included + within each interval in \code{from}. A list element of length 0 + indicates no included elements. Note that empty \code{to} elements are + not included in anything, and empty \code{from} elements do not + include anything. +} + +\seealso{ + See \code{\link{interval_overlap}} for partial overlaps -- i.e., at at + least a point. +} + +\examples{ +# Note that 'from' and 'to' contain valid but empty intervals. + +to <- Intervals( + matrix( + c( + 2, 6, + 2, 8, + 2, 9, + 4, 4, + 6, 8 + ), + ncol = 2, byrow = TRUE + ), + closed = c( TRUE, FALSE ), + type = "Z" + ) + +from <- Intervals( + matrix( + c( + 2, 8, + 8, 9, + 6, 9, + 11, 12, + 3, 3 + ), + ncol = 2, byrow = TRUE + ), + closed = c( TRUE, FALSE ), + type = "Z" + ) +rownames(from) <- letters[1:nrow(from)] + +from +to +interval_included(from, to) + +closed(to) <- TRUE +to +interval_included(from, to) + +# Intervals_full + +F <- FALSE +T <- TRUE + +to <- Intervals_full( + rep( c(2,8), c(4,4) ), + closed = matrix( c(F,F,T,T,F,T,F,T), ncol = 2 ), + type = "R" + ) + +type( from ) <- "R" +from <- as( from, "Intervals_full" ) + +from +to +interval_included(from, to) + +# Testing + +B <- 1000 + +x1 <- rexp( B, 1/1000 ) +s1 <- runif( B, max=5 ) +x2 <- rexp( B, 1/1000 ) +s2 <- runif( B, max=3 ) + +from <- Intervals_full( cbind( x1, x1 + s1 ) ) +to <- Intervals_full( cbind( x2, x2 + s2 ) ) + +ii <- interval_included( from, to ) +ii_match <- which( sapply( ii, length ) > 0 ) + +from[ ii_match[1:3], ] +lapply( ii[ ii_match[1:3] ], function(x) to[x,] ) + +included <- to[ unlist( ii ), ] +dim( included ) + +interval_intersection( included, interval_complement( from ) ) +} diff --git a/man/interval_intersection-methods.Rd b/man/interval_intersection-methods.Rd new file mode 100644 index 0000000..4c176d4 --- /dev/null +++ b/man/interval_intersection-methods.Rd @@ -0,0 +1,43 @@ +\name{interval_intersection} + +\alias{interval_intersection} +\alias{interval_intersection,Intervals_virtual-method} +\alias{interval_intersection,missing-method} + +\title{Compute the intersection of one or more sets of intervals} + +\description{ + Given one or more sets of intervals, produce a new set compactly + representing points contained in at least one interval of each input + object. +} + +\usage{ +\S4method{interval_intersection}{Intervals_virtual}(x, ..., check_valid = TRUE) + +\S4method{interval_intersection}{missing}(x, ..., check_valid = TRUE) +} + +\arguments{ + + \item{x}{ An \code{"Intervals"} or \code{"Intervals_full"} object.} + + \item{\dots}{Additional objects of the same classes permitted for \code{x}.} + + \item{check_valid}{ + Should \code{\link{validObject}} be called before passing to + compiled code? Also see \code{\link{interval_overlap}}. + } + +} + +\value{ + A single object representing points contained in each of the objects + supplied in the \code{x} and \code{...} arguments. +} + +\seealso{ + See \code{\link{interval_union}} and + \code{\link{interval_complement}}, which are used to produce the + results. +} \ No newline at end of file diff --git a/man/interval_overlap-methods.Rd b/man/interval_overlap-methods.Rd new file mode 100644 index 0000000..cf053ed --- /dev/null +++ b/man/interval_overlap-methods.Rd @@ -0,0 +1,128 @@ +\name{interval_overlap} + +\alias{interval_overlap} +\alias{interval_overlap,Intervals_virtual_or_numeric,Intervals_virtual_or_numeric-method} +\alias{interval_overlap,missing,ANY-method} +\alias{interval_overlap,ANY,missing-method} + +\title{Assess overlap from one set of intervals to another} + +\description{ + Asses overlap from intervals in one set to intervals in another set, + and return the relevant indices. +} + +\usage{ +\S4method{interval_overlap}{Intervals_virtual_or_numeric,Intervals_virtual_or_numeric}(from, to, check_valid = TRUE) +} + +\arguments{ + + \item{from}{ + An \code{"Intervals"} or \code{"Intervals_full"} object, or a + vector of class \code{"numeric"}. \emph{Note!} Prior to v. 0.11.1, + this argument was called \code{target}. + } + + \item{to}{ + An \code{"Intervals"} or \code{"Intervals_full"} object, or a + vector of class \code{"numeric"}. \emph{Note!} Prior to v. 0.11.1, + this argument was called \code{query}. + } + + \item{check_valid}{ + Should \code{\link{validObject}} be called before passing to + compiled code? This, among other things, verifies that endpoints are + of data type \code{"numeric"} and the \code{closed} vector/matrix is + appropriately sized and of the correct data type. (Compiled code + does no further checking.) + } + +} + +\details{ + Intervals which meet at endpoints overlap only if both endpoints are + closed. Intervals in \code{to} with \code{NA} endpoints are + ignored, with a warning; in \code{from}, such intervals produce no + matches. Intervals in either \code{to} or \code{from} which are + actually empty have their endpoints set to \code{NA} before + proceeding, with warning, and so do not generate matches. If + eith \code{to} or \code{from} is a vector of class \code{"numeric"}, + overlap will be assess for the corresponding set of points. +} + +\value{ + A list, with one element for each row/component of \code{from}. The + elements are vectors of indices, indicating which \code{to} rows (or + components, for the \code{"numeric"} method) overlap each interval in + \code{from}. A list element of length 0 indicates no overlapping + elements. +} + +\note{ + If you want real (\code{type == "R"}) intervals that overlap in a set + of positive measure --- not just at endpoints --- set all endpoints to + open (i.e., \code{close(from) <- FALSE; closed(to) <- FALSE}) first. + + This function is now just a wrapper for \code{\link{which_nearest}}. +} + +\seealso{ + See \code{\link{which_nearest}} for details on nearby as well as + overlapping intervals in \code{to}. +} + +\examples{ +# Note that 'from' contains a valid but empty interval. + +to <- Intervals( + matrix( + c( + 2, 8, + 3, 4, + 5, 10 + ), + ncol = 2, byrow = TRUE + ), + closed = c( TRUE, FALSE ), + type = "Z" + ) + +from <- Intervals( + matrix( + c( + 2, 8, + 8, 9, + 6, 9, + 11, 12, + 3, 3 + ), + ncol = 2, byrow = TRUE + ), + closed = c( TRUE, FALSE ), + type = "Z" + ) +rownames(from) <- letters[1:nrow(from)] + +empty(to) +empty(from) + +interval_overlap(from, to) + +# Non-empty real intevals of size 0 can overlap other intervals. + +u <- to +type(u) <- "R" + +v <- Intervals_full( rep(3,4) ) +closed(v)[2,] <- FALSE +v +empty(v) +size(v) + +interval_overlap(v, u) + +# Working with points + +interval_overlap( from, c( 2, 3, 6, NA ) ) +} diff --git a/man/interval_union-methods.Rd b/man/interval_union-methods.Rd new file mode 100644 index 0000000..0c9d1f9 --- /dev/null +++ b/man/interval_union-methods.Rd @@ -0,0 +1,55 @@ +\name{interval_union} + +\alias{interval_union} +\alias{interval_union,Intervals_virtual-method} +\alias{interval_union,missing-method} + +\title{Compute the union of intervals in one or more interval matrices} + +\description{ + Compute the union of intervals in one or more interval matrices. The + intervals contained in a single interval matrix object need not, in + general, be disjoint; \code{interval_union}, however, always returns a + matrix with sorted, disjoint intervals. +} + +\usage{ +\S4method{interval_union}{Intervals_virtual}(x, ..., check_valid = TRUE) + +\S4method{interval_union}{missing}(x, ..., check_valid = TRUE) +} + +\arguments{ + + \item{x}{ An \code{"Intervals"} or \code{"Intervals_full"} object.} + + \item{\dots}{ + Optionally, additional objects which can be combined with + \code{x}. See \code{\link{c.Intervals}} for details on mixing + different types of objects. + } + + \item{check_valid}{ + Should \code{\link{validObject}} be called before passing to + compiled code? Also see \code{\link{interval_overlap}}. + } + +} + +\details{ + All supplied objects are combined using \code{\link[=c.Intervals]{c}} + and then then passed to \code{\link{reduce}}. The \code{missing} + method is only to permit use of \code{\link{do.call}} with named list, + since no named element will typically match \code{x}. +} + +\value{ + A single object of appropriate class, compactly representing the union + of all intervals in \code{x}, and optionally, in \code{...} as + well. For class \code{"Intervals"}, the result will have the same + \code{closed} values as \code{x}. +} + +\seealso{ + See \code{\link{reduce}}, which is used to produce the results. +} \ No newline at end of file diff --git a/man/intervals-package.Rd b/man/intervals-package.Rd new file mode 100644 index 0000000..daa5761 --- /dev/null +++ b/man/intervals-package.Rd @@ -0,0 +1,69 @@ +\name{intervals-package} + +\alias{intervals-package} +\alias{intervals} + +\docType{package} + +\title{ +Tools for working with points and intervals +} + +\description{ +Tools for working with and comparing sets of points and intervals. +} + +\details{ + + Index: + \describe{ + \item{\code{\link{Intervals-class}}}{Classes \code{"Intervals"} and \code{"Intervals_full"}.} + \item{\code{\link{Intervals_virtual-class}}}{Class \code{"Intervals_virtual"}.} + \item{\code{\link{Intervals_virtual_or_numeric-class}}}{Class union \code{"Intervals_virtual_or_numeric"}.} + \item{\code{\link[=as.matrix.Intervals_virtual]{as.matrix}}}{Coerce endpoints to a matrix.} + \item{\code{\link[=c.Intervals]{c}}}{Concatenate different sets of intervals.} + \item{\code{\link{close_intervals}}}{Re-represent integer intervals with open or closed endpoints.} + \item{\code{\link{closed}}}{Accessor for \code{closed} slot: closure vector/matrix.} + \item{\code{\link{clusters}}}{Identify clusters in a collection of positions or intervals.} + \item{\code{\link{contract}}}{Contract sets.} + \item{\code{\link{distance_to_nearest}}}{Compute distance to nearest position in a set of intervals.} + \item{\code{\link{empty}}}{Identify empty interval rows.} + \item{\code{\link{expand}}}{Expand sets.} + \item{\code{\link{interval_complement}}}{Compute the complement of a set of intervals.} + \item{\code{\link{interval_difference}}}{Compute set difference.} + \item{\code{\link{interval_included}}}{Assess inclusion of one set of intervals with respect to another.} + \item{\code{\link{interval_intersection}}}{Compute the intersection of one or more sets of intervals.} + \item{\code{\link{interval_overlap}}}{Assess which query intervals overlap which targets.} + \item{\code{\link{interval_union}}}{Compute the union of intervals in one or more interval matrices.} + \item{\code{\link{is.na}}}{Identify interval rows with \code{NA} endpoints.} + \item{\code{\link[=plot.Intervals]{plot}}}{S3 plotting methods for intervals objects.} + \item{\code{\link{reduce}}}{Compactly re-represent the points in a set of intervals.} + \item{\code{\link{sgd}}}{Yeast gene model sample data.} + \item{\code{\link{size}}}{Compute interval sizes.} + \item{\code{\link[=split.Intervals_virtual]{split}}}{Split an intervals object according to a factor.} + \item{\code{\link{type}}}{Accessor for \code{type} slot: Z or R.} + \item{\code{\link{which_nearest}}}{Identify nearest member(s) in a set of intervals.} + } + + Further information is available in the following vignettes: + \describe{ + \item{\code{intervals_overview}}{Overview of the intervals package.} + } + +} + +\author{ +Richard Bourgon +} + +\keyword{ package } + +\section{Acknowledgments}{ + Thanks to Julien Gagneur, Simon Anders, and Wolfgang Huber for + numerous helpful suggestions about the package content and code. +} + +\seealso{ + See the \pkg{genomeIntervals} package in Bioconductor, which extends + the functionality of this package. +} diff --git a/man/plot.Intervals.Rd b/man/plot.Intervals.Rd new file mode 100644 index 0000000..73b6c6e --- /dev/null +++ b/man/plot.Intervals.Rd @@ -0,0 +1,152 @@ +\name{plot.Intervals} + +\alias{plot} +\alias{plot.Intervals} +\alias{plot.Intervals_full} +\alias{plot,Intervals,missing-method} +\alias{plot,Intervals_full,missing-method} +\alias{plot,Intervals,ANY-method} +\alias{plot,Intervals_full,ANY-method} + +\title{Plotting methods for interval objects} + +\description{ + S3 methods for plotting \code{"Intervals"} and \code{"Intervals_full"} + objects. +} + +\usage{ +\S3method{plot}{Intervals}(x, y, ...) +\S3method{plot}{Intervals_full}( + x, y = NULL, + axes = TRUE, + xlab = "", ylab = "", + xlim = NULL, ylim = NULL, + col = "black", lwd = 1, + cex = 1, + use_points = TRUE, + use_names = TRUE, + names_cex = 1, + ... + ) + +\S4method{plot}{Intervals,missing}(x, y, ...) +\S4method{plot}{Intervals_full,missing}(x, y, ...) +\S4method{plot}{Intervals,ANY}(x, y, ...) +\S4method{plot}{Intervals_full,ANY}(x, y, ...) +} + +\arguments{ + + \item{x}{An \code{"Intervals"} or \code{"Intervals_full"} object.} + + + \item{y}{ + Optional vector of heights at which to plot intervals. If omitted, + \code{y} will be automatically computed to generate a compact plot + but with no overlap. + } + + + \item{axes}{As for \code{\link{plot.default}}.} + + \item{xlab}{As for \code{\link{plot.default}}.} + + \item{ylab}{As for \code{\link{plot.default}}.} + + \item{xlim}{As for \code{\link{plot.default}}.} + + \item{ylim}{ + If not explicitly supplied, \code{ylim} is set to the maximum value + required for intervals which are visible for the given \code{xlim}. + } + + \item{col}{ + Color used for segments and endpoint points and interiors. Recycled + if necessary. + } + + \item{lwd}{Line width for segments. See \code{\link{par}}.} + + \item{cex}{ + Endpoint magnification. Only relevant if \code{use_points = + TRUE}. See \code{\link{par}}. + } + + \item{use_points}{Should points be plotted at interval endpoints?} + + \item{use_names}{ + Should \code{rownames(x)} by used for segment labels in the plot? + } + + \item{names_cex}{ + Segment label magnification. Only relevant if \code{use_names = + TRUE}. + } + + \item{...}{Other arguments for \code{\link{plot.default}}.} + +} + +\details{ + Intervals with \code{NA} for either endpoint are not + plotted. Vertical placement is on the integers, beginning with 0. +} + +\value{None.} + +\examples{ +# Note plot symbol for empty interval in 'from'. + +from <- Intervals( + matrix( + c( + 2, 8, + 8, 9, + 6, 9, + 11, 12, + 3, 3 + ), + ncol = 2, byrow = TRUE + ), + closed = c( FALSE, TRUE ), + type = "Z" + ) + +rownames(from) <- c("a","b","c","d","e") + +to <- Intervals( + matrix( + c( + 2, 8, + 3, 4, + 5, 10 + ), + ncol = 2, byrow = TRUE + ), + closed = c( FALSE, TRUE ), + type = "Z" + ) + +rownames(to) <- c("x","y","z") + +empty(from) + +plot( + c(from,to), + col = rep(1:2, c(nrow(from), nrow(to))) + ) + +legend("topright", c("from","to"), col=1:2, lwd=1) + +# More intervals. The maximal height shown is adapted to the plotting +# window. + +B <- 10000 +left <- runif( B, 0, 1e5 ) +right <- left + rexp( B, rate = 1/10 ) +x <- Intervals( cbind( left, right ) ) + +plot(x, use_points=FALSE) +plot(x, use_points=FALSE, xlim = c(0, 500)) +} \ No newline at end of file diff --git a/man/reduce-methods.Rd b/man/reduce-methods.Rd new file mode 100644 index 0000000..0ab7566 --- /dev/null +++ b/man/reduce-methods.Rd @@ -0,0 +1,42 @@ +\name{reduce} + +\alias{reduce} +\alias{reduce,Intervals_virtual-method} + +\title{Compactly re-represent the points in a set of intervals} + +\description{ + In general, \code{"\linkS4class{Intervals}"} and + \code{"\linkS4class{Intervals_full}"} objects may be redundant, the + intervals they contain may be in arbitrary order, and they may contain + non-informative intervals for which one or both endpoints are + \code{NA}. The \code{reduce} function re-represents the underlying + subsets of the integers or the real line in the unique, minimal form, + removing intervals with \code{NA} endpoints (with warning). +} + +\usage{ +\S4method{reduce}{Intervals_virtual}( x, check_valid = TRUE ) +} + +\arguments{ + + \item{x}{ An \code{"Intervals"} or \code{"Intervals_full"} object.} + + \item{check_valid}{ + Should \code{\link{validObject}} be called before passing to + compiled code? Also see \code{\link{interval_overlap}}. + } + +} + +\value{ + A single object of appropriate class, compactly representing the + union of all intervals in \code{x}. All intervals in \code{reduce(x)} + have numeric (i.e., not \code{NA}) endpoints. +} + +\seealso{ + See \code{\link{interval_union}}, which is really just concatenates its + arguments and then calls \code{reduce}. +} \ No newline at end of file diff --git a/man/sgd.Rd b/man/sgd.Rd new file mode 100644 index 0000000..9021231 --- /dev/null +++ b/man/sgd.Rd @@ -0,0 +1,91 @@ +\name{sgd} + +\alias{sgd} + +\docType{data} + +\title{Yeast gene model sample data} + +\description{ + This data set contains a data frame describing a subset of + the chromosome feature data represented in Fall 2007 version of + \file{saccharomyces\_cerevisiae.gff}, available for download from the + \emph{Saccharomyces} Genome Database (\url{http://www.yeastgenome.org}). +} + +\usage{data(sgd)} + +\format{ + A data frame with 14080 observations on the following 8 variables. + \describe{ + \item{\code{SGDID}}{SGD feature ID.} + \item{\code{type}}{ + Only four feature types have been retatined: \code{"CDS"}, + \code{"five_prime_UTR_intron"}, \code{"intron"}, and \code{"ORF"}. Note + that \code{"ORF"} correspond to a whole gene while \code{"CDS"}, to an + exon. \emph{S. cerevisae} does not, however, have many + multi-exonic genes. + } + \item{\code{feature_name}}{A character vector} + \item{\code{parent_feature_name}}{ + The \code{feature_name} of the a larger element to which the + current feature belongs. All retained \code{"CDS"} entries, for + example, belong to an \code{"ORF"} entry. + } + \item{\code{chr}}{ + The chromosome on which the feature occurs. + } + \item{\code{start}}{Feature start base.} + \item{\code{stop}}{Feature stop base.} + \item{\code{strand}}{Is the feature on the Watson or Crick strand?} + } +} + +\examples{ + +# An example to compute "promoters", defined to be the 500 bases +# upstream from an ORF annotation, provided these bases don't intersect +# another orf. See documentation for the sgd data set for more details +# on the annotation set. + +use_chr <- "chr01" + +data( sgd ) +sgd <- subset( sgd, chr == use_chr ) + +orf <- Intervals( + subset( sgd, type == "ORF", c( "start", "stop" ) ), + type = "Z" + ) +rownames( orf ) <- subset( sgd, type == "ORF" )$feature_name + +W <- subset( sgd, type == "ORF", "strand" ) == "W" + +promoters_W <- Intervals( + cbind( orf[W,1] - 500, orf[W,1] - 1 ), + type = "Z" + ) + +promoters_W <- interval_intersection( + promoters_W, + interval_complement( orf ) + ) + +# Many Watson-strand genes have another ORF upstream at a distance of +# less than 500 bp + +hist( size( promoters_W ) ) + +# All CDS entries are completely within their corresponding ORF entry. + +cds_W <- Intervals( + subset( sgd, type == "CDS" & strand == "W", c( "start", "stop" ) ), + type = "Z" + ) +rownames( cds_W ) <- NULL + +interval_intersection( cds_W, interval_complement( orf[W,] ) ) + +} + +\keyword{datasets} diff --git a/man/size-methods.Rd b/man/size-methods.Rd new file mode 100644 index 0000000..4476031 --- /dev/null +++ b/man/size-methods.Rd @@ -0,0 +1,73 @@ +\name{size} + +\alias{size} +\alias{size,Intervals-method} +\alias{size,Intervals_full-method} + +\title{Compute interval sizes} + +\description{ + Compute the size, in either Z or R as appropriate, for each interval + in an interval matrix. +} + +\usage{ +\S4method{size}{Intervals}(x, as = type(x)) + +\S4method{size}{Intervals_full}(x, as = type(x)) +} + +\arguments{ + + \item{x}{An \code{"Intervals"} or \code{"Intervals_full"} object.} + + \item{as}{ + Should the intervals be thought of as in Z or R? This is usually + determined automatically from the \code{type} slot, but because + changing type may cause object copying, it is sometimes convenient + to temporarily override this slot without actually resetting it. + } + +} + +\details{ + For type \code{"Z"} objects, counting measure; for type \code{"R"} + objects, Lebesgue measure. For type \code{"Z"} objects, intervals of + form (\emph{a},\emph{a}] and (\emph{a},\emph{a}) are both of length + 0. +} + +\value{ + A numeric vector with length equal to \code{nrow(x)}. +} + +\seealso{ + See \code{\link{empty}} to identify empty intervals. Note that when + \code{type(x) == "R"}, a size of 0 does not imply that an interval is + empty. +} + +\examples{ +z1 <- Intervals( cbind( 1, 1:3 ), type = "Z" ) +z2 <- z1; closed(z2)[1] <- FALSE +z3 <- z1; closed(z3) <- FALSE + +size(z1) +size(z2) +size(z3) + +r1 <- z1; type(r1) <- "R" +r2 <- z2; type(r2) <- "R" +r3 <- z3; type(r3) <- "R" + +size(r1) +size(r2) +size(r3) + +s1 <- Intervals_full( matrix( 1, 3, 2 ), type = "Z" ) +closed(s1)[2,2] <- FALSE +closed(s1)[3,] <- FALSE + +size(s1) +} + diff --git a/man/split.Intervals_virtual.Rd b/man/split.Intervals_virtual.Rd new file mode 100644 index 0000000..d4e2752 --- /dev/null +++ b/man/split.Intervals_virtual.Rd @@ -0,0 +1,37 @@ +\name{split} + +\alias{split} +\alias{split.Intervals_virtual} +\alias{split,Intervals_virtual-method} + +\title{Split an intervals object according to a factor} + +\description{ + S3 and S4 methods for splitting \code{"Intervals"} or + \code{"Intervals_full"} objects. +} + +\usage{ +\S3method{split}{Intervals_virtual}(x, f, drop = FALSE, ...) + +\S4method{split}{Intervals_virtual}(x, f, drop = FALSE, ...) +} + +\arguments{ + + \item{x}{ \code{"Intervals"} or \code{"Intervals_full"} objects. } + + \item{f}{ Passed to \code{\link{split.data.frame}}. } + + \item{drop}{ Passed to \code{\link{split.data.frame}}. } + + \item{...}{ Passed to \code{\link{split.data.frame}}. } + +} + +\value{ A list of objects of the same class as \code{x}, split by the + levels of \code{f}. Until R 2.15, special handling was not + required. Subsequent changes to the \pkg{base} package + \code{\link{split}} function required an explicit method here, but + code already provided by \code{\link{split.data.frame}} was + sufficient. } diff --git a/man/which_nearest-methods.Rd b/man/which_nearest-methods.Rd new file mode 100644 index 0000000..d9271b0 --- /dev/null +++ b/man/which_nearest-methods.Rd @@ -0,0 +1,108 @@ +\name{which_nearest} + +\alias{which_nearest} +\alias{which_nearest,numeric,Intervals_virtual-method} +\alias{which_nearest,Intervals_virtual,Intervals_virtual-method} +\alias{which_nearest,Intervals_virtual,numeric-method} +\alias{which_nearest,numeric,numeric-method} + +\title{Identify nearest member(s) in a set of intervals} + +\description{ + For each point or interval in the \code{from} argument, + identify the nearest member or members (in case of ties) of the + interval set in the \code{to} argument. +} + +\usage{ +\S4method{which_nearest}{numeric,Intervals_virtual}(from, to, check_valid = TRUE) + +\S4method{which_nearest}{Intervals_virtual,numeric}(from, to, check_valid = TRUE) + +\S4method{which_nearest}{Intervals_virtual,Intervals_virtual}(from, to, check_valid = TRUE) + +\S4method{which_nearest}{numeric,numeric}(from, to, check_valid = TRUE) +} + +\arguments{ + + \item{from}{An object of appropriate type.} + + \item{to}{An object of appropriate type.} + + \item{check_valid}{ + Should \code{\link{validObject}} be called before passing to + compiled code? Also see \code{\link{interval_overlap}}. + } + +} + +\value{ + A data frame with three columns: \code{distance_to_nearest}, + \code{which_nearest}, and \code{which_overlap}. The last two are + actually lists, since there may be zero, one, or more + nearest/overlapping intervals in the \code{to} object for any given + interval in \code{from}. + + Empty intervals in \code{to}, or intervals with \code{NA} endpoints, + produce a \code{NA} distance result, and no nearest or overlapping + hits. +} + +\note{ + (v. 0.11.0) The code used for the \code{distance_to_nearest} column + here is completely distinct from that used for the original + \code{\link{distance_to_nearest}} function. For the moment, they will + co-exist for testing purposes, but this function's code will + eventually replace the older code. + + Note that a naive way of implementing \code{which_nearest} would be to + use the simpler, old implementation of \code{distance_to_nearest}, use + \code{expand} to grow all intervals by the correspnoding amount, and + then use \code{interval_overlap} to identify target. This approach, + however, will miss a small fraction of targets due to floating point + issues. +} + +\examples{ +# Point to interval. Empty rows, or those with NA endpoints, do not +# generate hits. Note that distance_to_nearest can be 0 but without +# overlap, depending on endpoint closure. + +to <- Intervals_full( c(-1,0,NA,5,-1,3,10,Inf) ) +closed(to)[1,] <- FALSE +closed(to)[2,2] <- FALSE +from <- c( NA, -3:5 ) + +to +cbind( from, which_nearest( from, to ) ) + +# Completely empty to object + +which_nearest( from, to[1,] ) + +# Interval to interval + +from <- Intervals( c(-Inf,-Inf,3.5,-1,1,4) ) +from +which_nearest( from, to ) + +# Checking behavior with ties + +from <- Intervals_full( c(2,2,4,4,3,3,5,5) ) +closed( from )[2:3,] <- FALSE +to <- Intervals_full( c(0,0,6,6,1,1,7,8) ) +closed( to )[2:3,] <- FALSE + +from +to +which_nearest( from, to ) + +from <- Intervals_full( c(1,3,6,2,4,7) ) +to <- Intervals_full( c(4,4,5,5) ) +closed( to )[1,] <- FALSE + +from +to +which_nearest( from, to ) +} diff --git a/src/Endpoint.cpp b/src/Endpoint.cpp new file mode 100644 index 0000000..a22b1cd --- /dev/null +++ b/src/Endpoint.cpp @@ -0,0 +1,73 @@ +#include "Endpoint.h" + + + + +//////// Ordering for tied endpoints + +/* + We use two different tied endpoint orderings, one for reduce, and a different + one for interval_overlap. These should be set by any code that uses sorting, + so we initialize to -1, and have the sort method check this and throw an error + if it's still found. + + Let Q/T be query/target, L/R be left/right, and O/C be open/closed. Our + ordering, when pos is effectively tied, is then: + + QRO < TRO ... < TLC < QLC < QRC < TRC ... < TLO < QLO + 0 1 2 3 4 5 6 7 + + The basic principals are, for similar closure, start targets before + queries but finish them after queries. For abutting intervals, start new + intervals before finishing old ones, unless one or both endpoints are + open, in which case we should finish old intervals first. +*/ + +int Endpoint::state_array[2][2][2] = {{{0,0},{0,0}},{{0,0},{0,0}}}; + + + + +//////// Endpoint methods + +Endpoint::Endpoint(int i, double p, bool q, bool l, bool c) { + index = i; pos = p; query = q; left = l; closed = c; +} + +void Endpoint::R_print() const { + Rprintf( + "index = %i, pos = %f (%s, %s, %s)\n", + index, pos, + query ? "query" : "target", + left ? "left" : "right", + closed ? "closed" : "open" + ); +} + + + + +//////// Endpoints methods + +Endpoints::Endpoints( const double * pos, const int * closed, int n, bool query, bool is_full ) { + /* + The pos pointer should point to an n x 2 array of endpoints, and the closed + pointer, to either an array of booleans of the same size (if full = true) + or an array of two booleans (if full = false). Note that R uses int, not + bool, for logicals. Intervals with R numeric NA in either slot are + dropped. + */ + int i; + this->reserve( 2 * n ); + for ( i = 0; i < n; i++ ) { + if ( ISNA( pos[i] ) || ISNA( pos[i+n] ) ) continue; + this->push_back( Endpoint( i, pos[i], query, true, (bool) closed[ is_full ? i : 0 ] ) ); + this->push_back( Endpoint( i, pos[i+n], query, false, (bool) closed[ is_full ? i+n : 1 ] ) ); + } +} + +void Endpoints::R_print() const { + Endpoints::const_iterator it; + for ( it = this->begin(); it < this->end(); it++ ) + it->R_print(); +} diff --git a/src/Endpoint.h b/src/Endpoint.h new file mode 100644 index 0000000..57c679b --- /dev/null +++ b/src/Endpoint.h @@ -0,0 +1,69 @@ +#ifndef ENDPOINT_H + +#define ENDPOINT_H +#include +#include +#include + + + + +//////// Endpoint class + +class Endpoint{ + +private: + + static int state_array[2][2][2]; + + inline int state() const { return( state_array[query][left][closed] ); } + +public: + + int index; + double pos; + bool query, left, closed; + + Endpoint(int i, double p, bool q, bool l, bool c); + + inline bool operator< (const Endpoint& other) const { + /* + We assume that the calling code is aware of the difficulty in assessing + equality for floating point numbers and that values are passed in as + exactly equal (in their floating point representation) if and only if + exact equality is intended by the calling code. Given this assumption, + there is no need for a relative difference approach here. + */ + if ( this->pos == other.pos ) + return( this->state() < other.state() ); + else + return( this->pos < other.pos ); + } + + static void set_state_array( const int new_array[2][2][2] ) { + int i, j, k; + for( i = 0; i < 2; i++ ) + for( j = 0; j < 2; j++ ) + for( k = 0; k < 2; k++ ) + Endpoint::state_array[i][j][k] = new_array[i][j][k]; + } + + void R_print() const; + +}; + + + + +//////// Endpoints class + +class Endpoints : public std::vector< Endpoint > { +public: + Endpoints( const double * pos, const int * closed, int n, bool query, bool is_full ); + void R_print() const; +}; + + + + +#endif // #ifndef ENDPOINT_H diff --git a/src/plot_overlap.cpp b/src/plot_overlap.cpp new file mode 100644 index 0000000..7ae66ae --- /dev/null +++ b/src/plot_overlap.cpp @@ -0,0 +1,85 @@ +#include +#include +#include "Endpoint.h" +#include +#include +#include + +/* + What we require to prevent segfaults is the same as for + interval_overlap.cpp. See details there. Everything should be checked by the + calling code in R. + + For plotting without visual overlap, we do not care about endpoint closure, + and we always open new intervals before closing old ones. + + When an interval opens, we assign it the minimal free interior option, if + there is one; otherwise, we assign it the current count of open + intervals. When an interval closes, if it does not have the current maximum y, + its y gets added to the free_interior set. +*/ + + + + +const int reduce_order[2][2][2] = { + {{2,2},{1,1}}, // Target: {{ ), ] }, { (, [ }} + {{0,0},{0,0}} // Query: {{ ), ] }, { (, [ }} +}; + + + + +extern "C" +{ + + SEXP _plot_overlap(SEXP e, SEXP c, SEXP full) { + + // Load data and sort + int n = nrows(e); + bool full_bool = *LOGICAL(full); + Endpoints ep ( REAL(e), LOGICAL(c), n, false, full_bool ); + + // Set sorting order, then sort + Endpoint::set_state_array( reduce_order ); + sort( ep.begin(), ep.end() ); + + // Process + int i; + int active_count = 0; + std::set free_interior; + std::vector y (n); + Endpoints::const_iterator it; + + // Initialize to NA + for ( i = 0; i < n; i++ ) y[i] = R_NaInt; + + for ( it = ep.begin(); it < ep.end(); it++ ) { + if ( it->left ) { + // Opening an interval + if ( free_interior.size() > 0 ) { + y[ it->index ] = *free_interior.begin(); + free_interior.erase( free_interior.begin() ); + } + else y[ it->index ] = active_count; + active_count++; + } + else{ + // Closing an interval + active_count--; + if ( y[ it->index ] < active_count + free_interior.size() ) + free_interior.insert( y[ it->index ] ); + } + } + + // Prepare and return result. + SEXP result; + + PROTECT( result = allocVector( INTSXP, n ) ); + copy( y.begin(), y.end(), INTEGER( result ) ); + UNPROTECT(1); + return( result ); + + } + +} diff --git a/src/reduce.cpp b/src/reduce.cpp new file mode 100644 index 0000000..28c14af --- /dev/null +++ b/src/reduce.cpp @@ -0,0 +1,97 @@ +#include +#include +#include "Endpoint.h" +#include +#include + +/* + What we require to prevent segfaults is the same as for + interval_overlap.cpp. See details there. Everything should be checked by the + calling code in R. +*/ + + + + +const int reduce_order[2][2][2] = { + {{2,4},{3,1}}, // Target: {{ ), ] }, { (, [ }} + {{0,0},{0,0}} // Query: {{ ), ] }, { (, [ }} +}; + + + + +extern "C" +{ + + SEXP _reduce(SEXP e, SEXP c, SEXP full) { + + // Load data and sort + int n = nrows(e); + bool full_bool = *LOGICAL(full); + Endpoints ep ( REAL(e), LOGICAL(c), n, false, full_bool ); + + // Set sorting order, then sort + Endpoint::set_state_array( reduce_order ); + sort( ep.begin(), ep.end() ); + + // Process + int score = 0; + std::vector start, end; + std::vector start_c, end_c; + Endpoints::const_iterator it; + + for ( it = ep.begin(); it < ep.end(); it++ ) { + if ( score == 0 ) { + if ( !it->left ) + error("Internal error: unexpected endpoint type when score = 0."); + start.push_back( it->pos ); + if ( full_bool ) start_c.push_back( (int) it->closed ); + } + score += ( it->left ? +1 : -1 ); + if ( score == 0 ) { + if ( it->left ) + error("Internal error: unexpected endpoint type when score = 0."); + end.push_back( it->pos ); + if ( full_bool ) end_c.push_back( (int) it->closed ); + } + } + + if ( start.size() != end.size() ) + error("Internal error: mismatched start and end endpoint sets."); + + // Prepare and return result. + SEXP result; + + PROTECT( result = allocVector( VECSXP, 2 ) ); + + SET_VECTOR_ELT( result, 0, allocMatrix( REALSXP, start.size(), 2 ) ); + copy( start.begin(), start.end(), REAL( VECTOR_ELT( result, 0 ) ) ); + copy( + end.begin(), end.end(), + REAL( VECTOR_ELT( result, 0 ) ) + start.size() + ); + + if ( full_bool ) { + SET_VECTOR_ELT( result, 1, allocMatrix( LGLSXP, start.size(), 2 ) ); + copy( + start_c.begin(), start_c.end(), + LOGICAL( VECTOR_ELT( result, 1 ) ) + ); + copy( + end_c.begin(), end_c.end(), + LOGICAL( VECTOR_ELT( result, 1 ) ) + start.size() + ); + } + else { + SET_VECTOR_ELT( result, 1, allocVector( LGLSXP, 2 ) ); + LOGICAL( VECTOR_ELT( result, 1 ) )[0] = LOGICAL(c)[0]; + LOGICAL( VECTOR_ELT( result, 1 ) )[1] = LOGICAL(c)[1]; + } + + UNPROTECT(1); + return( result ); + + } + +} diff --git a/src/which_nearest.cpp b/src/which_nearest.cpp new file mode 100644 index 0000000..dab5c41 --- /dev/null +++ b/src/which_nearest.cpp @@ -0,0 +1,215 @@ +#include +#include +#include "Endpoint.h" +#include +#include +#include +#include + +/* + #### What we require to prevent segfaults: + + 1. For Intervals_full objects, the endpoint and closure matrices must be of + the same dimension, and have two columns each. For Intervals objects, we + expect a closure vector of length 2. + + 2. Endpoints must be type double, and closure must be R logical, which ends up + as int in C++. + + The validity function for the classes should verify both of these properties, + so we do no additional checks here, i.e., we assume that we've been passed + valid objects. + + #### To-do + + - Try hash_set instead of set, if it compiles OK. + + #### The "active" and "pending" sets + + - The q_active and t_active sets record indices of intervals which are + currently open as we proceed through the list of points. + + - The q_pending set records the query interval (or intervals, in the case of + ties) which has closed most recently to the left. If multiple target intervals + come by before the next query interval is opened, each will need to be compare + to the right endpoint of the intervals in q_pending. Once we open a new query + interval, q_pending is cleared. + + - The t_pending set records indices of target intervals which have closed + since the last time a query interval opened -- and distances to the left were + therefor checked. Each of these target intervals needs to be checked against + the next query interval to become active, as well as any additional query + intervals that start at the same location. The t_pending set will be cleared + when we get ready to add a new index to it but see that (i) a query interval + has been opened since the last time we tried to add an index, and (ii) that + pos has changed. + + the last closure of a query interval. When we open a new query interval, + each of these target intervals needs to be compared to the new query + interval's left endpoint. Once we do this -- and provided that the next query + interval does not start in the same place -- then t_pending is cleared. + +*/ + +const int overlap_order[2][2][2] = { + {{1,5},{6,2}}, // Target: {{ ), ] }, { (, [ }} + {{0,4},{7,3}} // Query: {{ ), ] }, { (, [ }} +}; + +extern "C" +{ + + SEXP _which_nearest(SEXP qe, SEXP te, SEXP qc, SEXP tc, SEXP q_full, SEXP t_full) { + + // Load data, combine + int qn = nrows(qe); + int tn = nrows(te); + + Endpoints q ( REAL(qe), LOGICAL(qc), qn, true, *LOGICAL(q_full) ); + Endpoints t ( REAL(te), LOGICAL(tc), tn, false, *LOGICAL(t_full) ); + + double* q_right = REAL(qe) + qn; + double* t_right = REAL(te) + tn; + + q.insert( q.end(), t.begin(), t.end() ); + + // Set sorting order, then sort + Endpoint::set_state_array( overlap_order ); + sort(q.begin(), q.end()); + + // Process overlaps + std::set q_active, t_active; + std::vector< std::set > indices ( tn ); + + // For distance_to_nearest and which_nearest + double q_check_pos = std::numeric_limits::infinity(); + std::set q_pending, t_pending; + std::vector delta ( tn ); + std::vector< std::set > which ( tn ); + double diff; + + // For looping + Endpoints::const_iterator it; + std::set::iterator set_it; + int i; + + // Initialize delta + for ( i = 0; i < tn; i++ ) + delta[i] = std::numeric_limits::infinity(); + + for ( it = q.begin(); it < q.end(); it++ ) { + if ( it->query ) { + if ( it->left ) { + // Query left + for( set_it = t_active.begin(); set_it != t_active.end(); set_it++ ) { + indices[ *set_it ].insert( it->index + 1 ); + if ( delta[ *set_it ] > 0 ) which[ *set_it ].clear(); + delta[ *set_it ] = 0; + which[ *set_it ].insert( it->index + 1 ); + } + for( set_it = t_pending.begin(); set_it != t_pending.end(); set_it++ ) { + diff = it->pos - t_right[ *set_it ]; + if ( delta[ *set_it ] == diff ) + which[ *set_it ].insert( it->index + 1 ); + if ( delta[ *set_it ] > diff ) { + which[ *set_it ].clear(); + delta[ *set_it ] = diff; + which[ *set_it ].insert( it->index + 1 ); + } + } + q_active.insert( it->index ); + q_check_pos = it->pos; + q_pending.clear(); + } + else { + // Query right + q_active.erase( it->index ); + if ( q_right[ it->index ] > q_right[ *q_pending.begin() ] ) + q_pending.clear(); + q_pending.insert( it->index ); + } + } + else { + if ( it->left ) { + // Target left + /* + Note that some care is required here. It is possible that there is + another interval at distance 0 to the left, but which, due to + endpoint closure, does not actually overlap the target interval we + are activating. In this case, q_active could be empty but we should + still set delta to 0 for this target interval and add the index of + the query interval immediately to the left to the which + set. Similarly, if there are both overlapping and non-overlapping + distance-zero query intervals, we want to return delta = 0 and the + indices for both types. + */ + if ( q_active.size() > 0 ) { + delta[ it->index ] = 0; + for( set_it = q_active.begin(); set_it != q_active.end(); set_it++ ) { + indices[ it->index ].insert( *set_it + 1 ); + which[ it->index ].insert( *set_it + 1 ); + } + } + for ( set_it = q_pending.begin(); set_it != q_pending.end(); set_it++ ) { + diff = it->pos - q_right[ *set_it ]; + if ( delta[ it->index ] == diff ) + which[ it->index ].insert( *set_it + 1 ); + if ( delta[ it->index ] > diff ) { + which[ it->index ].clear(); + delta[ it->index ] = diff; + which[ it->index ].insert( *set_it + 1 ); + } + } + t_active.insert( it->index ); + } + else { + // Target right + t_active.erase( it->index ); + if ( it->pos > q_check_pos ) { + t_pending.clear(); + q_check_pos = std::numeric_limits::infinity(); + } + t_pending.insert( it->index ); + } + } + } + + // Prepare and return result. + SEXP result; + + PROTECT( result = allocVector( VECSXP, 3 ) ); + + SET_VECTOR_ELT( result, 0, allocVector( REALSXP, tn ) ); // delta + SET_VECTOR_ELT( result, 1, allocVector( VECSXP, tn ) ); // which + SET_VECTOR_ELT( result, 2, allocVector( VECSXP, tn ) ); // which_overlap + + copy( + delta.begin(), delta.end(), + REAL( VECTOR_ELT( result, 0 ) ) + ); + + for( i = 0; i < tn; i++ ) { + SET_VECTOR_ELT( + VECTOR_ELT( result, 1 ), i, + allocVector( INTSXP, which[i].size() ) + ); + copy( + which[i].begin(), which[i].end(), + INTEGER( VECTOR_ELT( VECTOR_ELT( result, 1 ), i ) ) + ); + SET_VECTOR_ELT( + VECTOR_ELT( result, 2 ), i, + allocVector( INTSXP, indices[i].size() ) + ); + copy( + indices[i].begin(), indices[i].end(), + INTEGER( VECTOR_ELT( VECTOR_ELT( result, 2 ), i ) ) + ); + } + + UNPROTECT(1); + return( result ); + + } + +} diff --git a/tests/intervals_test_code.R b/tests/intervals_test_code.R new file mode 100644 index 0000000..ea506c0 --- /dev/null +++ b/tests/intervals_test_code.R @@ -0,0 +1,140 @@ +library( "intervals" ) + +######## NAs and empty intervals + +u <- Intervals_full( as.numeric(NA), type = "Z" ) +u <- c( u, u ) +v <- Intervals_full( c(1,3,1,Inf), type = "Z" ) +x <- Intervals( 1, closed = FALSE, type = "Z" ) # empty +w <- c( x, u, v ) +rownames(w) <- letters[ 1:nrow(w) ] + +x +u +v +w + +is.na(w) +empty(w) + +distance_to_nearest( u, v ) +distance_to_nearest( w, v ) + +pts <- c( -Inf, Inf, NA, NaN, 0:2 ) + +distance_to_nearest( pts, v ) + +identical( + distance_to_nearest( pts, v ), + distance_to_nearest( pts, open_intervals( v ) ) + ) + +interval_overlap( w, v ) + +reduce( w ) + +open_intervals(w) + + + + +######## Subset assignment + +u <- Intervals( 1:8, type = "Z" ) +rownames( u ) <- letters[ 1:nrow(u) ] +v <- Intervals( -4:-1, type = "Z" ) +rownames( v ) <- letters[ nrow(u) + 1:nrow(v) ] +w <- open_intervals(u) + +u +v +w + +# Basic +z <- u; z[2:3,] <- v +z + +# With names +z <- u; z[c("a","d"),] <- v +z + +# Missing row name +result <- try( { z <- u; z[c("a","e"),] <- v }, TRUE ) +result + +# Closure adjustment +z <- w; z[2:3,] <- v +z + +# Size mismatch error +result <- try( { z <- w; z[2:3,] <- v[1,] }, TRUE ) +result + +# Intervals_full method +x <- Intervals_full( 1:6, c(TRUE,FALSE) ) +rownames( x ) <- letters[ 1:nrow(x) ] +y <- Intervals_full( -4:-1 ) + +x +y + +# Missing value names +z <- x; z[2,] <- y[1,] +z + +# Missing x names +z <- y; z[1,] <- x[1,] +z + +# Type mismatch error +result <- try( { z <- x; z[2:3,] <- v }, TRUE ) +result + +# Coercion up +type(v) <- "R" +closed(v) <- c( FALSE, TRUE ) +x +v +z <- x; z[2:3,] <- v +z + +# With warning due to assignment +z <- v; z[1,] <- x[3,] +z + +# No row name copying with matrices +A <- matrix( 0, 2, 2 ) +rownames(A) <- c("1","2") +z <- x; z[1:2,] <- A +z + + + + +######## distance_to_nearest() behavior + +a <- Intervals_full( c(2,5), FALSE ) +b <- Intervals_full( c(1,5,2,10), matrix(c(TRUE,FALSE,FALSE,TRUE),2,2) ) + +a +b + +distance_to_nearest(a,b) + +type(a) <- "Z" +type(b) <- "Z" + +distance_to_nearest(a,b) + +a <- as( a, "Intervals" ) +b <- as( open_intervals( b ), "Intervals" ) + +a +b + +distance_to_nearest(a,b) + +type(a) <- "R" +type(b) <- "R" + +distance_to_nearest(a,b) diff --git a/vignettes/intervals_overview.R b/vignettes/intervals_overview.R new file mode 100644 index 0000000..5c1564c --- /dev/null +++ b/vignettes/intervals_overview.R @@ -0,0 +1,167 @@ +### R code from vignette source 'intervals_overview.Rnw' + +################################################### +### code chunk number 1: width +################################################### +options( width = 80 ) + + +################################################### +### code chunk number 2: Intervals +################################################### +library( intervals ) +x <- Intervals( matrix( 1:6, ncol = 2 ) ) +x +x[2,2] <- NA +x[3,1] <- 6 +x + + +################################################### +### code chunk number 3: Intervals_full +################################################### +y <- as( x, "Intervals_full" ) +y <- c( y, Intervals_full( c(2,3,5,7) ) ) +closed(y)[2:3,1] <- FALSE +closed(y)[4,2] <- FALSE +rownames(y) <- letters[1:5] +y + + +################################################### +### code chunk number 4: size +################################################### +size(x) +empty(x) +empty(y) + + +################################################### +### code chunk number 5: plotting +################################################### +plot( y ) + + +################################################### +### code chunk number 6: set_operations +################################################### +reduce( y ) +interval_intersection( x, x + 2 ) +interval_complement( x ) + + +################################################### +### code chunk number 7: set_operations +################################################### +interval_union( x, interval_complement( x ) ) + + +################################################### +### code chunk number 8: distance +################################################### +B <- 100000 +left <- runif( B, 0, 1e8 ) +right <- left + rexp( B, rate = 1/10 ) +v <- Intervals( cbind( left, right ) ) +head( v ) +mean( size( v ) ) +dim( reduce( v ) ) +system.time( d <- distance_to_nearest( sample( 1e8, B ), v ) ) + + +################################################### +### code chunk number 9: distanceplot +################################################### +hist( d, main = "Distance to nearest interval" ) + + +################################################### +### code chunk number 10: overlap +################################################### +rownames(v) <- sprintf( "%06i", 1:nrow(v) ) +io <- interval_overlap( v, v ) +head( io, n = 3 ) +n <- sapply( io, length ) +sum( n > 1 ) +k <- which.max( n ) +io[ k ] +v[ k, ] +v[ io[[ k ]], ] + + +################################################### +### code chunk number 11: clusters +################################################### +B <- 100 +left <- runif( B, 0, 1e4 ) +right <- left + rexp( B, rate = 1/10 ) +y <- reduce( Intervals( cbind( left, right ) ) ) +w <- 100 +c2 <- clusters( y, w ) +c2[1:3] + + +################################################### +### code chunk number 12: expand +################################################### +delta <- .Machine[[ "double.eps" ]]^0.5 +y1 <- Intervals( c( .5, 1 - delta / 2 ) ) +y2 <- Intervals( c( .25, 1, .75, 2 ) ) +y1 +y2 +all.equal( y1[1,2], y2[2,1] ) +interval_intersection( y1, y2 ) + + +################################################### +### code chunk number 13: expand +################################################### +contract( y1, delta, "relative" ) + + +################################################### +### code chunk number 14: expand +################################################### +inner <- interval_intersection( + contract( y1, delta, "relative" ), + contract( y2, delta, "relative" ) + ) +inner +outer <- interval_intersection( + expand( y1, delta, "relative" ), + expand( y2, delta, "relative" ) + ) +outer + + +################################################### +### code chunk number 15: expand +################################################### +interval_difference( outer, inner ) + + +################################################### +### code chunk number 16: gaps +################################################### +x <- Intervals( c(1,10,100,8,50,200), type = "Z" ) +x +w <- 2 +close_intervals( contract( reduce( expand(x, w/2) ), w/2 ) ) + + +################################################### +### code chunk number 17: integer_range +################################################### +.Machine$integer.max +numeric_max <- with( .Machine, double.base^double.digits ) +options( digits = ceiling( log10( numeric_max ) ) ) +numeric_max + + +################################################### +### code chunk number 18: sessionInfo +################################################### +si <- as.character( toLatex( sessionInfo() ) ) +cat( si[ -grep( "Locale", si ) ], sep = "\n" ) + + diff --git a/vignettes/intervals_overview.Rnw b/vignettes/intervals_overview.Rnw new file mode 100644 index 0000000..34e18b7 --- /dev/null +++ b/vignettes/intervals_overview.Rnw @@ -0,0 +1,453 @@ +@ +\documentclass[a4paper]{article} + +\usepackage{Sweave, amssymb, amsmath} + +\usepackage[ +pdftex, +pdfpagelabels, +plainpages=false, +pdfborder={0 0 0}, +pdfstartview=FitH, +bookmarks=true, +bookmarksnumbered=true, +bookmarksopen=true +] +{hyperref} + +\title{Overview of the \emph{intervals} package} +\author{Richard Bourgon} +\date{06 June 2009} + +% The is for R CMD check, which finds it in spite of the "%", and also for +% automatic creation of links in the HTML documentation for the package: +% \VignetteIndexEntry{Overview of the intervals package.} + + + + +\begin{document} + + + + +%%%%%%%% Setup + +% Don't reform code +\SweaveOpts{keep.source=TRUE, eps=FALSE} + +% Size for figures +\setkeys{Gin}{width=.7\textwidth} + +% Fonts +\DefineVerbatimEnvironment{Sinput}{Verbatim}{xleftmargin=1cm,fontshape=sl,fontsize=\small} +\DefineVerbatimEnvironment{Soutput}{Verbatim}{xleftmargin=1cm,fontsize=\small} + +% Reduce characters per line in R output + +@ +<>= +options( width = 80 ) +@ + +% Make title +\maketitle + +% Typesetting commands + +\newcommand{\R}{\mathbb{R}} +\newcommand{\Z}{\mathbb{Z}} + + + + +%%%%%%%% TOC + +\tableofcontents + +\vspace{.25in} + + +%%%%%%%% Main text + +\section{Introduction} + +The \emph{intervals} packages defines two S4 classes which represent collections +of intervals over either the integers ($\Z$) or the real number line ($\R$). An +instance of either class consists of a two-column matrix of endpoints, plus +additional slots describing endpoint closure and whether the intervals are to be +thought of as being over $\Z$ or $\R$. + +@ +<>= +library( intervals ) +x <- Intervals( matrix( 1:6, ncol = 2 ) ) +x +x[2,2] <- NA +x[3,1] <- 6 +x +@ + +Objects of class \texttt{Intervals} represent collections of intervals with +common endpoint closure, e.g., all left-closed, right-open. More control over +endpoints is permitted with the \texttt{Intervals\_full} class. (Both classes +are derived from \texttt{Intervals\_virtual}, which is not intended for use by +package users.) + +@ +<>= +y <- as( x, "Intervals_full" ) +y <- c( y, Intervals_full( c(2,3,5,7) ) ) +closed(y)[2:3,1] <- FALSE +closed(y)[4,2] <- FALSE +rownames(y) <- letters[1:5] +y +@ + +The \texttt{size} method gives measure --- counting measure over $\Z$ or +Lebesgue measure over $\R$ --- for each interval represented in an object. The +\texttt{empty} method identifies intervals that are in fact empty sets, which +over $\R$ is not the same thing as having size 0. (Valid objects must have each +right endpoint no less than the corresponding left endpoint. When one or both +endpoints are open, however, valid intervals may be empty.) + +@ +<>= +size(x) +empty(x) +empty(y) +@ + +\begin{figure}[!tb] + \centering +@ +<>= +plot( y ) +@ +\caption{The \texttt{Intervals\_full} object \texttt{y}, plotted with +\texttt{plot(y)}. The second row contains an \texttt{NA} endpoint, and is not +shown in the plot. The empty interval is plotted as a hollow point. By default, +vertical placement avoids overlaps but is compact. } +\label{fig:plotting} +\end{figure} + + + + +\section{Interpretation of objects} + +An \texttt{Intervals} or \texttt{Intervals\_full} object can be thought of in +two different modes, each of which is useful in certain contexts: + +\begin{enumerate} + + \item As a (non-unique) representation of a subset of $\Z$ or $\R$. + + \item As a collection of (possibly overlapping) intervals, each of which has a + meaningful identity. + +\end{enumerate} + + + + +\subsection{As a subset of $\Z$ or $\R$} + +The \emph{intervals} package provides a number of basic tools for working in the +first mode, where an object represents a subset of $\Z$ or $\R$ but the rows of +the endpoint matrix do not have any external identity. Basic tools include +\texttt{reduce}, which returns a sorted minimal representation equivalent to the +original (dropping any intervals with \texttt{NA} endpoints), as well as +\texttt{interval\_union}, \texttt{interval\_complement}, and +\texttt{interval\_intersection}. + +@ +<>= +reduce( y ) +interval_intersection( x, x + 2 ) +interval_complement( x ) +@ + +Note that combining \texttt{x} and its complement in order to compute a union +requires mixing endpoint closure types; coercion to \texttt{Intervals\_full} is +automatic. + +@ +<>= +interval_union( x, interval_complement( x ) ) +@ + +The \texttt{distance\_to\_nearest} function treats its \texttt{to} argument in +the first mode, as just a subset of $\Z$ or $\R$; it treats its \texttt{from} +argument, however, in the second mode, returning one distance for every row of +the \texttt{from} object. In the example below, we also look at performance for +large data sets (less than one second on a 2 GHz Intel Core 2 Duo Macintosh, +although the time shown below will likely differ). A histogram of \texttt{d} is +given in Figure~\ref{fig:distance}. + +@ +<>= +B <- 100000 +left <- runif( B, 0, 1e8 ) +right <- left + rexp( B, rate = 1/10 ) +v <- Intervals( cbind( left, right ) ) +head( v ) +mean( size( v ) ) +dim( reduce( v ) ) +system.time( d <- distance_to_nearest( sample( 1e8, B ), v ) ) +@ + +\begin{figure}[!tb] + \centering +@ +<>= +hist( d, main = "Distance to nearest interval" ) +@ + \caption{Histogram of distances from a random set of points to the nearest + point in \texttt{v}. There is also a \texttt{distance\_to\_nearest} method for + comparing two sets of intervals.} + \label{fig:distance} +\end{figure} + + + + +\subsection{As a set of meaningful, possibly overlapping intervals} + +In some applications, each row of an object's endpoint matrix has a meaningful +identity, and particular points from $\Z$ or $\R$ may be found in more than one +row. To support this mode, objects may be given row names, which are propagated +through calculations when appropriate. The \texttt{c} methods simply stack +objects (like \texttt{rbind}), preserving row names and retaining redundancy, if +any. + +The \texttt{interval\_overlap} method works in this mode. In the next example we +use it to identify rows of \texttt{v} which are at least partially redundant, +i.e., which intersect at least one other row of \texttt{v}. All rows overlap +themselves, so we look for rows that overlap at least two rows: + +@ +<>= +rownames(v) <- sprintf( "%06i", 1:nrow(v) ) +io <- interval_overlap( v, v ) +head( io, n = 3 ) +n <- sapply( io, length ) +sum( n > 1 ) +k <- which.max( n ) +io[ k ] +v[ k, ] +v[ io[[ k ]], ] +@ + +The \texttt{which\_nearest} method also respects row identity, for both its +\texttt{to} and \texttt{from} arguments. In addition to computing the distance +from each \texttt{from} interval to the nearest point in \texttt{to}, it also +returns the row index of the \texttt{to} interval (or intervals, in case of +ties) located at the indicated distance. + +Another function which operates in this mode is \texttt{clusters}, which takes a +set of points or intervals and identifies maximal groups which cluster together +--- which are separated from one another by no more than a user-specified +threshold. The following code is taken from the \texttt{clusters} documentation: + +@ +<>= +B <- 100 +left <- runif( B, 0, 1e4 ) +right <- left + rexp( B, rate = 1/10 ) +y <- reduce( Intervals( cbind( left, right ) ) ) +w <- 100 +c2 <- clusters( y, w ) +c2[1:3] +@ + + + + +\section{Floating point and intervals over $\R$} + +When \texttt{type == "R"}, interval endpoints are not truly in $\R$, but rather, +in the subset which can be represented by floating point arithmetic. (For the +moment, this is also true when \texttt{type == "Z"}. See +Section~\ref{sec:representation}.) This limits the endpoint values which can be +represented; more importantly, if computations are performed on interval +endpoints, it means that floating point error can affect whether or not +endpoints coincide, whether intervals which meet at or near endpoints overlap +one another, etc. + +In spite of this potentially serious limitation, it is still often convenient to +work with intervals with non-integer endpoints, including data where adjacent +intervals exactly meet at a non-integer endpoint. To address this, the +\emph{intervals} package takes the following approach: + +\begin{itemize} + + \item Floating point representations of interval endpoints are assumed to be + \emph{exactly equal} (in the sense of \texttt{==} in R or C++) if and only + if the user intends the real values corresponding to these representations + to be exactly equal. + + \item For cases where floating point error and approximate equality are a + concern, tools are provided to permit distinguishing between ambiguous and + unambiguous intersection, union, etc. + +\end{itemize} + +In the next example, \texttt{y1} does not literally overlap \texttt{y2[2,]}, +although R's \texttt{all.equal} function asserts that the gap between them is +smaller than the default tolerance for equivalence up to floating point +precision. + +@ +<>= +delta <- .Machine[[ "double.eps" ]]^0.5 +y1 <- Intervals( c( .5, 1 - delta / 2 ) ) +y2 <- Intervals( c( .25, 1, .75, 2 ) ) +y1 +y2 +all.equal( y1[1,2], y2[2,1] ) +interval_intersection( y1, y2 ) +@ + +The \texttt{expand} and \texttt{contract} methods, used with \texttt{type = +"relative"}, permit consideration of the maximal and minimal interval sets which +are consistent with the nominal endpoints --- from the point of view of endpoint +relative difference. The \texttt{contract} method, for example, contracts each +interval in a collection so that the relative difference between original and +contracted endpoints is equal to tolerance \texttt{delta}. Thus, if a relative +difference less than or equal to \texttt{delta} is our criterion for approximate +floating point equality, the contracted object has endpoints which are +approximately equal to those of the original --- even though the contracted object +is a proper subset of the original. The \texttt{expand} method is similar, but +generates a proper superset. + +@ +<>= +contract( y1, delta, "relative" ) +@ + +We compute two separate intersections which bound the nominal intersection: + +@ +<>= +inner <- interval_intersection( + contract( y1, delta, "relative" ), + contract( y2, delta, "relative" ) + ) +inner +outer <- interval_intersection( + expand( y1, delta, "relative" ), + expand( y2, delta, "relative" ) + ) +outer +@ + +Finally, we identify points which may or may not be in the intersection, +depending on whether we make a conservative, literal, or anti-conservative +interpretation of the nominal endpoints. + +@ +<>= +interval_difference( outer, inner ) +@ + +The \texttt{expand} and \texttt{contract} methods have other uses as +well. Here, we eliminate gaps of size 2 or smaller: + +@ +<>= +x <- Intervals( c(1,10,100,8,50,200), type = "Z" ) +x +w <- 2 +close_intervals( contract( reduce( expand(x, w/2) ), w/2 ) ) +@ + + + + +\section{Notes on implementation} + +\subsection{Endpoint representation} +\label{sec:representation} + +For the moment, interval endpoints are always stored using R's \emph{numeric} +data type. Although this is wasteful from an memory and speed point of view, +we do it for two reasons. First, use of R's \texttt{Inf} and \texttt{-Inf} --- +not possible with the \emph{integer} type --- is very convenient when +computing complements. Second, the range of integers which can be represented +using the \emph{numeric} data type is considerably greater: + +@ +<>= +.Machine$integer.max +numeric_max <- with( .Machine, double.base^double.digits ) +options( digits = ceiling( log10( numeric_max ) ) ) +numeric_max +@ + + + + +\subsection{Efficiency} + +All computations are accomplished by treating intervals as pairs of tagged +endpoints, sorting these endpoints (along with their tags), and then making a +single pass through the results. Computational complexity for set operations is +therefore $O(n \log n)$, where input object $i$ contains $n_i$ rows and $n = +\sum_i n_i$. The same sorting approach is also used for +\texttt{interval\_overlap}, although if every interval in a query object of $m$ +rows overlaps every intervals in a target object of $n$ rows, generating output +alone must of necessity be $O(mn)$. + +Sorted endpoint vectors are not retained in memory. If one wishes to query a +particular object over and over, repeated sorting would be inefficient; in +practice so far, however, such repeated querying has not been needed. + + + + +\subsection{Checking validity} + +The code behind \texttt{which\_nearest} and \texttt{reduce} (key methods in +the \emph{intervals} package, which may be directly called by the user and are +also used internally in numerous locations) is written in C++ for +efficiency. The compiled code makes a number of assumptions about the +\texttt{SEXP} objects passed in as arguments, but does not explicitly check +these assumptions. Nonetheless, when the R wrappers for the compiled code are +applied to \emph{valid} objects from the \texttt{Intervals} or +\texttt{Intervals\_full} classes, all assumptions will always be met. This +design decision was taken so that the requirements for individual objects and +their contents could be gathered together in a single, natural location: the +classes' \texttt{validity} functions. + +The \emph{intervals} package provides replacement methods --- e.g., +\texttt{type} and \texttt{closed} --- which implement error checking and +preserve object validity. R's implementation of S4 classes, however, leaves +object data slots exposed to the user. As a consequence, a user can directly +manipulate the data slots of a valid \texttt{Intervals} or +\texttt{Intervals\_full} object in a way that invalidates the object, but does +not generate any warning or error. + +To prevent invalid objects from being passed to compiled code --- and +potentially generating segmentation faults or other problems --- all wrapper +code in this package includes a \texttt{check\_valid} argument. This argument is +set to \texttt{TRUE} by default, so that \texttt{validObject} is called on +relevant objects before handing them off to the compiled code. For efficiency, +users may choose to override this extra check if they are certain they have not +manually assigned inappropriate content to objects' data slots. + + + + +\section{Session information} + +@ +<>= +si <- as.character( toLatex( sessionInfo() ) ) +cat( si[ -grep( "Locale", si ) ], sep = "\n" ) +@ + + + + +\end{document} diff --git a/vignettes/intervals_overview.pdf b/vignettes/intervals_overview.pdf new file mode 100644 index 0000000000000000000000000000000000000000..e888056a5dcb3143ae916730f308e0bd16190a8b GIT binary patch literal 131707 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 literal 0 HcmV?d00001