src/Util.jl

Fri, 27 Aug 2021 16:56:16 +0300

author
Tuomo Valkonen <tuomov@iki.fi>
date
Fri, 27 Aug 2021 16:56:16 +0300
changeset 29
69242e8598eb
parent 28
ffd693c381f2
child 33
a60d2f12ef93
permissions
-rw-r--r--

a bit less workaround

0
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1 #########################
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
2 # Some utility functions
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
3 #########################
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
4
4
59fd17a3cea0 Add __precompile__() for what it is worth
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
5 __precompile__()
59fd17a3cea0 Add __precompile__() for what it is worth
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
6
0
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
7 module Util
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
8
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
9 ##############
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
10 # Our exports
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
11 ##############
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
12
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
13 export map_first_slice!,
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
14 reduce_first_slice,
19
63849571a046 norm₁
Tuomo Valkonen <tuomov@iki.fi>
parents: 18
diff changeset
15 norm₁,
0
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
16 norm₂,
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
17 γnorm₂,
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
18 norm₂w,
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
19 norm₂²,
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
20 norm₂w²,
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
21 norm₂₁,
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
22 γnorm₂₁,
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
23 dot,
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
24 mean,
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
25 proj_norm₂₁ball!,
18
0253c5881812 proj_nonneg!
Tuomo Valkonen <tuomov@iki.fi>
parents: 10
diff changeset
26 proj_nonneg!,
0
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
27 curry,
8
44ac3683263c @threadsif
Tuomo Valkonen <tuomov@iki.fi>
parents: 7
diff changeset
28 ⬿,
9
59d94d475b5a @background
Tuomo Valkonen <tuomov@iki.fi>
parents: 8
diff changeset
29 @threadsif,
10
e9edf00242a3 @backgroundif
Tuomo Valkonen <tuomov@iki.fi>
parents: 9
diff changeset
30 @background,
e9edf00242a3 @backgroundif
Tuomo Valkonen <tuomov@iki.fi>
parents: 9
diff changeset
31 @backgroundif
8
44ac3683263c @threadsif
Tuomo Valkonen <tuomov@iki.fi>
parents: 7
diff changeset
32
44ac3683263c @threadsif
Tuomo Valkonen <tuomov@iki.fi>
parents: 7
diff changeset
33
44ac3683263c @threadsif
Tuomo Valkonen <tuomov@iki.fi>
parents: 7
diff changeset
34 ##########
44ac3683263c @threadsif
Tuomo Valkonen <tuomov@iki.fi>
parents: 7
diff changeset
35 # Threads
44ac3683263c @threadsif
Tuomo Valkonen <tuomov@iki.fi>
parents: 7
diff changeset
36 ##########
44ac3683263c @threadsif
Tuomo Valkonen <tuomov@iki.fi>
parents: 7
diff changeset
37
44ac3683263c @threadsif
Tuomo Valkonen <tuomov@iki.fi>
parents: 7
diff changeset
38 macro threadsif(threads, loop)
44ac3683263c @threadsif
Tuomo Valkonen <tuomov@iki.fi>
parents: 7
diff changeset
39 return esc(:(if $threads
44ac3683263c @threadsif
Tuomo Valkonen <tuomov@iki.fi>
parents: 7
diff changeset
40 Threads.@threads $loop
10
e9edf00242a3 @backgroundif
Tuomo Valkonen <tuomov@iki.fi>
parents: 9
diff changeset
41 else
8
44ac3683263c @threadsif
Tuomo Valkonen <tuomov@iki.fi>
parents: 7
diff changeset
42 $loop
10
e9edf00242a3 @backgroundif
Tuomo Valkonen <tuomov@iki.fi>
parents: 9
diff changeset
43 end))
8
44ac3683263c @threadsif
Tuomo Valkonen <tuomov@iki.fi>
parents: 7
diff changeset
44 end
0
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
45
9
59d94d475b5a @background
Tuomo Valkonen <tuomov@iki.fi>
parents: 8
diff changeset
46 macro background(bgtask, fgtask)
59d94d475b5a @background
Tuomo Valkonen <tuomov@iki.fi>
parents: 8
diff changeset
47 return :(t = Threads.@spawn $(esc(bgtask));
59d94d475b5a @background
Tuomo Valkonen <tuomov@iki.fi>
parents: 8
diff changeset
48 $(esc(fgtask));
59d94d475b5a @background
Tuomo Valkonen <tuomov@iki.fi>
parents: 8
diff changeset
49 wait(t))
59d94d475b5a @background
Tuomo Valkonen <tuomov@iki.fi>
parents: 8
diff changeset
50 end
59d94d475b5a @background
Tuomo Valkonen <tuomov@iki.fi>
parents: 8
diff changeset
51
10
e9edf00242a3 @backgroundif
Tuomo Valkonen <tuomov@iki.fi>
parents: 9
diff changeset
52 macro backgroundif(threads, bgtask, fgtask)
e9edf00242a3 @backgroundif
Tuomo Valkonen <tuomov@iki.fi>
parents: 9
diff changeset
53 return :(if $(esc(threads))
e9edf00242a3 @backgroundif
Tuomo Valkonen <tuomov@iki.fi>
parents: 9
diff changeset
54 @background $(esc(bgtask)) $(esc(fgtask))
e9edf00242a3 @backgroundif
Tuomo Valkonen <tuomov@iki.fi>
parents: 9
diff changeset
55 else
e9edf00242a3 @backgroundif
Tuomo Valkonen <tuomov@iki.fi>
parents: 9
diff changeset
56 $(esc(bgtask))
e9edf00242a3 @backgroundif
Tuomo Valkonen <tuomov@iki.fi>
parents: 9
diff changeset
57 $(esc(fgtask))
e9edf00242a3 @backgroundif
Tuomo Valkonen <tuomov@iki.fi>
parents: 9
diff changeset
58 end)
e9edf00242a3 @backgroundif
Tuomo Valkonen <tuomov@iki.fi>
parents: 9
diff changeset
59 end
e9edf00242a3 @backgroundif
Tuomo Valkonen <tuomov@iki.fi>
parents: 9
diff changeset
60
0
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
61 ########################
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
62 # Functional programming
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
63 #########################
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
64
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
65 curry = (f::Function,y...)->(z...)->f(y...,z...)
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
66
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
67 ###############################
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
68 # For working with NamedTuples
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
69 ###############################
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
70
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
71 ⬿ = merge
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
72
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
73 ######
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
74 # map
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
75 ######
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
76
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
77 @inline function map_first_slice!(f!, y)
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
78 for i in CartesianIndices(size(y)[2:end])
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
79 @inbounds f!(@view(y[:, i]))
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
80 end
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
81 end
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
82
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
83 @inline function map_first_slice!(x, f!, y)
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
84 for i in CartesianIndices(size(y)[2:end])
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
85 @inbounds f!(@view(x[:, i]), @view(y[:, i]))
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
86 end
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
87 end
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
88
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
89 @inline function reduce_first_slice(f, y; init=0.0)
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
90 accum=init
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
91 for i in CartesianIndices(size(y)[2:end])
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
92 @inbounds accum=f(accum, @view(y[:, i]))
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
93 end
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
94 return accum
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
95 end
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
96
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
97 ###########################
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
98 # Norms and inner products
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
99 ###########################
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
100
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
101 @inline function dot(x, y)
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
102 @assert(length(x)==length(y))
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
103
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
104 accum=0
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
105 for i=1:length(y)
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
106 @inbounds accum += x[i]*y[i]
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
107 end
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
108 return accum
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
109 end
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
110
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
111 @inline function norm₂w²(y, w)
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
112 #Insane memory allocs
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
113 #return @inbounds sum(i -> y[i]*y[i]*w[i], 1:length(y))
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
114 accum=0
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
115 for i=1:length(y)
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
116 @inbounds accum=accum+y[i]*y[i]*w[i]
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
117 end
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
118 return accum
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
119 end
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
120
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
121 @inline function norm₂w(y, w)
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
122 return √(norm₂w²(y, w))
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
123 end
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
124
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
125 @inline function norm₂²(y)
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
126 #Insane memory allocs
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
127 #return @inbounds sum(i -> y[i]*y[i], 1:length(y))
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
128 accum=0
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
129 for i=1:length(y)
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
130 @inbounds accum=accum+y[i]*y[i]
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
131 end
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
132 return accum
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
133 end
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
134
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
135 @inline function norm₂(y)
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
136 return √(norm₂²(y))
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
137 end
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
138
19
63849571a046 norm₁
Tuomo Valkonen <tuomov@iki.fi>
parents: 18
diff changeset
139 @inline function norm₁(y)
63849571a046 norm₁
Tuomo Valkonen <tuomov@iki.fi>
parents: 18
diff changeset
140 accum=0
63849571a046 norm₁
Tuomo Valkonen <tuomov@iki.fi>
parents: 18
diff changeset
141 for i=1:length(y)
63849571a046 norm₁
Tuomo Valkonen <tuomov@iki.fi>
parents: 18
diff changeset
142 @inbounds accum=accum+abs(y[i])
63849571a046 norm₁
Tuomo Valkonen <tuomov@iki.fi>
parents: 18
diff changeset
143 end
63849571a046 norm₁
Tuomo Valkonen <tuomov@iki.fi>
parents: 18
diff changeset
144 return accum
63849571a046 norm₁
Tuomo Valkonen <tuomov@iki.fi>
parents: 18
diff changeset
145 end
63849571a046 norm₁
Tuomo Valkonen <tuomov@iki.fi>
parents: 18
diff changeset
146
0
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
147 @inline function γnorm₂(y, γ)
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
148 hubersq = xsq -> begin
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
149 x=√xsq
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
150 return if x > γ
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
151 x-γ/2
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
152 elseif x<-γ
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
153 -x-γ/2
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
154 else
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
155 xsq/(2γ)
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
156 end
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
157 end
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
158
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
159 if γ==0
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
160 return norm₂(y)
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
161 else
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
162 return hubersq(norm₂²(y))
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
163 end
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
164 end
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
165
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
166 function norm₂₁(y)
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
167 return reduce_first_slice((s, x) -> s+norm₂(x), y)
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
168 end
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
169
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
170 function γnorm₂₁(y,γ)
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
171 return reduce_first_slice((s, x) -> s+γnorm₂(x, γ), y)
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
172 end
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
173
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
174 function mean(v)
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
175 return sum(v)/prod(size(v))
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
176 end
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
177
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
178 @inline function proj_norm₂₁ball!(y, α)
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
179 α²=α*α
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
180
7
900a7e18ca01 optimise
Tuomo Valkonen <tuomov@iki.fi>
parents: 4
diff changeset
181 if ndims(y)==3 && size(y, 1)==2
900a7e18ca01 optimise
Tuomo Valkonen <tuomov@iki.fi>
parents: 4
diff changeset
182 @inbounds for i=1:size(y, 2)
900a7e18ca01 optimise
Tuomo Valkonen <tuomov@iki.fi>
parents: 4
diff changeset
183 @simd for j=1:size(y, 3)
900a7e18ca01 optimise
Tuomo Valkonen <tuomov@iki.fi>
parents: 4
diff changeset
184 n² = y[1,i,j]*y[1,i,j]+y[2,i,j]*y[2,i,j]
900a7e18ca01 optimise
Tuomo Valkonen <tuomov@iki.fi>
parents: 4
diff changeset
185 if n²>α²
900a7e18ca01 optimise
Tuomo Valkonen <tuomov@iki.fi>
parents: 4
diff changeset
186 v = α/√n²
900a7e18ca01 optimise
Tuomo Valkonen <tuomov@iki.fi>
parents: 4
diff changeset
187 y[1, i, j] *= v
900a7e18ca01 optimise
Tuomo Valkonen <tuomov@iki.fi>
parents: 4
diff changeset
188 y[2, i, j] *= v
900a7e18ca01 optimise
Tuomo Valkonen <tuomov@iki.fi>
parents: 4
diff changeset
189 end
900a7e18ca01 optimise
Tuomo Valkonen <tuomov@iki.fi>
parents: 4
diff changeset
190 end
900a7e18ca01 optimise
Tuomo Valkonen <tuomov@iki.fi>
parents: 4
diff changeset
191 end
900a7e18ca01 optimise
Tuomo Valkonen <tuomov@iki.fi>
parents: 4
diff changeset
192 else
900a7e18ca01 optimise
Tuomo Valkonen <tuomov@iki.fi>
parents: 4
diff changeset
193 y′=reshape(y, (size(y, 1), prod(size(y)[2:end])))
900a7e18ca01 optimise
Tuomo Valkonen <tuomov@iki.fi>
parents: 4
diff changeset
194
900a7e18ca01 optimise
Tuomo Valkonen <tuomov@iki.fi>
parents: 4
diff changeset
195 @inbounds @simd for i=1:size(y′, 2)# in CartesianIndices(size(y)[2:end])
900a7e18ca01 optimise
Tuomo Valkonen <tuomov@iki.fi>
parents: 4
diff changeset
196 n² = norm₂²(@view(y′[:, i]))
900a7e18ca01 optimise
Tuomo Valkonen <tuomov@iki.fi>
parents: 4
diff changeset
197 if n²>α²
29
69242e8598eb a bit less workaround
Tuomo Valkonen <tuomov@iki.fi>
parents: 28
diff changeset
198 @views y′[:, i] .*= (α/√n²)
7
900a7e18ca01 optimise
Tuomo Valkonen <tuomov@iki.fi>
parents: 4
diff changeset
199 end
0
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
200 end
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
201 end
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
202 end
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
203
18
0253c5881812 proj_nonneg!
Tuomo Valkonen <tuomov@iki.fi>
parents: 10
diff changeset
204 @inline function proj_nonneg!(y)
0253c5881812 proj_nonneg!
Tuomo Valkonen <tuomov@iki.fi>
parents: 10
diff changeset
205 @inbounds @simd for i=1:length(y)
0253c5881812 proj_nonneg!
Tuomo Valkonen <tuomov@iki.fi>
parents: 10
diff changeset
206 if y[i] < 0
0253c5881812 proj_nonneg!
Tuomo Valkonen <tuomov@iki.fi>
parents: 10
diff changeset
207 y[i] = 0
0253c5881812 proj_nonneg!
Tuomo Valkonen <tuomov@iki.fi>
parents: 10
diff changeset
208 end
0253c5881812 proj_nonneg!
Tuomo Valkonen <tuomov@iki.fi>
parents: 10
diff changeset
209 end
0253c5881812 proj_nonneg!
Tuomo Valkonen <tuomov@iki.fi>
parents: 10
diff changeset
210 return y
0253c5881812 proj_nonneg!
Tuomo Valkonen <tuomov@iki.fi>
parents: 10
diff changeset
211 end
0253c5881812 proj_nonneg!
Tuomo Valkonen <tuomov@iki.fi>
parents: 10
diff changeset
212
0
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
213 end # Module
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
214

mercurial