docs: def build_strain_specific_models(self, joblib=False, cores=1, force_rerun=False):
          """Wrapper function for _build_strain_specific_model"""
          if len(self.df_orthology_matrix) == 0:
              raise RuntimeError('Empty orthology matrix, please calculate first!')
          ref_functional_genes = [g.id for g in self.reference_gempro.functional_genes]
          log.info('Building strain specific models...')
          if joblib:
              result = DictList(Parallel(n_jobs=cores)(delayed(self._build_strain_specific_model)(s, ref_functional_genes, self.df_orthology_matrix, force_rerun=force_rerun) for s in self.strain_ids))
          # if sc:
          #     strains_rdd = sc.parallelize(self.strain_ids)
          #     result = strains_rdd.map(self._build_strain_specific_model).collect()
          else:
              result = []
              for s in tqdm(self.strain_ids):
                  result.append(self._build_strain_specific_model(s, ref_functional_genes, self.df_orthology_matrix, force_rerun=force_rerun))
  
          for strain_id, gp_noseqs_path in result:
              self.strain_infodict[strain_id]['gp_noseqs_path'] = gp_noseqs_path