code: def _get_v_angle(self, case, B, v_angle_guess, p_businj, iref):
          
          buses = case.connected_buses
  
          pv_idxs = [bus._i for bus in buses if bus.type == PV]
          pq_idxs = [bus._i for bus in buses if bus.type == PQ]
          pvpq_idxs = pv_idxs + pq_idxs
          pvpq_rows = [[i] for i in pvpq_idxs]
  
          # Get the susceptance matrix with the column and row corresponding to
          # the reference bus removed.
          Bpvpq = B[pvpq_rows, pvpq_idxs]
  
          Bref = B[pvpq_rows, [iref]]
  
          # Bus active power injections (generation - load) adjusted for phase
          # shifters and real shunts.
          p_surplus = array([case.s_surplus(v).real for v in buses])
          g_shunt = array([bus.g_shunt for bus in buses])
          Pbus = (p_surplus - p_businj - g_shunt) / case.base_mva
  
          Pbus.shape = len(Pbus), 1
  
          A = Bpvpq
          b = Pbus[pvpq_idxs] - Bref * v_angle_guess[iref]
  
  #        x, res, rank, s = linalg.lstsq(A.todense(), b)
          x = spsolve(A, b)
  
          # Insert the reference voltage angle of the slack bus.
          v_angle = r_[x[:iref], v_angle_guess[iref], x[iref:]]
  
          return v_angle, Pbus[iref]
docs: Calculates the voltage phase angles.