Skip to content
Snippets Groups Projects
contact_vectors.jl 1.33 KiB

@inline function reindex!(k,csum,index_list_i,index_list_j,j_to_i_contacts,i_to_j_contacts,sample_list_i,sample_list_j)
    i_index = index_list_i[k]
    j_index = index_list_j[k]    
    csum +=  j_to_i_contacts[j_index] - i_to_j_contacts[i_index] +  sample_list_i[k] -  sample_list_j[k]
    i_to_j_contacts[i_index] = sample_list_i[k] 
    j_to_i_contacts[j_index] = sample_list_j[k]    
    return csum
end
function generate_contact_vectors!(ij_dist,ji_dist,i_to_j_contacts::Vector{T}, j_to_i_contacts::Vector{T}) where T
    rand!(RNG,ij_dist,i_to_j_contacts)
    rand!(RNG,ji_dist,j_to_i_contacts)
    l_i = length(i_to_j_contacts)
    l_j = length(j_to_i_contacts)

    csum = sum(i_to_j_contacts) - sum(j_to_i_contacts)

    inner_iter = 10
    index_list_i = @MVector zeros(Int,inner_iter)
    index_list_j = similar(index_list_i)
    sample_list_i = @MVector zeros(T,inner_iter)
    sample_list_j = similar(sample_list_i)
    
    while csum != 0
        sample!(RNG,1:l_i,index_list_i)
        sample!(RNG,1:l_j,index_list_j)
        rand!(RNG,ij_dist,sample_list_i)
        rand!(RNG,ji_dist,sample_list_j)
        @inbounds for i = 1:inner_iter
            if csum != 0
                csum = reindex!(i,csum,index_list_i,index_list_j,j_to_i_contacts,i_to_j_contacts,sample_list_i,sample_list_j)
            end
        end
    end
    return nothing
end