FWI Example

We will peform FWI using the following steps:

  1. Prepare models
  2. Setup Constraints with SetIntersectionProjection
  3. Build a small local compute cluster (2 workers)
    • Take care of some HPC details related to thread affinity
  4. Create source and receivers geometries
  5. Build F, the JUDI modeling operator
  6. Use F to create data for both models
  7. Visualize data
  8. Assess if data is cycle skipped at the farthest offsets
  9. Build the objective function
  10. Perform the FWI using minConf_PQN from JUDI
  11. Visualize velocity models and objective function
  12. Visualize data match
  13. Remove workers

Note on runtime

Warning: this notebook takes more than 1 hour to run for 16 shots with two workers on an Intel 8168.

lscpu CPU information: Intel(R) Xeon(R) Platinum 8168 CPU @ 2.70GHz

# Add packages needed
# PythonPlot is already installed in the environment
# using Pkg
# Pkg.add(["Distributed", "SlimOptim", "JUDI", "SetIntersectionProjection"])
using Distributed, JUDI, SlimOptim, LinearAlgebra, PythonPlot, SetIntersectionProjection, Printf

Prepare models

n = (251, 251) # nx, nz
d = (15., 15.) # hx, hz
o = (0., 0.); # ox, oz
# Squared slowness
m = 1.5f0^(-2) * ones(Float32, n)
m[101:150, 101:150] .= 1.7f0^(-2)
m0 = 1/1.5f0^2 * ones(Float32, n);
model = Model(n,d,o,m)
model0 = Model(n,d,o,m0);

Visualize

figure(figsize=(8,9))
vmin,vmax = extrema(m)
dmin,dmax = -.1,.1

subplot(3,1,1); imshow(m,aspect="auto",cmap="jet"); 
colorbar(); clim(vmin,vmax); title("True squared slowness (m)")

subplot(3,1,2); imshow(m0,aspect="auto",cmap="jet");
colorbar(); clim(vmin,vmax); title("Initial squared slowness (m0)");

subplot(3,1,3); imshow(m.-m0,aspect="auto",cmap="seismic");
colorbar(); clim(dmin,dmax); title("Difference (m-m0)");

tight_layout()

png

Setup Constraints with SetIntersectionProjection

options=PARSDMM_options()
options.FL=Float32
options=default_PARSDMM_options(options,options.FL)
constraint = Vector{SetIntersectionProjection.set_definitions}()
constraint2 = Vector{SetIntersectionProjection.set_definitions}()
set_definitions[]

We setup two constaints:

  • Bounds that limit maximum and minimum velocity
  • TV, that limits variation and force a piece-wise constant structure
#bounds:
m_min = 0 .* m .+ minimum(m).*.5
m_max = 0 .* m .+ maximum(m)
set_type = "bounds"
TD_OP = "identity"
app_mode = ("matrix","")
custom_TD_OP = ([],false)
push!(constraint, set_definitions(set_type,TD_OP,vec(m_min),vec(m_max),app_mode,custom_TD_OP));
push!(constraint2, set_definitions(set_type,TD_OP,vec(m_min),vec(m_max),app_mode,custom_TD_OP));
#TV
(TV,dummy1,dummy2,dummy3) = get_TD_operator(model0,"TV",options.FL)
m_min = 0.0
m_max = norm(TV*vec(m),1) * .5
set_type = "l1"
TD_OP = "TV"
app_mode = ("matrix","")
custom_TD_OP = ([],false)
push!(constraint, set_definitions(set_type,TD_OP,m_min,m_max,app_mode,custom_TD_OP));
#set up constraints with bounds only, precompute some things and define projector
(P_sub2,TD_OP2,set_Prop2) = setup_constraints(constraint2, model0,options.FL)
(TD_OP2,AtA2,l2,y2) = PARSDMM_precompute_distribute(TD_OP2,set_Prop2,model0,options)
options2 = deepcopy(options)
options2.rho_ini = ones(length(TD_OP2))*10.0

proj_intersection2 = x-> PARSDMM(x, AtA2, TD_OP2, set_Prop2, P_sub2, model0, options2)  

# Projection function
function prj2(input)
    input = Float32.(input)
    (x,dummy1,dummy2,dymmy3) = proj_intersection2(vec(input))
    return x
end
prj2 (generic function with 1 method)
#set up constraints with bounds and TV
(P_sub,TD_OP,set_Prop) = setup_constraints(constraint, model0,options.FL)
(TD_OP,AtA,l,y) = PARSDMM_precompute_distribute(TD_OP,set_Prop,model0,options)
options.rho_ini = ones(length(TD_OP))*10.0

proj_intersection = x-> PARSDMM(x, AtA, TD_OP, set_Prop, P_sub, model0, options)

# Projection function
function prj(input)
    input = Float32.(input)
    (x,dummy1,dummy2,dymmy3) = proj_intersection(vec(input))
    return x
end
prj (generic function with 1 method)

Build a small local compute cluster

Setup OMP environment variables for the cluster

In the distributed compute case the workers that we add would be on different hardware, and we might add tens of workers in 2D and hundreds in 3D. Here we run on a single machine with only 2 workers, and so we need to be careful with details related to high performance computing. If we did not specify thread affinity, the two workers would compete for the same physical cores and the modeling would be incredibly slow.

We spin up the small 2-worker cluster by calling addprocs(2), and because we set the environment variable ENV["OMP_DISPLAY_ENV"] = "true" we will see the OMP environment printed out on each worker. In that output (below) we can verify that half of the total threads (44/2 = 22) are assigned to each socket on this 2 socket system. You can obtain more details about the hardware with the shell command lscpu.

We set four environment variables related to OpenMP:

  • OMP_DISPLAY_ENV prints out the OpenMP environment on each worker
  • OMP_PROC_BIND specifies that threads should be bound to physical cores
  • OMP_NUM_THREADS specifies the number of threads per workers is 1/2 the number of physical cores
  • GOMP_CPU_AFFINITY specifies which physical cores the threads run on for each worker

If you run the shell command top during execution, you will see 3 julia processes: the main process and two workers. The two workers should generally have about 50% of the system, and load average should tend towards the physical number of cores.

nthread = Sys.CPU_THREADS
nw = 2

ENV["OMP_DISPLAY_ENV"] = "true"
ENV["OMP_PROC_BIND"] = "close"
ENV["OMP_NUM_THREADS"] = "$(div(nthread, nw))" 
addprocs(nw)
@show workers()
for k in 1:nworkers()
    place1 = (k - 1) * div(nthread,nworkers())
    place2 = (k + 0) * div(nthread,nworkers()) - 1
    @show place1, place2, div(nthread, nw)
    @spawnat workers()[k] ENV["GOMP_CPU_AFFINITY"] = "$(place1)-$(place2)";
end
workers() = [2, 3]
(place1, place2, div(nthread, nw)) = (0, 1, 2)
(place1, place2, div(nthread, nw)) = (2, 3, 2)
@everywhere using Distributed, JUDI, LinearAlgebra
      From worker 3:	
      From worker 3:	OPENMP DISPLAY ENVIRONMENT BEGIN
      From worker 3:	  _OPENMP = '201511'
      From worker 3:	  OMP_DYNAMIC = 'FALSE'
      From worker 3:	  OMP_NESTED = 'FALSE'
      From worker 3:	  OMP_NUM_THREADS = '2'
      From worker 3:	  OMP_SCHEDULE = 'DYNAMIC'
      From worker 3:	  OMP_PROC_BIND = 'CLOSE'
      From worker 3:	  OMP_PLACES = ''
      From worker 3:	  OMP_STACKSIZE = '2097152'
      From worker 3:	  OMP_WAIT_POLICY = 'PASSIVE'
      From worker 3:	  OMP_THREAD_LIMIT = '4294967295'
      From worker 3:	  OMP_MAX_ACTIVE_LEVELS = '1'
      From worker 3:	  OMP_CANCELLATION = 'FALSE'
      From worker 3:	  OMP_DEFAULT_DEVICE = '0'
      From worker 3:	  OMP_MAX_TASK_PRIORITY = '0'
      From worker 3:	  OMP_DISPLAY_AFFINITY = 'FALSE'
      From worker 3:	  OMP_AFFINITY_FORMAT = 'level %L thread %i affinity %A'
      From worker 3:	  OMP_ALLOCATOR = 'omp_default_mem_alloc'
      From worker 3:	  OMP_TARGET_OFFLOAD = 'DEFAULT'
      From worker 3:	OPENMP DISPLAY ENVIRONMENT END
      From worker 2:	
      From worker 2:	OPENMP DISPLAY ENVIRONMENT BEGIN
      From worker 2:	  _OPENMP = '201511'
      From worker 2:	  OMP_DYNAMIC = 'FALSE'
      From worker 2:	  OMP_NESTED = 'FALSE'
      From worker 2:	  OMP_NUM_THREADS = '2'
      From worker 2:	  OMP_SCHEDULE = 'DYNAMIC'
      From worker 2:	  OMP_PROC_BIND = 'CLOSE'
      From worker 2:	  OMP_PLACES = ''
      From worker 2:	  OMP_STACKSIZE = '2097152'
      From worker 2:	  OMP_WAIT_POLICY = 'PASSIVE'
      From worker 2:	  OMP_THREAD_LIMIT = '4294967295'
      From worker 2:	  OMP_MAX_ACTIVE_LEVELS = '1'
      From worker 2:	  OMP_CANCELLATION = 'FALSE'
      From worker 2:	  OMP_DEFAULT_DEVICE = '0'
      From worker 2:	  OMP_MAX_TASK_PRIORITY = '0'
      From worker 2:	  OMP_DISPLAY_AFFINITY = 'FALSE'
      From worker 2:	  OMP_AFFINITY_FORMAT = 'level %L thread %i affinity %A'
      From worker 2:	  OMP_ALLOCATOR = 'omp_default_mem_alloc'
      From worker 2:	  OMP_TARGET_OFFLOAD = 'DEFAULT'
      From worker 2:	OPENMP DISPLAY ENVIRONMENT END

Create source and receivers geometries

We use 8 shot locations evenly distributed across the left of the model.

tn = 4000  # Recording time in ms
dt = 2f0  # Shot record sampling rate in ms
f0 = 0.005 # Peak frquency in kHz
0.005
nsrc = 8
xsrc = convertToCell(d[1].*ones(Float32, nsrc))
ysrc = convertToCell(range(0f0, stop = 0f0, length = nsrc))
zsrc = convertToCell(range(0f0, (n[2] - 1)*d[2], length=nsrc))
src_geom = Geometry(xsrc, ysrc, zsrc; dt=dt, t=tn);
nrec = 251
xrec = (n[1] - 2)*d[1] .* ones(Float32, nrec)
yrec = 0f0
zrec = range(0f0, (n[2] - 1)*d[2], length=nrec)
rec_geom = Geometry(xrec, yrec, zrec; dt=dt, t=tn, nsrc=nsrc);

Visualize geometry

figure()
vmin,vmax = extrema(m)
dmin,dmax = -.1,.1

imshow(m,aspect="auto",cmap="jet", extent=[0, 3750, 3750, 0]); 
colorbar(); clim(vmin,vmax); title("True squared slowness (m)")
scatter(xsrc, zsrc, c="g", label="Sources")
scatter(xrec[1:4:end], zrec[1:4:end], c="c", label="Receiver")
legend()

png

PyObject <matplotlib.legend.Legend object at 0x170fa68b0>

Build F, the JUDI modeling operator

# True model operator
F = judiModeling(model, src_geom, rec_geom)

# Intial model operator
F0 = judiModeling(model0, src_geom, rec_geom);
# Source function
fsrc = judiVector(src_geom, ricker_wavelet(tn, dt, f0));

Use F to create the data in both models

t1 = @elapsed begin
    dobs = F*fsrc;
end
@info @sprintf("Time in true model; %.2f seconds\n", t1);

t2 = @elapsed begin
    d0 = F0*fsrc;
end
@info @sprintf("Time in init model; %.2f seconds\n", t2);
      From worker 3:	
      From worker 3:	OPENMP DISPLAY ENVIRONMENT BEGIN
      From worker 3:	  _OPENMP = '201511'
      From worker 3:	  OMP_DYNAMIC = 'FALSE'
      From worker 3:	  OMP_NESTED = 'FALSE'
      From worker 3:	  OMP_NUM_THREADS = '2'
      From worker 3:	  OMP_SCHEDULE = 'DYNAMIC'
      From worker 3:	  OMP_PROC_BIND = 'CLOSE'
      From worker 3:	  OMP_PLACES = ''
      From worker 3:	  OMP_STACKSIZE = '2097152'
      From worker 3:	  OMP_WAIT_POLICY = 'PASSIVE'
      From worker 3:	  OMP_THREAD_LIMIT = '4294967295'
      From worker 3:	  OMP_MAX_ACTIVE_LEVELS = '2147483647'
      From worker 3:	  OMP_CANCELLATION = 'FALSE'
      From worker 3:	  OMP_DEFAULT_DEVICE = '0'
      From worker 3:	  OMP_MAX_TASK_PRIORITY = '0'
      From worker 3:	  OMP_DISPLAY_AFFINITY = 'FALSE'
      From worker 3:	  OMP_AFFINITY_FORMAT = 'level %L thread %i affinity %A'
      From worker 3:	OPENMP DISPLAY ENVIRONMENT END
      From worker 2:	
      From worker 2:	OPENMP DISPLAY ENVIRONMENT BEGIN
      From worker 2:	  _OPENMP = '201511'
      From worker 2:	  OMP_DYNAMIC = 'FALSE'
      From worker 2:	  OMP_NESTED = 'FALSE'
      From worker 2:	  OMP_NUM_THREADS = '2'
      From worker 2:	  OMP_SCHEDULE = 'DYNAMIC'
      From worker 2:	  OMP_PROC_BIND = 'CLOSE'
      From worker 2:	  OMP_PLACES = ''
      From worker 2:	  OMP_STACKSIZE = '2097152'
      From worker 2:	  OMP_WAIT_POLICY = 'PASSIVE'
      From worker 2:	  OMP_THREAD_LIMIT = '4294967295'
      From worker 2:	  OMP_MAX_ACTIVE_LEVELS = '2147483647'
      From worker 2:	  OMP_CANCELLATION = 'FALSE'
      From worker 2:	  OMP_DEFAULT_DEVICE = '0'
      From worker 2:	  OMP_MAX_TASK_PRIORITY = '0'
      From worker 2:	  OMP_DISPLAY_AFFINITY = 'FALSE'
      From worker 2:	  OMP_AFFINITY_FORMAT = 'level %L thread %i affinity %A'
      From worker 2:	OPENMP DISPLAY ENVIRONMENT END
      From worker 3:	Operator `forward` ran in 0.42 s
      From worker 2:	Operator `forward` ran in 0.48 s
      From worker 3:	Operator `forward` ran in 0.43 s
      From worker 2:	Operator `forward` ran in 0.42 s
      From worker 3:	Operator `forward` ran in 0.39 s
      From worker 2:	Operator `forward` ran in 0.42 s
      From worker 3:	Operator `forward` ran in 0.46 s
      From worker 2:	Operator `forward` ran in 0.33 s


┌ Info: Time in true model; 27.31 seconds
└ @ Main In[20]:4


      From worker 3:	Operator `forward` ran in 0.43 s
      From worker 2:	Operator `forward` ran in 0.41 s
      From worker 3:	Operator `forward` ran in 0.35 s
      From worker 2:	Operator `forward` ran in 0.36 s
      From worker 3:	Operator `forward` ran in 0.36 s
      From worker 2:	Operator `forward` ran in 0.38 s
      From worker 3:	Operator `forward` ran in 0.37 s
      From worker 2:	Operator `forward` ran in 0.29 s


┌ Info: Time in init model; 10.21 seconds
└ @ Main In[20]:9

Compute the residual data

r = d0 - dobs;

Visualize data

shots = [1,4,8]
3-element Vector{Int64}:
 1
 4
 8

Plot shot gathers for true model, initial model, and residual

The table below describes the data images below. We flip the direction of the residual and modeled data in order to help display the match with the true data.

<table style="border:1px solid black;" width="60%"> <tr> <td style="border:1px solid black; text-align:center;" bgcolor="white"> <b>Initial Residual Data<br>(flipped)</b></td> <td style="border:1px solid black; text-align:center;" bgcolor="white"> <b>True Data</b></td> <td style="border:1px solid black; text-align:center;" bgcolor="white"> <b>Initial Data<br>(flipped)</b></td> </tr> </table>

Note that the data modeled in the initial model lacks a lot of reflectivity that is evident in the data modeled in the true model. We expect to recover this missing reflectivity with the FWI.

scale = 10.0 / sqrt(norm(dobs)^2 / length(dobs.data))
@show scale

nzero = 5
pad = ones(Float32,2001,nzero)

figure(figsize=(8,9)); clf()
for (iplot,ishot) in enumerate(shots)
    cat2 = hcat(reverse(r.data[ishot],dims=2), pad, dobs.data[ishot], pad, reverse(d0.data[ishot],dims=2))
    subplot(3,1,iplot);
    imshow(cat2,cmap="gray",aspect="auto",clim=[-1,+1]);
    title(" Initial Residual sz=$(zsrc[ishot])   |   True sz=$(zsrc[ishot])   |   Initial sz=$(zsrc[ishot]) (flipped)");
end
tight_layout()

png

scale = 0.018069575143305386

Assess if data is cycle skipped at the farthest offsets

Next we plot the far offset traces for these three shots in order to assess if the data is cycle skipped.

You can ovbserve in the plots below that the refraction waveforms (first arrivals) in the initial model are not cycle skipped with respect to the true model, so we can proceed.

A very significant part of the residual wavefield is actually reflections in this example.

scale = 10.0 / sqrt(norm(dobs)^2 / length(dobs.data))
t = [0.0:dt:tn;]

figure(figsize=(8,9)); clf()
for (iplot,ishot) in enumerate(shots)
    subplot(3,1,iplot);
    plot(t,dobs.data[ishot][:,end],label="True Model $(ishot) at z=$(zsrc[ishot])");
    plot(t,d0.data[ishot][:,end],label="Initial Model $(ishot) at z=$(zsrc[ishot])");
    xlim([4.5,t[end]])
    legend()
end
tight_layout()

png

Build the objective functions

Build src/rec positions mask

We use this mask to remove the imprint in gradients of proximity to source locations. The mask is set to 0 wherever a source or receiver is close, and is set to 1 otherwise. Without this mask most of the gradient updates would be concentrated close to sources where the model is correct.

wb_mask = ones(Float32,size(m))
wb_mask[1:5, :] .= 0;
wb_mask[end-5:end, :] .= 0;

figure(figsize=(8,3))
imshow(wb_mask', aspect="auto",cmap="gray_r",clim=[0,+2]);
colorbar();
title("Water Bottom Mask");
tight_layout()

png

Build the objective function

This method is called by the solver whenever the gradient is required. Steps in computing the gradient are as follows:

  1. Apply the adjoint of the Jacobian to the current residual J' * [F*v - d]
  2. Apply simple scaling based on the size of the first gradient, and save to apply to future gradients
# build Jacoian
J = judiJacobian(F0, fsrc)

function objective(F0, G, m, dobs, wb_mask)
    F0.model.m .= m
    t = @elapsed begin
        d0 = F0*fsrc
        if isnothing(G)
            return .5f0*norm(d0 .- dobs)^2
        end
        G .= J' * (d0 .- dobs)
    end
    G .*= vec(wb_mask)
    ϕ = .5f0*norm(d0 .- dobs)^2
    if gscale == 0.0
        # compute scalar from first gradient, apply to future gradients
        global gscale = .25f0 ./ maximum(G) 
        @show gscale
    end
    G .*= gscale
    return ϕ
end

# struct to save the first gradient scalar
gscale = 0f0
f(x) = objective(F0, nothing, x, dobs, wb_mask)
g!(G, x) = objective(F0, G, x, dobs, wb_mask)
fg!(G, x) = objective(F0, G, x, dobs, wb_mask)
fg! (generic function with 1 method)

Compute gradient

grad1 = 0f0 .* vec(m0)
tgrad1 = @elapsed begin
    g!(grad1, vec(m0))
    gscale = 0
end
@show tgrad1;
      From worker 3:	Operator `forward` ran in 0.35 s
      From worker 2:	Operator `forward` ran in 0.37 s
      From worker 3:	Operator `forward` ran in 0.35 s
      From worker 2:	Operator `forward` ran in 0.31 s
      From worker 3:	Operator `forward` ran in 0.36 s
      From worker 2:	Operator `forward` ran in 0.38 s
      From worker 3:	Operator `forward` ran in 0.35 s
      From worker 2:	Operator `forward` ran in 0.26 s
      From worker 3:	Operator `forward` ran in 0.39 s
      From worker 2:	Operator `forward` ran in 0.47 s
      From worker 3:	Operator `gradient` ran in 0.59 s
      From worker 2:	Operator `gradient` ran in 0.46 s
      From worker 3:	Operator `forward` ran in 0.35 s
      From worker 2:	Operator `forward` ran in 0.48 s
      From worker 3:	Operator `gradient` ran in 0.63 s
      From worker 2:	Operator `gradient` ran in 0.49 s
      From worker 3:	Operator `forward` ran in 0.41 s
      From worker 2:	Operator `forward` ran in 0.40 s
      From worker 3:	Operator `gradient` ran in 0.52 s
      From worker 2:	Operator `gradient` ran in 0.48 s
      From worker 3:	Operator `forward` ran in 0.35 s
      From worker 2:	Operator `forward` ran in 0.41 s
      From worker 3:	Operator `gradient` ran in 0.54 s
      From worker 2:	Operator `gradient` ran in 0.34 s
gscale = 3.15937f-5
tgrad1 = 33.235375243
dm = m0 .- m
grad1 = reshape(grad1, n)
mg2 = reshape(m0 .- grad1, n)
figure(figsize=(8,9))

subplot(5,1,1)
imshow(grad1' ./ maximum(abs,grad1),aspect="auto",cmap="seismic");
colorbar(orientation="vertical");clim(-1,1);
title("Initial Gradient without Illumination Compensation");

subplot(5,1,2)
imshow(dm ./ maximum(abs,dm),aspect="auto",cmap="seismic");
colorbar(orientation="vertical");clim(-1,1);
title("Squared slowness Difference: (m0 - m)");

subplot(5,1,3)
imshow(mg2',aspect="auto",cmap="seismic");
colorbar(orientation="vertical");clim(vmin,vmax)
title("Updated squared slowness: (m0 - grad1)");

subplot(5,1,4)
imshow(reshape(prj(mg2), n)',aspect="auto",cmap="seismic");
colorbar(orientation="vertical");clim(vmin,vmax)
title("Updated projected (bounds + TV) squared slowness: prj(m0 - grad1)");

subplot(5,1,5)
imshow(reshape(prj2(mg2), n)',aspect="auto",cmap="seismic");
colorbar(orientation="vertical");clim(vmin,vmax)
title("Updated projected (bounds) squared slowness: prj(m0 - grad1)");

tight_layout()
relative evolution to small, exiting PARSDMM (iteration 37)

png

input to PARSDMM is feasible, returning

Perform the FWI using minConf_PQN

We will do 10 functions evaluation cost of projected quasi-Newton with two setup:

  • Bounds constraints only
  • Bounds + tv constrains
# FWI with PQN
niter = 10
gscale = 0f0
options_pqn = pqn_options(progTol=0, store_trace=true, verbose=3, maxIter=niter)
SlimOptim.PQN_params(3, 1.0f-5, 0, 10, 0.0001f0, 10, false, true, true, 1.0f-6, 1.0f-7, 100, false, 20, 1, 1)
sol = pqn(f, g!, fg!, vec(m0), prj, options_pqn);
Running PQN...
Number of L-BFGS Corrections to store: 10
Spectral initialization of SPG: 1
Maximum number of SPG iterations: 100
SPG optimality tolerance: 1.00e-06
SPG progress tolerance: 1.00e-07
PQN optimality tolerance: 1.00e-05
PQN progress tolerance: 0.00e+00
Quadratic initialization of line search: 0
Maximum number of iterations: 10
Line search: BackTracking{Float32, Int64}
input to PARSDMM is feasible, returning
      From worker 2:	Operator `forward` ran in 0.32 s
      From worker 3:	Operator `forward` ran in 0.36 s
      From worker 2:	Operator `forward` ran in 0.33 s
      From worker 3:	Operator `forward` ran in 0.34 s
      From worker 2:	Operator `forward` ran in 0.34 s
      From worker 3:	Operator `forward` ran in 0.47 s
      From worker 2:	Operator `forward` ran in 0.32 s
      From worker 3:	Operator `forward` ran in 0.22 s
      From worker 2:	Operator `forward` ran in 0.36 s
      From worker 3:	Operator `forward` ran in 0.44 s
      From worker 2:	Operator `gradient` ran in 0.56 s
      From worker 3:	Operator `gradient` ran in 0.50 s
      From worker 2:	Operator `forward` ran in 0.39 s
      From worker 3:	Operator `forward` ran in 0.34 s
      From worker 2:	Operator `gradient` ran in 0.44 s
      From worker 3:	Operator `gradient` ran in 0.50 s
      From worker 2:	Operator `forward` ran in 0.35 s
      From worker 3:	Operator `forward` ran in 0.43 s
      From worker 2:	Operator `gradient` ran in 0.57 s
      From worker 3:	Operator `gradient` ran in 0.47 s
      From worker 2:	Operator `forward` ran in 0.36 s
      From worker 3:	Operator `forward` ran in 0.41 s
      From worker 2:	Operator `gradient` ran in 0.54 s
      From worker 3:	Operator `gradient` ran in 0.38 s
gscale = 3.159375f-5
 Iteration   FunEvals  GradEvals Projections     Step Length    Function Val        Opt Cond
relative evolution to small, exiting PARSDMM (iteration 37)
         0          0          0          0     0.00000e+00     8.04513e+05     6.74951e-02
relative evolution to small, exiting PARSDMM (iteration 37)
relative evolution to small, exiting PARSDMM (iteration 37)
      From worker 2:	Operator `forward` ran in 0.24 s
      From worker 3:	Operator `forward` ran in 0.38 s
      From worker 2:	Operator `forward` ran in 0.38 s
      From worker 3:	Operator `forward` ran in 0.44 s
      From worker 2:	Operator `forward` ran in 0.41 s
      From worker 3:	Operator `forward` ran in 0.35 s
      From worker 2:	Operator `forward` ran in 0.36 s
      From worker 3:	Operator `forward` ran in 0.26 s
      From worker 2:	Operator `forward` ran in 0.28 s
      From worker 3:	Operator `forward` ran in 0.32 s
      From worker 2:	Operator `forward` ran in 0.35 s
      From worker 3:	Operator `forward` ran in 0.54 s
      From worker 2:	Operator `forward` ran in 0.33 s
      From worker 3:	Operator `forward` ran in 0.34 s
      From worker 2:	Operator `forward` ran in 0.36 s
      From worker 3:	Operator `forward` ran in 0.23 s
input to PARSDMM is feasible, returning
      From worker 3:	Operator `forward` ran in 0.34 s
      From worker 2:	Operator `forward` ran in 0.37 s
      From worker 3:	Operator `forward` ran in 0.34 s
      From worker 2:	Operator `forward` ran in 0.33 s
      From worker 3:	Operator `forward` ran in 0.36 s
      From worker 2:	Operator `forward` ran in 0.37 s
      From worker 3:	Operator `forward` ran in 0.33 s
      From worker 2:	Operator `forward` ran in 0.22 s
      From worker 2:	Operator `forward` ran in 0.35 s
      From worker 3:	Operator `forward` ran in 0.35 s
      From worker 2:	Operator `gradient` ran in 0.33 s
      From worker 3:	Operator `gradient` ran in 0.48 s
      From worker 2:	Operator `forward` ran in 0.35 s
      From worker 3:	Operator `forward` ran in 0.35 s
      From worker 2:	Operator `gradient` ran in 0.55 s
      From worker 3:	Operator `gradient` ran in 0.50 s
      From worker 2:	Operator `forward` ran in 0.31 s
      From worker 3:	Operator `forward` ran in 0.43 s
      From worker 2:	Operator `gradient` ran in 0.58 s
      From worker 3:	Operator `gradient` ran in 0.50 s
      From worker 2:	Operator `forward` ran in 0.35 s
      From worker 3:	Operator `forward` ran in 0.37 s
      From worker 2:	Operator `gradient` ran in 0.52 s
      From worker 3:	Operator `gradient` ran in 0.32 s
relative evolution to small, exiting PARSDMM (iteration 38)
         1          3          2          6     1.00000e-01     5.95413e+05     5.50441e-02
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 29)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)


┌ Info: Line search failed
└ @ SlimOptim /Users/mathiaslouboutin/.julia/dev/SlimOptim/src/linesearches.jl:47


relative evolution to small, exiting PARSDMM (iteration 15)
      From worker 3:	Operator `forward` ran in 0.34 s
      From worker 2:	Operator `forward` ran in 0.37 s
      From worker 3:	Operator `forward` ran in 0.36 s
      From worker 2:	Operator `forward` ran in 0.33 s
      From worker 3:	Operator `forward` ran in 0.36 s
      From worker 2:	Operator `forward` ran in 0.35 s
      From worker 3:	Operator `forward` ran in 0.35 s
      From worker 2:	Operator `forward` ran in 0.25 s
      From worker 3:	Operator `forward` ran in 0.23 s
      From worker 2:	Operator `forward` ran in 0.34 s
      From worker 3:	Operator `forward` ran in 0.36 s
      From worker 2:	Operator `forward` ran in 0.35 s
      From worker 3:	Operator `forward` ran in 0.36 s
      From worker 2:	Operator `forward` ran in 0.32 s
      From worker 3:	Operator `forward` ran in 0.34 s
      From worker 2:	Operator `forward` ran in 0.22 s
input to PARSDMM is feasible, returning
      From worker 3:	Operator `forward` ran in 0.36 s
      From worker 2:	Operator `forward` ran in 0.39 s
      From worker 3:	Operator `forward` ran in 0.34 s
      From worker 2:	Operator `forward` ran in 0.35 s
      From worker 3:	Operator `forward` ran in 0.41 s
      From worker 2:	Operator `forward` ran in 0.35 s
      From worker 3:	Operator `forward` ran in 0.32 s
      From worker 2:	Operator `forward` ran in 0.24 s
      From worker 2:	Operator `forward` ran in 0.32 s
      From worker 3:	Operator `forward` ran in 0.35 s
      From worker 2:	Operator `gradient` ran in 0.69 s
      From worker 3:	Operator `gradient` ran in 0.71 s
      From worker 2:	Operator `forward` ran in 0.40 s
      From worker 3:	Operator `forward` ran in 0.42 s
      From worker 2:	Operator `gradient` ran in 0.73 s
      From worker 3:	Operator `gradient` ran in 0.72 s
      From worker 2:	Operator `forward` ran in 0.46 s
      From worker 3:	Operator `forward` ran in 0.54 s
      From worker 2:	Operator `gradient` ran in 0.72 s
      From worker 3:	Operator `gradient` ran in 0.72 s
      From worker 2:	Operator `forward` ran in 0.40 s
      From worker 3:	Operator `forward` ran in 0.42 s
      From worker 2:	Operator `gradient` ran in 0.66 s
      From worker 3:	Operator `gradient` ran in 0.63 s
relative evolution to small, exiting PARSDMM (iteration 15)
         2          5          3         36     1.00000e-01     4.97818e+05     1.70875e-01
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 30)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)


┌ Info: Line search failed
└ @ SlimOptim /Users/mathiaslouboutin/.julia/dev/SlimOptim/src/linesearches.jl:47


relative evolution to small, exiting PARSDMM (iteration 15)
      From worker 2:	Operator `forward` ran in 0.39 s
      From worker 3:	Operator `forward` ran in 0.38 s
      From worker 2:	Operator `forward` ran in 0.38 s
      From worker 3:	Operator `forward` ran in 0.48 s
      From worker 2:	Operator `forward` ran in 0.36 s
      From worker 3:	Operator `forward` ran in 0.33 s
      From worker 2:	Operator `forward` ran in 0.39 s
      From worker 3:	Operator `forward` ran in 0.39 s
      From worker 3:	Operator `forward` ran in 0.34 s
      From worker 2:	Operator `forward` ran in 0.34 s
      From worker 3:	Operator `forward` ran in 0.34 s
      From worker 2:	Operator `forward` ran in 0.33 s
      From worker 3:	Operator `forward` ran in 0.33 s
      From worker 2:	Operator `forward` ran in 0.33 s
      From worker 3:	Operator `forward` ran in 0.36 s
      From worker 2:	Operator `forward` ran in 0.23 s
input to PARSDMM is feasible, returning
      From worker 3:	Operator `forward` ran in 0.33 s
      From worker 2:	Operator `forward` ran in 0.37 s
      From worker 3:	Operator `forward` ran in 0.34 s
      From worker 2:	Operator `forward` ran in 0.31 s
      From worker 3:	Operator `forward` ran in 0.33 s
      From worker 2:	Operator `forward` ran in 0.37 s
      From worker 3:	Operator `forward` ran in 0.36 s
      From worker 2:	Operator `forward` ran in 0.23 s
      From worker 3:	Operator `forward` ran in 0.36 s
      From worker 2:	Operator `forward` ran in 0.36 s
      From worker 3:	Operator `gradient` ran in 0.62 s
      From worker 2:	Operator `gradient` ran in 0.62 s
      From worker 3:	Operator `forward` ran in 0.39 s
      From worker 2:	Operator `forward` ran in 0.39 s
      From worker 3:	Operator `gradient` ran in 0.62 s
      From worker 2:	Operator `gradient` ran in 0.66 s
      From worker 3:	Operator `forward` ran in 0.39 s
      From worker 2:	Operator `forward` ran in 0.39 s
      From worker 3:	Operator `gradient` ran in 0.66 s
      From worker 2:	Operator `gradient` ran in 0.68 s
      From worker 3:	Operator `forward` ran in 0.41 s
      From worker 2:	Operator `forward` ran in 0.40 s
      From worker 3:	Operator `gradient` ran in 0.71 s
      From worker 2:	Operator `gradient` ran in 0.68 s
relative evolution to small, exiting PARSDMM (iteration 15)
         3          7          4         64     1.00000e-01     3.82668e+05     1.56781e-01
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 29)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)


┌ Info: Line search failed
└ @ SlimOptim /Users/mathiaslouboutin/.julia/dev/SlimOptim/src/linesearches.jl:47


relative evolution to small, exiting PARSDMM (iteration 15)
      From worker 3:	Operator `forward` ran in 0.39 s
      From worker 2:	Operator `forward` ran in 0.37 s
      From worker 3:	Operator `forward` ran in 0.35 s
      From worker 2:	Operator `forward` ran in 0.37 s
      From worker 3:	Operator `forward` ran in 0.35 s
      From worker 2:	Operator `forward` ran in 0.36 s
      From worker 3:	Operator `forward` ran in 0.33 s
      From worker 2:	Operator `forward` ran in 0.24 s
relative evolution to small, exiting PARSDMM (iteration 15)
      From worker 3:	Operator `forward` ran in 0.37 s
      From worker 2:	Operator `forward` ran in 0.39 s
      From worker 3:	Operator `forward` ran in 0.38 s
      From worker 2:	Operator `forward` ran in 0.37 s
      From worker 3:	Operator `forward` ran in 0.38 s
      From worker 2:	Operator `forward` ran in 0.39 s
      From worker 3:	Operator `forward` ran in 0.37 s
      From worker 2:	Operator `forward` ran in 0.23 s
      From worker 3:	Operator `forward` ran in 0.43 s
      From worker 2:	Operator `forward` ran in 0.37 s
      From worker 3:	Operator `gradient` ran in 0.33 s
      From worker 2:	Operator `gradient` ran in 0.52 s
      From worker 3:	Operator `forward` ran in 0.41 s
      From worker 2:	Operator `forward` ran in 0.42 s
      From worker 3:	Operator `gradient` ran in 0.53 s
      From worker 2:	Operator `gradient` ran in 0.51 s
      From worker 3:	Operator `forward` ran in 0.38 s
      From worker 2:	Operator `forward` ran in 0.43 s
      From worker 3:	Operator `gradient` ran in 0.54 s
      From worker 2:	Operator `gradient` ran in 0.48 s
      From worker 3:	Operator `forward` ran in 0.37 s
      From worker 2:	Operator `forward` ran in 0.38 s
      From worker 3:	Operator `gradient` ran in 0.49 s
      From worker 2:	Operator `gradient` ran in 0.32 s
relative evolution to small, exiting PARSDMM (iteration 15)
         4          8          5         92     1.00000e+00     3.50573e+05     6.73204e-02
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 38)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)


┌ Info: Line search failed
└ @ SlimOptim /Users/mathiaslouboutin/.julia/dev/SlimOptim/src/linesearches.jl:47


relative evolution to small, exiting PARSDMM (iteration 15)
      From worker 2:	Operator `forward` ran in 0.35 s
      From worker 3:	Operator `forward` ran in 0.36 s
      From worker 2:	Operator `forward` ran in 0.36 s
      From worker 3:	Operator `forward` ran in 0.32 s
      From worker 2:	Operator `forward` ran in 0.38 s
      From worker 3:	Operator `forward` ran in 0.36 s
      From worker 2:	Operator `forward` ran in 0.35 s
      From worker 3:	Operator `forward` ran in 0.24 s
relative evolution to small, exiting PARSDMM (iteration 15)
      From worker 3:	Operator `forward` ran in 0.30 s
      From worker 2:	Operator `forward` ran in 0.38 s
      From worker 3:	Operator `forward` ran in 0.36 s
      From worker 2:	Operator `forward` ran in 0.36 s
      From worker 3:	Operator `forward` ran in 0.36 s
      From worker 2:	Operator `forward` ran in 0.39 s
      From worker 3:	Operator `forward` ran in 0.34 s
      From worker 2:	Operator `forward` ran in 0.24 s
      From worker 3:	Operator `forward` ran in 0.33 s
      From worker 2:	Operator `forward` ran in 0.37 s
      From worker 3:	Operator `gradient` ran in 0.67 s
      From worker 2:	Operator `gradient` ran in 0.85 s
      From worker 3:	Operator `forward` ran in 0.42 s
      From worker 2:	Operator `forward` ran in 0.44 s
      From worker 3:	Operator `gradient` ran in 0.62 s
      From worker 2:	Operator `gradient` ran in 0.60 s
      From worker 3:	Operator `forward` ran in 0.40 s
      From worker 2:	Operator `forward` ran in 0.40 s
      From worker 3:	Operator `gradient` ran in 0.62 s
      From worker 2:	Operator `gradient` ran in 0.67 s
      From worker 3:	Operator `forward` ran in 0.39 s
      From worker 2:	Operator `forward` ran in 0.41 s
      From worker 3:	Operator `gradient` ran in 0.65 s
      From worker 2:	Operator `gradient` ran in 0.66 s
relative evolution to small, exiting PARSDMM (iteration 26)
         5          9          6        116     1.00000e+00     1.17713e+05     2.24156e-02
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)


┌ Info: Line search failed
└ @ SlimOptim /Users/mathiaslouboutin/.julia/dev/SlimOptim/src/linesearches.jl:47


relative evolution to small, exiting PARSDMM (iteration 15)
      From worker 2:	Operator `forward` ran in 0.37 s
      From worker 3:	Operator `forward` ran in 0.38 s
      From worker 2:	Operator `forward` ran in 0.39 s
      From worker 3:	Operator `forward` ran in 0.34 s
      From worker 2:	Operator `forward` ran in 0.39 s
      From worker 3:	Operator `forward` ran in 0.37 s
      From worker 2:	Operator `forward` ran in 0.35 s
      From worker 3:	Operator `forward` ran in 0.22 s
relative evolution to small, exiting PARSDMM (iteration 15)
      From worker 3:	Operator `forward` ran in 0.42 s
      From worker 2:	Operator `forward` ran in 0.42 s
      From worker 3:	Operator `forward` ran in 0.37 s
      From worker 2:	Operator `forward` ran in 0.37 s
      From worker 3:	Operator `forward` ran in 0.35 s
      From worker 2:	Operator `forward` ran in 0.37 s
      From worker 3:	Operator `forward` ran in 0.36 s
      From worker 2:	Operator `forward` ran in 0.23 s
      From worker 3:	Operator `forward` ran in 0.26 s
      From worker 2:	Operator `forward` ran in 0.46 s
      From worker 3:	Operator `gradient` ran in 0.70 s
      From worker 2:	Operator `gradient` ran in 0.72 s
      From worker 3:	Operator `forward` ran in 0.44 s
      From worker 2:	Operator `forward` ran in 0.44 s
      From worker 3:	Operator `gradient` ran in 0.74 s
      From worker 2:	Operator `gradient` ran in 0.74 s
      From worker 3:	Operator `forward` ran in 0.41 s
      From worker 2:	Operator `forward` ran in 0.42 s
      From worker 3:	Operator `gradient` ran in 0.35 s
      From worker 2:	Operator `gradient` ran in 0.55 s
      From worker 3:	Operator `forward` ran in 0.38 s
      From worker 2:	Operator `forward` ran in 0.36 s
      From worker 3:	Operator `gradient` ran in 0.50 s
      From worker 2:	Operator `gradient` ran in 0.32 s
relative evolution to small, exiting PARSDMM (iteration 26)
         6         10          7        130     1.00000e+00     8.91832e+04     2.10390e-02
relative evolution to small, exiting PARSDMM (iteration 14)
relative evolution to small, exiting PARSDMM (iteration 28)
relative evolution to small, exiting PARSDMM (iteration 28)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)


┌ Info: Line search failed
└ @ SlimOptim /Users/mathiaslouboutin/.julia/dev/SlimOptim/src/linesearches.jl:47


relative evolution to small, exiting PARSDMM (iteration 15)
      From worker 2:	Operator `forward` ran in 0.38 s
      From worker 3:	Operator `forward` ran in 0.34 s
      From worker 2:	Operator `forward` ran in 0.38 s
      From worker 3:	Operator `forward` ran in 0.36 s
      From worker 2:	Operator `forward` ran in 0.38 s
      From worker 3:	Operator `forward` ran in 0.38 s
      From worker 2:	Operator `forward` ran in 0.38 s
      From worker 3:	Operator `forward` ran in 0.30 s
relative evolution to small, exiting PARSDMM (iteration 15)
      From worker 2:	Operator `forward` ran in 0.43 s
      From worker 3:	Operator `forward` ran in 0.43 s
      From worker 2:	Operator `forward` ran in 0.39 s
      From worker 3:	Operator `forward` ran in 0.37 s
      From worker 2:	Operator `forward` ran in 0.35 s
      From worker 3:	Operator `forward` ran in 0.35 s
      From worker 2:	Operator `forward` ran in 0.37 s
      From worker 3:	Operator `forward` ran in 0.25 s
      From worker 2:	Operator `forward` ran in 0.40 s
      From worker 3:	Operator `forward` ran in 0.44 s
      From worker 2:	Operator `gradient` ran in 0.58 s
      From worker 3:	Operator `gradient` ran in 0.51 s
      From worker 2:	Operator `forward` ran in 0.39 s
      From worker 3:	Operator `forward` ran in 0.38 s
      From worker 2:	Operator `gradient` ran in 0.59 s
      From worker 3:	Operator `gradient` ran in 0.49 s
      From worker 2:	Operator `forward` ran in 0.38 s
      From worker 3:	Operator `forward` ran in 0.43 s
      From worker 2:	Operator `gradient` ran in 0.58 s
      From worker 3:	Operator `gradient` ran in 0.50 s
      From worker 2:	Operator `forward` ran in 0.40 s
      From worker 3:	Operator `forward` ran in 0.41 s
      From worker 2:	Operator `gradient` ran in 0.50 s
      From worker 3:	Operator `gradient` ran in 0.40 s
relative evolution to small, exiting PARSDMM (iteration 14)
         7         11          8        146     1.00000e+00     3.31746e+04     2.72466e-02
relative evolution to small, exiting PARSDMM (iteration 14)
relative evolution to small, exiting PARSDMM (iteration 14)
relative evolution to small, exiting PARSDMM (iteration 27)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 14)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)


┌ Info: Line search failed
└ @ SlimOptim /Users/mathiaslouboutin/.julia/dev/SlimOptim/src/linesearches.jl:47


relative evolution to small, exiting PARSDMM (iteration 15)
      From worker 3:	Operator `forward` ran in 0.23 s
      From worker 2:	Operator `forward` ran in 0.38 s
      From worker 3:	Operator `forward` ran in 0.36 s
      From worker 2:	Operator `forward` ran in 0.42 s
      From worker 3:	Operator `forward` ran in 0.43 s
      From worker 2:	Operator `forward` ran in 0.38 s
      From worker 3:	Operator `forward` ran in 0.37 s
      From worker 2:	Operator `forward` ran in 0.26 s
relative evolution to small, exiting PARSDMM (iteration 15)
      From worker 2:	Operator `forward` ran in 0.37 s
      From worker 3:	Operator `forward` ran in 0.37 s
      From worker 2:	Operator `forward` ran in 0.42 s
      From worker 3:	Operator `forward` ran in 0.36 s
      From worker 2:	Operator `forward` ran in 0.45 s
      From worker 3:	Operator `forward` ran in 0.40 s
      From worker 2:	Operator `forward` ran in 0.38 s
      From worker 3:	Operator `forward` ran in 0.25 s
      From worker 3:	Operator `forward` ran in 0.26 s
      From worker 2:	Operator `forward` ran in 0.40 s
      From worker 3:	Operator `gradient` ran in 0.75 s
      From worker 2:	Operator `gradient` ran in 0.77 s
      From worker 3:	Operator `forward` ran in 0.52 s
      From worker 2:	Operator `forward` ran in 0.51 s
      From worker 3:	Operator `gradient` ran in 0.62 s
      From worker 2:	Operator `gradient` ran in 0.61 s
      From worker 3:	Operator `forward` ran in 0.46 s
      From worker 2:	Operator `forward` ran in 0.45 s
      From worker 3:	Operator `gradient` ran in 0.76 s
      From worker 2:	Operator `gradient` ran in 0.77 s
      From worker 3:	Operator `forward` ran in 0.50 s
      From worker 2:	Operator `forward` ran in 0.44 s
      From worker 3:	Operator `gradient` ran in 0.82 s
      From worker 2:	Operator `gradient` ran in 0.80 s
relative evolution to small, exiting PARSDMM (iteration 14)
         8         12          9        164     1.00000e+00     1.77415e+04     2.05675e-02
relative evolution to small, exiting PARSDMM (iteration 14)
relative evolution to small, exiting PARSDMM (iteration 27)
relative evolution to small, exiting PARSDMM (iteration 20)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)


┌ Info: Line search failed
└ @ SlimOptim /Users/mathiaslouboutin/.julia/dev/SlimOptim/src/linesearches.jl:47


relative evolution to small, exiting PARSDMM (iteration 15)
      From worker 3:	Operator `forward` ran in 0.40 s
      From worker 2:	Operator `forward` ran in 0.37 s
      From worker 3:	Operator `forward` ran in 0.38 s
      From worker 2:	Operator `forward` ran in 0.38 s
      From worker 3:	Operator `forward` ran in 0.36 s
      From worker 2:	Operator `forward` ran in 0.40 s
      From worker 3:	Operator `forward` ran in 0.39 s
      From worker 2:	Operator `forward` ran in 0.25 s
relative evolution to small, exiting PARSDMM (iteration 15)
      From worker 2:	Operator `forward` ran in 0.38 s
      From worker 3:	Operator `forward` ran in 0.38 s
      From worker 2:	Operator `forward` ran in 0.36 s
      From worker 3:	Operator `forward` ran in 0.39 s
      From worker 2:	Operator `forward` ran in 0.37 s
      From worker 3:	Operator `forward` ran in 0.37 s
      From worker 2:	Operator `forward` ran in 0.39 s
      From worker 3:	Operator `forward` ran in 0.25 s
      From worker 3:	Operator `forward` ran in 0.26 s
      From worker 2:	Operator `forward` ran in 0.53 s
      From worker 3:	Operator `gradient` ran in 0.96 s
      From worker 2:	Operator `gradient` ran in 0.97 s
      From worker 3:	Operator `forward` ran in 0.45 s
      From worker 2:	Operator `forward` ran in 0.47 s
      From worker 3:	Operator `gradient` ran in 0.78 s
      From worker 2:	Operator `gradient` ran in 0.75 s
      From worker 3:	Operator `forward` ran in 0.53 s
      From worker 2:	Operator `forward` ran in 0.57 s
      From worker 3:	Operator `gradient` ran in 0.77 s
      From worker 2:	Operator `gradient` ran in 0.78 s
      From worker 3:	Operator `forward` ran in 0.51 s
      From worker 2:	Operator `forward` ran in 0.51 s
      From worker 3:	Operator `gradient` ran in 0.70 s
      From worker 2:	Operator `gradient` ran in 0.74 s
relative evolution to small, exiting PARSDMM (iteration 14)
         9         13         10        184     1.00000e+00     1.05269e+04     1.38740e-02
relative evolution to small, exiting PARSDMM (iteration 25)
relative evolution to small, exiting PARSDMM (iteration 41)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 14)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 14)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 14)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)
relative evolution to small, exiting PARSDMM (iteration 15)


┌ Info: Line search failed
└ @ SlimOptim /Users/mathiaslouboutin/.julia/dev/SlimOptim/src/linesearches.jl:47


relative evolution to small, exiting PARSDMM (iteration 15)
      From worker 2:	Operator `forward` ran in 0.40 s
      From worker 3:	Operator `forward` ran in 0.40 s
      From worker 2:	Operator `forward` ran in 0.38 s
      From worker 3:	Operator `forward` ran in 0.39 s
      From worker 2:	Operator `forward` ran in 0.38 s
      From worker 3:	Operator `forward` ran in 0.41 s
      From worker 2:	Operator `forward` ran in 0.40 s
      From worker 3:	Operator `forward` ran in 0.27 s
relative evolution to small, exiting PARSDMM (iteration 15)
      From worker 3:	Operator `forward` ran in 0.34 s
      From worker 2:	Operator `forward` ran in 0.39 s
      From worker 3:	Operator `forward` ran in 0.40 s
      From worker 2:	Operator `forward` ran in 0.39 s
      From worker 3:	Operator `forward` ran in 0.38 s
      From worker 2:	Operator `forward` ran in 0.37 s
      From worker 3:	Operator `forward` ran in 0.37 s
      From worker 2:	Operator `forward` ran in 0.24 s
      From worker 3:	Operator `forward` ran in 0.40 s
      From worker 2:	Operator `forward` ran in 0.37 s
      From worker 3:	Operator `gradient` ran in 0.81 s
      From worker 2:	Operator `gradient` ran in 0.81 s
      From worker 2:	Operator `forward` ran in 0.39 s
      From worker 3:	Operator `forward` ran in 0.40 s
      From worker 2:	Operator `gradient` ran in 0.54 s
      From worker 3:	Operator `gradient` ran in 0.58 s
      From worker 2:	Operator `forward` ran in 0.54 s
      From worker 3:	Operator `forward` ran in 0.52 s
      From worker 2:	Operator `gradient` ran in 0.67 s
      From worker 3:	Operator `gradient` ran in 0.52 s
      From worker 2:	Operator `forward` ran in 0.37 s
      From worker 3:	Operator `forward` ran in 0.45 s
      From worker 2:	Operator `gradient` ran in 0.58 s
      From worker 3:	Operator `gradient` ran in 0.35 s
relative evolution to small, exiting PARSDMM (iteration 14)
        10         14         11        216     1.00000e+00     5.58767e+03     9.81355e-03
sol2 = pqn(f, g!, fg!, vec(m0), prj2, options_pqn);
Running PQN...
Number of L-BFGS Corrections to store: 10
Spectral initialization of SPG: 1
Maximum number of SPG iterations: 100
SPG optimality tolerance: 1.00e-06
SPG progress tolerance: 1.00e-07
PQN optimality tolerance: 1.00e-05
PQN progress tolerance: 0.00e+00
Quadratic initialization of line search: 0
Maximum number of iterations: 10
Line search: BackTracking{Float32, Int64}
input to PARSDMM is feasible, returning
      From worker 2:	Operator `forward` ran in 0.41 s
      From worker 3:	Operator `forward` ran in 0.33 s
      From worker 2:	Operator `forward` ran in 0.33 s
      From worker 3:	Operator `forward` ran in 0.33 s
      From worker 2:	Operator `forward` ran in 0.33 s
      From worker 3:	Operator `forward` ran in 0.31 s
      From worker 2:	Operator `forward` ran in 0.31 s
      From worker 3:	Operator `forward` ran in 0.22 s
      From worker 2:	Operator `forward` ran in 0.36 s
      From worker 3:	Operator `forward` ran in 0.40 s
      From worker 2:	Operator `gradient` ran in 0.50 s
      From worker 3:	Operator `gradient` ran in 0.47 s
      From worker 2:	Operator `forward` ran in 0.37 s
      From worker 3:	Operator `forward` ran in 0.43 s
      From worker 2:	Operator `gradient` ran in 0.54 s
      From worker 3:	Operator `gradient` ran in 0.43 s
      From worker 2:	Operator `forward` ran in 0.34 s
      From worker 3:	Operator `forward` ran in 0.39 s
      From worker 2:	Operator `gradient` ran in 0.47 s
      From worker 3:	Operator `gradient` ran in 0.42 s
      From worker 2:	Operator `forward` ran in 0.36 s
      From worker 3:	Operator `forward` ran in 0.38 s
      From worker 2:	Operator `gradient` ran in 0.48 s
      From worker 3:	Operator `gradient` ran in 0.29 s
 Iteration   FunEvals  GradEvals Projections     Step Length    Function Val        Opt Cond
input to PARSDMM is feasible, returning
         0          0          0          0     0.00000e+00     8.04514e+05     2.50000e-01
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
      From worker 2:	Operator `forward` ran in 0.41 s
      From worker 3:	Operator `forward` ran in 0.51 s
      From worker 2:	Operator `forward` ran in 0.48 s
      From worker 3:	Operator `forward` ran in 0.48 s
      From worker 2:	Operator `forward` ran in 0.52 s
      From worker 3:	Operator `forward` ran in 0.51 s
      From worker 2:	Operator `forward` ran in 0.50 s
      From worker 3:	Operator `forward` ran in 0.33 s
      From worker 3:	Operator `forward` ran in 0.29 s
      From worker 2:	Operator `forward` ran in 0.35 s
      From worker 3:	Operator `forward` ran in 0.32 s
      From worker 2:	Operator `forward` ran in 0.33 s
      From worker 3:	Operator `forward` ran in 0.37 s
      From worker 2:	Operator `forward` ran in 0.34 s
      From worker 3:	Operator `forward` ran in 0.37 s
      From worker 2:	Operator `forward` ran in 0.22 s
input to PARSDMM is feasible, returning
      From worker 3:	Operator `forward` ran in 0.36 s
      From worker 2:	Operator `forward` ran in 0.34 s
      From worker 3:	Operator `forward` ran in 0.36 s
      From worker 2:	Operator `forward` ran in 0.34 s
      From worker 3:	Operator `forward` ran in 0.34 s
      From worker 2:	Operator `forward` ran in 0.38 s
      From worker 3:	Operator `forward` ran in 0.35 s
      From worker 2:	Operator `forward` ran in 0.22 s
      From worker 2:	Operator `forward` ran in 0.37 s
      From worker 3:	Operator `forward` ran in 0.39 s
      From worker 2:	Operator `gradient` ran in 0.73 s
      From worker 3:	Operator `gradient` ran in 0.77 s
      From worker 2:	Operator `forward` ran in 0.35 s
      From worker 3:	Operator `forward` ran in 0.38 s
      From worker 2:	Operator `gradient` ran in 0.50 s
      From worker 3:	Operator `gradient` ran in 0.51 s
      From worker 2:	Operator `forward` ran in 0.35 s
      From worker 3:	Operator `forward` ran in 0.46 s
      From worker 2:	Operator `gradient` ran in 0.59 s
      From worker 3:	Operator `gradient` ran in 0.48 s
      From worker 2:	Operator `forward` ran in 0.37 s
      From worker 3:	Operator `forward` ran in 0.42 s
      From worker 2:	Operator `gradient` ran in 0.56 s
      From worker 3:	Operator `gradient` ran in 0.33 s
input to PARSDMM is feasible, returning
         1          3          2          6     1.00000e-01     4.12124e+05     1.59019e-01
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
      From worker 2:	Operator `forward` ran in 0.40 s
      From worker 3:	Operator `forward` ran in 0.39 s
      From worker 2:	Operator `forward` ran in 0.36 s
      From worker 3:	Operator `forward` ran in 0.37 s
      From worker 2:	Operator `forward` ran in 0.43 s
      From worker 3:	Operator `forward` ran in 0.39 s
      From worker 2:	Operator `forward` ran in 0.64 s
      From worker 3:	Operator `forward` ran in 0.26 s
      From worker 2:	Operator `forward` ran in 0.22 s
      From worker 3:	Operator `forward` ran in 0.34 s
      From worker 2:	Operator `forward` ran in 0.35 s
      From worker 3:	Operator `forward` ran in 0.35 s
      From worker 2:	Operator `forward` ran in 0.34 s
      From worker 3:	Operator `forward` ran in 0.37 s
      From worker 2:	Operator `forward` ran in 0.35 s
      From worker 3:	Operator `forward` ran in 0.23 s
input to PARSDMM is feasible, returning
      From worker 2:	Operator `forward` ran in 0.36 s
      From worker 3:	Operator `forward` ran in 0.37 s
      From worker 2:	Operator `forward` ran in 0.36 s
      From worker 3:	Operator `forward` ran in 0.45 s
      From worker 2:	Operator `forward` ran in 0.35 s
      From worker 3:	Operator `forward` ran in 0.34 s
      From worker 2:	Operator `forward` ran in 0.36 s
      From worker 3:	Operator `forward` ran in 0.24 s
      From worker 2:	Operator `forward` ran in 0.36 s
      From worker 3:	Operator `forward` ran in 0.40 s
      From worker 3:	Operator `gradient` ran in 0.75 s
      From worker 2:	Operator `gradient` ran in 0.75 s
      From worker 2:	Operator `forward` ran in 0.42 s
      From worker 3:	Operator `forward` ran in 0.46 s
      From worker 2:	Operator `gradient` ran in 0.61 s
      From worker 3:	Operator `gradient` ran in 0.47 s
      From worker 2:	Operator `forward` ran in 0.36 s
      From worker 3:	Operator `forward` ran in 0.44 s
      From worker 2:	Operator `gradient` ran in 0.58 s
      From worker 3:	Operator `gradient` ran in 0.49 s
      From worker 2:	Operator `forward` ran in 0.41 s
      From worker 3:	Operator `forward` ran in 0.37 s
      From worker 2:	Operator `gradient` ran in 0.51 s
      From worker 3:	Operator `gradient` ran in 0.31 s
input to PARSDMM is feasible, returning
         2          5          3         42     1.00000e-01     2.75734e+05     1.35675e-01
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
      From worker 2:	Operator `forward` ran in 0.39 s
      From worker 3:	Operator `forward` ran in 0.36 s
      From worker 2:	Operator `forward` ran in 0.40 s
      From worker 3:	Operator `forward` ran in 0.36 s
      From worker 2:	Operator `forward` ran in 0.37 s
      From worker 3:	Operator `forward` ran in 0.38 s
      From worker 2:	Operator `forward` ran in 0.39 s
      From worker 3:	Operator `forward` ran in 0.34 s
input to PARSDMM is feasible, returning
      From worker 3:	Operator `forward` ran in 0.38 s
      From worker 2:	Operator `forward` ran in 0.40 s
      From worker 3:	Operator `forward` ran in 0.39 s
      From worker 2:	Operator `forward` ran in 0.36 s
      From worker 3:	Operator `forward` ran in 0.37 s
      From worker 2:	Operator `forward` ran in 0.38 s
      From worker 3:	Operator `forward` ran in 0.36 s
      From worker 2:	Operator `forward` ran in 0.23 s
      From worker 3:	Operator `forward` ran in 0.26 s
      From worker 2:	Operator `forward` ran in 0.38 s
      From worker 3:	Operator `gradient` ran in 0.77 s
      From worker 2:	Operator `gradient` ran in 0.79 s
      From worker 3:	Operator `forward` ran in 0.67 s
      From worker 2:	Operator `forward` ran in 0.60 s
      From worker 3:	Operator `gradient` ran in 0.99 s
      From worker 2:	Operator `gradient` ran in 0.99 s
      From worker 3:	Operator `forward` ran in 0.54 s
      From worker 2:	Operator `forward` ran in 0.48 s
      From worker 3:	Operator `gradient` ran in 0.73 s
      From worker 2:	Operator `gradient` ran in 0.93 s
      From worker 3:	Operator `forward` ran in 0.41 s
      From worker 2:	Operator `forward` ran in 0.48 s
      From worker 3:	Operator `gradient` ran in 0.67 s
      From worker 2:	Operator `gradient` ran in 0.42 s
input to PARSDMM is feasible, returning
         3          6          4         70     1.00000e+00     1.12580e+05     1.14484e-01
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
      From worker 2:	Operator `forward` ran in 0.39 s
      From worker 3:	Operator `forward` ran in 0.43 s
      From worker 2:	Operator `forward` ran in 0.42 s
      From worker 3:	Operator `forward` ran in 0.42 s
      From worker 2:	Operator `forward` ran in 0.53 s
      From worker 3:	Operator `forward` ran in 0.47 s
      From worker 2:	Operator `forward` ran in 0.51 s
      From worker 3:	Operator `forward` ran in 0.52 s
input to PARSDMM is feasible, returning
      From worker 2:	Operator `forward` ran in 0.51 s
      From worker 3:	Operator `forward` ran in 0.37 s
      From worker 2:	Operator `forward` ran in 0.37 s
      From worker 3:	Operator `forward` ran in 0.39 s
      From worker 2:	Operator `forward` ran in 0.37 s
      From worker 3:	Operator `forward` ran in 0.35 s
      From worker 2:	Operator `forward` ran in 0.38 s
      From worker 3:	Operator `forward` ran in 0.23 s
      From worker 2:	Operator `forward` ran in 0.40 s
      From worker 3:	Operator `forward` ran in 0.37 s
      From worker 2:	Operator `gradient` ran in 0.84 s
      From worker 3:	Operator `gradient` ran in 0.84 s
      From worker 2:	Operator `forward` ran in 0.43 s
      From worker 3:	Operator `forward` ran in 0.47 s
      From worker 2:	Operator `gradient` ran in 0.64 s
      From worker 3:	Operator `gradient` ran in 0.69 s
      From worker 2:	Operator `forward` ran in 0.44 s
      From worker 3:	Operator `forward` ran in 0.46 s
      From worker 2:	Operator `gradient` ran in 0.78 s
      From worker 3:	Operator `gradient` ran in 0.79 s
      From worker 2:	Operator `forward` ran in 0.40 s
      From worker 3:	Operator `forward` ran in 0.47 s
      From worker 2:	Operator `gradient` ran in 0.60 s
      From worker 3:	Operator `gradient` ran in 0.41 s
input to PARSDMM is feasible, returning
         4          7          5         94     1.00000e+00     3.94970e+04     4.63609e-02
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
      From worker 2:	Operator `forward` ran in 0.43 s
      From worker 3:	Operator `forward` ran in 0.38 s
      From worker 2:	Operator `forward` ran in 0.36 s
      From worker 3:	Operator `forward` ran in 0.38 s
      From worker 2:	Operator `forward` ran in 0.37 s
      From worker 3:	Operator `forward` ran in 0.36 s
      From worker 2:	Operator `forward` ran in 0.36 s
      From worker 3:	Operator `forward` ran in 0.24 s
input to PARSDMM is feasible, returning
      From worker 3:	Operator `forward` ran in 0.37 s
      From worker 2:	Operator `forward` ran in 0.34 s
      From worker 3:	Operator `forward` ran in 0.37 s
      From worker 2:	Operator `forward` ran in 0.48 s
      From worker 3:	Operator `forward` ran in 0.32 s
      From worker 2:	Operator `forward` ran in 0.37 s
      From worker 3:	Operator `forward` ran in 0.38 s
      From worker 2:	Operator `forward` ran in 0.23 s
      From worker 2:	Operator `forward` ran in 0.32 s
      From worker 3:	Operator `forward` ran in 0.56 s
      From worker 2:	Operator `gradient` ran in 0.43 s
      From worker 3:	Operator `gradient` ran in 0.51 s
      From worker 2:	Operator `forward` ran in 0.40 s
      From worker 3:	Operator `forward` ran in 0.43 s
      From worker 2:	Operator `gradient` ran in 0.51 s
      From worker 3:	Operator `gradient` ran in 0.46 s
      From worker 2:	Operator `forward` ran in 0.39 s
      From worker 3:	Operator `forward` ran in 0.39 s
      From worker 2:	Operator `gradient` ran in 0.50 s
      From worker 3:	Operator `gradient` ran in 0.52 s
      From worker 2:	Operator `forward` ran in 0.37 s
      From worker 3:	Operator `forward` ran in 0.36 s
      From worker 2:	Operator `gradient` ran in 0.44 s
      From worker 3:	Operator `gradient` ran in 0.35 s
input to PARSDMM is feasible, returning
         5          8          6        118     1.00000e+00     2.78628e+04     2.88242e-02
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
      From worker 3:	Operator `forward` ran in 0.37 s
      From worker 2:	Operator `forward` ran in 0.36 s
      From worker 3:	Operator `forward` ran in 0.35 s
      From worker 2:	Operator `forward` ran in 0.36 s
      From worker 3:	Operator `forward` ran in 0.38 s
      From worker 2:	Operator `forward` ran in 0.38 s
      From worker 3:	Operator `forward` ran in 0.36 s
      From worker 2:	Operator `forward` ran in 0.24 s
input to PARSDMM is feasible, returning
      From worker 2:	Operator `forward` ran in 0.35 s
      From worker 3:	Operator `forward` ran in 0.37 s
      From worker 2:	Operator `forward` ran in 0.39 s
      From worker 3:	Operator `forward` ran in 0.34 s
      From worker 2:	Operator `forward` ran in 0.37 s
      From worker 3:	Operator `forward` ran in 0.29 s
      From worker 2:	Operator `forward` ran in 0.36 s
      From worker 3:	Operator `forward` ran in 0.25 s
      From worker 2:	Operator `forward` ran in 0.40 s
      From worker 3:	Operator `forward` ran in 0.45 s
      From worker 2:	Operator `gradient` ran in 0.62 s
      From worker 3:	Operator `gradient` ran in 0.58 s
      From worker 2:	Operator `forward` ran in 0.35 s
      From worker 3:	Operator `forward` ran in 0.45 s
      From worker 2:	Operator `gradient` ran in 0.59 s
      From worker 3:	Operator `gradient` ran in 0.50 s
      From worker 2:	Operator `forward` ran in 0.40 s
      From worker 3:	Operator `forward` ran in 0.44 s
      From worker 2:	Operator `gradient` ran in 0.58 s
      From worker 3:	Operator `gradient` ran in 0.56 s
      From worker 2:	Operator `forward` ran in 0.37 s
      From worker 3:	Operator `forward` ran in 0.43 s
      From worker 2:	Operator `gradient` ran in 0.60 s
      From worker 3:	Operator `gradient` ran in 0.35 s
input to PARSDMM is feasible, returning
         6          9          7        150     1.00000e+00     1.45960e+04     2.03700e-02
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
      From worker 3:	Operator `forward` ran in 0.38 s
      From worker 2:	Operator `forward` ran in 0.37 s
      From worker 3:	Operator `forward` ran in 0.37 s
      From worker 2:	Operator `forward` ran in 0.35 s
      From worker 3:	Operator `forward` ran in 0.41 s
      From worker 2:	Operator `forward` ran in 0.35 s
      From worker 3:	Operator `forward` ran in 0.38 s
      From worker 2:	Operator `forward` ran in 0.24 s
input to PARSDMM is feasible, returning
      From worker 2:	Operator `forward` ran in 0.38 s
      From worker 3:	Operator `forward` ran in 0.39 s
      From worker 2:	Operator `forward` ran in 0.37 s
      From worker 3:	Operator `forward` ran in 0.40 s
      From worker 2:	Operator `forward` ran in 0.38 s
      From worker 3:	Operator `forward` ran in 0.38 s
      From worker 2:	Operator `forward` ran in 0.38 s
      From worker 3:	Operator `forward` ran in 0.23 s
      From worker 2:	Operator `forward` ran in 0.37 s
      From worker 3:	Operator `forward` ran in 0.50 s
      From worker 2:	Operator `gradient` ran in 0.64 s
      From worker 3:	Operator `gradient` ran in 0.56 s
      From worker 2:	Operator `forward` ran in 0.36 s
      From worker 3:	Operator `forward` ran in 0.49 s
      From worker 2:	Operator `gradient` ran in 0.64 s
      From worker 3:	Operator `gradient` ran in 0.51 s
      From worker 2:	Operator `forward` ran in 0.41 s
      From worker 3:	Operator `forward` ran in 0.44 s
      From worker 2:	Operator `gradient` ran in 0.60 s
      From worker 3:	Operator `gradient` ran in 0.52 s
      From worker 2:	Operator `forward` ran in 0.42 s
      From worker 3:	Operator `forward` ran in 0.37 s
      From worker 2:	Operator `gradient` ran in 0.54 s
      From worker 3:	Operator `gradient` ran in 0.34 s
input to PARSDMM is feasible, returning
         7         10          8        190     1.00000e+00     7.63842e+03     1.36674e-02
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
      From worker 3:	Operator `forward` ran in 0.23 s
      From worker 2:	Operator `forward` ran in 0.40 s
      From worker 3:	Operator `forward` ran in 0.43 s
      From worker 2:	Operator `forward` ran in 0.37 s
      From worker 3:	Operator `forward` ran in 0.37 s
      From worker 2:	Operator `forward` ran in 0.37 s
      From worker 3:	Operator `forward` ran in 0.38 s
      From worker 2:	Operator `forward` ran in 0.26 s
input to PARSDMM is feasible, returning
      From worker 3:	Operator `forward` ran in 0.38 s
      From worker 2:	Operator `forward` ran in 0.33 s
      From worker 3:	Operator `forward` ran in 0.36 s
      From worker 2:	Operator `forward` ran in 0.34 s
      From worker 3:	Operator `forward` ran in 0.33 s
      From worker 2:	Operator `forward` ran in 0.34 s
      From worker 3:	Operator `forward` ran in 0.33 s
      From worker 2:	Operator `forward` ran in 0.24 s
      From worker 2:	Operator `forward` ran in 0.26 s
      From worker 3:	Operator `forward` ran in 0.44 s
      From worker 2:	Operator `gradient` ran in 0.80 s
      From worker 3:	Operator `gradient` ran in 0.80 s
      From worker 2:	Operator `forward` ran in 0.38 s
      From worker 3:	Operator `forward` ran in 0.40 s
      From worker 2:	Operator `gradient` ran in 0.53 s
      From worker 3:	Operator `gradient` ran in 0.53 s
      From worker 2:	Operator `forward` ran in 0.41 s
      From worker 3:	Operator `forward` ran in 0.44 s
      From worker 2:	Operator `gradient` ran in 0.48 s
      From worker 3:	Operator `gradient` ran in 0.53 s
      From worker 2:	Operator `forward` ran in 0.37 s
      From worker 3:	Operator `forward` ran in 0.42 s
      From worker 2:	Operator `gradient` ran in 0.58 s
      From worker 3:	Operator `gradient` ran in 0.38 s
input to PARSDMM is feasible, returning
         8         11          9        238     1.00000e+00     3.18718e+03     1.09845e-02
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
      From worker 3:	Operator `forward` ran in 0.37 s
      From worker 2:	Operator `forward` ran in 0.40 s
      From worker 3:	Operator `forward` ran in 0.38 s
      From worker 2:	Operator `forward` ran in 0.38 s
      From worker 3:	Operator `forward` ran in 0.34 s
      From worker 2:	Operator `forward` ran in 0.39 s
      From worker 3:	Operator `forward` ran in 0.35 s
      From worker 2:	Operator `forward` ran in 0.37 s
input to PARSDMM is feasible, returning
      From worker 3:	Operator `forward` ran in 0.44 s
      From worker 2:	Operator `forward` ran in 0.40 s
      From worker 3:	Operator `forward` ran in 0.37 s
      From worker 2:	Operator `forward` ran in 0.34 s
      From worker 3:	Operator `forward` ran in 0.37 s
      From worker 2:	Operator `forward` ran in 0.36 s
      From worker 3:	Operator `forward` ran in 0.40 s
      From worker 2:	Operator `forward` ran in 0.24 s
      From worker 3:	Operator `forward` ran in 0.38 s
      From worker 2:	Operator `forward` ran in 0.43 s
      From worker 3:	Operator `gradient` ran in 0.61 s
      From worker 2:	Operator `gradient` ran in 0.51 s
      From worker 3:	Operator `forward` ran in 0.38 s
      From worker 2:	Operator `forward` ran in 0.41 s
      From worker 3:	Operator `gradient` ran in 0.65 s
      From worker 2:	Operator `gradient` ran in 0.52 s
      From worker 3:	Operator `forward` ran in 0.43 s
      From worker 2:	Operator `forward` ran in 0.44 s
      From worker 3:	Operator `gradient` ran in 0.52 s
      From worker 2:	Operator `gradient` ran in 0.51 s
      From worker 3:	Operator `forward` ran in 0.40 s
      From worker 2:	Operator `forward` ran in 0.42 s
      From worker 3:	Operator `gradient` ran in 0.51 s
      From worker 2:	Operator `gradient` ran in 0.34 s
input to PARSDMM is feasible, returning
         9         12         10        292     1.00000e+00     2.62946e+03     1.24063e-02
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
input to PARSDMM is feasible, returning
      From worker 3:	Operator `forward` ran in 0.40 s
      From worker 2:	Operator `forward` ran in 0.39 s
      From worker 3:	Operator `forward` ran in 0.39 s
      From worker 2:	Operator `forward` ran in 0.59 s
      From worker 3:	Operator `forward` ran in 0.36 s
      From worker 2:	Operator `forward` ran in 0.38 s
      From worker 3:	Operator `forward` ran in 0.37 s
      From worker 2:	Operator `forward` ran in 0.24 s
input to PARSDMM is feasible, returning
      From worker 3:	Operator `forward` ran in 0.39 s
      From worker 2:	Operator `forward` ran in 0.38 s
      From worker 3:	Operator `forward` ran in 0.37 s
      From worker 2:	Operator `forward` ran in 0.38 s
      From worker 3:	Operator `forward` ran in 0.38 s
      From worker 2:	Operator `forward` ran in 0.46 s
      From worker 3:	Operator `forward` ran in 0.37 s
      From worker 2:	Operator `forward` ran in 0.24 s
      From worker 3:	Operator `forward` ran in 0.40 s
      From worker 2:	Operator `forward` ran in 0.37 s
      From worker 3:	Operator `gradient` ran in 0.74 s
      From worker 2:	Operator `gradient` ran in 0.76 s
      From worker 3:	Operator `forward` ran in 0.46 s
      From worker 2:	Operator `forward` ran in 0.46 s
      From worker 3:	Operator `gradient` ran in 0.78 s
      From worker 2:	Operator `gradient` ran in 0.82 s
      From worker 3:	Operator `forward` ran in 0.52 s
      From worker 2:	Operator `forward` ran in 0.50 s
      From worker 3:	Operator `gradient` ran in 0.78 s
      From worker 2:	Operator `gradient` ran in 0.78 s
      From worker 3:	Operator `forward` ran in 0.44 s
      From worker 2:	Operator `forward` ran in 0.47 s
      From worker 3:	Operator `gradient` ran in 0.73 s
      From worker 2:	Operator `gradient` ran in 0.71 s
input to PARSDMM is feasible, returning
        10         13         11        338     1.00000e+00     1.73191e+03     5.47692e-03
mf = reshape(prj(sol.x), n) # optimal solution
ϕ = sol.ϕ_trace   # cost vs iteration
m1 = sol.x_trace  # model vs iteration
collect(m1[i] = reshape(m1[i], n) for i=1:length(ϕ));
relative evolution to small, exiting PARSDMM (iteration 15)
mf2 = reshape(prj(sol2.x), n) # optimal solution
ϕ2 = sol2.ϕ_trace   # cost vs iteration
m2 = sol2.x_trace  # model vs iteration
collect(m2[i] = reshape(m2[i], n) for i=1:length(ϕ2));
relative evolution to small, exiting PARSDMM (iteration 15)

Visualize velocity models and objective function

figure(figsize=(8,9)); clf()

subplot(4,1,1);imshow(m0',aspect="auto",cmap="jet");
colorbar(orientation="vertical");clim(vmin,vmax);title("Initial Velocity");

subplot(4,1,2);imshow(mf2',aspect="auto",cmap="jet");
colorbar(orientation="vertical");clim(vmin,vmax);title("FWI Velocity");

subplot(4,1,3);imshow(mf',aspect="auto",cmap="jet");
colorbar(orientation="vertical");clim(vmin,vmax);title("FWI Velocity with TV");

subplot(4,1,4);imshow(m',aspect="auto",cmap="jet");
colorbar(orientation="vertical");clim(vmin,vmax);title("True Velocity")

tight_layout()

png

Display the velocity difference models

rms_v2 = @sprintf("%.1f m/s", sqrt(norm(m .- m0)^2 / length(m)))
rms_vf = @sprintf("%.1f m/s", sqrt(norm(m .- mf)^2 / length(m)))
rms_vf2 = @sprintf("%.1f m/s", sqrt(norm(m .- mf2)^2 / length(m)))

figure(figsize=(8,6)); clf()

subplot(3,1,1);imshow(m .- m0,aspect="auto",cmap="seismic");
colorbar(orientation="vertical");clim(dmin,dmax);
title("Vtrue - Vinit difference, rms=$(rms_v2)");

subplot(3,1,2);imshow(m .- mf,aspect="auto",cmap="seismic");
colorbar(orientation="vertical");clim(dmin,dmax);
title("Vtrue - Vfwi difference, rms=$(rms_vf)");

subplot(3,1,3);imshow(m .- mf2,aspect="auto",cmap="seismic");
colorbar(orientation="vertical");clim(dmin,dmax);
title("Vtrue - Vfwi_TV difference, rms=$(rms_vf2)");

tight_layout()

png

Display the cost function

figure(figsize=(8,4)); clf()
iters = [0:1:niter;]
plot(ϕ[2:end] ./ ϕ[2], marker="o", label="FWI_TV")
plot(ϕ2[2:end] ./ ϕ2[2], marker="o", label="FWI")
ylim([0,1.05])
xlabel("Nonlinear Iteration")
ylabel("Normalized cost ||f(v) - d||")
title(@sprintf("FWI Objective Function reduced %.1f percent and %.1f percent with TV",
               100 * (ϕ[2] - ϕ[end]) / ϕ[2], 100 * (ϕ2[2] - ϕ2[end]) / ϕ2[2]));
tight_layout()

png

Display data misfit vs model misfit

figure(figsize=(8,4)); clf()

c = [norm(m1[i] .- m, 2) for i in 1:length(m1)]
c2 = [norm(m2[i] .- m, 2) for i in 1:length(m2)]
loglog(c[2:end], ϕ[2:end], label="FWI_TV", marker="s", linewidth=1)
loglog(c2[2:end], ϕ2[2:end], label="FWI", marker="s", linewidth=1)
legend()
xlabel("Log Model residual")
ylabel("Log Data residual")
title("Misfit Trajectory, LOOK AT THAT TV MODEL ERROR");
tight_layout()

png

Visualize data match

Generate data in the FWI velocity model

tf = @elapsed begin
    F0.model.m .= vec(mf)
    df = F0*fsrc;
end
@show tf;

tf2 = @elapsed begin
    F0.model.m .= vec(mf2)
    df2 = F0*fsrc;
end
@show tf2;
      From worker 2:	Operator `forward` ran in 0.24 s
      From worker 3:	Operator `forward` ran in 0.37 s
      From worker 2:	Operator `forward` ran in 0.48 s
      From worker 3:	Operator `forward` ran in 0.41 s
      From worker 2:	Operator `forward` ran in 0.39 s
      From worker 3:	Operator `forward` ran in 0.34 s
      From worker 2:	Operator `forward` ran in 0.37 s
      From worker 3:	Operator `forward` ran in 0.24 s
tf = 10.834594565
      From worker 3:	Operator `forward` ran in 0.38 s
      From worker 2:	Operator `forward` ran in 0.41 s
      From worker 3:	Operator `forward` ran in 0.38 s
      From worker 2:	Operator `forward` ran in 0.38 s
      From worker 3:	Operator `forward` ran in 0.45 s
      From worker 2:	Operator `forward` ran in 0.38 s
      From worker 3:	Operator `forward` ran in 0.38 s
      From worker 2:	Operator `forward` ran in 0.25 s
tf2 = 10.631615719

Compute residuals

rf = df - dobs;
rf2 = df2 - dobs;

Plot shot gathers for true, initial model, and fwi models

The table below describes the data images below. We will flip the direction of the residual and modeled data in order to help display the match with the true data. We include the initial data as shown above for easier comparison.

<table style="border:1px solid black;" width="60%"> <tr> <td style="border:1px solid black; text-align:center;" bgcolor="white"> <b>Initial Residual Data<br>(flipped)</b></td> <td style="border:1px solid black; text-align:center;" bgcolor="white"> <b>True Data</b></td> <td style="border:1px solid black; text-align:center;" bgcolor="white"> <b>Initial Data<br>(flipped)</b></td> </tr> <tr> <td style="border:1px solid black; text-align:center;" bgcolor="white"> <b>FWI Residual Data<br>(flipped)</b></td> <td style="border:1px solid black; text-align:center;" bgcolor="white"> <b>True Data</b></td> <td style="border:1px solid black; text-align:center;" bgcolor="white"> <b>FWI Data<br>(flipped)</b></td> </tr> </table>

We first make a function to create the plots that we can re-use for the selected shots.

zsrc = trunc.([zsrc[i][1] for i=1:nsrc]; digits=6)
function make_plot(index)
    figure(figsize=(8,6)); clf()
    cat2 = hcat(reverse(r.data[index],dims=2), pad, dobs.data[index], pad, reverse(d0.data[index],dims=2))
    catf = hcat(reverse(rf.data[index],dims=2), pad, dobs.data[index], pad, reverse(df.data[index],dims=2))
    catf2 = hcat(reverse(rf2.data[index],dims=2), pad, dobs.data[index], pad, reverse(df.data[index],dims=2))
    subplot(3,1,1);
    imshow(cat2,cmap="gray",aspect="auto",clim=[-1,+1]);
    title(" Initial Residual sz=$(zsrc[index])   ||   True sz=$(zsrc[index])   ||   Initial sz=$(zsrc[index]) (flipped)");
    subplot(3,1,2);
    imshow(catf2,cmap="gray",aspect="auto",clim=[-1,+1]);
    title(" FWI Residual sz=$(zsrc[index])   ||   True sz=$(zsrc[index])   ||   FWI sz=$(zsrc[index]) (flipped)");
    tight_layout()
    subplot(3,1,3);
    imshow(catf,cmap="gray",aspect="auto",clim=[-1,+1]);
    title("TV FWI Residual sz=$(zsrc[index])   ||   True sz=$(zsrc[index])   ||   FWI sz=$(zsrc[index]) (flipped)");
    tight_layout()
end
make_plot (generic function with 1 method)

Data for the 1st shot, generated in the initial and FWI models

make_plot(1)

png

Data for the 4th shot, generated in the initial and FWI models

make_plot(4)

png

Data for the 8th shot, generated in the initial and FWI models

make_plot(8)

png

Remove workers

rmprocs(workers());
┌ Warning: rmprocs: process 1 not removed
└ @ Distributed /Users/julia/buildbot/worker/package_macos64/build/usr/share/julia/stdlib/v1.6/Distributed/src/cluster.jl:1038