Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

SingleRLE level #373

Merged
merged 5 commits into from
Jan 13, 2024
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions src/Finch.jl
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ export fastfinch, safefinch, debugfinch

export Tensor
export SparseRLE, SparseRLELevel
export SingleRLE, SingleRLELevel
export SparseList, SparseListLevel
export SparseHash, SparseHashLevel
export SparseCOO, SparseCOOLevel
Expand Down Expand Up @@ -101,6 +102,7 @@ include("tensors/scalars.jl")
include("tensors/levels/abstractlevel.jl")
include("tensors/fibers.jl")
include("tensors/levels/sparserlelevels.jl")
include("tensors/levels/singlerlelevels.jl")
include("tensors/levels/sparselistlevels.jl")
include("tensors/levels/sparsehashlevels.jl")
include("tensors/levels/sparsecoolevels.jl")
Expand Down
347 changes: 347 additions & 0 deletions src/tensors/levels/singlerlelevels.jl
Original file line number Diff line number Diff line change
@@ -0,0 +1,347 @@
struct SingleRLELevel{Ti, Ptr, Idx, Lvl} <: AbstractLevel
lvl::Lvl
shape::Ti
ptr::Ptr
left::Idx
right::Idx
end

const SingleRLE = SingleRLELevel
SingleRLELevel(lvl::Lvl) where {Lvl} = SingleRLELevel{Int}(lvl)
SingleRLELevel(lvl, shape::Ti) where {Ti} = SingleRLELevel{Ti}(lvl, shape)
SingleRLELevel{Ti}(lvl) where {Ti} = SingleRLELevel{Ti}(lvl, zero(Ti))
SingleRLELevel{Ti}(lvl, shape) where {Ti} = SingleRLELevel{Ti}(lvl, shape, postype(lvl)[1], Ti[], Ti[])

Check warning on line 13 in src/tensors/levels/singlerlelevels.jl

View check run for this annotation

Codecov / codecov/patch

src/tensors/levels/singlerlelevels.jl#L10-L13

Added lines #L10 - L13 were not covered by tests

SingleRLELevel{Ti}(lvl::Lvl, shape, ptr::Ptr, left::Idx, right::Idx) where {Ti, Lvl, Ptr, Idx} =

Check warning on line 15 in src/tensors/levels/singlerlelevels.jl

View check run for this annotation

Codecov / codecov/patch

src/tensors/levels/singlerlelevels.jl#L15

Added line #L15 was not covered by tests
SingleRLELevel{Ti, Ptr, Idx, Lvl}(lvl, shape, ptr, left, right)

Base.summary(lvl::SingleRLELevel) = "SingleRLE($(summary(lvl.lvl)))"
similar_level(lvl::SingleRLELevel) = SingleRLE(similar_level(lvl.lvl))
similar_level(lvl::SingleRLELevel, dim, tail...) = SingleRLE(similar_level(lvl.lvl, tail...), dim)

Check warning on line 20 in src/tensors/levels/singlerlelevels.jl

View check run for this annotation

Codecov / codecov/patch

src/tensors/levels/singlerlelevels.jl#L18-L20

Added lines #L18 - L20 were not covered by tests

function memtype(::Type{SingleRLELevel{Ti, Ptr, Idx, Lvl}}) where {Ti, Ptr, Idx, Lvl}
return Ti

Check warning on line 23 in src/tensors/levels/singlerlelevels.jl

View check run for this annotation

Codecov / codecov/patch

src/tensors/levels/singlerlelevels.jl#L22-L23

Added lines #L22 - L23 were not covered by tests
end

function postype(::Type{SingleRLELevel{Ti, Ptr, Idx, Lvl}}) where {Ti, Ptr, Idx, Lvl}
return Ptr

Check warning on line 27 in src/tensors/levels/singlerlelevels.jl

View check run for this annotation

Codecov / codecov/patch

src/tensors/levels/singlerlelevels.jl#L26-L27

Added lines #L26 - L27 were not covered by tests
end

function moveto(lvl::SingleRLELevel{Ti, Ptr, Idx, Lvl}, Tm) where {Ti, Ptr, Idx, Lvl}
lvl_2 = moveto(lvl.lvl, Tm)
ptr_2 = moveto(lvl.ptr, Tm)
left_2 = moveto(lvl.left, Tm)
right_2 = moveto(lvl.right, Tm)
return SingleRLELevel{Ti}(lvl_2, lvl.shape, ptr_2, left_2, right_2)

Check warning on line 35 in src/tensors/levels/singlerlelevels.jl

View check run for this annotation

Codecov / codecov/patch

src/tensors/levels/singlerlelevels.jl#L30-L35

Added lines #L30 - L35 were not covered by tests
end

function countstored_level(lvl::SingleRLELevel, pos)
countstored_level(lvl.lvl, lvl.ptr[pos + 1] - 1)

Check warning on line 39 in src/tensors/levels/singlerlelevels.jl

View check run for this annotation

Codecov / codecov/patch

src/tensors/levels/singlerlelevels.jl#L38-L39

Added lines #L38 - L39 were not covered by tests
end

pattern!(lvl::SingleRLELevel{Ti}) where {Ti} =

Check warning on line 42 in src/tensors/levels/singlerlelevels.jl

View check run for this annotation

Codecov / codecov/patch

src/tensors/levels/singlerlelevels.jl#L42

Added line #L42 was not covered by tests
SingleRLELevel{Ti}(pattern!(lvl.lvl), lvl.shape, lvl.ptr, lvl.left, lvl.right)

redefault!(lvl::SingleRLELevel{Ti}, init) where {Ti} =

Check warning on line 45 in src/tensors/levels/singlerlelevels.jl

View check run for this annotation

Codecov / codecov/patch

src/tensors/levels/singlerlelevels.jl#L45

Added line #L45 was not covered by tests
SingleRLELevel{Ti}(redefault!(lvl.lvl, init), lvl.shape, lvl.ptr, lvl.left, lvl.right)

Base.resize!(lvl::SingleRLELevel{Ti}, dims...) where {Ti} =

Check warning on line 48 in src/tensors/levels/singlerlelevels.jl

View check run for this annotation

Codecov / codecov/patch

src/tensors/levels/singlerlelevels.jl#L48

Added line #L48 was not covered by tests
SingleRLELevel{Ti}(resize!(lvl.lvl, dims[1:end-1]...), dims[end], lvl.ptr, lvl.left, lvl.right)

function Base.show(io::IO, lvl::SingleRLELevel{Ti, Ptr, Idx, Lvl}) where {Ti, Lvl, Idx, Ptr}
if get(io, :compact, false)
print(io, "SingleRLE(")

Check warning on line 53 in src/tensors/levels/singlerlelevels.jl

View check run for this annotation

Codecov / codecov/patch

src/tensors/levels/singlerlelevels.jl#L51-L53

Added lines #L51 - L53 were not covered by tests
else
print(io, "SingleRLE{$Ti}(")

Check warning on line 55 in src/tensors/levels/singlerlelevels.jl

View check run for this annotation

Codecov / codecov/patch

src/tensors/levels/singlerlelevels.jl#L55

Added line #L55 was not covered by tests
end
show(io, lvl.lvl)
print(io, ", ")
show(IOContext(io, :typeinfo=>Ti), lvl.shape)
print(io, ", ")
if get(io, :compact, false)
print(io, "…")

Check warning on line 62 in src/tensors/levels/singlerlelevels.jl

View check run for this annotation

Codecov / codecov/patch

src/tensors/levels/singlerlelevels.jl#L57-L62

Added lines #L57 - L62 were not covered by tests
else
show(io, lvl.ptr)
print(io, ", ")
show(io, lvl.left)
print(io, ", ")
show(io, lvl.right)

Check warning on line 68 in src/tensors/levels/singlerlelevels.jl

View check run for this annotation

Codecov / codecov/patch

src/tensors/levels/singlerlelevels.jl#L64-L68

Added lines #L64 - L68 were not covered by tests
end
print(io, ")")

Check warning on line 70 in src/tensors/levels/singlerlelevels.jl

View check run for this annotation

Codecov / codecov/patch

src/tensors/levels/singlerlelevels.jl#L70

Added line #L70 was not covered by tests
end

function display_fiber(io::IO, mime::MIME"text/plain", fbr::SubFiber{<:SingleRLELevel}, depth)
p = fbr.pos
lvl = fbr.lvl
left_endpoints = @view(lvl.left[lvl.ptr[p]:lvl.ptr[p + 1] - 1])

Check warning on line 76 in src/tensors/levels/singlerlelevels.jl

View check run for this annotation

Codecov / codecov/patch

src/tensors/levels/singlerlelevels.jl#L73-L76

Added lines #L73 - L76 were not covered by tests

crds = []
for l in left_endpoints
append!(crds, l)
end

Check warning on line 81 in src/tensors/levels/singlerlelevels.jl

View check run for this annotation

Codecov / codecov/patch

src/tensors/levels/singlerlelevels.jl#L78-L81

Added lines #L78 - L81 were not covered by tests

print_coord(io, crd) = print(io, crd, ":", lvl.right[lvl.ptr[p]-1+searchsortedfirst(left_endpoints, crd)])
get_fbr(crd) = fbr(crd)

Check warning on line 84 in src/tensors/levels/singlerlelevels.jl

View check run for this annotation

Codecov / codecov/patch

src/tensors/levels/singlerlelevels.jl#L83-L84

Added lines #L83 - L84 were not covered by tests

print(io, "SingleRLE (", default(fbr), ") [", ":,"^(ndims(fbr) - 1), "1:", fbr.lvl.shape, "]")
display_fiber_data(io, mime, fbr, depth, 1, crds, print_coord, get_fbr)

Check warning on line 87 in src/tensors/levels/singlerlelevels.jl

View check run for this annotation

Codecov / codecov/patch

src/tensors/levels/singlerlelevels.jl#L86-L87

Added lines #L86 - L87 were not covered by tests
end

@inline level_ndims(::Type{<:SingleRLELevel{Ti, Ptr, Idx, Lvl}}) where {Ti, Ptr, Idx, Lvl} = 1 + level_ndims(Lvl)
@inline level_size(lvl::SingleRLELevel) = (level_size(lvl.lvl)..., lvl.shape)
@inline level_axes(lvl::SingleRLELevel) = (level_axes(lvl.lvl)..., Base.OneTo(lvl.shape))
@inline level_eltype(::Type{<:SingleRLELevel{Ti, Ptr, Idx, Lvl}}) where {Ti, Ptr, Idx, Lvl} = level_eltype(Lvl)
@inline level_default(::Type{<:SingleRLELevel{Ti, Ptr, Idx, Lvl}}) where {Ti, Ptr, Idx, Lvl}= level_default(Lvl)
data_rep_level(::Type{<:SingleRLELevel{Ti, Ptr, Idx, Lvl}}) where {Ti, Ptr, Idx, Lvl} = SparseData(data_rep_level(Lvl))

Check warning on line 95 in src/tensors/levels/singlerlelevels.jl

View check run for this annotation

Codecov / codecov/patch

src/tensors/levels/singlerlelevels.jl#L90-L95

Added lines #L90 - L95 were not covered by tests

(fbr::AbstractFiber{<:SingleRLELevel})() = fbr
function (fbr::SubFiber{<:SingleRLELevel})(idxs...)
isempty(idxs) && return fbr
lvl = fbr.lvl
p = fbr.pos
r1 = searchsortedlast(@view(lvl.left[lvl.ptr[p]:lvl.ptr[p + 1] - 1]), idxs[end])
r2 = searchsortedfirst(@view(lvl.right[lvl.ptr[p]:lvl.ptr[p + 1] - 1]), idxs[end])
q = lvl.ptr[p] + first(r1) - 1
fbr_2 = SubFiber(lvl.lvl, q)
r1 != r2 ? default(fbr_2) : fbr_2(idxs[1:end-1]...)

Check warning on line 106 in src/tensors/levels/singlerlelevels.jl

View check run for this annotation

Codecov / codecov/patch

src/tensors/levels/singlerlelevels.jl#L97-L106

Added lines #L97 - L106 were not covered by tests
end


mutable struct VirtualSingleRLELevel <: AbstractVirtualLevel
lvl
ex
Ti
ptr
left
right
shape
qos_fill
qos_stop
prev_pos
end

is_level_injective(lvl::VirtualSingleRLELevel, ctx) = [false, is_level_injective(lvl.lvl, ctx)...]
is_level_concurrent(lvl::VirtualSingleRLELevel, ctx) = [false, is_level_concurrent(lvl.lvl, ctx)...]
is_level_atomic(lvl::VirtualSingleRLELevel, ctx) = false

Check warning on line 125 in src/tensors/levels/singlerlelevels.jl

View check run for this annotation

Codecov / codecov/patch

src/tensors/levels/singlerlelevels.jl#L123-L125

Added lines #L123 - L125 were not covered by tests


function virtualize(ex, ::Type{SingleRLELevel{Ti, Ptr, Idx, Lvl}}, ctx, tag=:lvl) where {Ti, Ptr, Idx, Lvl}
sym = freshen(ctx, tag)
ptr = freshen(ctx, tag, :_ptr)
left = freshen(ctx, tag, :_left)
right = freshen(ctx, tag, :_right)
push!(ctx.preamble, quote
$sym = $ex
$ptr = $sym.ptr
$left = $sym.left
$right = $sym.right

Check warning on line 137 in src/tensors/levels/singlerlelevels.jl

View check run for this annotation

Codecov / codecov/patch

src/tensors/levels/singlerlelevels.jl#L128-L137

Added lines #L128 - L137 were not covered by tests
end)
lvl_2 = virtualize(:($sym.lvl), Lvl, ctx, sym)
shape = value(:($sym.shape), Int)
qos_fill = freshen(ctx, sym, :_qos_fill)
qos_stop = freshen(ctx, sym, :_qos_stop)
prev_pos = freshen(ctx, sym, :_prev_pos)
VirtualSingleRLELevel(lvl_2, sym, Ti, ptr, left, right, shape, qos_fill, qos_stop, prev_pos)

Check warning on line 144 in src/tensors/levels/singlerlelevels.jl

View check run for this annotation

Codecov / codecov/patch

src/tensors/levels/singlerlelevels.jl#L139-L144

Added lines #L139 - L144 were not covered by tests
end
function lower(lvl::VirtualSingleRLELevel, ctx::AbstractCompiler, ::DefaultStyle)
quote
$SingleRLELevel{$(lvl.Ti)}(

Check warning on line 148 in src/tensors/levels/singlerlelevels.jl

View check run for this annotation

Codecov / codecov/patch

src/tensors/levels/singlerlelevels.jl#L146-L148

Added lines #L146 - L148 were not covered by tests
$(ctx(lvl.lvl)),
$(ctx(lvl.shape)),
$(lvl.ex).ptr,
$(lvl.ex).left,
$(lvl.ex).right,
)
end
end

Base.summary(lvl::VirtualSingleRLELevel) = "SingleRLE($(summary(lvl.lvl)))"

Check warning on line 158 in src/tensors/levels/singlerlelevels.jl

View check run for this annotation

Codecov / codecov/patch

src/tensors/levels/singlerlelevels.jl#L158

Added line #L158 was not covered by tests

function virtual_level_size(lvl::VirtualSingleRLELevel, ctx)
ext = make_extent(lvl.Ti, literal(lvl.Ti(1)), lvl.shape)
(virtual_level_size(lvl.lvl, ctx)..., ext)

Check warning on line 162 in src/tensors/levels/singlerlelevels.jl

View check run for this annotation

Codecov / codecov/patch

src/tensors/levels/singlerlelevels.jl#L160-L162

Added lines #L160 - L162 were not covered by tests
end

function virtual_level_resize!(lvl::VirtualSingleRLELevel, ctx, dims...)
lvl.shape = getstop(dims[end])
lvl.lvl = virtual_level_resize!(lvl.lvl, ctx, dims[1:end-1]...)
lvl

Check warning on line 168 in src/tensors/levels/singlerlelevels.jl

View check run for this annotation

Codecov / codecov/patch

src/tensors/levels/singlerlelevels.jl#L165-L168

Added lines #L165 - L168 were not covered by tests
end


virtual_level_eltype(lvl::VirtualSingleRLELevel) = virtual_level_eltype(lvl.lvl)
virtual_level_default(lvl::VirtualSingleRLELevel) = virtual_level_default(lvl.lvl)
postype(lvl::VirtualSingleRLELevel) = postype(lvl.lvl)

Check warning on line 174 in src/tensors/levels/singlerlelevels.jl

View check run for this annotation

Codecov / codecov/patch

src/tensors/levels/singlerlelevels.jl#L172-L174

Added lines #L172 - L174 were not covered by tests

function declare_level!(lvl::VirtualSingleRLELevel, ctx::AbstractCompiler, pos, init)
Ti = lvl.Ti
Tp = postype(lvl)
qos = call(-, call(getindex, :($(lvl.ptr)), call(+, pos, 1)), 1)
push!(ctx.code.preamble, quote
$(lvl.qos_fill) = $(Tp(0))
$(lvl.qos_stop) = $(Tp(0))

Check warning on line 182 in src/tensors/levels/singlerlelevels.jl

View check run for this annotation

Codecov / codecov/patch

src/tensors/levels/singlerlelevels.jl#L176-L182

Added lines #L176 - L182 were not covered by tests
end)
if issafe(ctx.mode)
push!(ctx.code.preamble, quote
$(lvl.prev_pos) = $(Tp(0))

Check warning on line 186 in src/tensors/levels/singlerlelevels.jl

View check run for this annotation

Codecov / codecov/patch

src/tensors/levels/singlerlelevels.jl#L184-L186

Added lines #L184 - L186 were not covered by tests
end)
end
lvl.lvl = declare_level!(lvl.lvl, ctx, qos, init)
return lvl

Check warning on line 190 in src/tensors/levels/singlerlelevels.jl

View check run for this annotation

Codecov / codecov/patch

src/tensors/levels/singlerlelevels.jl#L189-L190

Added lines #L189 - L190 were not covered by tests
end

function trim_level!(lvl::VirtualSingleRLELevel, ctx::AbstractCompiler, pos)
Tp = postype(lvl)
qos = freshen(ctx.code, :qos)
push!(ctx.code.preamble, quote
resize!($(lvl.ptr), $(ctx(pos)) + 1)
$qos = $(lvl.ptr)[end] - $(Tp(1))
resize!($(lvl.left), $qos)
resize!($(lvl.right), $qos)

Check warning on line 200 in src/tensors/levels/singlerlelevels.jl

View check run for this annotation

Codecov / codecov/patch

src/tensors/levels/singlerlelevels.jl#L193-L200

Added lines #L193 - L200 were not covered by tests
end)
lvl.lvl = trim_level!(lvl.lvl, ctx, value(qos, Tp))
return lvl

Check warning on line 203 in src/tensors/levels/singlerlelevels.jl

View check run for this annotation

Codecov / codecov/patch

src/tensors/levels/singlerlelevels.jl#L202-L203

Added lines #L202 - L203 were not covered by tests
end

function assemble_level!(lvl::VirtualSingleRLELevel, ctx, pos_start, pos_stop)
pos_start = ctx(cache!(ctx, :p_start, pos_start))
pos_stop = ctx(cache!(ctx, :p_start, pos_stop))
return quote
Finch.resize_if_smaller!($(lvl.ptr), $pos_stop + 1)
Finch.fill_range!($(lvl.ptr), 0, $pos_start + 1, $pos_stop + 1)

Check warning on line 211 in src/tensors/levels/singlerlelevels.jl

View check run for this annotation

Codecov / codecov/patch

src/tensors/levels/singlerlelevels.jl#L206-L211

Added lines #L206 - L211 were not covered by tests
end
end

function freeze_level!(lvl::VirtualSingleRLELevel, ctx::AbstractCompiler, pos_stop)
p = freshen(ctx.code, :p)
pos_stop = ctx(cache!(ctx, :pos_stop, simplify(pos_stop, ctx)))
qos_stop = freshen(ctx.code, :qos_stop)
push!(ctx.code.preamble, quote
for $p = 1:($pos_stop)
$(lvl.ptr)[$p + 1] += $(lvl.ptr)[$p]
end
$qos_stop = $(lvl.ptr)[$pos_stop + 1] - 1

Check warning on line 223 in src/tensors/levels/singlerlelevels.jl

View check run for this annotation

Codecov / codecov/patch

src/tensors/levels/singlerlelevels.jl#L215-L223

Added lines #L215 - L223 were not covered by tests
end)
lvl.lvl = freeze_level!(lvl.lvl, ctx, value(qos_stop))
return lvl

Check warning on line 226 in src/tensors/levels/singlerlelevels.jl

View check run for this annotation

Codecov / codecov/patch

src/tensors/levels/singlerlelevels.jl#L225-L226

Added lines #L225 - L226 were not covered by tests
end

function thaw_level!(lvl::VirtualSingleRLELevel, ctx::AbstractCompiler, pos_stop)
p = freshen(ctx.code, :p)
pos_stop = ctx(cache!(ctx, :pos_stop, simplify(pos_stop, ctx)))
qos_stop = freshen(ctx.code, :qos_stop)
push!(ctx.code.preamble, quote
$(lvl.qos_fill) = $(lvl.ptr)[$pos_stop + 1] - 1
$(lvl.qos_stop) = $(lvl.qos_fill)
$qos_stop = $(lvl.qos_fill)
$(if issafe(ctx.mode)
quote
$(lvl.prev_pos) = Finch.scansearch($(lvl.ptr), $(lvl.qos_stop) + 1, 1, $pos_stop) - 1

Check warning on line 239 in src/tensors/levels/singlerlelevels.jl

View check run for this annotation

Codecov / codecov/patch

src/tensors/levels/singlerlelevels.jl#L229-L239

Added lines #L229 - L239 were not covered by tests
end
end)
for $p = $pos_stop:-1:1
$(lvl.ptr)[$p + 1] -= $(lvl.ptr)[$p]
end

Check warning on line 244 in src/tensors/levels/singlerlelevels.jl

View check run for this annotation

Codecov / codecov/patch

src/tensors/levels/singlerlelevels.jl#L242-L244

Added lines #L242 - L244 were not covered by tests
end)
lvl.lvl = thaw_level!(lvl.lvl, ctx, value(qos_stop))
return lvl

Check warning on line 247 in src/tensors/levels/singlerlelevels.jl

View check run for this annotation

Codecov / codecov/patch

src/tensors/levels/singlerlelevels.jl#L246-L247

Added lines #L246 - L247 were not covered by tests
end

function instantiate(fbr::VirtualSubFiber{VirtualSingleRLELevel}, ctx, mode::Reader, subprotos, ::Union{typeof(defaultread), typeof(walk)})
(lvl, pos) = (fbr.lvl, fbr.pos)
tag = lvl.ex
Tp = postype(lvl)
Ti = lvl.Ti
my_i_end = freshen(ctx.code, tag, :_i_end)
my_i_stop = freshen(ctx.code, tag, :_i_stop)
my_i_start = freshen(ctx.code, tag, :_i_start)
my_q = freshen(ctx.code, tag, :_q)
my_q_stop = freshen(ctx.code, tag, :_q_stop)

Check warning on line 259 in src/tensors/levels/singlerlelevels.jl

View check run for this annotation

Codecov / codecov/patch

src/tensors/levels/singlerlelevels.jl#L250-L259

Added lines #L250 - L259 were not covered by tests

Furlable(
body = (ctx, ext) -> Thunk(

Check warning on line 262 in src/tensors/levels/singlerlelevels.jl

View check run for this annotation

Codecov / codecov/patch

src/tensors/levels/singlerlelevels.jl#L261-L262

Added lines #L261 - L262 were not covered by tests
preamble = quote
$my_q = $(lvl.ptr)[$(ctx(pos))]
$my_q_stop = $(lvl.ptr)[$(ctx(pos)) + $(Tp(1))]
if $my_q < $my_q_stop
$my_i_start = $(lvl.ptr)[$my_q_stop - $(Tp(1))]
$my_i_stop = $(lvl.ptr)[$my_q_stop - $(Tp(1))]

Check warning on line 268 in src/tensors/levels/singlerlelevels.jl

View check run for this annotation

Codecov / codecov/patch

src/tensors/levels/singlerlelevels.jl#L264-L268

Added lines #L264 - L268 were not covered by tests
else
$my_i_start= $(Ti(1))
$my_i_stop= $(Ti(0))

Check warning on line 271 in src/tensors/levels/singlerlelevels.jl

View check run for this annotation

Codecov / codecov/patch

src/tensors/levels/singlerlelevels.jl#L270-L271

Added lines #L270 - L271 were not covered by tests
end
end,
body = (ctx) -> Sequence([

Check warning on line 274 in src/tensors/levels/singlerlelevels.jl

View check run for this annotation

Codecov / codecov/patch

src/tensors/levels/singlerlelevels.jl#L274

Added line #L274 was not covered by tests
Phase(
start = (ctx, ext) -> literal(lvl.Ti(1)),
stop = (ctx, ext) -> call(-, value(my_i_start, lvl.Ti), getunit(ext)),
body = (ctx, ext) -> Run(Fill(virtual_level_default(lvl))),

Check warning on line 278 in src/tensors/levels/singlerlelevels.jl

View check run for this annotation

Codecov / codecov/patch

src/tensors/levels/singlerlelevels.jl#L276-L278

Added lines #L276 - L278 were not covered by tests
),
Phase(
stop = (ctx, ext) -> value(my_i_stop, lvl.Ti),
body = (ctx, ext) -> Run(Simplify(instantiate(VirtualSubFiber(lvl.lvl, value(my_q)), ctx, mode, subprotos))),

Check warning on line 282 in src/tensors/levels/singlerlelevels.jl

View check run for this annotation

Codecov / codecov/patch

src/tensors/levels/singlerlelevels.jl#L281-L282

Added lines #L281 - L282 were not covered by tests
),
Phase(
stop = (ctx, ext) -> lvl.shape,
body = (ctx, ext) -> Run(Fill(virtual_level_default(lvl)))

Check warning on line 286 in src/tensors/levels/singlerlelevels.jl

View check run for this annotation

Codecov / codecov/patch

src/tensors/levels/singlerlelevels.jl#L285-L286

Added lines #L285 - L286 were not covered by tests
)
])
)
)
end

instantiate(fbr::VirtualSubFiber{VirtualSingleRLELevel}, ctx, mode::Updater, protos) =

Check warning on line 293 in src/tensors/levels/singlerlelevels.jl

View check run for this annotation

Codecov / codecov/patch

src/tensors/levels/singlerlelevels.jl#L293

Added line #L293 was not covered by tests
instantiate(VirtualHollowSubFiber(fbr.lvl, fbr.pos, freshen(ctx.code, :null)), ctx, mode, protos)

function instantiate(fbr::VirtualHollowSubFiber{VirtualSingleRLELevel}, ctx, mode::Updater, subprotos, ::Union{typeof(defaultupdate), typeof(extrude)})
(lvl, pos) = (fbr.lvl, fbr.pos)
tag = lvl.ex
Tp = postype(lvl)
Ti = lvl.Ti
qos = freshen(ctx.code, tag, :_qos)
qos_fill = lvl.qos_fill
qos_stop = lvl.qos_stop
dirty = freshen(ctx.code, tag, :dirty)

Check warning on line 304 in src/tensors/levels/singlerlelevels.jl

View check run for this annotation

Codecov / codecov/patch

src/tensors/levels/singlerlelevels.jl#L296-L304

Added lines #L296 - L304 were not covered by tests

Furlable(
body = (ctx, ext) -> Thunk(

Check warning on line 307 in src/tensors/levels/singlerlelevels.jl

View check run for this annotation

Codecov / codecov/patch

src/tensors/levels/singlerlelevels.jl#L306-L307

Added lines #L306 - L307 were not covered by tests
preamble = quote
$qos = $qos_fill + 1
$(lvl.ptr)[$(ctx(pos)) + 1] == 0 ||

Check warning on line 310 in src/tensors/levels/singlerlelevels.jl

View check run for this annotation

Codecov / codecov/patch

src/tensors/levels/singlerlelevels.jl#L309-L310

Added lines #L309 - L310 were not covered by tests
throw(FinchProtocolError("SingleRLELevels can only be updated once"))
end,

body = (ctx) -> AcceptRun(
body = (ctx, ext) -> Thunk(

Check warning on line 315 in src/tensors/levels/singlerlelevels.jl

View check run for this annotation

Codecov / codecov/patch

src/tensors/levels/singlerlelevels.jl#L314-L315

Added lines #L314 - L315 were not covered by tests
preamble = quote
if $qos > $qos_stop
$qos_stop = max($qos_stop << 1, 1)
Finch.resize_if_smaller!($(lvl.left), $qos_stop)
Finch.resize_if_smaller!($(lvl.right), $qos_stop)
$(contain(ctx_2->assemble_level!(lvl.lvl, ctx_2, value(qos, Tp), value(qos_stop, Tp)), ctx))

Check warning on line 321 in src/tensors/levels/singlerlelevels.jl

View check run for this annotation

Codecov / codecov/patch

src/tensors/levels/singlerlelevels.jl#L317-L321

Added lines #L317 - L321 were not covered by tests
end
$dirty = false

Check warning on line 323 in src/tensors/levels/singlerlelevels.jl

View check run for this annotation

Codecov / codecov/patch

src/tensors/levels/singlerlelevels.jl#L323

Added line #L323 was not covered by tests
end,
body = (ctx) -> instantiate(VirtualHollowSubFiber(lvl.lvl, value(qos, Tp), dirty), ctx, mode, subprotos),

Check warning on line 325 in src/tensors/levels/singlerlelevels.jl

View check run for this annotation

Codecov / codecov/patch

src/tensors/levels/singlerlelevels.jl#L325

Added line #L325 was not covered by tests
epilogue = quote
if $dirty
$(fbr.dirty) = true
$(lvl.left)[$qos] = $(ctx(getstart(ext)))
$(lvl.right)[$qos] = $(ctx(getstop(ext)))
$(qos) += $(Tp(1))
$(if issafe(ctx.mode)
quote
$(lvl.prev_pos) = $(ctx(pos))

Check warning on line 334 in src/tensors/levels/singlerlelevels.jl

View check run for this annotation

Codecov / codecov/patch

src/tensors/levels/singlerlelevels.jl#L327-L334

Added lines #L327 - L334 were not covered by tests
end
end)
end
end
)
),
epilogue = quote
$(lvl.ptr)[$(ctx(pos)) + 1] = $qos - $qos_fill - 1
$qos_fill = $qos - 1

Check warning on line 343 in src/tensors/levels/singlerlelevels.jl

View check run for this annotation

Codecov / codecov/patch

src/tensors/levels/singlerlelevels.jl#L342-L343

Added lines #L342 - L343 were not covered by tests
end
)
)
end
4 changes: 2 additions & 2 deletions src/tensors/levels/sparserlelevels.jl
Original file line number Diff line number Diff line change
Expand Up @@ -87,8 +87,8 @@ function display_fiber(io::IO, mime::MIME"text/plain", fbr::SubFiber{<:SparseRLE
end

@inline level_ndims(::Type{<:SparseRLELevel{Ti, Ptr, Left, Right, Lvl}}) where {Ti, Ptr, Left, Right, Lvl} = 1 + level_ndims(Lvl)
@inline level_size(lvl::SparseRLELevel) = (lvl.shape, level_size(lvl.lvl)...)
@inline level_axes(lvl::SparseRLELevel) = (Base.OneTo(lvl.shape), level_axes(lvl.lvl)...)
@inline level_size(lvl::SparseRLELevel) = (level_size(lvl.lvl)..., lvl.shape)
@inline level_axes(lvl::SparseRLELevel) = (level_axes(lvl.lvl)..., Base.OneTo(lvl.shape))
@inline level_eltype(::Type{<:SparseRLELevel{Ti, Ptr, Left, Right, Lvl}}) where {Ti, Ptr, Left, Right, Lvl} = level_eltype(Lvl)
@inline level_default(::Type{<:SparseRLELevel{Ti, Ptr, Left, Right, Lvl}}) where {Ti, Ptr, Left, Right, Lvl}= level_default(Lvl)
data_rep_level(::Type{<:SparseRLELevel{Ti, Ptr, Left, Right, Lvl}}) where {Ti, Ptr, Left, Right, Lvl} = SparseData(data_rep_level(Lvl))
Expand Down
Loading