11using Printf: @printf
2- using Accessors: @set
32
43@kwdef mutable struct ApplyExpProblem{State} <: AbstractProblem
54 operator
@@ -11,66 +10,69 @@ operator(A::ApplyExpProblem) = A.operator
1110state (A:: ApplyExpProblem ) = A. state
1211current_exponent (A:: ApplyExpProblem ) = A. current_exponent
1312function current_time (A:: ApplyExpProblem )
14- t = im* A. current_exponent
13+ t = im * A. current_exponent
1514 return iszero (imag (t)) ? real (t) : t
1615end
1716
18- set_operator (A:: ApplyExpProblem , operator) = (@set A. operator = operator)
19- set_state (A:: ApplyExpProblem , state) = (@set A. state = state)
20- set_current_exponent (A:: ApplyExpProblem , exponent) = (@set A. current_exponent = exponent)
21-
22- function region_plan (A:: ApplyExpProblem ; nsites, time_step, sweep_kwargs... )
23- return applyexp_regions (state (A), time_step; nsites, sweep_kwargs... )
17+ # Rename region_plan
18+ function region_plan (A:: ApplyExpProblem ; nsites, exponent_step, sweep_kwargs... )
19+ # The `exponent_step` kwarg for the `update!` function needs some pre-processing.
20+ return applyexp_regions (state (A), exponent_step; nsites, sweep_kwargs... )
2421end
2522
26- function update (
27- prob:: ApplyExpProblem ,
28- local_state,
29- region_iterator;
23+ function update! (
24+ region_iter:: RegionIterator{<:ApplyExpProblem} ,
25+ local_state;
3026 nsites,
3127 exponent_step,
3228 solver= runge_kutta_solver,
33- outputlevel,
34- kws... ,
3529)
36- iszero (abs (exponent_step)) && return prob, local_state
30+ prob = problem (region_iter)
31+
32+ if iszero (abs (exponent_step))
33+ return region_iter, local_state
34+ end
3735
38- local_state, info = solver (
39- x-> optimal_map (operator (prob), x), exponent_step, local_state; kws...
36+ solver_kwargs = region_kwargs (solver, region_iter)
37+
38+ local_state, _ = solver (
39+ x -> optimal_map (operator (prob), x), exponent_step, local_state; solver_kwargs...
4040 )
41- if nsites== 1
42- curr_reg = current_region (region_iterator )
43- next_reg = next_region (region_iterator )
41+ if nsites == 1
42+ curr_reg = current_region (region_iter )
43+ next_reg = next_region (region_iter )
4444 if ! isnothing (next_reg) && next_reg != curr_reg
4545 next_edge = first (edge_sequence_between_regions (state (prob), curr_reg, next_reg))
4646 v1, v2 = src (next_edge), dst (next_edge)
4747 psi = copy (state (prob))
4848 psi[v1], R = qr (local_state, uniqueinds (local_state, psi[v2]))
49- shifted_operator = position (operator (prob), psi, NamedEdge (v1=> v2))
50- R_t, _ = solver (x-> optimal_map (shifted_operator, x), - exponent_step, R; kws... )
51- local_state = psi[v1]* R_t
49+ shifted_operator = position (operator (prob), psi, NamedEdge (v1 => v2))
50+ R_t, _ = solver (
51+ x -> optimal_map (shifted_operator, x), - exponent_step, R; solver_kwargs...
52+ )
53+ local_state = psi[v1] * R_t
5254 end
5355 end
5456
55- prob = set_current_exponent (prob, current_exponent (prob) + exponent_step)
57+ prob. current_exponent += exponent_step
5658
57- return prob , local_state
59+ return region_iter , local_state
5860end
5961
60- function sweep_callback (
61- problem :: ApplyExpProblem ;
62+ function default_sweep_callback (
63+ sweep_iterator :: SweepIterator{<: ApplyExpProblem} ;
6264 exponent_description= " exponent" ,
63- outputlevel,
64- sweep,
65- nsweeps,
65+ outputlevel= 0 ,
6666 process_time= identity,
67- kws... ,
6867)
6968 if outputlevel >= 1
69+ the_problem = problem (sweep_iterator)
7070 @printf (
71- " Current %s = %s, " , exponent_description, process_time (current_exponent (problem))
71+ " Current %s = %s, " ,
72+ exponent_description,
73+ process_time (current_exponent (the_problem))
7274 )
73- @printf (" maxlinkdim=%d" , maxlinkdim (state (problem )))
75+ @printf (" maxlinkdim=%d" , maxlinkdim (state (the_problem )))
7476 println ()
7577 flush (stdout )
7678 end
7981function applyexp (
8082 init_prob:: AbstractProblem ,
8183 exponents;
82- extract_kwargs= (;),
83- update_kwargs= (;),
84- insert_kwargs= (;),
85- outputlevel= 0 ,
86- nsites= 1 ,
84+ sweep_callback= default_sweep_callback,
8785 order= 4 ,
88- kws... ,
86+ nsites= 2 ,
87+ sweep_kwargs... ,
8988)
9089 exponent_steps = diff ([zero (eltype (exponents)); exponents])
91- sweep_kws = (; outputlevel, extract_kwargs, insert_kwargs, nsites, order, update_kwargs)
92- kws_array = [(; sweep_kws... , time_step= t) for t in exponent_steps]
93- sweep_iter = sweep_iterator (init_prob, kws_array)
94- converged_prob = sweep_solve (sweep_iter; outputlevel, kws... )
90+
91+ kws_array = [
92+ (; order, nsites, sweep_kwargs... , exponent_step) for exponent_step in exponent_steps
93+ ]
94+ sweep_iter = SweepIterator (init_prob, kws_array)
95+
96+ converged_prob = problem (sweep_solve! (sweep_callback, sweep_iter))
97+
9598 return state (converged_prob)
9699end
97100
@@ -111,11 +114,10 @@ function time_evolve(
111114 time_points,
112115 init_state;
113116 process_time= process_real_times,
114- sweep_callback= (
115- a... ; k...
116- )-> sweep_callback (a... ; exponent_description= " time" , process_time, k... ),
117- kws... ,
117+ sweep_callback= iter ->
118+ default_sweep_callback (iter; exponent_description= " time" , process_time),
119+ sweep_kwargs... ,
118120)
119- exponents = [- im* t for t in time_points]
120- return applyexp (operator, exponents, init_state; sweep_callback, kws ... )
121+ exponents = [- im * t for t in time_points]
122+ return applyexp (operator, exponents, init_state; sweep_callback, sweep_kwargs ... )
121123end
0 commit comments