Hacktoberfest 2026: los issues que los mantenedores marcaron para octubre, abiertos y aptos para principiantes. Explorar issues de Hacktoberfest

rrule for casting LinearAlgebra.QRCompactWYQ into a Matrix

Abierto
#516 3 comentarios 0 reacciones 0 asignados Ver en GitHub

Nadie ha tomado este issue todavía.

Evaluación

Dificultad
4/5
Tiempo estimado
3-5 días
Aptitud para principiantes
35/100
Tipo de issue
Error
Claridad
Bastante claro
Estado de actividad
Estancado
Stack tecnológico
julia
Área
devtools

Línea de trabajo

Comienza con la reproducción usando Matrix(Q) y Q de una factorización qr incompleta; después inspecciona src/rulesets/Base/array.jl y la rrule existente de Matrix. Traza cómo ProjectTo y Array_pullback manejan el gradiente entrante de tamaño (6,4) frente al tamaño (6,6) de QRCompactWYQ. Se considera terminado cuando el pase hacia atrás para Matrix(Q) se completa sin DimensionMismatch y las llamadas de gradiente existentes siguen funcionando.

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

I'm trying to work with the Q matrix from a qr-factorization within Zygote. In an incomplete QR factorization for m>=n,
the QRCompactWYQMatrix Q has size=(m,m) but only the first n columns are relevant: https://docs.julialang.org/en/v1/stdlib/LinearAlgebra/#LinearAlgebra.qr

Using this in Zygote behaves as follows:

using LinearAlgebra
using Zygote
using Random

Random.seed!(1234)

V = rand(Float32, (6,4))
Q, _ = qr(V)

Zygote.gradient(A -> sum(A), Matrix(Q))
Zygote.gradient(A -> sum(A), Q)
Zygote.gradient(A -> sum(Matrix(A)), Q)

ERROR: LoadError: DimensionMismatch("variable with size(x) == (6, 6) cannot have a gradient with size(dx) == (6, 4)")
Stacktrace:
 [1] (::ChainRulesCore.ProjectTo{AbstractArray, NamedTuple{(:element, :axes), Tuple{ChainRulesCore.ProjectTo{Float32, NamedTuple{(), Tuple{}}}, Tuple{Base.OneTo{Int64}, Base.OneTo{Int64}}}}})(dx::FillArrays.Fill{Float32, 2, Tuple{Base.OneTo{Int64}, Base.OneTo{Int64}}})
   @ ChainRulesCore ~/.julia/packages/ChainRulesCore/Voykb/src/projection.jl:209
 [2] Array_pullback
   @ ~/.julia/packages/ChainRules/qd40H/src/rulesets/Base/array.jl:9 [inlined]
 [3] ZBack
   @ ~/.julia/packages/Zygote/nsu1Y/src/compiler/chainrules.jl:140 [inlined]
 [4] Pullback
   @ ~/source/gpuplayground/src/qr_project_mwe.jl:16 [inlined]
 [5] (::Zygote.var"#50#51"{typeof(∂(#5))})(Δ::Float32)
   @ Zygote ~/.julia/packages/Zygote/nsu1Y/src/compiler/interface.jl:41
 [6] gradient(f::Function, args::LinearAlgebra.QRCompactWYQ{Float32, Matrix{Float32}})
   @ Zygote ~/.julia/packages/Zygote/nsu1Y/src/compiler/interface.jl:76
 [7] top-level scope

The first two calls to gradient work fine. The last call fails because the incoming gradient is size=(6,4) but the matrix is of size=(6,6).

I tried modifying the rrule from here, https://github.com/JuliaDiff/ChainRules.jl/blob/master/src/rulesets/Base/array.jl line 7 like this:

function ChainRules.rrule(::typeof(Matrix), x::LinearAlgebra.QRCompactWYQ) 
  project_x = ProjectTo(x)
  Array_pullback(ȳ) = (NoTangent(), project_x(ȳ))
  return T(x), Array_pullback
end

but that didn't work. Is there a good way of making calls to Matrix(Q) in a backwards pass?
@mcabbott

Lenguaje dominante
Julia
Estrellas
475
Forks
98
Métricas de merge de PR
Sin PR fusionados en 30 d

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

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de JuliaDiff/ChainRules.jl

Todos los issues de JuliaDiff/ChainRules.jl

Issues similares

Más issues de Julia

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.