reorganize folder
[aggexp.git] / pkg / R / m_ExponentialWeights.R
1 #' @include b_LinearAlgorithm.R
2
3 #' @title Exponential Weights Algorithm
4 #'
5 #' @description Exponential Weights Algorithm.
6 #' Inherits \code{\link{LinearAlgorithm}}
7 #'
8 #' @field alpha Importance of weights redistribution, in [0,1]. Default: 0
9 #' @field grad Whether to use or not the (sub)gradient trick. Default: FALSE
10 #'
11 ExponentialWeights = setRefClass(
12 Class = "ExponentialWeights",
13
14 fields = c(
15 alpha = "numeric",
16 grad = "logical"
17 ),
18
19 contains = "LinearAlgorithm",
20
21 methods = list(
22 initialize = function(...)
23 {
24 callSuper(...)
25 if (length(alpha) == 0 || alpha < 0. || alpha > 1.)
26 alpha <<- 0. #no redistribution
27 if (length(grad) == 0)
28 grad <<- FALSE
29 },
30 predict_noNA = function(XY, x)
31 {
32 K = ncol(XY) - 1
33 if (K == 1)
34 {
35 #shortcut: nothing to combine
36 finalWeight = 1.
37 }
38
39 else
40 {
41 X = XY[,names(XY) != "Measure"]
42 Y = XY[,"Measure"]
43 finalWeight = .C("ew_predict_noNA", X = as.double(t(X)), Y = as.double(Y), n = as.integer(nrow(XY)),
44 K = as.integer(K), alpha=as.double(alpha), grad = as.integer(grad), weight=double(K))$weight
45 }
46
47 appendWeight(finalWeight)
48 return (matricize(x) %*% finalWeight)
49 # M = matricize(x)
50 # M[M<=30] = -1
51 # M[M>30] = 1
52 # return (30 + M%*%finalWeight)
53 }
54 )
55 )