# -*- coding: utf-8 -*-
# =============================================================================
#  Copyright (C) 2018 Mercados Electricos de Centroamérica. All rights reserved
# =============================================================================

"""Construye las matrices PTDF (Matriz H) para el cálculo de flujos DC
"""

from numpy import zeros
from numpy.linalg import solve
from simsdt.red.makeBdc import makeBdc


def makePTDF(bus, branch):
    """Construye la matriz PTDF DC

    Toma como nodo slack el primer nodo.

    La matriz es de dimensiones C{nbr x nb}, en donde C{nbr} es el numero de
    lineas y C{nb} es el numero de buses o nodos. El nodo slack siempre es el
    primer nodo.

    @author: Oscar A. Leiva (MERELEC)
    """

    # constantes
    nb = bus.shape[0]
    nbr = branch.shape[0]

    Bbus, Bf, _ = makeBdc(bus, branch)

    Bbus, Bf = Bbus.todense(), Bf.todense()

    H = zeros((nbr, nb))

    H[:, 1:] = solve(Bbus[1:, 1:].T, Bf[:, 1:].T).T
    #       = Bf[:,1:] * inv(Bbus[1:,1:])

    return H
