class_docstr: Stats for Y = q * round(X / q) where X ~ N(mu, sigma)
code: def logpmf(self, x):
      x1 = np.atleast_1d(x)
      in_domain = self.in_domain(x1)
      rval = np.zeros_like(x1, dtype=float) - np.inf
      x_in_domain = x1[in_domain]
  
      ubound = x_in_domain + self.q * 0.5
      lbound = x_in_domain - self.q * 0.5
      # -- reflect intervals right of mu to other side
      #    for more accurate calculation
      flip = lbound > self.mu
      tmp = lbound[flip].copy()
      lbound[flip] = self.mu - (ubound[flip] - self.mu)
      ubound[flip] = self.mu - (tmp - self.mu)
  
      assert np.all(ubound > lbound)
      a = self._norm_logcdf(ubound)
      b = self._norm_logcdf(lbound)
      rval[in_domain] = a + np.log1p(-np.exp(b - a))
      if isinstance(x, np.ndarray):
          return rval
      return float(rval)
  
imports: import numpy
  import numpy.random
  import scipy.stats
  from scipy.stats import rv_continuous
  from scipy.stats._continuous_distns import lognorm_gen
label_desc: Use image node_id 4 for calling the qnormal_gen obj's underlying member method code with example usage: obj.logpmf(x) and returns: float, rval