Skip to content

Commit

Permalink
minor fixes
Browse files Browse the repository at this point in the history
related to fast integrator
  • Loading branch information
martinheida authored Dec 12, 2023
1 parent 4192a8f commit 183d149
Show file tree
Hide file tree
Showing 7 changed files with 377 additions and 67 deletions.
36 changes: 25 additions & 11 deletions src/edgeiterate.jl
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,24 @@ function reset(f::FEIStorage)
return f
end

function reset(fei::FEIStorage,sig,_Cell,neighbors,sig_neigh_iterator)
reset(sig_neigh_iterator,sig,neighbors)
lsig = length(sig)
resize!(fei.free_nodes,lsig)
resize!(fei.valid_nodes,lsig)
fei.free_nodes .= false
fei.valid_nodes .= false
for (a,b) in sig_neigh_iterator
fei.valid_nodes[a] = true
end
first_index = findfirstassured(_Cell,sig)
fei.index[5] = _Cell
view(fei.index,1:4) .= 0
_swap(1,first_index,fei.valid_nodes)
fei.active_nodes[1] = 1
return fei
end

struct FastEdgeIterator{T}
iterators::T
ray_tol::Float64
Expand All @@ -66,7 +84,6 @@ struct FastEdgeIterator{T}
for i in 1:(dim-1)
its[i] = FEIData(dim,dim-i+1)
end
# println(typeof(its))
return new{typeof(its)}(its,tol)
end
end
Expand Down Expand Up @@ -226,17 +243,14 @@ function reset(NF_::FastEdgeIterator,_first,sig,searcher,r)
reset(NF_,sig,r,searcher.tree.extended_xs,sig[_first],searcher)
end

fraud_vertex(dim,sig,r,lsig,searcher::Nothing,xs) = false

function reset(NF_::FastEdgeIterator,sig::Sigma,r,xs,_Cell,searcher,fstore::FEIStorage=FEIStorage(sig,r),nu=0,old_cone=0,step=1;allrays = false, _Cell_first=false)
dim = NF_.iterators[1].dim
NF = NF_.iterators[step]
cdim = NF.current_dim

_Cell_entry=1
while sig[_Cell_entry]!=_Cell #avoids dispatch problems arising from findfirst()
_Cell_entry += 1
end
# _Cell_entry = findfirst(x->x==_Cell,sig)
_Cell_entry = findfirstassured(_Cell,sig)

lsig = length(sig)

Expand Down Expand Up @@ -296,7 +310,7 @@ function reset(NF_::FastEdgeIterator,sig::Sigma,r,xs,_Cell,searcher,fstore::FEIS
my_data = NF.index

#identify fraud indices far away from actual cloud
if dim==cdim && fraud_vertex(dim,sig,r,lsig,searcher,xs)
if dim==cdim && fraud_vertex(dim,sig,r,lsig,searcher,xs) # see particular fraud_vertex definition above
NF.index[EI_valid_rays] = 0
return false
end
Expand Down Expand Up @@ -402,11 +416,11 @@ function reset(NF_::FastEdgeIterator,sig::Sigma,r,xs,_Cell,searcher,fstore::FEIS
NF.valid_nodes[first_entry] = false
end
if dim==cdim
fstore.index[5]=_Cell
transfer_values!(fstore.index,NF.index,4)
transfer_values!(fstore.free_nodes,NF.free_nodes,lsig)
fstore.index[5]=_Cell # important!
transfer_values!(fstore.index,NF.index,4) # actually not necessary to store any more
transfer_values!(fstore.free_nodes,NF.free_nodes,lsig) # actually not necessary to store any more
transfer_values!(fstore.valid_nodes,NF.valid_nodes,lsig)
transfer_values!(fstore.active_nodes,NF.active_nodes,dim)
transfer_values!(fstore.active_nodes,NF.active_nodes,dim) # ...[1]=first_entry, rest will be nullified later
end
else
transfer_values!(NF.index,fstore.index,4)
Expand Down
17 changes: 16 additions & 1 deletion src/edgeiteratebase.jl
Original file line number Diff line number Diff line change
Expand Up @@ -50,9 +50,12 @@ function General_EdgeIterator(_sig,r,_Cell,EI::General_EdgeIterator{S}) where {S
end
end

function General_EdgeIterator(dim)
function General_EdgeIterator(dim::Int)
return General_EdgeIterator(MVector{dim+1,Int64}(zeros(Int64,dim+1)),dim+1,0,SVector{dim+1,Int64}(zeros(Int64,dim+1)))
end
function General_EdgeIterator(x::Point)
return General_EdgeIterator(MVector{length(x)+1,Int64}(zeros(Int64,length(x)+1)),length(x)+1,0,SVector{length(x)+1,Int64}(zeros(Int64,length(x)+1)))
end


function Base.iterate(itr::General_EdgeIterator, state=itr.a)
Expand Down Expand Up @@ -90,6 +93,18 @@ function get_EdgeIterator(sig,r,searcher,_Cell,xs,O::OnQueueEdges)
end
end

function get_EdgeIterator(sig,r,searcher,_Cell,xs,neighbors) # special version for fast_polygon
if (length(sig)==length(r)+1)
return General_EdgeIterator(sig,r,_Cell,searcher.general_edgeiterator)
else
my_iterator = searcher.fast_edgeiterator
fei = reset(searcher.fei,sig,_Cell,neighbors,searcher.sig_neigh_iterator)
println(" $(fei.valid_nodes), $(fei.active_nodes)")
HighVoronoi.reset(my_iterator,sig,r,xs,_Cell,nothing,fei) # `nothing` makes sure that `fraud_vertex` will not error
return my_iterator
end
end

function queue_edges_general_position(sig,r,searcher,_Cell,xs,edgecount,EI)
for (edge,skip) in EI
info = get(edgecount, edge, (0::Int64,0::Int64))
Expand Down
Loading

0 comments on commit 183d149

Please sign in to comment.