From 7eeaceb94797a4886bf963aec33d0f666bf74f4d Mon Sep 17 00:00:00 2001 From: "Quan (Andy) Gan" Date: Mon, 12 Jun 2023 10:44:24 +0800 Subject: [PATCH 1/8] use scipy instead of numpy --- python/dgl/transforms/functional.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/dgl/transforms/functional.py b/python/dgl/transforms/functional.py index fafb2ed32afb..91a435a9f0a2 100644 --- a/python/dgl/transforms/functional.py +++ b/python/dgl/transforms/functional.py @@ -3672,7 +3672,7 @@ def lap_pe(g, k, padding=False, return_eigval=False): L = sparse.eye(g.num_nodes()) - N * A * N # select eigenvectors with smaller eigenvalues O(n + klogk) - EigVal, EigVec = np.linalg.eig(L.toarray()) + EigVal, EigVec = scipy.sparse.linalg.eigs(L, k=pos_enc_dim+1, which='SR', tol=1e-2) max_freqs = min(n - 1, k) kpartition_indices = np.argpartition(EigVal, max_freqs)[: max_freqs + 1] topk_eigvals = EigVal[kpartition_indices] From 5b62d1b9b63e978d2e2fa7894977e183c1a4125e Mon Sep 17 00:00:00 2001 From: "Quan (Andy) Gan" Date: Thu, 29 Jun 2023 10:22:02 +0800 Subject: [PATCH 2/8] Update functional.py --- python/dgl/transforms/functional.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/dgl/transforms/functional.py b/python/dgl/transforms/functional.py index 91a435a9f0a2..bbd5edc7c0d7 100644 --- a/python/dgl/transforms/functional.py +++ b/python/dgl/transforms/functional.py @@ -3672,7 +3672,7 @@ def lap_pe(g, k, padding=False, return_eigval=False): L = sparse.eye(g.num_nodes()) - N * A * N # select eigenvectors with smaller eigenvalues O(n + klogk) - EigVal, EigVec = scipy.sparse.linalg.eigs(L, k=pos_enc_dim+1, which='SR', tol=1e-2) + EigVal, EigVec = scipy.sparse.linalg.eigs(L, k=k+1, which='SR', tol=1e-2) max_freqs = min(n - 1, k) kpartition_indices = np.argpartition(EigVal, max_freqs)[: max_freqs + 1] topk_eigvals = EigVal[kpartition_indices] From 5b4f1352fd9de2b39c6f3bd15ba1c85accdb2fee Mon Sep 17 00:00:00 2001 From: Quan Gan Date: Tue, 4 Jul 2023 05:58:55 +0000 Subject: [PATCH 3/8] fix --- python/dgl/transforms/functional.py | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/python/dgl/transforms/functional.py b/python/dgl/transforms/functional.py index bbd5edc7c0d7..03a374c301a6 100644 --- a/python/dgl/transforms/functional.py +++ b/python/dgl/transforms/functional.py @@ -3673,12 +3673,10 @@ def lap_pe(g, k, padding=False, return_eigval=False): # select eigenvectors with smaller eigenvalues O(n + klogk) EigVal, EigVec = scipy.sparse.linalg.eigs(L, k=k+1, which='SR', tol=1e-2) - max_freqs = min(n - 1, k) - kpartition_indices = np.argpartition(EigVal, max_freqs)[: max_freqs + 1] - topk_eigvals = EigVal[kpartition_indices] - topk_indices = kpartition_indices[topk_eigvals.argsort()][1:] - topk_EigVec = EigVec[:, topk_indices] - eigvals = F.tensor(EigVal[topk_indices], dtype=F.float32) + topk_indices = EigVal.argsort()[1:] + topk_eigvals = EigVal[topk_indices].real # scipy may give complex + topk_EigVec = EigVec[:, topk_indices].real + eigvals = F.tensor(topk_eigvals, dtype=F.float32) # get random flip signs rand_sign = 2 * (np.random.rand(max_freqs) > 0.5) - 1.0 From 19317d488889a1d86781ccd1a7974d4ac273b9d9 Mon Sep 17 00:00:00 2001 From: "Quan (Andy) Gan" Date: Wed, 5 Jul 2023 13:59:48 +0800 Subject: [PATCH 4/8] Update functional.py --- python/dgl/transforms/functional.py | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/python/dgl/transforms/functional.py b/python/dgl/transforms/functional.py index 03a374c301a6..8c7a9168568b 100644 --- a/python/dgl/transforms/functional.py +++ b/python/dgl/transforms/functional.py @@ -3672,10 +3672,21 @@ def lap_pe(g, k, padding=False, return_eigval=False): L = sparse.eye(g.num_nodes()) - N * A * N # select eigenvectors with smaller eigenvalues O(n + klogk) - EigVal, EigVec = scipy.sparse.linalg.eigs(L, k=k+1, which='SR', tol=1e-2) - topk_indices = EigVal.argsort()[1:] - topk_eigvals = EigVal[topk_indices].real # scipy may give complex - topk_EigVec = EigVec[:, topk_indices].real + + if k + 1 < n - 1: + # Use scipy if k + 1 < n - 1 for memory efficiency. + EigVal, EigVec = scipy.sparse.linalg.eigs(L, k=k+1, which='SR', tol=1e-2) + topk_indices = EigVal.argsort()[1:] + topk_eigvals = EigVal[topk_indices].real # scipy may give complex + topk_EigVec = EigVec[:, topk_indices].real + else: + # Fallback to numpy since scipy.sparse do not support this case. + EigVal, EigVec = np.linalg.eig(L.toarray()) + max_freqs = min(n - 1, k) + kpartition_indices = np.argpartition(EigVal, max_freqs)[: max_freqs + 1] + topk_eigvals = EigVal[kpartition_indices] + topk_indices = kpartition_indices[topk_eigvals.argsort()][1:] + topk_EigVec = EigVec[:, topk_indices] eigvals = F.tensor(topk_eigvals, dtype=F.float32) # get random flip signs From c40c8a20a32f57123373dad5ce06fb8ce3a2516b Mon Sep 17 00:00:00 2001 From: rudongyu Date: Thu, 27 Jul 2023 08:59:07 +0800 Subject: [PATCH 5/8] Update python/dgl/transforms/functional.py --- python/dgl/transforms/functional.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/python/dgl/transforms/functional.py b/python/dgl/transforms/functional.py index 8c7a9168568b..3b4070435676 100644 --- a/python/dgl/transforms/functional.py +++ b/python/dgl/transforms/functional.py @@ -3687,7 +3687,8 @@ def lap_pe(g, k, padding=False, return_eigval=False): topk_eigvals = EigVal[kpartition_indices] topk_indices = kpartition_indices[topk_eigvals.argsort()][1:] topk_EigVec = EigVec[:, topk_indices] - eigvals = F.tensor(topk_eigvals, dtype=F.float32) + topk_EigVal = EigVal[topk_indices] + eigvals = F.tensor(topk_EigVal, dtype=F.float32) # get random flip signs rand_sign = 2 * (np.random.rand(max_freqs) > 0.5) - 1.0 From 5b072426072f6e3e222d8009f3e0e41f67c050e1 Mon Sep 17 00:00:00 2001 From: Quan Gan Date: Thu, 3 Aug 2023 05:32:04 +0000 Subject: [PATCH 6/8] lint --- python/dgl/transforms/functional.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/python/dgl/transforms/functional.py b/python/dgl/transforms/functional.py index 3b4070435676..977ef8162ea4 100644 --- a/python/dgl/transforms/functional.py +++ b/python/dgl/transforms/functional.py @@ -3675,7 +3675,9 @@ def lap_pe(g, k, padding=False, return_eigval=False): if k + 1 < n - 1: # Use scipy if k + 1 < n - 1 for memory efficiency. - EigVal, EigVec = scipy.sparse.linalg.eigs(L, k=k+1, which='SR', tol=1e-2) + EigVal, EigVec = scipy.sparse.linalg.eigs( + L, k=k + 1, which="SR", tol=1e-2 + ) topk_indices = EigVal.argsort()[1:] topk_eigvals = EigVal[topk_indices].real # scipy may give complex topk_EigVec = EigVec[:, topk_indices].real From bc6a51452f380d76b9f80d723431c2a3021ce412 Mon Sep 17 00:00:00 2001 From: "Quan (Andy) Gan" Date: Mon, 21 Aug 2023 12:44:04 +0800 Subject: [PATCH 7/8] Update python/dgl/transforms/functional.py Co-authored-by: Hongzhi (Steve), Chen --- python/dgl/transforms/functional.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/python/dgl/transforms/functional.py b/python/dgl/transforms/functional.py index 977ef8162ea4..8f073244ccd5 100644 --- a/python/dgl/transforms/functional.py +++ b/python/dgl/transforms/functional.py @@ -3679,7 +3679,9 @@ def lap_pe(g, k, padding=False, return_eigval=False): L, k=k + 1, which="SR", tol=1e-2 ) topk_indices = EigVal.argsort()[1:] - topk_eigvals = EigVal[topk_indices].real # scipy may give complex + # Since scipy may return complex value, to avoid crashing in NN code, + # convert them to real number. + topk_eigvals = EigVal[topk_indices].real topk_EigVec = EigVec[:, topk_indices].real else: # Fallback to numpy since scipy.sparse do not support this case. From 070f0fd25ac6255dad0e05051b1a9d6eb7b755f0 Mon Sep 17 00:00:00 2001 From: "Quan (Andy) Gan" Date: Mon, 21 Aug 2023 12:44:10 +0800 Subject: [PATCH 8/8] Update python/dgl/transforms/functional.py Co-authored-by: Hongzhi (Steve), Chen --- python/dgl/transforms/functional.py | 1 - 1 file changed, 1 deletion(-) diff --git a/python/dgl/transforms/functional.py b/python/dgl/transforms/functional.py index 8f073244ccd5..14ccf0f196a8 100644 --- a/python/dgl/transforms/functional.py +++ b/python/dgl/transforms/functional.py @@ -3672,7 +3672,6 @@ def lap_pe(g, k, padding=False, return_eigval=False): L = sparse.eye(g.num_nodes()) - N * A * N # select eigenvectors with smaller eigenvalues O(n + klogk) - if k + 1 < n - 1: # Use scipy if k + 1 < n - 1 for memory efficiency. EigVal, EigVec = scipy.sparse.linalg.eigs(