1+ # Display helpers for OptimalControl
2+
3+ import CTDirect
4+ import CTModels
5+ import CTSolvers
6+
7+ """
8+ display_ocp_configuration(
9+ io::IO,
10+ discretizer::CTDirect.AbstractOptimalControlDiscretizer,
11+ modeler::CTSolvers.AbstractOptimizationModeler,
12+ solver::CTSolvers.AbstractOptimizationSolver;
13+ display::Bool=true,
14+ show_options::Bool=true,
15+ show_sources::Bool=false,
16+ )
17+
18+ Affiche la configuration de résolution (discretizer → modeler → solver) avec les options utilisateur en ligne.
19+
20+ Par défaut l’affichage est compact (`show_sources=false`) et n’affiche que les options marquées utilisateur.
21+ Si `show_options` est `false`, seules les IDs des composants sont affichées.
22+ """
23+ function display_ocp_configuration (
24+ io:: IO ,
25+ discretizer:: CTDirect.AbstractOptimalControlDiscretizer ,
26+ modeler:: CTSolvers.AbstractOptimizationModeler ,
27+ solver:: CTSolvers.AbstractOptimizationSolver ;
28+ display:: Bool = true ,
29+ show_options:: Bool = true ,
30+ show_sources:: Bool = false ,
31+ )
32+ display || return nothing
33+
34+ version_str = string (Base. pkgversion (OptimalControl))
35+
36+ # Header with method
37+ print (io, " ▫ OptimalControl v" , version_str, " solving with: " )
38+
39+ discretizer_id = OptimalControl. id (typeof (discretizer))
40+ modeler_id = OptimalControl. id (typeof (modeler))
41+ solver_id = OptimalControl. id (typeof (solver))
42+
43+ printstyled (io, discretizer_id; color= :cyan , bold= true )
44+ print (io, " → " )
45+ printstyled (io, modeler_id; color= :cyan , bold= true )
46+ print (io, " → " )
47+ printstyled (io, solver_id; color= :cyan , bold= true )
48+
49+ # NOTE: if we want to display extra method hints later, re-enable cleaned_method logic.
50+ # cleaned_method = CTBase.remove(method, (discretizer_id, modeler_id, solver_id))
51+ # if !isempty(cleaned_method)
52+ # print(io, " (")
53+ # for (i, m) in enumerate(cleaned_method)
54+ # sep = i == length(cleaned_method) ? "" : ", "
55+ # printstyled(io, string(m) * sep; color=:cyan, bold=true)
56+ # end
57+ # print(io, ")")
58+ # end
59+
60+ println (io)
61+
62+ # Combined configuration + options (compact default)
63+ println (io, " " )
64+ println (io, " 📦 Configuration:" )
65+
66+ discretizer_pkg = OptimalControl. id (typeof (discretizer))
67+ model_pkg = OptimalControl. id (typeof (modeler))
68+ solver_pkg = OptimalControl. id (typeof (solver))
69+
70+ disc_opts = show_options ? OptimalControl. options (discretizer) : nothing
71+ mod_opts = show_options ? OptimalControl. options (modeler) : nothing
72+ sol_opts = show_options ? OptimalControl. options (solver) : nothing
73+
74+ function print_component (line_prefix, label, pkg, opts)
75+ print (io, line_prefix)
76+ printstyled (io, label; bold= true )
77+ print (io, " : " )
78+ printstyled (io, pkg; color= :cyan , bold= true )
79+ if show_options && opts != = nothing
80+ user_items = Tuple{Symbol, Any}[]
81+ for (key, opt) in pairs (opts. options)
82+ if OptimalControl. is_user (opts, key)
83+ push! (user_items, (key, opt))
84+ end
85+ end
86+ sort! (user_items, by = x -> string (x[1 ]))
87+ n = length (user_items)
88+ if n == 0
89+ print (io, " (no user options)" )
90+ elseif n <= 2
91+ print (io, " (" )
92+ for (i, (key, opt)) in enumerate (user_items)
93+ sep = i == n ? " " : " , "
94+ src = show_sources ? " [" * string (opt. source) * " ]" : " "
95+ print (io, string (key), " = " , opt. value, src, sep)
96+ end
97+ print (io, " )" )
98+ else
99+ # Multiline with truncation after 3 items
100+ print (io, " \n " )
101+ shown = first (user_items, 3 )
102+ for (i, (key, opt)) in enumerate (shown)
103+ sep = i == length (shown) ? " " : " , "
104+ src = show_sources ? " [" * string (opt. source) * " ]" : " "
105+ print (io, string (key), " = " , opt. value, src, sep)
106+ end
107+ remaining = n - length (shown)
108+ if remaining > 0
109+ print (io, " , … (+" , remaining, " )" )
110+ end
111+ end
112+ end
113+ println (io)
114+ end
115+
116+ print_component (" ├─ " , " Discretizer" , discretizer_pkg, disc_opts)
117+ print_component (" ├─ " , " Modeler" , model_pkg, mod_opts)
118+ print_component (" └─ " , " Solver" , solver_pkg, sol_opts)
119+
120+ println (io)
121+ return nothing
122+ end
123+
124+ # Convenience without io
125+ function display_ocp_configuration (
126+ discretizer:: CTDirect.AbstractOptimalControlDiscretizer ,
127+ modeler:: CTSolvers.AbstractOptimizationModeler ,
128+ solver:: CTSolvers.AbstractOptimizationSolver ;
129+ display:: Bool = true ,
130+ show_options:: Bool = true ,
131+ show_sources:: Bool = false ,
132+ )
133+ return display_ocp_configuration (
134+ stdout , discretizer, modeler, solver;
135+ display= display, show_options= show_options, show_sources= show_sources,
136+ )
137+ end
0 commit comments