def main():

    results_root = pjoin(mm.rootdir(), "experiments", "parameter_sweeps", "odblock-eigs")

    for _rdir in os.listdir(results_root):
        results_dir = pjoin(results_root, _rdir)

        data = mm.parse_run(results_dir)

        if data is None:
            continue

        print("\nrefinement level", data['refinement'])
        print("disable-ms?", data['disable-ms'])

        first_m_block = 2
        nblock = 5

        # Just first Jacobian for now
        with warnings.catch_warnings():
            A = omat.import_blocks(pjoin(results_dir, "J_3_1_block"), nblock)

        # Get only LLG blocks
        A = omat.sub_matrix(A, first_m_block)

        # Get only offdiagonal blocks
        A = omat.off_diagonal_blocks(A)

        evs = []
        non_sym = []
        for block in A.flat:
            if block.nnz > 0:
                ev, evec = sp.sparse.linalg.eigs(block)
                evs.append(ev)
                TT = block - block.T

                nnz = len(filter(lambda x: x> 1e-8, TT.data))
                non_sym.append(nnz)

                # if nnz > 0:
                #     print(sp.mean(block.data))
                #     print(TT)


        # print("overall abs", map(maxabs, evs))
        # print("max real part", map(maxreal, evs))
        print("max imaginary part", max(map(maximag, evs)))

        print("max nnz in B - B^T", max(non_sym))



    return 0
    Z = sp.where(abs(Z.todense()) > precision, 1.0, 0.0)

    fig, axes = plt.subplots(1, 1)
    axes.imshow(Z.T, interpolation='nearest', cmap=binary)

    return fig


def print_block_shapes(blocks):
    for i in range(0, blocks.shape[0]):
        for j in range(0, blocks.shape[1]):
            print(i, j, blocks[i, j].shape)

# Load matrices
# first Jacobian of first time step
blocks = omat.import_blocks(pjoin(results_dir, "J_1_1_block"), 7)

# Get blocks of interest
F = omat.mergeblocks(blocks[2:5, 2:5])
A = blocks[0, 0].tocsr()
D = omat.mergeblocks(sp.array(blocks[0, 2:5], ndmin=2))
B = omat.mergeblocks(sp.array([[blocks[2,0]], [blocks[3,0]], [blocks[4,0]]]))

# Some info on shapes
print("F", F.shape)
print("A", A.shape)
print("B", B.shape)
print("D", D.shape)

# Calculate the schur complement
Ainv = sp.sparse.linalg.inv(A.tocsc())