docs: def rejection_sample(self, evidence=None, size=1, return_type="dataframe"):
          """
          Generates sample(s) from joint distribution of the bayesian network,
          given the evidence.
  
          Parameters
          ----------
          evidence: list of `pgmpy.factor.State` namedtuples
              None if no evidence
          size: int
              size of sample to be generated
          return_type: string (dataframe | recarray)
              Return type for samples, either of 'dataframe' or 'recarray'.
              Defaults to 'dataframe'
  
          Returns
          -------
          sampled: A pandas.DataFrame or a numpy.recarray object depending upon return_type argument
              the generated samples
  
          Examples
          --------
          >>> from pgmpy.models.BayesianModel import BayesianModel
          >>> from pgmpy.factors.discrete import TabularCPD
          >>> from pgmpy.factors.discrete import State
          >>> from pgmpy.sampling import BayesianModelSampling
          >>> student = BayesianModel([('diff', 'grade'), ('intel', 'grade')])
          >>> cpd_d = TabularCPD('diff', 2, [[0.6], [0.4]])
          >>> cpd_i = TabularCPD('intel', 2, [[0.7], [0.3]])
          >>> cpd_g = TabularCPD('grade', 3, [[0.3, 0.05, 0.9, 0.5], [0.4, 0.25,
          ...                0.08, 0.3], [0.3, 0.7, 0.02, 0.2]],
          ...                ['intel', 'diff'], [2, 2])
          >>> student.add_cpds(cpd_d, cpd_i, cpd_g)
          >>> inference = BayesianModelSampling(student)
          >>> evidence = [State(var='diff', state=0)]
          >>> inference.rejection_sample(evidence=evidence, size=2, return_type='dataframe')
                  intel       diff       grade
          0         0          0          1
          1         0          0          1
          """
          if evidence is None:
              return self.forward_sample(size)
          types = [(var_name, 'int') for var_name in self.topological_order]
          sampled = np.zeros(0, dtype=types).view(np.recarray)
          prob = 1
          i = 0
          while i < size:
              _size = int(((size - i) / prob) * 1.5)
              _sampled = self.forward_sample(_size, 'recarray')
  
              for evid in evidence:
                  _sampled = _sampled[_sampled[evid[0]] == evid[1]]
  
              prob = max(len(_sampled) / _size, 0.01)
              sampled = np.append(sampled, _sampled)[:size]
  
              i += len(_sampled)
  
          return _return_samples(return_type, sampled)