Array input arguments in nonlinear expressions
Los mantenedores suelen responder en 1 día
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 5/5
- Tiempo estimado
- Más de una semana
- Aptitud para principiantes
- 25/100
Línea de trabajo
Comience con GenericNonlinearExpr, MOI.(Scalar,Vector)NonlinearFunction, MOI.Nonlinear y las estructuras propuestas Node y Expression descritas en el issue. Trace cómo se representan actualmente las expresiones no lineales escalares y sus derivadas, y determine después cómo deberían representarse y diferenciarse las entradas de tipo array y matriz. Se considera terminado cuando el diseño y la implementación admitan ejemplos como norm(x, p) y log_det(X), con pruebas que cubran sus derivadas.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
Context: Yesterday I had a chat to @rluce about nonlinear expressions, particularly as they relate to Gurobi's upcoming nonlinear interface. We broadly agree on scalar nonlinear functions, and he had some preliminary ideas for vector-inputs.
cc @ccoffrin and @chriscoey for thoughts.
Our ultimate goal is to support examples like the following:
using JuMP, Ipopt
model = Model(Ipopt.Optimizer)
@variable(model, x[1:2, 1:2])
@objective(model, Max, log(det(X)))
# or perhaps the easier to manage;
@objective(model, Max, log_det(X))
using JuMP, Ipopt
model = Model(Ipopt.Optimizer)
@variable(model, x[1:3] >= 1)
p = 2
@objective(model, Min, norm(x, p))
Another key consumer of this would be https://github.com/jump-dev/MiniZinc.jl.
Changes required in JuMP
- We'd need to support
ArrayinGenericNonlinearExprand their mapping tomoi_function. This seems pretty easy.
Changes required in MOI
- We'd need to support
ArrayinMOI.(Scalar,Vector)NonlinearFunction. This seems pretty easy. - We'd need to support
ArrayinMOI.Nonlinearand be able to compute derivatives, etc.
The tricky part is all in 2.
We'd likely need some sort of Node(NODE_VECTOR, parent, n).
But matrices are a bit more complicated. We'd need to encode (rows, cols). One option would be to store the size as a packed value::Int64. That'd mean that we couldn't have matrices with side dimension greater than typemax(Int32)... but that seems okay.
encode(m::Int64, n::Int64) = encode(Int32(m), Int32(n))
encode(m::Int32, n::Int32) = reinterpret(Int64, (m, n))
decode(x::Int64) = Int64.(reinterpret(Tuple{Int32,Int32}, x))
norm(x) would look something like:
expr = Expression(
[
Node(NODE_CALL_MULTIVARIATE, -1, OP_NORM ),
Node(NODE_ARRAY, 1, 3 #= encode(3, 0) =#),
Node(NODE_VARIABLE, 2, 1 #= x1 =# ),
Node(NODE_VARIABLE, 2, 2 #= x2 =# ),
Node(NODE_VARIABLE, 2, 3 #= x3 =# ),
],
[],
);
log_det(X) would then look something like:
expr = Expression(
[
Node(NODE_CALL_MULTIVARIATE, -1, OP_LOGDET ),
Node(NODE_ARRAY, 1, 8589934594 #= encode(2, 2) =#),
Node(NODE_VARIABLE, 2, 1 #= x11 =# ),
Node(NODE_VARIABLE, 2, 2 #= x21 =# ),
Node(NODE_VARIABLE, 2, 2 #= x12 =# ),
Node(NODE_VARIABLE, 2, 3 #= x22 =# ),
],
[],
);
Once you have the data structure, it seems to me that the AD should follow fairly well.
Output arguments
Still absolutely no idea.
- Lenguaje dominante
- Julia
- Estrellas
- 506
- Forks
- 103
- Merge medio
- 1 d 10 min
- PR fusionados (30 d)
- 12
Preparar el entorno
Este proyecto no incluye contenedor de desarrollo, Dockerfile ni guía de contribución, así que la configuración corre por tu cuenta: empieza por su README y consulta nuestra guía para la primera contribución para los pasos generales.
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de jump-dev/MathOptInterface.jl
-
[Bridges] MultirowChange in set_map.jl drops zero coefficientsPosiblemente ocupada @odow la tomó hace 5 días. Abierto
jump-dev/MathOptInterface.jl#3106 · 2 comentarios · 1 asignado ·
Los mantenedores suelen responder en 1 día
-
Precision loss in Hessian computationPosiblemente ocupada @blegat la tomó hace 5 días. Abierto
Dificultad 5/5 Más de una semana Aptitud para principiantes 15/100
jump-dev/MathOptInterface.jl#3104 · 11 comentarios ·
Los mantenedores suelen responder en 1 día
-
Layer instantiatorAbierto
Dificultad 5/5 Más de una semana Aptitud para principiantes 35/100
jump-dev/MathOptInterface.jl#2986 · 3 comentarios ·
Los mantenedores suelen responder en 1 día
-
Differentiable Optimization APIAbierto
Dificultad 5/5 Más de una semana Aptitud para principiantes 25/100
jump-dev/MathOptInterface.jl#2969 · 2 comentarios · 1 reacción ·
Los mantenedores suelen responder en 1 día
-
Add Batched{S} setAbiertoType: Set Request
Dificultad 5/5 Más de una semana Aptitud para principiantes 35/100
jump-dev/MathOptInterface.jl#2904 · 15 comentarios · 7 reacciones ·
Los mantenedores suelen responder en 1 día
Todos los issues de jump-dev/MathOptInterface.jl
Issues similares
-
bug
Dificultad 2/5 1-3 horas Aptitud para principiantes 75/100
-
bug help wanted
Dificultad 2/5 1-3 horas Aptitud para principiantes 68/100
JuliaGeometry/Meshes.jl#1469 ·
Los mantenedores suelen responder en 1 día
-
distributed 🕸️
Dificultad 2/5 1-3 horas Aptitud para principiantes 62/100
CliMA/Oceananigans.jl#6295 · 1 comentario ·
Los mantenedores suelen responder en 1 día
-
CI: two jobs fail on the new ubuntu-latest (Ubuntu 26.04) runner imagePosiblemente ocupada @bjarthur la tomó hoy. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 86/100
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 63/100
mojaie/MolecularGraph.jl#151 ·