#!/usr/bin/env python
# coding: utf-8

# In[1]:


import numpy as np
from finesse.cymath.cmatrix import KLUMatrix

mat = KLUMatrix(name="mirror_example")
In1 = mat.declare_equations(Neqs=1, index=0, name="I_In1", is_diagonal=True)
Out1 = mat.declare_equations(Neqs=1, index=1, name="I_Out1", is_diagonal=True)
In2 = mat.declare_equations(Neqs=1, index=2, name="I_In2", is_diagonal=True)
Out2 = mat.declare_equations(Neqs=1, index=3, name="I_Out2", is_diagonal=True)

mat.construct()
mat.print_matrix()


# In[2]:


a11 = mat.declare_submatrix_view(In1.from_idx, Out1.from_idx, "_In1->Out1", False)
a22 = mat.declare_submatrix_view(In2.from_idx, Out2.from_idx, "_In2->Out2", False)

a12 = mat.declare_submatrix_view(In1.from_idx, Out2.from_idx, "_In1->Out2", False)
a21 = mat.declare_submatrix_view(In2.from_idx, Out1.from_idx, "_In2->Out1", False)

mat.construct()
mat.print_matrix()

print(f"{a11.shape=}")


# In[3]:


r = np.sqrt(0.9)
t = np.sqrt(0.1)

a11[:] = r
a22[:] = r
a12[:] = 1j * t
a21[:] = 1j * t

mat.print_matrix()

# print in dense format
np.set_printoptions(precision=1, linewidth=250)
print(mat.to_scipy_csc().todense())


# In[4]:


mat.set_rhs(In1.from_idx, 1.0)


# In[5]:


mat.print_rhs()

mat.factor()
mat.solve()

mat.print_rhs()


# In[6]:


import finesse
import numpy as np

model = finesse.Model()

np.set_printoptions(linewidth=200, precision=1)

model.parse(
    """
        l l1
        s s1 l1.p1 m1.p1
        m m1 R=0.9 T=0.1
    """
)
model.run(simulation_options={"debug_mode": True});


# In[7]:


with model.built() as sim:
    carrier_solver = sim.carrier
    klu_mat = carrier_solver.M()
    klu_mat.print_matrix()
    klu_mat.print_rhs()


# In[8]:


from finesse.cymath.cmatrix import KLUMatrix

mat = KLUMatrix(name="singular_example")
In1 = mat.declare_equations(Neqs=1, index=0, name="I_In1", is_diagonal=True)
Out1 = mat.declare_equations(Neqs=1, index=1, name="I_Out1", is_diagonal=True)
a12 = mat.declare_submatrix_view(In1.from_idx, Out1.from_idx, "_In1->Out1", False)
a21 = mat.declare_submatrix_view(Out1.from_idx, In1.from_idx, "_Out1->In1", False)

mat.construct()

a12[:] = 1
a21[:] = 1

mat.factor()


# In[9]:


import numpy as np
import finesse


model = finesse.Model()

model.parse(
    """
    l l1 P=1
    s s1 l1.p1 m1.p1
    m m1 R=0.1 T=0.9
    """
)
with model.built() as sim:
    sim.run_carrier()
    for node, val in zip(
        sim.carrier.nodes.keys(), np.array(sim.carrier.M().rhs_view[0, :]),
        strict=True
    ):
        print(node, val)

