Skip to content

Commit fef93f8

Browse files
author
arnaudon
committed
wip non-abelian transfer
1 parent 6d875d5 commit fef93f8

3 files changed

Lines changed: 30 additions & 12 deletions

File tree

netsalt/modes.py

Lines changed: 27 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -264,7 +264,9 @@ def pump_linear(mode_0, graph, D0_0, D0_1):
264264

265265
def mode_on_nodes(mode, graph):
266266
"""Compute the mode solution on the nodes of the graph."""
267-
laplacian = construct_laplacian(to_complex(mode), graph)
267+
laplacian = graph.graph["params"].get("laplacian_constructor", construct_laplacian)(
268+
to_complex(mode), graph
269+
)[0]
268270
min_eigenvalue, node_solution = sc.sparse.linalg.eigs(
269271
laplacian, k=1, sigma=0, v0=np.ones(len(graph)), which="LM"
270272
)
@@ -901,20 +903,36 @@ def lasing_threshold_linear(mode, graph, D0):
901903

902904
def get_node_transfer(k, graph, input_flow):
903905
"""Compute node transfer from a given input flow."""
904-
BT, _ = construct_incidence_matrix(graph)
906+
laplacian, BT, _, _ = graph.graph["params"].get("laplacian_constructor", construct_laplacian)(
907+
k, graph
908+
)
905909
bt = np.clip(np.ceil(np.real(BT.toarray())), -1, 0)
906-
K = bt.dot(np.repeat(graph.graph["ks"], 2))
907-
return sc.sparse.linalg.spsolve(construct_laplacian(k, graph), K * input_flow)
910+
ks = np.empty(2 * len(graph.graph["ks"]))
911+
ks[::2] = graph.graph["ks"]
912+
ks[1::2] = graph.graph["ks"]
913+
K = bt.dot(ks)
914+
return sc.sparse.linalg.spsolve(laplacian, K * input_flow)
908915

909916

910917
def get_edge_transfer(k, graph, input_flow):
911918
"""Compute edge transfer from a given input flow."""
912919
set_wavenumber(graph, k)
913-
BT, B = construct_incidence_matrix(graph)
914-
_r = sc.sparse.linalg.spsolve(
915-
construct_laplacian(k, graph), BT.dot(np.repeat(graph.graph["ks"], 2) * input_flow)
916-
)
917-
Winv = construct_weight_matrix(graph, with_k=False)
920+
laplacian, BT, B, Winv = graph.graph["params"].get(
921+
"laplacian_constructor", construct_laplacian
922+
)(k, graph)
923+
s = list(np.shape(graph.graph["ks"]))
924+
s[0] *= 2
925+
ks = np.empty(s, dtype=np.complex)
926+
ks[::2] = graph.graph["ks"]
927+
ks[1::2] = graph.graph["ks"]
928+
if len(s) > 1:
929+
_in = np.einsum("ikl,ij", ks, np.diag(input_flow))
930+
_in = BT.dot(sc.linalg.block_diag(*_in))
931+
# WIP HERE
932+
else:
933+
_in = BT.dot(ks * input_flow)
934+
935+
_r = sc.sparse.linalg.spsolve(laplacian, _in)
918936
return Winv.dot(B).dot(_r)
919937

920938

netsalt/non_abelian.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,4 +125,4 @@ def construct_so3_laplacian(wavenumber, graph, abelian_scale=1.0):
125125
set_so3_wavenumber(graph, wavenumber)
126126
BT, B = construct_so3_incidence_matrix(graph, abelian_scale=abelian_scale)
127127
Winv = construct_so3_weight_matrix(graph, abelian_scale=abelian_scale)
128-
return BT.dot(Winv).dot(B)
128+
return BT.dot(Winv).dot(B), BT, B, Winv

netsalt/quantum_graph.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -275,7 +275,7 @@ def construct_laplacian(wavenumber, graph):
275275
[graph[u].get("node_loss", node_loss) for u in graph.nodes()]
276276
)
277277

278-
return laplacian
278+
return BT.dot(Winv).dot(B), BT, B, Winv
279279

280280

281281
def set_wavenumber(graph, wavenumber):
@@ -455,7 +455,7 @@ def mode_quality(mode, graph, quality_method="eigenvalue"):
455455
graph (graph): quantum graph
456456
quality_method (str): method for quality evaluation (eig, singular value or det)
457457
"""
458-
laplacian = graph.graph["params"].get("laplacian_constructor", construct_laplacian)(
458+
laplacian = graph.graph["params"].get("laplacian_constructor", construct_laplacian)[0](
459459
to_complex(mode), graph
460460
)
461461
return laplacian_quality(laplacian, method=quality_method)

0 commit comments

Comments
 (0)