docs: def integrate(self, mass_min, mass_max, log_mode=True, weight=False, steps=1e4):
          """ Numerical Riemannn integral of the IMF (stupid simple).
  
          Parameters:
          -----------
          mass_min: minimum mass bound for integration (solar masses)
          mass_max: maximum mass bound for integration (solar masses)
          log_mode[True]: use logarithmic steps in stellar mass as oppose to linear
              weight[False]: weight the integral by stellar mass
              steps: number of numerical integration steps
  
          Returns:
          --------
          result of integral
          """
          if log_mode:
              d_log_mass = (np.log10(mass_max) - np.log10(mass_min)) / float(steps)
              log_mass = np.linspace(np.log10(mass_min), np.log10(mass_max), steps)
              mass = 10.**log_mass
  
              if weight:
                  return np.sum(mass * d_log_mass * self.pdf(mass, log_mode=True))
              else:
                  return np.sum(d_log_mass * self.pdf(mass, log_mode=True))
          else:
              d_mass = (mass_max - mass_min) / float(steps)
              mass = np.linspace(mass_min, mass_max, steps)
  
              if weight:
                  return np.sum(mass * d_mass * self.pdf(mass, log_mode=False))
              else:
                  return np.sum(d_mass * self.pdf(mass, log_mode=False))