Skip to content

Commit 4b488e2

Browse files
committed
docs: translate French comments and docstrings to English
- Update discretization_utils.jl docstrings to follow docstrings.md standards - Translate all French comments in solution.jl, test files - Replace 'nd' with 'multi' to avoid typos false positives - Improve code clarity for international contributors
1 parent 4ed14b1 commit 4b488e2

6 files changed

Lines changed: 85 additions & 75 deletions

File tree

src/OCP/Building/discretization_utils.jl

Lines changed: 28 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2,39 +2,44 @@
22
# Used for serialization (JSON, JLD2) and solution reconstruction
33

44
"""
5-
_discretize_function(f::Function, T::AbstractVector, dim::Int=-1)::Matrix{Float64}
5+
$(TYPEDSIGNATURES)
66
7-
Discrétise une fonction sur une grille temporelle.
7+
Discretize a function on a time grid.
8+
9+
Evaluates `f` at each point in `T` and collects the results into a matrix.
10+
If `dim` is -1, the output dimension is auto-detected from the first evaluation of `f`.
811
912
# Arguments
10-
- `f::Function`: Fonction à discrétiser (peut retourner scalaire ou vecteur)
11-
- `T::AbstractVector`: Grille temporelle (ou TimeGridModel)
12-
- `dim::Int`: Dimension attendue du résultat. Si -1, auto-détectée depuis la première évaluation.
13+
- `f::Function`: Function to discretize (can return a scalar or a vector).
14+
- `T::AbstractVector`: Time grid.
15+
- `dim::Int`: Expected dimension of the result. If -1, auto-detected from first evaluation.
1316
1417
# Returns
15-
- `Matrix{Float64}`: Matrice n×dim n = length(T)
18+
- `Matrix{Float64}`: n×dim matrix where n = length(T).
1619
1720
# Examples
1821
```julia
19-
# Fonction scalaire
22+
# Scalar function
2023
f_scalar = t -> 2.0 * t
2124
result = _discretize_function(f_scalar, [0.0, 0.5, 1.0], 1)
2225
# result = [0.0; 1.0; 2.0]
2326
24-
# Fonction vectorielle
27+
# Vector function
2528
f_vec = t -> [t, 2*t]
2629
result = _discretize_function(f_vec, [0.0, 0.5, 1.0], 2)
2730
# result = [0.0 0.0; 0.5 1.0; 1.0 2.0]
2831
29-
# Auto-détection de dimension
32+
# Auto-detect dimension
3033
result = _discretize_function(f_vec, [0.0, 0.5, 1.0])
3134
# result = [0.0 0.0; 0.5 1.0; 1.0 2.0]
3235
```
36+
37+
See also: [`_discretize_dual`](@ref)
3338
"""
3439
function _discretize_function(f::Function, T::AbstractVector, dim::Int=-1)::Matrix{Float64}
3540
n = length(T)
3641

37-
# Auto-détecter dimension si nécessaire
42+
# Auto-detect dimension if necessary
3843
if dim == -1
3944
first_val = f(T[1])
4045
dim = first_val isa Number ? 1 : length(first_val)
@@ -53,27 +58,31 @@ function _discretize_function(f::Function, T::AbstractVector, dim::Int=-1)::Matr
5358
end
5459

5560
"""
56-
_discretize_function(f::Function, T::TimeGridModel, dim::Int=-1)::Matrix{Float64}
61+
$(TYPEDSIGNATURES)
5762
58-
Surcharge pour TimeGridModel - extrait automatiquement la grille temporelle.
63+
Discretize a function on a `TimeGridModel` by extracting the underlying time grid.
64+
65+
See also: [`_discretize_function`](@ref)
5966
"""
6067
function _discretize_function(f::Function, T::TimeGridModel, dim::Int=-1)::Matrix{Float64}
6168
return _discretize_function(f, T.value, dim)
6269
end
6370

6471
"""
65-
_discretize_dual(dual_func::Union{Function,Nothing}, T, dim::Int=-1)
72+
$(TYPEDSIGNATURES)
6673
67-
Helper pour discrétiser les fonctions duales qui peuvent être `nothing`.
74+
Discretize a dual function, returning `nothing` if the input is `nothing`.
6875
6976
# Arguments
70-
- `dual_func`: Fonction duale ou `nothing`
71-
- `T`: Grille temporelle
72-
- `dim`: Dimension (auto-détectée si -1)
77+
- `dual_func::Union{Function,Nothing}`: Dual function or `nothing`.
78+
- `T`: Time grid.
79+
- `dim::Int`: Dimension (auto-detected if -1).
7380
7481
# Returns
75-
- `Matrix{Float64}` si `dual_func` est une fonction
76-
- `nothing` si `dual_func` est `nothing`
82+
- `Matrix{Float64}` if `dual_func` is a function.
83+
- `nothing` if `dual_func` is `nothing`.
84+
85+
See also: [`_discretize_function`](@ref)
7786
"""
7887
function _discretize_dual(dual_func::Union{Function,Nothing}, T, dim::Int=-1)
7988
return isnothing(dual_func) ? nothing : _discretize_function(dual_func, T, dim)

src/OCP/Building/solution.jl

Lines changed: 26 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -797,52 +797,53 @@ end
797797
# ============================================================================== #
798798

799799
"""
800-
_serialize_solution(sol::Solution)::Dict{String, Any}
800+
$(TYPEDSIGNATURES)
801801
802-
Sérialise une solution en données discrètes pour export (JLD2, JSON, etc.).
803-
Utilise les getters publics pour accéder aux champs de la solution.
802+
Serialize a solution into discrete data for export (JLD2, JSON, etc.).
804803
805-
Cette fonction extrait toutes les données d'une solution et les convertit en format
806-
sérialisable (matrices, vecteurs, scalaires). Les fonctions sont discrétisées sur
807-
la grille temporelle.
804+
Extracts all data from a solution and converts it into a serializable format
805+
(matrices, vectors, scalars). Functions are discretized on the time grid.
806+
Uses public getters to access solution fields.
808807
809808
# Arguments
810-
- `sol::Solution`: Solution à sérialiser
809+
- `sol::Solution`: Solution to serialize.
811810
812811
# Returns
813-
- `Dict{String, Any}`: Dictionnaire contenant toutes les données discrètes :
814-
- `"time_grid"`: Grille temporelle
815-
- `"state"`, `"control"`, `"costate"`: Matrices discrétisées
816-
- `"variable"`: Vecteur de variables
817-
- `"objective"`: Valeur scalaire
818-
- Fonctions duales discrétisées (peuvent être `nothing`)
819-
- Duals de boundary et variable (vecteurs)
820-
- Informations du solveur
812+
- `Dict{String, Any}`: Dictionary containing all discrete data:
813+
- `"time_grid"`: Time grid
814+
- `"state"`, `"control"`, `"costate"`: Discretized matrices
815+
- `"variable"`: Variable vector
816+
- `"objective"`: Scalar value
817+
- Discretized dual functions (can be `nothing`)
818+
- Boundary and variable duals (vectors)
819+
- Solver information
821820
822821
# Notes
823-
- Les fonctions sont discrétisées via `_discretize_function`
824-
- Les duals `nothing` sont préservés comme `nothing`
825-
- Compatible avec `build_solution` pour reconstruction
822+
- Functions are discretized via `_discretize_function`.
823+
- `nothing` duals are preserved as `nothing`.
824+
- Compatible with `build_solution` for reconstruction.
826825
827826
# Example
828827
```julia
829828
sol = solve(ocp)
830829
data = CTModels._serialize_solution(sol)
831830
# Reconstruction
832831
sol_reconstructed = CTModels.build_solution(
833-
ocp, data["time_grid"], data["state"], data["control"],
834-
data["variable"], data["costate"];
832+
ocp, data["time_grid"], data["state"], data["control"],
833+
data["variable"], data["costate"];
835834
objective=data["objective"], ...
836835
)
837836
```
837+
838+
See also: [`build_solution`](@ref), [`_discretize_function`](@ref)
838839
"""
839840
function _serialize_solution(sol::Solution)::Dict{String, Any}
840-
# Utiliser les getters publics
841+
# Use public getters
841842
T = time_grid(sol)
842843
dim_x = state_dimension(sol)
843844
dim_u = control_dimension(sol)
844845

845-
# Discrétiser les fonctions principales
846+
# Discretize main functions
846847
return Dict(
847848
"time_grid" => T,
848849
"state" => _discretize_function(state(sol), T, dim_x),
@@ -851,19 +852,19 @@ function _serialize_solution(sol::Solution)::Dict{String, Any}
851852
"variable" => variable(sol),
852853
"objective" => objective(sol),
853854

854-
# Discrétiser les fonctions duales (peuvent être nothing)
855+
# Discretize dual functions (can be nothing)
855856
"path_constraints_dual" => _discretize_dual(path_constraints_dual(sol), T),
856857
"state_constraints_lb_dual" => _discretize_dual(state_constraints_lb_dual(sol), T),
857858
"state_constraints_ub_dual" => _discretize_dual(state_constraints_ub_dual(sol), T),
858859
"control_constraints_lb_dual" => _discretize_dual(control_constraints_lb_dual(sol), T),
859860
"control_constraints_ub_dual" => _discretize_dual(control_constraints_ub_dual(sol), T),
860861

861-
# Duals de boundary et variable (vecteurs, pas fonctions)
862+
# Boundary and variable duals (vectors, not functions)
862863
"boundary_constraints_dual" => boundary_constraints_dual(sol),
863864
"variable_constraints_lb_dual" => variable_constraints_lb_dual(sol),
864865
"variable_constraints_ub_dual" => variable_constraints_ub_dual(sol),
865866

866-
# Infos solver
867+
# Solver info
867868
"iterations" => iterations(sol),
868869
"message" => message(sol),
869870
"status" => status(sol),

test/extras/debug_stack.jl

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,21 +5,21 @@
55
# JSON: [[1.0], [2.0], [3.0]]
66
data_1d = [[1.0], [2.0], [3.0]]
77

8-
# Case 2: Multi-D path (e.g. state of dimension 2 over 3 time steps)
8+
# Case 2: Multi-dimensional path (e.g. state of dimension 2 over 3 time steps)
99
# JSON: [[1.0, 1.1], [2.0, 2.1], [3.0, 3.1]]
10-
data_nd = [[1.0, 1.1], [2.0, 2.1], [3.0, 3.1]]
10+
data_multi = [[1.0, 1.1], [2.0, 2.1], [3.0, 3.1]]
1111

1212
println("--- Case 1: 1D Data ---")
1313
stacked_1d = stack(data_1d; dims=1)
1414
println("Type: ", typeof(stacked_1d))
1515
println("Size: ", size(stacked_1d))
1616
println("Content: ", stacked_1d)
1717

18-
println("\n--- Case 2: Multi-D Data ---")
19-
stacked_nd = stack(data_nd; dims=1)
20-
println("Type: ", typeof(stacked_nd))
21-
println("Size: ", size(stacked_nd))
22-
println("Content: ", stacked_nd)
18+
println("\n--- Case 2: Multi-dimensional Data ---")
19+
stacked_multi = stack(data_multi; dims=1)
20+
println("Type: ", typeof(stacked_multi))
21+
println("Size: ", size(stacked_multi))
22+
println("Content: ", stacked_multi)
2323

2424
# Verify current logic for 1D
2525
if stacked_1d isa Vector

test/extras/test_jld2_roundtrip.jl

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,20 +28,20 @@ println("\n✓ Export successful")
2828
sol_imported = CTModels.import_ocp_solution(CTModels.JLD2Tag(), ocp; filename=filename)
2929
println("✓ Import successful")
3030

31-
# Vérifier que les valeurs sont identiques
31+
# Verify that values are identical
3232
println("\nImported solution:")
3333
println(" Objective: ", CTModels.objective(sol_imported))
3434
println(" State at t=0.5: ", CTModels.state(sol_imported)(0.5))
3535
println(" Control at t=0.5: ", CTModels.control(sol_imported)(0.5))
3636
println(" Costate at t=0.5: ", CTModels.costate(sol_imported)(0.5))
3737

38-
# Comparaison détaillée
38+
# Detailed comparison
3939
obj_match = CTModels.objective(sol_original) CTModels.objective(sol_imported)
4040
state_match = CTModels.state(sol_original)(0.5) CTModels.state(sol_imported)(0.5)
4141
control_match = CTModels.control(sol_original)(0.5) CTModels.control(sol_imported)(0.5)
4242
costate_match = CTModels.costate(sol_original)(0.5) CTModels.costate(sol_imported)(0.5)
4343

44-
# Test sur plusieurs points temporels
44+
# Test on multiple time points
4545
t_test = [0.0, 0.25, 0.5, 0.75, 1.0]
4646
all_states_match = all(CTModels.state(sol_original)(t) CTModels.state(sol_imported)(t) for t in t_test)
4747
all_controls_match = all(CTModels.control(sol_original)(t) CTModels.control(sol_imported)(t) for t in t_test)

test/suite/ocp/test_discretization_utils.jl

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,37 +9,37 @@ function test_discretization_utils()
99
@testset "Discretization utilities" begin
1010

1111
@testset "Basic discretization - scalar function" verbose = VERBOSE showtiming = SHOWTIMING begin
12-
# Fonction scalaire simple
12+
# Simple scalar function
1313
f_scalar = t -> 2.0 * t
1414
T = [0.0, 0.5, 1.0]
1515

16-
# Avec dimension explicite
16+
# With explicit dimension
1717
result = CTModels.OCP._discretize_function(f_scalar, T, 1)
1818
@test size(result) == (3, 1)
1919
@test result [0.0; 1.0; 2.0]
2020

21-
# Avec auto-détection
21+
# With auto-detection
2222
result_auto = CTModels.OCP._discretize_function(f_scalar, T)
2323
@test result_auto result
2424
end
2525

2626
@testset "Basic discretization - vector function" begin
27-
# Fonction vectorielle
27+
# Vector function
2828
f_vec = t -> [t, 2*t]
2929
T = [0.0, 0.5, 1.0]
3030

31-
# Avec dimension explicite
31+
# With explicit dimension
3232
result = CTModels.OCP._discretize_function(f_vec, T, 2)
3333
@test size(result) == (3, 2)
3434
@test result [0.0 0.0; 0.5 1.0; 1.0 2.0]
3535

36-
# Avec auto-détection
36+
# With auto-detection
3737
result_auto = CTModels.OCP._discretize_function(f_vec, T)
3838
@test result_auto result
3939
end
4040

4141
@testset "TimeGridModel support" begin
42-
# Test avec TimeGridModel
42+
# Test with TimeGridModel
4343
T_grid = CTModels.TimeGridModel(LinRange(0.0, 1.0, 5))
4444
f = t -> [t, t^2]
4545

@@ -86,8 +86,8 @@ function test_discretization_utils()
8686
end
8787

8888
@testset "Scalar return from vector function" begin
89-
# Fonction retourne vecteur mais on veut dim=1
90-
f = t -> [2.0 * t] # Retourne vecteur de taille 1
89+
# Function returns vector but we want dim=1
90+
f = t -> [2.0 * t] # Returns vector of size 1
9191
T = [0.0, 0.5, 1.0]
9292

9393
result = CTModels.OCP._discretize_function(f, T, 1)

test/suite/serialization/test_export_import.jl

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -772,22 +772,22 @@ function test_export_import()
772772
ocp, sol0 = solution_example()
773773

774774
# First cycle
775-
CTModels.export_ocp_solution(sol0; filename="idempotence_json_nd1", format=:JSON)
775+
CTModels.export_ocp_solution(sol0; filename="idempotence_json_multi1", format=:JSON)
776776
sol1 = CTModels.import_ocp_solution(
777-
ocp; filename="idempotence_json_nd1", format=:JSON
777+
ocp; filename="idempotence_json_multi1", format=:JSON
778778
)
779779

780780
# Second cycle
781-
CTModels.export_ocp_solution(sol1; filename="idempotence_json_nd2", format=:JSON)
781+
CTModels.export_ocp_solution(sol1; filename="idempotence_json_multi2", format=:JSON)
782782
sol2 = CTModels.import_ocp_solution(
783-
ocp; filename="idempotence_json_nd2", format=:JSON
783+
ocp; filename="idempotence_json_multi2", format=:JSON
784784
)
785785

786786
# Verify idempotence
787787
Test.@test compare_solutions(sol1, sol2)
788788

789-
remove_if_exists("idempotence_json_nd1.json")
790-
remove_if_exists("idempotence_json_nd2.json")
789+
remove_if_exists("idempotence_json_multi1.json")
790+
remove_if_exists("idempotence_json_multi2.json")
791791
end
792792

793793
Test.@testset "JSON idempotence: with complex infos" verbose = VERBOSE showtiming = SHOWTIMING begin
@@ -910,22 +910,22 @@ function test_export_import()
910910
ocp, sol0 = solution_example()
911911

912912
# First cycle
913-
CTModels.export_ocp_solution(sol0; filename="idempotence_jld_nd1", format=:JLD)
913+
CTModels.export_ocp_solution(sol0; filename="idempotence_jld_multi1", format=:JLD)
914914
sol1 = CTModels.import_ocp_solution(
915-
ocp; filename="idempotence_jld_nd1", format=:JLD
915+
ocp; filename="idempotence_jld_multi1", format=:JLD
916916
)
917917

918918
# Second cycle
919-
CTModels.export_ocp_solution(sol1; filename="idempotence_jld_nd2", format=:JLD)
919+
CTModels.export_ocp_solution(sol1; filename="idempotence_jld_multi2", format=:JLD)
920920
sol2 = CTModels.import_ocp_solution(
921-
ocp; filename="idempotence_jld_nd2", format=:JLD
921+
ocp; filename="idempotence_jld_multi2", format=:JLD
922922
)
923923

924924
# Verify idempotence
925925
Test.@test compare_solutions(sol1, sol2)
926926

927-
remove_if_exists("idempotence_jld_nd1.jld2")
928-
remove_if_exists("idempotence_jld_nd2.jld2")
927+
remove_if_exists("idempotence_jld_multi1.jld2")
928+
remove_if_exists("idempotence_jld_multi2.jld2")
929929
end
930930

931931
# ========================================================================

0 commit comments

Comments
 (0)