/* * * Copyright 2008-2012 NVIDIA Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include // for floating point infinity #if THRUST_DEVICE_COMPILER == THRUST_DEVICE_COMPILER_NVCC #include #else #include #endif namespace thrust { namespace random { template normal_distribution ::normal_distribution(RealType a, RealType b) :super_t(),m_param(a,b) { } // end normal_distribution::normal_distribution() template normal_distribution ::normal_distribution(const param_type &parm) :super_t(),m_param(parm) { } // end normal_distribution::normal_distribution() template void normal_distribution ::reset(void) { super_t::reset(); } // end normal_distribution::reset() template template typename normal_distribution::result_type normal_distribution ::operator()(UniformRandomNumberGenerator &urng) { return operator()(urng, m_param); } // end normal_distribution::operator()() template template typename normal_distribution::result_type normal_distribution ::operator()(UniformRandomNumberGenerator &urng, const param_type &parm) { return super_t::sample(urng, parm.first, parm.second); } // end normal_distribution::operator()() template typename normal_distribution::param_type normal_distribution ::param(void) const { return m_param; } // end normal_distribution::param() template void normal_distribution ::param(const param_type &parm) { m_param = parm; } // end normal_distribution::param() template typename normal_distribution::result_type normal_distribution ::min THRUST_PREVENT_MACRO_SUBSTITUTION (void) const { return -this->max(); } // end normal_distribution::min() template typename normal_distribution::result_type normal_distribution ::max THRUST_PREVENT_MACRO_SUBSTITUTION (void) const { // XXX this solution is pretty terrible // we can't use numeric_traits::max because nvcc will // complain that it is a __host__ function union { thrust::detail::uint32_t inf_as_int; float result; } hack; hack.inf_as_int = 0x7f800000u; return hack.result; } // end normal_distribution::max() template typename normal_distribution::result_type normal_distribution ::mean(void) const { return m_param.first; } // end normal_distribution::mean() template typename normal_distribution::result_type normal_distribution ::stddev(void) const { return m_param.second; } // end normal_distribution::stddev() template bool normal_distribution ::equal(const normal_distribution &rhs) const { return m_param == rhs.param(); } template template std::basic_ostream& normal_distribution ::stream_out(std::basic_ostream &os) const { typedef std::basic_ostream ostream_type; typedef typename ostream_type::ios_base ios_base; // save old flags and fill character const typename ios_base::fmtflags flags = os.flags(); const CharT fill = os.fill(); const CharT space = os.widen(' '); os.flags(ios_base::dec | ios_base::fixed | ios_base::left); os.fill(space); os << mean() << space << stddev(); // restore old flags and fill character os.flags(flags); os.fill(fill); return os; } template template std::basic_istream& normal_distribution ::stream_in(std::basic_istream &is) { typedef std::basic_istream istream_type; typedef typename istream_type::ios_base ios_base; // save old flags const typename ios_base::fmtflags flags = is.flags(); is.flags(ios_base::skipws); is >> m_param.first >> m_param.second; // restore old flags is.flags(flags); return is; } template bool operator==(const normal_distribution &lhs, const normal_distribution &rhs) { return thrust::random::detail::random_core_access::equal(lhs,rhs); } template bool operator!=(const normal_distribution &lhs, const normal_distribution &rhs) { return !(lhs == rhs); } template std::basic_ostream& operator<<(std::basic_ostream &os, const normal_distribution &d) { return thrust::random::detail::random_core_access::stream_out(os,d); } template std::basic_istream& operator>>(std::basic_istream &is, normal_distribution &d) { return thrust::random::detail::random_core_access::stream_in(is,d); } } // end random } // end thrust