Well, the previous listing worked only for Int vectors. Following is a more 
properly typed version.
Various optimizations are possible: @inbounds, reducing allocations, etc.


function uniquepermutations(base)
    zpos = Vector{Vector{Vector{Int}}}()
    zval = Vector{eltype(base)}()
    left = length(base)
    for (v,c) in countmap(base)
        push!(zpos,collect(subsets(collect(1:left),c)))
        push!(zval,v)
        left -= c
    end
    res = Vector{Vector{eltype(base)}}()
    for a in product(zpos...)
        slots = collect(1:length(base))
        perm = similar(base)
        for (val,b) in zip(zval,a)
            perm[slots[b]] = val
            slots[b] = 0
            slots = filter(x->x>0,slots)
        end
        push!(res,perm)
    end
    res
end

Reply via email to