updated factors to have a static, inline density function that's then used by member functions