@@ -38,17 +38,20 @@ function fgh!(glr::GLR{RobustLoss{ρ},<:L2R}, X, y) where ρ <: RobustRho1P{δ}
38
38
ϕ_ = ϕ (ρ)
39
39
if glr. fit_intercept
40
40
(f, g, H, θ) -> begin
41
- r = _get_residuals (X, θ, y)
42
- w = _get_w (r, δ)
41
+ r = SCRATCH_N[]
42
+ get_residuals! (r, X, θ, y)
43
+ w = SCRATCH_N2[]
44
+ w .= convert .(Float64, abs .(r) .<= δ)
43
45
# gradient via ψ function
44
46
g === nothing || begin
45
- ψr = _get_ψr (r, w, ψ_)
47
+ ψr = SCRATCH_N3[]
48
+ ψr .= ψ_ .(r, w)
46
49
apply_Xt! (g, X, ψr)
47
50
g .+ = λ .* θ
48
51
end
49
52
# Hessian via ϕ functiono
50
53
H === nothing || begin
51
- # Hessian allocates a ton anyway so use of scratch is a bit pointless
54
+ # NOTE: Hessian allocates a ton anyway so use of scratch is a bit pointless
52
55
ϕr = ϕ_ .(r, w)
53
56
ΛX = ϕr .* X
54
57
mul! (view (H, 1 : p, 1 : p), X' , ΛX)
@@ -64,11 +67,14 @@ function fgh!(glr::GLR{RobustLoss{ρ},<:L2R}, X, y) where ρ <: RobustRho1P{δ}
64
67
end
65
68
else
66
69
(f, g, H, θ) -> begin
67
- r = _get_residuals (X, θ, y)
68
- w = _get_w (r, δ)
70
+ r = SCRATCH_N[]
71
+ get_residuals! (r, X, θ, y)
72
+ w = SCRATCH_N2[]
73
+ w .= convert .(Float64, abs .(r) .<= δ)
69
74
# gradient via ψ function
70
75
g === nothing || begin
71
- ψr = _get_ψr (r, w, ψ_)
76
+ ψr = SCRATCH_N3[]
77
+ ψr .= ψ_ .(r, w)
72
78
apply_Xt! (g, X, ψr)
73
79
g .+ = λ .* θ
74
80
end
@@ -87,8 +93,10 @@ function Hv!(glr::GLR{RobustLoss{ρ},<:L2R}, X, y) where ρ <: RobustRho1P{δ} w
87
93
# see d_logistic.jl for more comments on this (similar procedure)
88
94
if glr. fit_intercept
89
95
(Hv, θ, v) -> begin
90
- r = _get_residuals (X, θ, y)
91
- w = _get_w (r, δ)
96
+ r = SCRATCH_N[]
97
+ get_residuals! (r, X, θ, y)
98
+ w = SCRATCH_N2[]
99
+ w .= convert .(Float64, abs .(r) .<= δ)
92
100
w .= ϕ_ .(r, w)
93
101
# views on first p rows (intercept row treated after)
94
102
a = 1 : p
@@ -108,8 +116,10 @@ function Hv!(glr::GLR{RobustLoss{ρ},<:L2R}, X, y) where ρ <: RobustRho1P{δ} w
108
116
end
109
117
else
110
118
(Hv, θ, v) -> begin
111
- r = _get_residuals (X, θ, y)
112
- w = _get_w (r, δ)
119
+ r = SCRATCH_N[]
120
+ get_residuals! (r, X, θ, y)
121
+ w = SCRATCH_N2[]
122
+ w .= convert .(Float64, abs .(r) .<= δ)
113
123
w .= ϕ_ .(r, w)
114
124
t = SCRATCH_N3[]
115
125
apply_X! (t, X, v)
@@ -120,6 +130,7 @@ function Hv!(glr::GLR{RobustLoss{ρ},<:L2R}, X, y) where ρ <: RobustRho1P{δ} w
120
130
end
121
131
end
122
132
133
+
123
134
# For IWLS
124
135
function Mv! (glr:: GLR{RobustLoss{ρ},<:L2R} , X, y;
125
136
threshold= 1e-6 ) where ρ <: RobustRho1P{δ} where δ
@@ -130,24 +141,38 @@ function Mv!(glr::GLR{RobustLoss{ρ},<:L2R}, X, y;
130
141
# which we solve via an iterative method so, one θ
131
142
# gives one way of applying the relevant matrix (X'ΛX+λI)
132
143
(ωr, θ) -> begin
133
- r = _get_residuals (X, θ, y)
134
- w = _get_w (r, δ)
144
+ r = SCRATCH_N[]
145
+ get_residuals! (r, X, θ, y)
146
+ w = SCRATCH_N2[]
147
+ w .= convert .(Float64, abs .(r) .<= δ)
135
148
# ω = ψ(r)/r ; weighing factor for IWLS
136
149
ωr .= ω_ .(r, w)
137
150
# function defining the application of (X'ΛX + λI)
138
151
if glr. fit_intercept
139
152
(Mv, v) -> begin
140
- a = 1 : p
141
- vₐ = view (v, a)
142
- Mvₐ = view (Mv, a)
143
- XtW1 = vec (sum (ωr .* X, dims= 1 ))
144
- vₑ = v[end ]
145
- mul! (Mvₐ, X' , ωr .* (X * vₐ))
153
+ a = 1 : p
154
+ vₐ = view (v, a)
155
+ Mvₐ = view (Mv, a)
156
+ XtW1 = view (SCRATCH_P[], a)
157
+ @inbounds for j in a
158
+ XtW1[j] = dot (ωr, view (X, :, j))
159
+ end
160
+ vₑ = v[end ]
161
+ t = SCRATCH_N[]
162
+ apply_X! (t, X, vₐ)
163
+ t .*= ωr
164
+ mul! (Mvₐ, X' , t)
146
165
Mvₐ .+ = λ .* vₐ .+ XtW1 .* vₑ
147
166
Mv[end ] = dot (XtW1, vₐ) + (sum (ωr)+ λ) * vₑ
148
167
end
149
168
else
150
- (Mv, v) -> (mul! (Mv, X' , ωr .* (X * v)); Mv .+ = λ .* v)
169
+ (Mv, v) -> begin
170
+ t = SCRATCH_N[]
171
+ apply_X! (t, X, v)
172
+ t .*= ωr
173
+ mul! (Mv, X' , t)
174
+ Mv .+ = λ .* v
175
+ end
151
176
end
152
177
end
153
178
end
@@ -159,9 +184,12 @@ function smooth_fg!(glr::GLR{RobustLoss{ρ},<:ENR}, X, y) where ρ <: RobustRho1
159
184
p = size (X, 2 )
160
185
ψ_ = ψ (ρ)
161
186
(g, θ) -> begin
162
- r = _get_residuals (X, θ, y)
163
- w = _get_w (r, δ)
164
- ψr = _get_ψr (r, w, ψ_)
187
+ r = SCRATCH_N[]
188
+ get_residuals! (r, X, θ, y)
189
+ w = SCRATCH_N2[]
190
+ w .= convert .(Float64, abs .(r) .<= δ)
191
+ ψr = SCRATCH_N3[]
192
+ ψr .= ψ_ .(r, w)
165
193
apply_Xt! (g, X, ψr)
166
194
g .+ = λ .* θ
167
195
return glr. loss (r) + get_l2 (glr. penalty)(θ)
0 commit comments