I am sorry that I didn't pay attention to the formulae. But now I have two points.
First, the formula for gt.assortativity implies that we are talking about discrete categories for the vertices. If this is true, how can we use it at all for "degree" since we treat that as a continuous variable? Thus, I don't understand what does "in", "out" and "total" do in this formula.
Second, I tried implementing the formula itself assuming that the actual degree values to be discrete types and my code gives different results than the result given by gt.assortativity. I agree that I might be interpreting the whole thing in a different fashion and I would be very happy to understand it. My code:
import numpy as np
import graph_tool.all as gt
# Load a graph
g = gt.collection.data['karate']
# Unique degree values or types
deg_vals = list(set([v.out_degree() for v in g.vertices()]))
n = len(deg_vals)
e = np.zeros(n) # fraction of edges that connect similar vertices
a = np.zeros(n) # fraction of edges connected to a vertx of a given type
for v in g.vertices():
a[deg_vals.index(v.out_degree())] += 1
for nbr in v.out_neighbours():
if v.out_degree() == nbr.out_degree():
e[deg_vals.index(v.out_degree())] += 1
a /= g.num_edges()
e /= g.num_edges()
r = (sum(e)-sum(a**2))/(1-sum(a**2))
print(r)
print(gt.assortativity(g, deg = 'out'))