docs: def _read_bim(self):
          """Reads the BIM file."""
          # Reading the BIM file and setting the values
          bim = pd.read_csv(self.bim_filename, delim_whitespace=True,
                            names=["chrom", "snp", "cm", "pos", "a1", "a2"],
                            dtype=dict(snp=str, a1=str, a2=str))
  
          # Saving the index as integer
          bim["i"] = bim.index
  
          # Checking for duplicated markers
          try:
              bim = bim.set_index("snp", verify_integrity=True)
              self._has_duplicated = False
  
          except ValueError as e:
              # Setting this flag to true
              self._has_duplicated = True
  
              # Finding the duplicated markers
              duplicated = bim.snp.duplicated(keep=False)
              duplicated_markers = bim.loc[duplicated, "snp"]
              duplicated_marker_counts = duplicated_markers.value_counts()
  
              # The dictionary that will contain information about the duplicated
              # markers
              self._dup_markers = {
                  m: [] for m in duplicated_marker_counts.index
              }
  
              # Logging a warning
              logger.warning("Duplicated markers found")
              for marker, count in duplicated_marker_counts.iteritems():
                  logger.warning("  - {}: {:,d} times".format(marker, count))
              logger.warning("Appending ':dupX' to the duplicated markers "
                             "according to their location in the BIM file")
  
              # Renaming the markers
              counter = Counter()
              for i, marker in duplicated_markers.iteritems():
                  counter[marker] += 1
                  new_name = "{}:dup{}".format(marker, counter[marker])
                  bim.loc[i, "snp"] = new_name
  
                  # Updating the dictionary containing the duplicated markers
                  self._dup_markers[marker].append(new_name)
  
              # Resetting the index
              bim = bim.set_index("snp", verify_integrity=True)
  
          # Encoding the allele
          #   - The original 0 is the actual 2 (a1/a1)
          #   - The original 2 is the actual 1 (a1/a2)
          #   - The original 3 is the actual 0 (a2/a2)
          #   - The original 1 is the actual -1 (no call)
          allele_encoding = np.array(
              [bim.a2 * 2, bim.a1 + bim.a2, bim.a1 * 2,
               list(repeat("00", bim.shape[0]))],
              dtype="U2",
          )
          self._allele_encoding = allele_encoding.T
  
          # Saving the data in the object
          self._bim = bim[["chrom", "pos", "cm", "a1", "a2", "i"]]
          self._nb_markers = self._bim.shape[0]