code: def P(self):
          
          N = self.N
          tig_to_idx = self.tig_to_idx
          P = np.zeros((N, N, 2), dtype=int)
          for (at, bt), (strandedness, md, mh) in self.orientations.items():
              if not (at in tig_to_idx and bt in tig_to_idx):
                  continue
              ai = tig_to_idx[at]
              bi = tig_to_idx[bt]
              P[ai, bi, 0] = P[bi, ai, 0] = md
              P[ai, bi, 1] = P[bi, ai, 1] = mh
          return P
docs: Contact frequency matrix with better precision on distance between
          contigs. In the matrix M, the distance is assumed to be the distance
          between mid-points of two contigs. In matrix Q, however, we compute
          harmonic mean of the links for the orientation configuration that is
          shortest. This offers better precision for the distance between big
          contigs.