diff --git a/src/run.jl b/src/run.jl index 906012a86a8246e80638cc93c087a39bf6d3c9c3..dc9a9118aea6403e037aafb65036062a9f1d6684 100644 --- a/src/run.jl +++ b/src/run.jl @@ -8,15 +8,22 @@ function myrun() name = "test" mesh = init_grid(50) d = 2 - m = 1 + m = 2 - Vg = FeSpace(mesh, DP0(), (1,)) + Vg = FeSpace(mesh, P1(), (1,)) Vu = FeSpace(mesh, P1(), (m,)) Vp1 = FeSpace(mesh, DP0(), (1,)) Vp2 = FeSpace(mesh, DP1(), (m, d)) - g = FeFunction(Vg, name="g") + # inpainting mask = FeFunction(Vg, name="mask") + # optflow + f0 = FeFunction(Vg, name="f0") + f1 = FeFunction(Vg, name="f1") + fw = FeFunction(Vg, name="fw") + nablafw = nabla(fw) + + g = FeFunction(Vg, name="g") u = FeFunction(Vu, name="u") p1 = FeFunction(Vp1, name="p1") p2 = FeFunction(Vp2, name="p2") @@ -36,7 +43,7 @@ function myrun() alpha1 = 0. alpha2 = 10. - beta = 0. + beta = 1e-3 lambda = 0.01 gamma1 = 1e-3 gamma2 = 1e-3 @@ -44,16 +51,24 @@ function myrun() interpolate!(g, x -> norm(x - SA[0.5, 0.5]) < 0.3) interpolate!(mask, x -> abs(x[2] - 0.5) > 0.1) + interpolate!(f0, x -> x[1]) + interpolate!(f1, x -> x[1] - 0.01) + fw.data .= f1.data + g_optflow(x; u, f0, fw, nablafw) = + nablafw * u - (fw - f0) + interpolate!(g, g_optflow; u, f0, fw, nablafw) + #T(data, u) = u #tdata = u # FIXME - @inline T(data, u) = iszero(data) ? zero(u) : u - tdata = mask + #T(data, u) = iszero(data) ? zero(u) : u + #tdata = mask - #T(data, u) = dot(data, u) - #tdata = nabla(fw) + T(data, u) = data * u + tdata = nabla(fw) - S(u) = u + #S(u, nablau) = u + S(u, nablau) = nablau function dp1_update(x; g, u, p1, du, tdata) m1 = max(gamma1, norm(T(tdata, u) - g)) @@ -88,7 +103,7 @@ function myrun() end end - @inline function du_a(x, du, nabladu, phi, nablaphi; g, u, nablau, p1, p2, tdata) + function du_a(x, du, nabladu, phi, nablaphi; g, u, nablau, p1, p2, tdata) m1 = max(gamma1, norm(T(tdata, u) - g)) cond1 = norm(T(tdata, u) - g) > gamma1 ? dot(T(tdata, u) - g, T(tdata, du)) / norm(T(tdata, u) - g)^2 * p1 : @@ -104,14 +119,14 @@ function myrun() dot(cond2, nablaphi) aB = alpha2 * dot(T(tdata, du), T(tdata, phi)) + - beta * dot(S(du), S(phi)) + beta * dot(S(du, nabladu), S(phi, nablaphi)) return a1 + a2 + aB end - @inline function du_l(x, phi, nablaphi; g, u, nablau, tdata) + function du_l(x, phi, nablaphi; g, u, nablau, tdata) aB = alpha2 * dot(T(tdata, u), T(tdata, phi)) + - beta * dot(S(u), S(phi)) + beta * dot(S(u, nablau), S(phi, nablaphi)) m1 = max(gamma1, norm(T(tdata, u) - g)) p1part = alpha1 / m1 * dot(T(tdata, u) - g, T(tdata, phi)) m2 = max(gamma2, norm(nablau))