@@ -20,21 +20,20 @@ FixedIntervalCover <- R6::R6Class("FixedIntervalCover",
20
20
)
21
21
22
22
# ' @export
23
- FixedIntervalCover $ set(" public" , " initialize" , function (filter_values , ... ){
24
- super $ initialize(filter_values , typename = " Fixed Interval" )
23
+ FixedIntervalCover $ set(" public" , " initialize" , function (... ){
24
+ super $ initialize(typename = " Fixed Interval" )
25
25
params <- list (... )
26
26
if (" number_intervals" %in% names(params )){ self $ number_intervals <- params [[" number_intervals" ]] }
27
27
if (" percent_overlap" %in% names(params )){ self $ percent_overlap <- params [[" percent_overlap" ]] }
28
28
})
29
29
30
30
# # Set overlap/gain threshold
31
+ # # percent_overlap ----
31
32
FixedIntervalCover $ set(" active" , " percent_overlap" ,
32
33
function (value ){
33
34
if (missing(value )){ private $ .percent_overlap }
34
35
else {
35
36
if (any(value < 0 ) || any(value > = 100 )){ stop(" The percent overlap must be a percentage between [0, 100)." ) }
36
- if (length(value ) != private $ .filter_dim && length(value ) != 1 ){ stop(" The percent overlap must be a single scalar or a vector of scalars with length equal to the dimensionality of the filter space." ) }
37
- if (length(value ) == 1 && private $ .filter_dim > 1 ){ value <- rep(value , private $ .filter_dim ) } # # create a vector
38
37
private $ .percent_overlap <- value
39
38
self
40
39
}
@@ -44,19 +43,36 @@ FixedIntervalCover$set("active", "percent_overlap",
44
43
# # Active binding to set the number of intervals to distribute along each dimension.
45
44
# # By default, if a scalar is given and the filter dimensionality is > 1, the scalar is
46
45
# # repeated along each dimension.
46
+ # # number_intervals ----
47
47
FixedIntervalCover $ set(" active" , " number_intervals" ,
48
48
function (value ){
49
49
if (missing(value )){ private $ .number_intervals }
50
50
else {
51
- if (length(value ) == 1 && private $ .filter_dim > 1 ){ value <- rep(value , private $ .filter_dim ) } # # create a vector
52
51
stopifnot(all(value > 0 ))
53
- stopifnot(length(value ) == private $ .filter_dim )
54
52
private $ .number_intervals <- value
55
53
self
56
54
}
57
55
}
58
56
)
59
57
58
+ # # Validates the parameter settings
59
+ # # validate ----
60
+ FixedIntervalCover $ set(" public" , " validate" , function (filter ){
61
+ stopifnot(! is.na(private $ .percent_overlap ))
62
+ stopifnot(! is.na(private $ .number_intervals ))
63
+ stopifnot(all(self $ number_intervals > 0 ))
64
+ stopifnot(all(self $ percent_overlap > = 0 ), all(self $ percent_overlap < 100 ))
65
+ fv <- filter()
66
+ f_dim <- ncol(fv )
67
+ if (length(self $ number_intervals ) == 1 && f_dim > 1 ){
68
+ self $ number_intervals <- rep(self $ number_intervals [1 ], f_dim )
69
+ }
70
+ if (length(self $ percent_overlap ) == 1 && f_dim > 1 ){
71
+ self $ percent_overlap <- rep(self $ percent_overlap [1 ], f_dim )
72
+ }
73
+ })
74
+
75
+ # # format ----
60
76
FixedIntervalCover $ set(" public" , " format" , function (... ){
61
77
# type_pretty <- paste0(toupper(substr(self$typename, start = 1, stop = 1)), tolower(substr(self$typename, start = 2, stop = nchar(self$typename))))
62
78
sprintf(" Cover: (typename = %s, number intervals = [%s], percent overlap = [%s]%%)" ,
@@ -66,12 +82,13 @@ FixedIntervalCover$set("public", "format", function(...){
66
82
})
67
83
68
84
# # This function is specific to the interval-type covers
69
- FixedIntervalCover $ set( " public " , " interval_bounds" , function ( index = NULL ){
70
- stopifnot( ! is.na( private $ .percent_overlap ))
71
- stopifnot( ! is.na( private $ .number_intervals ) )
72
-
85
+ # # interval_bounds ----
86
+ FixedIntervalCover $ set( " public " , " interval_bounds " , function ( filter , index = NULL ){
87
+ self $ validate( filter )
88
+
73
89
# # Get filter min and max ranges
74
- filter_rng <- apply(self $ filter_values , 2 , range )
90
+ fv <- filter()
91
+ filter_rng <- apply(fv , 2 , range )
75
92
{ filter_min <- filter_rng [1 ,]; filter_max <- filter_rng [2 ,] }
76
93
filter_len <- diff(filter_rng )
77
94
@@ -98,15 +115,20 @@ FixedIntervalCover$set("public", "interval_bounds", function(index=NULL){
98
115
})
99
116
100
117
# # Setup a valid index set (via cartesian product)
118
+ # # construct_index_set ----
101
119
FixedIntervalCover $ set(" public" , " construct_index_set" , function (... ){
102
120
cart_prod <- arrayInd(seq(prod(self $ number_intervals )), .dim = self $ number_intervals )
103
121
self $ index_set <- apply(cart_prod , 1 , function (x ){ sprintf(" (%s)" , paste0(x , collapse = " " )) })
104
122
})
105
123
106
124
# # Given the current set of parameter values, construct the level sets whose union covers the filter space
107
- FixedIntervalCover $ set(" public" , " construct_cover" , function (index = NULL ){
108
- stopifnot(! is.na(private $ .percent_overlap ))
109
- stopifnot(! is.na(private $ .number_intervals ))
125
+ # # construct_cover ----
126
+ FixedIntervalCover $ set(" public" , " construct_cover" , function (filter , index = NULL ){
127
+ self $ validate(filter )
128
+
129
+ # # Get filter values
130
+ fv <- filter()
131
+ f_dim <- ncol(fv )
110
132
111
133
# # If the index set hasn't been made yet, construct it.
112
134
if (any(is.na(self $ index_set ))){ self $ construct_index_set() }
@@ -115,34 +137,36 @@ FixedIntervalCover$set("public", "construct_cover", function(index=NULL){
115
137
# # If no index specified, return the level sets either by construction
116
138
if (missing(index ) || is.null(index )){
117
139
stopifnot(! index %in% self $ index_set )
118
- set_bnds <- self $ interval_bounds()
119
- self $ level_sets <- constructIsoAlignedLevelSets(self $ filter_values , as.matrix(set_bnds ))
140
+ set_bnds <- self $ interval_bounds(filter )
141
+ self $ level_sets <- constructIsoAlignedLevelSets(fv , as.matrix(set_bnds ))
120
142
return (invisible (self )) # # return invisibly
121
143
} else {
122
144
if (! is.na(self $ level_sets ) && index %in% names(self $ level_sets )){
123
145
return (self $ level_sets [[index ]])
124
146
} else {
125
147
p_idx <- which(index == self $ index_set )
126
- set_bnds <- self $ interval_bounds(index )
127
- level_set <- constructIsoAlignedLevelSets(self $ filter_values , set_bnds )
148
+ set_bnds <- self $ interval_bounds(filter , index )
149
+ level_set <- constructIsoAlignedLevelSets(fv , set_bnds )
128
150
return (level_set )
129
151
}
130
152
}
131
153
})
132
154
133
155
# # Constructs a 'neighborhood', which is an (n x k+1) subset of pullback ids representing
134
156
# # the set of n unique (k+1)-fold intersections are required to construct the nerve.
135
- FixedIntervalCover $ set(" public" , " neighborhood" , function (k ){
157
+ # # neighborhood ----
158
+ FixedIntervalCover $ set(" public" , " neighborhood" , function (filter , k ){
136
159
stopifnot(! is.na(private $ .index_set ))
160
+ fv <- filter()
137
161
if (k == 1 ){
138
162
all_pairs <- t(combn(1L : length(private $ .index_set ), 2 ))
139
163
multi_index <- arrayInd(seq(prod(self $ number_intervals )), .dim = self $ number_intervals )
140
164
141
165
# # Get filter min and max ranges
142
- filter_rng <- apply(self $ filter_values , 2 , range )
166
+ filter_rng <- apply(fv , 2 , range )
143
167
{ filter_min <- filter_rng [1 ,]; filter_max <- filter_rng [2 ,] }
144
168
filter_len <- diff(filter_rng )
145
- d_rng <- 1 : ncol(self $ filter_values )
169
+ d_rng <- 1 : ncol(fv )
146
170
147
171
# # Compute the critical distances that determine which pairwise combinations to compare
148
172
base_interval_length <- filter_len / self $ number_intervals
@@ -169,9 +193,10 @@ FixedIntervalCover$set("public", "neighborhood", function(k){
169
193
})
170
194
171
195
# # Converts percent overlap to interval length for a fixed number of intervals
172
- FixedIntervalCover $ set(" public" , " overlap_to_interval_len" , function (percent_overlap ){
196
+ FixedIntervalCover $ set(" public" , " overlap_to_interval_len" , function (filter , percent_overlap ){
173
197
stopifnot(all(is.numeric(self $ number_intervals )))
174
- filter_rng <- apply(self $ filter_values , 2 , range )
198
+ fv <- filter()
199
+ filter_rng <- apply(fv , 2 , range )
175
200
{ filter_min <- filter_rng [1 ,]; filter_max <- filter_rng [2 ,] }
176
201
filter_len <- diff(filter_rng )
177
202
base_interval_length <- filter_len / self $ number_intervals
@@ -180,9 +205,10 @@ FixedIntervalCover$set("public", "overlap_to_interval_len", function(percent_ove
180
205
})
181
206
182
207
# # Converts interval length to percent overlap for a fixed number of intervals
183
- FixedIntervalCover $ set(" public" , " interval_len_to_percent_overlap" , function (interval_len ){
208
+ FixedIntervalCover $ set(" public" , " interval_len_to_percent_overlap" , function (filter , interval_len ){
184
209
stopifnot(all(is.numeric(self $ number_intervals )))
185
- filter_rng <- apply(self $ filter_values , 2 , range )
210
+ fv <- filter()
211
+ filter_rng <- apply(fv , 2 , range )
186
212
{ filter_min <- filter_rng [1 ,]; filter_max <- filter_rng [2 ,] }
187
213
filter_len <- diff(filter_rng )
188
214
base_interval_length <- filter_len / self $ number_intervals
0 commit comments