TypeError: in typeassert in Julia 1.6.3

I am new to Julia. I am working on a Julia package which the writer is not available.

This is the part of the code where I have a problem with:

function find_partition(model::Model, ms)
    ps = Dict{Z3Expr,Vector{Int}}()
    for (i, m) in enumerate(ms)
        mval = Z3.eval(model, m, false)
        println(ps)
        println(mval)
        println(typeof(mval))
        if haskey(ps, mval)
            push!(ps[mval], i)
        else
            push!(ps, mval=>Int[i])
        end
    end
    values(ps)
end

Here is the output:

Dict{Z3.Expr, Vector{Int64}}()
1.0
Z3.ExprAllocated
ERROR: TypeError: in typeassert, expected UInt64, got a value of type UInt32
Stacktrace:
  [1] hashindex(key::Z3.ExprAllocated, sz::Int64)
    @ Base ./dict.jl:169
  [2] ht_keyindex(h::Dict{Z3.Expr, Vector{Int64}}, key::Z3.ExprAllocated)
    @ Base ./dict.jl:284
  [3] haskey(h::Dict{Z3.Expr, Vector{Int64}}, key::Z3.ExprAllocated)
    @ Base ./dict.jl:550
  [4] find_partition(model::Z3.ModelAllocated, ms::Vector{Z3.ExprAllocated})
    @ Absynth.NLSat ~/Desktop/faoc/Absynth/src/nlsat/cfinitesolver.jl:101

I tried following it and found out that somewhere inside dict.jl in Julia, there are such lines

sz = length(h.keys)
...
index = hashindex(key, sz)

And this is the hashindex written somewhere in dict.jl:

hashindex(key, sz) = (((hash(key)::UInt % Int) & (sz-1)) + 1)::Int

It seems that the version of Z3 used in this package is not compatible with the current version of Julia. I am not sure if this package was working in the beginning at all.

Is there any quick fix to this? Like rewriting this part of the code:

if haskey(ps, mval)
     push!(ps[mval], i)
else
     push!(ps, mval=>Int[i])

in a way that this won’t happen? I tried writing like merge!(ps,Dict(mval=>Int[i])) but it’s eventually reaching this hashindex function again. If I install the older versions of Julia, would it be possible to solve this issue or the problem is somewhere else?

Hi Daneshvar,

unfortunately there is no minimal (not) working example I could get my hands dirty on. Please see Please read: make it easier to help you

1 Like

BTW, this thread is tri(?)plicated. And I don’t think it belongs to ‘Internals & Design’.

I’ve archived the other two copies of this topic (please don’t post the same thing multiple times; it’s also posted on stackoverflow) and moved it into the general usage category.

4 Likes

The problem is that the hash(key::Z3.ExprAllocated) method returns a UInt32 instead of a UInt64. This is why the type assertion fails.

Check in the package code to see if that method is defined and if so you’ll have to fix it. Otherwise, it might be due to a default method of hash (though I haven’t checked, I’m not sure there even is a default method for hash), in which case you should define your own.

1 Like

Thank you for the reply. I tested it with Julia 1.4.2 instead of 1.6.3 and it’s working.