annotate nmr_preprocessing/Int_Funct.R @ 2:7304ec2c9ab7 draft

Uploaded
author marie-tremblay-metatoul
date Mon, 30 Jul 2018 10:33:03 -0400
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
1 beginTreatment <- function(name, Signal_data = NULL, Signal_info = NULL,
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
2 force.real = FALSE) {
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
3
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
4 cat("Begin", name, "\n")
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
5
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
6
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
7 # Formatting the Signal_data and Signal_info -----------------------
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
8
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
9 vec <- is.vector(Signal_data)
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
10 if (vec) {
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
11 Signal_data <- vec2mat(Signal_data)
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
12 }
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
13 if (is.vector(Signal_info)) {
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
14 Signal_info <- vec2mat(Signal_info)
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
15 }
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
16 if (!is.null(Signal_data)) {
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
17 if (!is.matrix(Signal_data)) {
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
18 stop("Signal_data is not a matrix.")
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
19 }
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
20 if (!is.complex(Signal_data) && !is.numeric(Signal_data)) {
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
21 stop("Signal_data contains non-numerical values.")
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
22 }
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
23 }
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
24 if (!is.null(Signal_info) && !is.matrix(Signal_info)) {
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
25 stop("Signal_info is not a matrix.")
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
26 }
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
27
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
28
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
29 Original_data <- Signal_data
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
30
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
31 # Extract the real part of the spectrum ---------------------------
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
32
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
33 if (force.real) {
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
34 if (is.complex(Signal_data)) {
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
35 Signal_data <- Re(Signal_data)
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
36 } else {
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
37 # The signal is numeric Im(Signal_data) is zero anyway so let's avoid
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
38 # using complex(real=...,imaginary=0) which would give a complex signal
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
39 # in endTreatment()
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
40 force.real <- FALSE
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
41 }
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
42 }
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
43
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
44
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
45 # Return the formatted data and metadata entries --------------------
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
46
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
47 return(list(start = proc.time(), vec = vec, force.real = force.real,
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
48 Original_data = Original_data, Signal_data = Signal_data, Signal_info = Signal_info))
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
49 }
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
50
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
51 binarySearch <- function(a, target, lower = TRUE) {
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
52 # search the index i in a such that a[i] == target
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
53 # if it doesn't exists and lower, it searches the closer a[i] such that a[i] < target
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
54 # if !lower, it seraches the closer a[i] such that a[i] > target
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
55 # a should be monotone but can be increasing or decreasing
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
56
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
57 # if a is increasing INVARIANT: a[amin] < target < a[amax]
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
58 N <- length(a)
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
59 if ((a[N] - target) * (a[N] - a[1]) <= 0) {
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
60 return(N)
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
61 }
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
62 if ((a[1] - target) * (a[N] - a[1]) >= 0) {
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
63 return(1)
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
64 }
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
65 amin <- 1
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
66 amax <- N
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
67 while (amin + 1 < amax) {
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
68 amid <- floor((amin + amax)/2)
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
69 if ((a[amid] - target) * (a[amax] - a[amid]) < 0) {
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
70 amin <- amid
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
71 } else if ((a[amid] - target) * (a[amax] - a[amid]) > 0) {
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
72 amax <- amid
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
73 } else {
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
74 # a[amid] == a[amax] or a[amid] == target In both cases, a[amid] ==
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
75 # target
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
76 return(amid)
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
77 }
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
78 }
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
79 if (xor(lower, a[amin] > a[amax])) {
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
80 # (lower && a[amin] < a[amax]) || (!lower && a[min] > a[max])
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
81 # If increasing and we want the lower, we take amin
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
82 # If decreasing and we want the bigger, we take amin too
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
83 return(amin)
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
84 } else {
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
85 return(amax)
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
86 }
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
87 }
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
88
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
89 checkArg <- function(arg, checks, can.be.null=FALSE) {
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
90 check.list <- list(bool=c(is.logical, "a boolean"),
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
91 int =c(function(x){x%%1==0}, "an integer"),
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
92 num =c(is.numeric, "a numeric"),
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
93 str =c(is.character, "a string"),
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
94 pos =c(function(x){x>0}, "positive"),
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
95 pos0=c(function(x){x>=0}, "positive or zero"),
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
96 l1 =c(function(x){length(x)==1}, "of length 1")
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
97 )
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
98 if (is.null(arg)) {
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
99 if (!can.be.null) {
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
100 stop(deparse(substitute(arg)), " is null.")
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
101 }
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
102 } else {
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
103 if (is.matrix(arg)) {
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
104 stop(deparse(substitute(arg)), " is not scalar.")
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
105 }
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
106 for (c in checks) {
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
107 if (!check.list[[c]][[1]](arg)) {
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
108 stop(deparse(substitute(arg)), " is not ", check.list[[c]][[2]], ".")
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
109 }
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
110 }
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
111 }
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
112 }
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
113
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
114 endTreatment <- function(name, begin_info, Signal_data) {
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
115
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
116 # begin_info: object outputted from beginTreatment
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
117
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
118
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
119 # Formatting the entries and printing process time -----------------------
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
120 end_time <- proc.time() # record it as soon as possible
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
121 start_time <- begin_info[["start"]]
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
122 delta_time <- end_time - start_time
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
123 delta <- delta_time[]
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
124 cat("End", name, "\n")
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
125 cat("It lasted", round(delta["user.self"], 3), "s user time,", round(delta["sys.self"],3),
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
126 "s system time and", round(delta["elapsed"], 3), "s elapsed time.\n")
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
127
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
128
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
129 if (begin_info[["force.real"]]) {
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
130 # The imaginary part is left untouched
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
131 i <- complex(real = 0, imaginary = 1)
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
132 Signal_data <- Signal_data + i * Im(begin_info[["Original_data"]])
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
133 }
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
134
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
135 if (begin_info[["vec"]]) {
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
136 Signal_data <- Signal_data[1, ]
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
137 }
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
138
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
139 # Return the formatted data and metadata entries --------------------
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
140 return(Signal_data)
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
141 }
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
142
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
143 Interpol <- function(t, y) {
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
144 # y: sample
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
145 # t : warping function
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
146
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
147 m <- length(y)
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
148 # t <= m-1
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
149 # because if t > m-1, y[ti+1] will be NA when we compute g
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
150 valid <- 1 <= t & t <= m-1 # FIXME it was '<' in Bubble v2
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
151 s <- (1:m)[valid]
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
152 ti <- floor(t[s])
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
153 tr <- t[s] - ti
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
154 g <- y[ti + 1] - y[ti]
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
155 f <- y[ti] + tr * g
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
156 list(f=f, s=s, g=g)
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
157 }
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
158
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
159 vec2mat <- function(vec) {
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
160
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
161 return(matrix(vec, nrow = 1, dimnames = list(c(1), names(vec))))
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
162
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
163 }
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
164
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
165 getArg <- function(arg, info, argname, can.be.absent=FALSE) {
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
166 if (is.null(arg)) {
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
167 start <- paste("impossible to get argument", argname, "it was not given directly and");
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
168 if (!is.matrix(info)) {
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
169 stop(paste(start, "the info matrix was not given"))
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
170 }
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
171 if (!(argname %in% colnames(info))) {
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
172 if (can.be.absent) {
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
173 return(NULL)
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
174 } else {
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
175 stop(paste(start, "is not in the info matrix"))
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
176 }
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
177 }
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
178 if (nrow(info) < 1) {
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
179 stop(paste(start, "the info matrix has no row"))
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
180 }
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
181 arg <- info[1,argname]
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
182 if (is.na(arg)) {
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
183 stop(paste(start, "it is NA in the info matrix"))
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
184 }
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
185 }
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
186 return(arg)
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
187 }
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
188
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
189 binarySearch <- function(a, target, lower = TRUE) {
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
190 # search the index i in a such that a[i] == target
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
191 # if it doesn't exists and lower, it searches the closer a[i] such that a[i] < target
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
192 # if !lower, it seraches the closer a[i] such that a[i] > target
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
193 # a should be monotone but can be increasing or decreasing
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
194
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
195 # if a is increasing INVARIANT: a[amin] < target < a[amax]
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
196 N <- length(a)
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
197 if ((a[N] - target) * (a[N] - a[1]) <= 0) {
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
198 return(N)
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
199 }
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
200 if ((a[1] - target) * (a[N] - a[1]) >= 0) {
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
201 return(1)
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
202 }
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
203 amin <- 1
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
204 amax <- N
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
205 while (amin + 1 < amax) {
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
206 amid <- floor((amin + amax)/2)
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
207 if ((a[amid] - target) * (a[amax] - a[amid]) < 0) {
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
208 amin <- amid
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
209 } else if ((a[amid] - target) * (a[amax] - a[amid]) > 0) {
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
210 amax <- amid
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
211 } else {
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
212 # a[amid] == a[amax] or a[amid] == target In both cases, a[amid] ==
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
213 # target
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
214 return(amid)
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
215 }
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
216 }
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
217 if (xor(lower, a[amin] > a[amax])) {
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
218 # (lower && a[amin] < a[amax]) || (!lower && a[min] > a[max])
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
219 # If increasing and we want the lower, we take amin
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
220 # If decreasing and we want the bigger, we take amin too
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
221 return(amin)
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
222 } else {
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
223 return(amax)
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
224 }
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
225 }
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
226
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
227 # returns the discrete borders of the interval for a numeric vector a
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
228
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
229 indexInterval <- function (a, from, to, inclusive=TRUE) {
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
230 # If inclusive and from <= to, we need to take the lower
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
231 # If not inclusive and from > to, we need to take the lower too
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
232 lowerFrom <- xor(inclusive, from > to)
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
233 fromIndex <- binarySearch(a, from, lowerFrom)
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
234 toIndex <- binarySearch(a, to, !lowerFrom)
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
235 return(fromIndex:toIndex)
7304ec2c9ab7 Uploaded
marie-tremblay-metatoul
parents:
diff changeset
236 }