# Buggy code
def create_neg(self, neg_head):
    if neg_head:

        def fn(heads, relations, tails, num_chunks, chunk_size, neg_sample_size):
            hidden_dim = heads.shape[1]
            heads = heads.reshape(num_chunks, neg_sample_size, hidden_dim)
            heads = nd.transpose(heads, axes=(0, 2, 1))
            tmp = (tails * relations).reshape(num_chunks, chunk_size, hidden_dim)
            return nd.linalg_gemm2(tmp, heads)

        return fn
    else:

        def fn(heads, relations, tails, num_chunks, chunk_size, neg_sample_size):
            hidden_dim = heads.shape[1]
            tails = tails.reshape(num_chunks, neg_sample_size, hidden_dim)
            tails = nd.transpose(tails, axes=(0, 2, 1))
            tmp = (heads * relations).reshape(num_chunks, chunk_size, hidden_dim)
            return nd.linalg_gemm2(tmp, tails)

        return fn


# Traceback (AssertionError)
test_shared_mem_store.test_init ... /var/jenkins_home/workspace/DGL_PR-752@2/python/dgl/base.py:18: UserWarning: Initializer is not set. Use zero initializer instead. To suppress this warning, use `set_initializer` to explicitly specify which initializer to use.
warnings.warn(msg, warn_type)
/var/jenkins_home/workspace/DGL_PR-752@2/python/dgl/base.py:18: UserWarning: It may not be safe to access node data of all nodes.It's recommended to node data of a subset of nodes directly.
warnings.warn(msg, warn_type)
/var/jenkins_home/workspace/DGL_PR-752@2/python/dgl/base.py:18: UserWarning: It may not be safe to access edge data of all edges.It's recommended to edge data of a subset of edges directly.
warnings.warn(msg, warn_type)
[06:09:05] /var/jenkins_home/workspace/DGL_PR-752@2/src/runtime/shared_mem.cc:32: remove /test_graph1_node_feat for shared memory
[06:09:05] /var/jenkins_home/workspace/DGL_PR-752@2/src/runtime/shared_mem.cc:32: remove /test_graph1_node_test4 for shared memory
[06:09:05] /var/jenkins_home/workspace/DGL_PR-752@2/src/runtime/shared_mem.cc:32: remove /test_graph1_in for shared memory
[06:09:05] /var/jenkins_home/workspace/DGL_PR-752@2/src/runtime/shared_mem.cc:32: remove /test_graph1_edge_feat for shared memory
[06:09:05] /var/jenkins_home/workspace/DGL_PR-752@2/src/runtime/shared_mem.cc:32: remove /test_graph1_edge_test4 for shared memory
/var/jenkins_home/workspace/DGL_PR-752@2/python/dgl/base.py:18: UserWarning: Initializer is not set. Use zero initializer instead. To suppress this warning, use `set_initializer` to explicitly specify which initializer to use.
warnings.warn(msg, warn_type)
/var/jenkins_home/workspace/DGL_PR-752@2/python/dgl/base.py:18: UserWarning: It may not be safe to access node data of all nodes.It's recommended to node data of a subset of nodes directly.
warnings.warn(msg, warn_type)
/var/jenkins_home/workspace/DGL_PR-752@2/python/dgl/base.py:18: UserWarning: It may not be safe to access edge data of all edges.It's recommended to edge data of a subset of edges directly.
warnings.warn(msg, warn_type)

Arrays are not almost equal to 7 decimals

(mismatch 100.0%)
x: array([20., 20., 20., 20., 20., 20., 20., 20., 20., 20.], dtype=float32)
y: array(11)
Traceback (most recent call last):
File "/var/jenkins_home/workspace/DGL_PR-752@2/tests/distributed/test_shared_mem_store.py", line 65, in check_init_func
check_array_shared_memory(g, worker_id, [g.nodes[:].data['test4'], g.edges[:].data['test4']])
File "/var/jenkins_home/workspace/DGL_PR-752@2/tests/distributed/test_shared_mem_store.py", line 28, in check_array_shared_memory
assert_almost_equal(F.asnumpy(arr[0]), i + 10)
File "/usr/local/lib/python3.5/dist-packages/numpy/testing/nose_tools/utils.py", line 567, in assert_almost_equal
return assert_array_almost_equal(actual, desired, decimal, err_msg)
File "/usr/local/lib/python3.5/dist-packages/numpy/testing/nose_tools/utils.py", line 965, in assert_array_almost_equal
precision=decimal)
File "/usr/local/lib/python3.5/dist-packages/numpy/testing/nose_tools/utils.py", line 781, in assert_array_compare
raise AssertionError(msg)
AssertionError:
Arrays are not almost equal to 7 decimals

(mismatch 100.0%)
x: array([20., 20., 20., 20., 20., 20., 20., 20., 20., 20.], dtype=float32)
y: array(11)
FAIL

# Fixed code
def create_neg(self, neg_head):
    if neg_head:

        def fn(heads, relations, tails, num_chunks, chunk_size, neg_sample_size):
            hidden_dim = heads.shape[1]
            emb_real, emb_img = nd.split(tails, num_outputs=2, axis=-1)
            rel_real, rel_img = nd.split(relations, num_outputs=2, axis=-1)
            real = emb_real * rel_real + emb_img * rel_img
            img = -emb_real * rel_img + emb_img * rel_real
            emb_complex = nd.concat(real, img, dim=-1)
            tmp = emb_complex.reshape(num_chunks, chunk_size, hidden_dim)
            heads = heads.reshape(num_chunks, neg_sample_size, hidden_dim)
            heads = nd.transpose(heads, axes=(0, 2, 1))
            return nd.linalg_gemm2(tmp, heads)

        return fn
    else:

        def fn(heads, relations, tails, num_chunks, chunk_size, neg_sample_size):
            hidden_dim = heads.shape[1]
            emb_real, emb_img = nd.split(heads, num_outputs=2, axis=-1)
            rel_real, rel_img = nd.split(relations, num_outputs=2, axis=-1)
            real = emb_real * rel_real - emb_img * rel_img
            img = emb_real * rel_img + emb_img * rel_real
            emb_complex = nd.concat(real, img, dim=-1)
            tmp = emb_complex.reshape(num_chunks, chunk_size, hidden_dim)

            tails = tails.reshape(num_chunks, neg_sample_size, hidden_dim)
            tails = nd.transpose(tails, axes=(0, 2, 1))
            return nd.linalg_gemm2(tmp, tails)

        return fn