Array Constructors - `similar`
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 5/5
- Tiempo estimado
- Más de una semana
- Aptitud para principiantes
- 15/100
Línea de trabajo
Comienza leyendo las tres issues enlazadas de Julia y el esquema propuesto de allocate_memory, preserve, initialize e instantiate. La issue no menciona archivos del repositorio ni tests, y done no está definido más allá de llegar a un acuerdo sobre un diseño para separar las responsabilidades de construcción de arrays.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
I think we are in a good place to start working on array constructors (would also make documenting examples a whole lot easier). This brings up stuff related to similar:
- https://github.com/JuliaLang/julia/issues/25107
- https://github.com/JuliaLang/julia/issues/18161
- https://github.com/JuliaLang/julia/issues/10064
I'm not convinced there's a silver bullet for array constructors, but I think we could at least find a solution to what similar is often trying to do, allow generic method definition without worrying about array specific constructors. I think we actually need to break up what similar does into several pieces though
- allocate memory - a buffer/Ref that is safer than a pointer
- do something to the memory - probably fastest on pointers
- create user facing instance - e.g., Array
I haven't worked out all the details but here's some of the cleaner code I have so far that might support this.
""" allocate_memory(x, args...) """ # step 1 allocates memory with corresponding device to `x` and axes
function allocate_memory(x) end
""" preserve(f, x, y) """ # step 2 operate on pointers and permit novel garbage collection approaches
preserve(f, x::X) where {X} = preserve(f, x, device(X))
preserve(f, x::X, ::CPUIndex) where {X} = f(x)
function preserve(f, x::X, ::CPUPointer) where {X}
GC.@preserve x out = f(pointer(x))
return out
end
preserve(f, x::X, y::Y) where {X,Y} = preserve(p_x -> preserve(Base.Fix1(op, p_x), y), x)
""" as_immutable """
function as_immutable(x) end
""" initialize(original, new_data) """ # step 3 turn processed buffer into user facing array
function initialize(x::X, data) where {X}
if !ismutable(X)
return as_immutable(data)
else
return data
end
end
""" instantiate(f, x, allocator, initiializer) """
instantiate(f, x, allocator, initiializer) = initiializer(x, preserve(f, allocator(x), x))
instantiate(f, x, allocator) = (f, x, allocator, initiialize)
instantiate(f, x) = (f, x, allocate_memory)
The reason I think separating things out like this is helpful is because it turns this function from base like this
function rotr90(A::AbstractMatrix)
ind1, ind2 = axes(A)
B = similar(A, (ind2,ind1))
m = first(ind1)+last(ind1)
for i=ind1, j=axes(A,2)
B[j,m-i] = A[i,j]
end
return B
end
into this
function rotr90(A)
ind1, ind2 = axes(A)
return instantiate(A, x -> allocate_memory(x, (ind2, ind1))) do a, b
m = first(ind1)+last(ind1)
for i=ind1, j=axes(A,2)
b[j,m-i] = a[i,j]
end
end
end
This means that new array types typically wouldn't need to change rotr90 but would just change their allocators and initializers. I'm not super familiar with how jagged arrays work but we could have allocate_memory take in device and memory layout info for this.
- Lenguaje dominante
- Julia
- Estrellas
- 140
- Forks
- 44
- Merge medio
- 4 d 14 h
- PR fusionados (30 d)
- 5
Guía de contribución
No hay ninguna guía de contribución indexada para este repositorio
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 JuliaArrays/ArrayInterface.jl
-
Dificultad 5/5 Más de una semana Aptitud para principiantes 25/100
JuliaArrays/ArrayInterface.jl#499 ·
-
Dificultad 5/5 Más de una semana Aptitud para principiantes 25/100
JuliaArrays/ArrayInterface.jl#463 · 5 comentarios · 4 reacciones ·
-
Dificultad 4/5 3-5 días Aptitud para principiantes 35/100
JuliaArrays/ArrayInterface.jl#460 · 8 comentarios · 2 reacciones ·
-
Dificultad 4/5 3-5 días Aptitud para principiantes 35/100
JuliaArrays/ArrayInterface.jl#397 · 1 comentario ·
-
Dificultad 4/5 3-5 días Aptitud para principiantes 15/100
JuliaArrays/ArrayInterface.jl#396 ·
Todos los issues de JuliaArrays/ArrayInterface.jl
Issues similares
-
Dificultad 1/5 Menos de una hora Aptitud para principiantes 86/100
SciML/ModelingToolkit.jl#5207 ·
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 85/100
epiforecasts/BVDOutbreakSize#888 · 1 comentario ·
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 80/100
CliMA/Oceananigans.jl#6070 · 1 reacción ·
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 75/100
JuliaLang/LinearAlgebra.jl#1707 · 1 comentario ·
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 75/100
JuliaPluto/Pluto.jl#3616 ·