Source code for wield.control.SFLU.test.T_SFLU_DRFPMI

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# SPDX-License-Identifier: Apache-2.0
# SPDX-FileCopyrightText: © 2021 Massachusetts Institute of Technology.
# SPDX-FileCopyrightText: © 2021 Lee McCuller <mcculler@caltech.edu>
# NOTICE: authors should document their contributions in concisely in NOTICE
# with details inline in source files, comments, and docstrings.
"""
"""
import numpy as np
import networkx as nx
from wield.utilities.mpl import mplfigB

from wield.control.SFLU import nx2tikz
from wield.utilities.strings import padding_remove

from wield.control.SFLU import SFLU
from wield.control.SFLU.functions import neg

from wield.pytest import (  # noqa: F401
    tjoin,
    dprint,
)


DRFPMI_locs = {
    "prm.A.i": (-10, +5),
    "prm.A.o": (-10, -5),
    "prm.B.i": (-5, -5),
    "prm.B.o": (-5, +5),
    "prm.A.i.exc": (-20, +5),
    "prm.A.o.tp": (-20, -5),

    "X.itm.A.i": (+25, +5),
    "X.itm.A.o": (+25, -5),
    "X.itm.B.i": (+30, -5),
    "X.itm.B.o": (+30, +5),

    "X.etm.A.i": (+40, +5),
    "X.etm.A.o": (+40, -5),
    "X.etm.B.o": (+45, +5),
    "X.etm.B.i": (+45, -5),

    "Y.itm.A.i": (+5, +15),
    "Y.itm.A.o": (+15, +15),
    "Y.itm.B.o": (+5, +20),
    "Y.itm.B.i": (+15, +20),

    "Y.etm.A.i": (+5, +30),
    "Y.etm.A.o": (+15, +30),
    "Y.etm.B.o": (+5, +35),
    "Y.etm.B.i": (+15, +35),

    "srm.A.i": (+15, -15),
    "srm.A.o": (+5, -15),
    "srm.B.o": (+15, -20),
    "srm.B.i": (+5, -20),

    "BS.A1.i": (-0, +5),
    "BS.A1.o": (-0, -5),

    "BS.B1.i": (+20, -5),
    "BS.B1.o": (+20, +5),

    "BS.A2.o": (+5, +10),
    "BS.A2.i": (+15, +10),

    "BS.B2.i": (+5, -10),
    "BS.B2.o": (+15, -10),

    "srm.B.i.exc": (+5, -25),
    "srm.B.o.tp": (+15, -25),
    "X.etm.A.o.exc": (+38, -10),
    "X.etm.A.o.tp": (+41, -8),
    "Y.etm.A.o.exc": (+20, +30),
    "Y.etm.A.o.tp": (+20, +32),
}

DRFPMI_edges = {
    ("BS.B1.o"      ,  "BS.A1.i"       ): "BS.t",
    ("BS.A1.o"      ,  "BS.B1.i"       ): "BS.t",
    ("BS.B2.o"      ,  "BS.A2.i"       ): "BS.t",
    ("BS.A2.o"      ,  "BS.B2.i"       ): "BS.t",
    ("BS.A2.o"      ,  "BS.A1.i"       ): "BS.r",
    ("BS.A1.o"      ,  "BS.A2.i"       ): "BS.r",
    ("BS.B1.o"      ,  "BS.B2.i"       ): "-BS.r",
    ("BS.B2.o"      ,  "BS.B1.i"       ): "-BS.r",

    ("prm.A.o"      ,  "prm.B.i"       ): "prm.t",
    ("prm.B.o"      ,  "prm.A.i"       ): "prm.t",
    ("prm.A.o"      ,  "prm.A.i"       ): "prm.r",
    ("prm.B.o"      ,  "prm.B.i"       ): "-prm.r",

    ("srm.B.o"      ,  "srm.A.i"       ): "srm.t",
    ("srm.A.o"      , "srm.B.i"        ): "srm.t",
    ("srm.A.o"      , "srm.A.i"        ): "srm.r",
    ("srm.B.o"      ,  "srm.B.i"       ): "-srm.r",

    ("Y.itm.A.o"    ,  "Y.itm.A.i"     ): "Y.itm.r",
    ("Y.itm.B.o"    ,  "Y.itm.B.i"     ): "-Y.itm.r",
    ("Y.itm.B.o"    ,  "Y.itm.A.i"     ): "Y.itm.t",
    ("Y.itm.A.o"    ,  "Y.itm.B.i"     ): "Y.itm.t",

    ("Y.etm.A.o"    ,  "Y.etm.A.i"     ): "Y.etm.r",
    ("Y.etm.B.o"    ,  "Y.etm.B.i"     ): "-Y.etm.r",
    ("Y.etm.B.o"    ,  "Y.etm.A.i"     ): "Y.etm.t",
    ("Y.etm.A.o"    ,  "Y.etm.B.i"     ): "Y.etm.t",

    ("X.itm.A.o"    ,  "X.itm.A.i"     ): "X.itm.r",
    ("X.itm.B.o"    ,  "X.itm.B.i"     ): "-X.itm.r",
    ("X.itm.B.o"    ,  "X.itm.A.i"     ): "X.itm.t",
    ("X.itm.A.o"    ,  "X.itm.B.i"     ): "X.itm.t",

    ("X.etm.A.o"    ,  "X.etm.A.i"     ): "X.etm.r",
    ("X.etm.B.o"    ,  "X.etm.B.i"     ): "-X.etm.r",
    ("X.etm.B.o"    ,  "X.etm.A.i"     ): "X.etm.t",
    ("X.etm.A.o"    ,  "X.etm.B.i"     ): "X.etm.t",

    ("prm.B.i"      ,  "BS.A1.o"       ): "prc.tau",
    ("BS.A1.i"      ,  "prm.B.o"       ): "prc.tau",

    ("srm.A.i"      , "BS.B2.o"        ): "src.tau",
    ("BS.B2.i"      ,  "srm.A.o"       ): "src.tau",
     # ("BS.B2.i"      , "BS.B2.o"        ): "src.tau",
     # ("srm.A.i"      , "srm.A.o"        ): "1",

    ("Y.itm.A.i"    ,  "BS.A2.o"       ): ('*', 'BS_Y.tau'),
    ("BS.A2.i"      ,  "Y.itm.A.o"     ): ('*', 'BS_Y.tau'),

    ("X.itm.A.i"    ,  "BS.B1.o"       ): ('*', 'BS_X.tau'),
    ("BS.B1.i"      ,  "X.itm.A.o"     ): ('*', 'BS_X.tau'),

    ("X.etm.A.i"    ,  "X.itm.B.o"     ): "XARM.tau",
    ("X.itm.B.i"    ,  "X.etm.A.o"     ): "XARM.tau",

    ("Y.etm.A.i"    ,  "Y.itm.B.o"     ): "YARM.tau",
    ("Y.itm.B.i"    ,  "Y.etm.A.o"     ): "YARM.tau",

    ("X.etm.A.o"    ,  "X.etm.A.o.exc" ): "1",
    ("Y.etm.A.o"    ,  "Y.etm.A.o.exc" ): "1",
    ("X.etm.A.o.tp" ,  "X.etm.A.o"     ): "1",
    ("Y.etm.A.o.tp" ,  "Y.etm.A.o"     ): "1",

    ("srm.B.i"      ,  "srm.B.i.exc"   ): "1",
    ("srm.B.o.tp"   ,  "srm.B.o"       ): "1",
    ("prm.A.i"      ,  "prm.A.i.exc"   ): "1",
    ("prm.A.o.tp"   ,  "prm.A.o"       ): "1",
}

reduce_list = [
    'X.etm.A.i',
    'X.etm.A.o',
    'X.itm.B.i',
    'X.itm.B.o',
    'Y.etm.A.i',
    'Y.etm.A.o',
    'Y.itm.B.i',
    'Y.itm.B.o',

    'X.itm.A.i',
    'X.itm.A.o',
    'Y.itm.A.i',
    'Y.itm.A.o',

    'prm.A.i',
    'prm.A.o',
    'prm.B.i',
    'prm.B.o',

    'BS.A1.i',
    'BS.A1.o',
    'BS.A2.i',
    'BS.A2.o',
    'BS.B1.i',
    'BS.B1.o',
    'BS.B2.i',
    'BS.B2.o',

    'srm.A.i',
    'srm.A.o',
    'srm.B.i',
    'srm.B.o',
]


in_out = dict(
    inputs = [
        'srm.B.i.exc',
        'Y.etm.A.o.exc',
        'X.etm.A.o.exc',
        'prm.A.i.exc',
        'srm.B.i.exc',
        'X.etm.B.i',
        'Y.etm.B.i',
    ],
    outputs = [
        'srm.B.o.tp',
        'prm.A.o.tp',
        'X.etm.A.o.tp',
        'Y.etm.A.o.tp',
        'srm.B.o.tp',
        'X.etm.B.o',
        'Y.etm.B.o',
    ],
)

if True:

[docs] def T_SFLU_DRFPMI_show_full(): """ Show a graph reduction using networkx+tikz """ sflu = SFLU.SFLU( DRFPMI_edges, graph=True, ) # match=False allows a reduced input/output set sflu.graph_nodes_pos(DRFPMI_locs, match=True) #sflu.graph_nodes_pos(DRFPMI_locs, match=True) print('inputs: ', sflu.inputs) print('outputs: ', sflu.outputs) print('nodes: ', sflu.nodes) #print('nodes') #print(sflu.graph_nodes_repr()) G1 = sflu.G.copy() sflu.graph_reduce_auto_pos(lX=-10, rX=+10, Y=0, dY=-2) sflu.reduce(*reduce_list) sflu.graph_reduce_auto_pos_io(lX=-30, rX=+30, Y=-5, dY=-5) G2 = sflu.G.copy() nx2tikz.dump_pdf( [G1, G2], fname = tjoin('testG.pdf'), texname = tjoin('testG.tex'), # preamble = preamble, scale='10pt', )
[docs] def T_SFLU_DRFPMI_show_sub(): """ Show a graph reduction using networkx+tikz """ sflu = SFLU.SFLU( DRFPMI_edges, graph=True, **in_out, ) # match=False allows a reduced input/output set sflu.graph_nodes_pos(DRFPMI_locs, match=True) G0 = sflu.G.copy() #sflu.graph_nodes_pos(DRFPMI_locs, match=True) print('inputs: ', sflu.inputs) print('outputs: ', sflu.outputs) print('nodes: ', sflu.nodes) #print('nodes') #print(sflu.graph_nodes_repr()) G1 = sflu.G.copy() sflu.graph_reduce_auto_pos(lX=-10, rX=+10, Y=0, dY=-2) sflu.reduce(*reduce_list) print('nodes: ', sflu.nodes) sflu.graph_reduce_auto_pos_io(lX=-30, rX=+30, Y=-5, dY=-5) G2 = sflu.G.copy() G3 = sflu.G.copy() for rN, cS in sflu.row2col_cf.items(): for cN in cS: G2.edges[cN, rN]['color'] = 'blue' for cN, rS in sflu.col2row_cf.items(): for rN in rS: G2.edges[cN, rN]['color'] = 'red' if True: # this is to colorize the edges of G3 based on the computation comp = sflu.computer() edge_map = {} comp.edge_map(edge_map = edge_map, default = 1) print(edge_map) T_etm = 0 T_itm = 0.0148 T_prm = 0.03 T_srm = 0.35 emap = { '1': 1, 'BS.r': 0.5**0.5, 'BS.t': 0.5**0.5, 'BS_X.tau': np.exp(np.pi*2j*0), 'BS_Y.tau': np.exp(np.pi*2j*0), 'X.etm.r': (1-T_etm)**0.5, 'X.etm.t': T_etm**0.5, 'X.itm.r': (1-T_itm)**0.5, 'X.itm.t': T_itm**0.5, 'XARM.tau': np.exp(np.pi*2j*0), 'Y.etm.r': (1-T_etm)**0.5, 'Y.etm.t': T_etm**0.5, 'Y.itm.r': (1-T_itm)**0.5, 'Y.itm.t': T_itm**0.5, 'YARM.tau': np.exp(np.pi*2j*0), 'prc.tau': np.exp(np.pi*2j*0), 'prm.r': (1-T_prm)**0.5, 'prm.t': T_prm**0.5, 'src.tau': np.exp(np.pi*2j*0), 'srm.r': (1-T_srm)**0.5, 'srm.t': T_srm**0.5, } assert(set(edge_map.keys()) == set(emap.keys())) comp.compute(edge_map=emap) for rN, cN in comp.Espace.keys(): try: G3.edges[cN, rN]['color'] = 'red' except KeyError: pass else: G3 = G2 nx2tikz.dump_pdf( [G1, G2, G3], fname = tjoin('testG.pdf'), texname = tjoin('testG.tex'), # preamble = preamble, scale='10pt', )
[docs] def T_SFLU_DRFPMI_serialize(): sflu = SFLU.SFLU( DRFPMI_edges, **in_out, ) sflu.reduce(*reduce_list) comp = sflu.computer() oplistE_yamlstr = comp.convert_oplistE2yamlstr() print(oplistE_yamlstr) assert(comp.convert_yamlstr2oplistE(oplistE_yamlstr) == comp.oplistE) comp_yamlstr = comp.convert_self2yamlstr() print(comp_yamlstr) comp2 = SFLU.SFLUCompute.from_yaml(comp_yamlstr) assert(comp2.oplistE == comp.oplistE) assert(comp2.edges == comp.edges) assert(comp2.row2col == comp.row2col) assert(comp2.col2row == comp.col2row) with open(tjoin('DRFPMI.yaml'), 'w') as F: F.write(comp_yamlstr) return
[docs] def T_SFLU_DRFPMI_working(): sflu = SFLU.SFLU( DRFPMI_edges, **in_out, ) sflu.reduce(*reduce_list) comp = sflu.computer() print(comp.edges) edge_map = {} comp.edge_map(edge_map = edge_map, default = 1) print(edge_map) T_etm = 80e-6 T_itm = 0.0148 T_prm = 0.03 T_srm = 0.35 emap = { '1': 1, 'BS.r': 0.5**0.5, 'BS.t': 0.5**0.5, 'BS_X.tau': np.exp(np.pi*0.5j), 'BS_Y.tau': np.exp(np.pi*2j*0), 'X.etm.r': (1-T_etm)**0.5, 'X.etm.t': T_etm**0.5, 'X.itm.r': (1-T_itm)**0.5, 'X.itm.t': T_itm**0.5, 'XARM.tau': np.exp(np.pi*2j*0), 'Y.etm.r': (1-T_etm)**0.5, 'Y.etm.t': T_etm**0.5, 'Y.itm.r': (1-T_itm)**0.5, 'Y.itm.t': T_itm**0.5, 'YARM.tau': np.exp(np.pi*2j*0), 'prc.tau': np.exp(np.pi*2j*0), 'prm.r': (1-T_prm)**0.5, 'prm.t': T_prm**0.5, 'src.tau': np.exp(np.pi*2j*0), 'srm.r': (1-T_srm)**0.5, 'srm.t': T_srm**0.5, } assert(set(edge_map.keys()) == set(emap.keys())) comp.compute(edge_map=emap) dprint(list(comp.Espace.keys())) #results = comp.inverse_col(['srm.B.o.tp'], {'srm.B.i.exc':1})['srm.B.o.tp'] results = comp.inverse_single('srm.B.o.tp', 'srm.B.i.exc') print("CALC: ", abs(results)**2) results = comp.inverse_row({'srm.B.o.tp': None}, { 'srm.B.i.exc', 'prm.A.i.exc', 'X.etm.B.i', 'Y.etm.B.i', }) print("CALC: ", {k : abs(r)**2 for k, r in results.items()}, sum(abs(r)**2 for k, r in results.items())) pass