-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsolve_multilayer.jl
63 lines (52 loc) · 1.36 KB
/
solve_multilayer.jl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
using StaticArrays
using IntervalArithmetic
using IntervalRootFinding
using IterTools
import IntervalRootFinding: BreadthFirstSearch
import JSON
import ForwardDiff: jacobian
using GeneratingFunctions
using Graphs
using Utils
low(interval) = interval.lo
high(interval) = interval.hi
function ufunc(zz::T, layers, params) where T
L = length(layers)
res = ones(typeof(zz[1]), L)
for (j, layer, param) in zip(1:L, layers, params)
for i in 1:L
if i == j
res[j] *= 1. - g1(layer, zz[i], param...)
else
res[j] *= 1. - g0(layer, zz[i], param...)
end
end
end
return SVector{L}(1. .- res)
end
function ures(zz::SVector, layers, params)
L = length(layers)
return zz .- ufunc(zz, layers, params)
end
function ures(zz::Region, layers, params)
L = length(layers)
X = zz .- ufunc(zz, layers, params)
return X.v
end
function find_u(layers, params)
L = length(layers)
X = IntervalBox(UNITINTERVAL, L)
rts = roots(uu -> ures(uu, layers, params), X, Krawczyk, 1e-3)
return rts
end
function find_S(layers, params)
L = length(layers)
uu = find_u(layers, params)
res = ones(typeof(uu[1]), L)
for rt in uu
for (layer, u) in zip(layers, rt.interval)
res[i] *= 1. - g0(layer, uu[i], param...)
end
end
return SS
end