[PATCH] libstdc++: add uniform on sphere distribution

Paolo Carlini paolo.carlini@oracle.com
Wed Jul 16 15:03:00 GMT 2014


Hi,

On 07/16/2014 01:05 PM, Ed Smith-Rowland wrote:
> One thing we all forgot: the operator== is also non-trivial because it 
> needs to compare _M_n.
Right. And reset too. I'm going to test and apply the below.

Thanks,
Paolo.

///////////////////////
-------------- next part --------------
2014-07-16  Paolo Carlini  <paolo.carlini@oracle.com>

	* include/ext/random: Minor formatting and cosmetic tweaks.
	(uniform_on_sphere_distribution<>::operator==
	(const uniform_on_sphere_distribution&,
	const uniform_on_sphere_distribution&)): Compare the _M_nds.
	(uniform_on_sphere_distribution<>::reset): Reset _M_nd.
	(operator!=(const uniform_on_sphere_distribution&,
	const uniform_on_sphere_distribution&)): Adjust.
	* include/ext/random.tcc: Minor cosmetc tweaks.
-------------- next part --------------
Index: include/ext/random
===================================================================
--- include/ext/random	(revision 212581)
+++ include/ext/random	(working copy)
@@ -598,7 +598,7 @@
     inline bool
     operator!=(const __gnu_cxx::beta_distribution<_RealType>& __d1,
 	       const __gnu_cxx::beta_distribution<_RealType>& __d2)
-   { return !(__d1 == __d2); }
+    { return !(__d1 == __d2); }
 
 
   /**
@@ -2575,7 +2575,7 @@
     inline bool
     operator!=(const __gnu_cxx::triangular_distribution<_RealType>& __d1,
 	       const __gnu_cxx::triangular_distribution<_RealType>& __d2)
-   { return !(__d1 == __d2); }
+    { return !(__d1 == __d2); }
 
 
   /**
@@ -2810,7 +2810,7 @@
     inline bool
     operator!=(const __gnu_cxx::von_mises_distribution<_RealType>& __d1,
 	       const __gnu_cxx::von_mises_distribution<_RealType>& __d2)
-   { return !(__d1 == __d2); }
+    { return !(__d1 == __d2); }
 
 
   /**
@@ -3328,12 +3328,12 @@
        */
       explicit
       uniform_on_sphere_distribution()
-      : _M_param(), _M_n(_RealType(0), _RealType(1))
+      : _M_param(), _M_nd()
       { }
 
       explicit
       uniform_on_sphere_distribution(const param_type& __p)
-      : _M_param(__p), _M_n(_RealType(0), _RealType(1))
+      : _M_param(__p), _M_nd()
       { }
 
       /**
@@ -3341,7 +3341,7 @@
        */
       void
       reset()
-      { }
+      { _M_nd.reset(); }
 
       /**
        * @brief Returns the parameter set of the distribution.
@@ -3425,14 +3425,15 @@
       friend bool
       operator==(const uniform_on_sphere_distribution& __d1,
 		 const uniform_on_sphere_distribution& __d2)
-      { return true; }
+      { return __d1._M_nd == __d2._M_nd; }
 
       /**
-       * @brief Inserts a %uniform_on_sphere_distribution random number distribution
-       * @p __x into the output stream @p __os.
+       * @brief Inserts a %uniform_on_sphere_distribution random number
+       *        distribution @p __x into the output stream @p __os.
        *
        * @param __os An output stream.
-       * @param __x  A %uniform_on_sphere_distribution random number distribution.
+       * @param __x  A %uniform_on_sphere_distribution random number
+       *             distribution.
        *
        * @returns The output stream with the state of @p __x inserted or in
        * an error state.
@@ -3446,11 +3447,13 @@
 		   __x);
 
       /**
-       * @brief Extracts a %uniform_on_sphere_distribution random number distribution
+       * @brief Extracts a %uniform_on_sphere_distribution random number
+       *        distribution
        * @p __x from the input stream @p __is.
        *
        * @param __is An input stream.
-       * @param __x  A %uniform_on_sphere_distribution random number generator engine.
+       * @param __x  A %uniform_on_sphere_distribution random number
+       *             generator engine.
        *
        * @returns The input stream with @p __x extracted or in an error state.
        */
@@ -3470,7 +3473,7 @@
 			const param_type& __p);
 
       param_type _M_param;
-      std::normal_distribution<_RealType> _M_n;
+      std::normal_distribution<_RealType> _M_nd;
     };
 
   /**
@@ -3482,7 +3485,7 @@
 	       _RealType>& __d1,
 	       const __gnu_cxx::uniform_on_sphere_distribution<_Dimen,
 	       _RealType>& __d2)
-   { return false; }
+    { return !(__d1 == __d2); }
 
 _GLIBCXX_END_NAMESPACE_VERSION
 } // namespace __gnu_cxx
Index: include/ext/random.tcc
===================================================================
--- include/ext/random.tcc	(revision 212581)
+++ include/ext/random.tcc	(working copy)
@@ -1551,7 +1551,7 @@
 	_RealType __sum = _RealType(0);
 
 	std::generate(__ret.begin(), __ret.end(),
-		      [&__urng, &__sum, this](){ _RealType __t = _M_n(__urng);
+		      [&__urng, &__sum, this](){ _RealType __t = _M_nd(__urng);
 						 __sum += __t * __t;
 						 return __t; });
 	auto __norm = std::sqrt(__sum);
@@ -1583,8 +1583,7 @@
 	       const __gnu_cxx::uniform_on_sphere_distribution<_Dimen,
 							       _RealType>& __x)
     {
-      // The distribution has no state, nothing to save.
-      return __os << __x._M_n;
+      return __os << __x._M_nd;
     }
 
   template<std::size_t _Dimen, typename _RealType, typename _CharT,
@@ -1594,8 +1593,7 @@
 	       __gnu_cxx::uniform_on_sphere_distribution<_Dimen,
 							 _RealType>& __x)
     {
-      // The distribution has no state, nothing to restore.
-      return __is >> __x._M_n;
+      return __is >> __x._M_nd;
     }
 
 _GLIBCXX_END_NAMESPACE_VERSION


More information about the Gcc-patches mailing list