complement.hpp 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. // (C) Copyright John Maddock 2006.
  2. // (C) Copyright Paul A. Bristow 2006.
  3. // (C) Copyright Matt Borland 2024
  4. // Use, modification and distribution are subject to the
  5. // Boost Software License, Version 1.0. (See accompanying file
  6. // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  7. #ifndef BOOST_STATS_COMPLEMENT_HPP
  8. #define BOOST_STATS_COMPLEMENT_HPP
  9. #include <boost/math/tools/config.hpp>
  10. //
  11. // This code really defines our own tuple type.
  12. // It would be nice to reuse boost::math::tuple
  13. // while retaining our own type safety, but it's
  14. // not clear if that's possible. In any case this
  15. // code is *very* lightweight.
  16. //
  17. namespace boost{ namespace math{
  18. template <class Dist, class RealType>
  19. struct complemented2_type
  20. {
  21. BOOST_MATH_GPU_ENABLED complemented2_type(
  22. const Dist& d,
  23. const RealType& p1)
  24. : dist(d),
  25. param(p1) {}
  26. const Dist& dist;
  27. const RealType& param;
  28. private:
  29. complemented2_type& operator=(const complemented2_type&) = delete;
  30. };
  31. template <class Dist, class RealType1, class RealType2>
  32. struct complemented3_type
  33. {
  34. BOOST_MATH_GPU_ENABLED complemented3_type(
  35. const Dist& d,
  36. const RealType1& p1,
  37. const RealType2& p2)
  38. : dist(d),
  39. param1(p1),
  40. param2(p2) {}
  41. const Dist& dist;
  42. const RealType1& param1;
  43. const RealType2& param2;
  44. private:
  45. complemented3_type& operator=(const complemented3_type&) = delete;
  46. };
  47. template <class Dist, class RealType1, class RealType2, class RealType3>
  48. struct complemented4_type
  49. {
  50. BOOST_MATH_GPU_ENABLED complemented4_type(
  51. const Dist& d,
  52. const RealType1& p1,
  53. const RealType2& p2,
  54. const RealType3& p3)
  55. : dist(d),
  56. param1(p1),
  57. param2(p2),
  58. param3(p3) {}
  59. const Dist& dist;
  60. const RealType1& param1;
  61. const RealType2& param2;
  62. const RealType3& param3;
  63. private:
  64. complemented4_type& operator=(const complemented4_type&) = delete;
  65. };
  66. template <class Dist, class RealType1, class RealType2, class RealType3, class RealType4>
  67. struct complemented5_type
  68. {
  69. BOOST_MATH_GPU_ENABLED complemented5_type(
  70. const Dist& d,
  71. const RealType1& p1,
  72. const RealType2& p2,
  73. const RealType3& p3,
  74. const RealType4& p4)
  75. : dist(d),
  76. param1(p1),
  77. param2(p2),
  78. param3(p3),
  79. param4(p4) {}
  80. const Dist& dist;
  81. const RealType1& param1;
  82. const RealType2& param2;
  83. const RealType3& param3;
  84. const RealType4& param4;
  85. private:
  86. complemented5_type& operator=(const complemented5_type&) = delete;
  87. };
  88. template <class Dist, class RealType1, class RealType2, class RealType3, class RealType4, class RealType5>
  89. struct complemented6_type
  90. {
  91. BOOST_MATH_GPU_ENABLED complemented6_type(
  92. const Dist& d,
  93. const RealType1& p1,
  94. const RealType2& p2,
  95. const RealType3& p3,
  96. const RealType4& p4,
  97. const RealType5& p5)
  98. : dist(d),
  99. param1(p1),
  100. param2(p2),
  101. param3(p3),
  102. param4(p4),
  103. param5(p5) {}
  104. const Dist& dist;
  105. const RealType1& param1;
  106. const RealType2& param2;
  107. const RealType3& param3;
  108. const RealType4& param4;
  109. const RealType5& param5;
  110. private:
  111. complemented6_type& operator=(const complemented6_type&) = delete;
  112. };
  113. template <class Dist, class RealType1, class RealType2, class RealType3, class RealType4, class RealType5, class RealType6>
  114. struct complemented7_type
  115. {
  116. BOOST_MATH_GPU_ENABLED complemented7_type(
  117. const Dist& d,
  118. const RealType1& p1,
  119. const RealType2& p2,
  120. const RealType3& p3,
  121. const RealType4& p4,
  122. const RealType5& p5,
  123. const RealType6& p6)
  124. : dist(d),
  125. param1(p1),
  126. param2(p2),
  127. param3(p3),
  128. param4(p4),
  129. param5(p5),
  130. param6(p6) {}
  131. const Dist& dist;
  132. const RealType1& param1;
  133. const RealType2& param2;
  134. const RealType3& param3;
  135. const RealType4& param4;
  136. const RealType5& param5;
  137. const RealType6& param6;
  138. private:
  139. complemented7_type& operator=(const complemented7_type&) = delete;
  140. };
  141. template <class Dist, class RealType>
  142. BOOST_MATH_GPU_ENABLED inline complemented2_type<Dist, RealType> complement(const Dist& d, const RealType& r)
  143. {
  144. return complemented2_type<Dist, RealType>(d, r);
  145. }
  146. template <class Dist, class RealType1, class RealType2>
  147. BOOST_MATH_GPU_ENABLED inline complemented3_type<Dist, RealType1, RealType2> complement(const Dist& d, const RealType1& r1, const RealType2& r2)
  148. {
  149. return complemented3_type<Dist, RealType1, RealType2>(d, r1, r2);
  150. }
  151. template <class Dist, class RealType1, class RealType2, class RealType3>
  152. BOOST_MATH_GPU_ENABLED inline complemented4_type<Dist, RealType1, RealType2, RealType3> complement(const Dist& d, const RealType1& r1, const RealType2& r2, const RealType3& r3)
  153. {
  154. return complemented4_type<Dist, RealType1, RealType2, RealType3>(d, r1, r2, r3);
  155. }
  156. template <class Dist, class RealType1, class RealType2, class RealType3, class RealType4>
  157. BOOST_MATH_GPU_ENABLED inline complemented5_type<Dist, RealType1, RealType2, RealType3, RealType4> complement(const Dist& d, const RealType1& r1, const RealType2& r2, const RealType3& r3, const RealType4& r4)
  158. {
  159. return complemented5_type<Dist, RealType1, RealType2, RealType3, RealType4>(d, r1, r2, r3, r4);
  160. }
  161. template <class Dist, class RealType1, class RealType2, class RealType3, class RealType4, class RealType5>
  162. BOOST_MATH_GPU_ENABLED inline complemented6_type<Dist, RealType1, RealType2, RealType3, RealType4, RealType5> complement(const Dist& d, const RealType1& r1, const RealType2& r2, const RealType3& r3, const RealType4& r4, const RealType5& r5)
  163. {
  164. return complemented6_type<Dist, RealType1, RealType2, RealType3, RealType4, RealType5>(d, r1, r2, r3, r4, r5);
  165. }
  166. template <class Dist, class RealType1, class RealType2, class RealType3, class RealType4, class RealType5, class RealType6>
  167. BOOST_MATH_GPU_ENABLED inline complemented7_type<Dist, RealType1, RealType2, RealType3, RealType4, RealType5, RealType6> complement(const Dist& d, const RealType1& r1, const RealType2& r2, const RealType3& r3, const RealType4& r4, const RealType5& r5, const RealType6& r6)
  168. {
  169. return complemented7_type<Dist, RealType1, RealType2, RealType3, RealType4, RealType5, RealType6>(d, r1, r2, r3, r4, r5, r6);
  170. }
  171. } // namespace math
  172. } // namespace boost
  173. #endif // BOOST_STATS_COMPLEMENT_HPP