@@ -750,33 +750,36 @@ class HPolytope {
750
750
}
751
751
752
752
753
- // ------------oracle for exact hmc spherical gaussian sampling---------------//
754
-
753
+ // Boundary oracle for exact hmc spherical gaussian sampling
755
754
// compute intersection point of ray starting from r and pointing to v
756
- // with polytope discribed by A and b
755
+ // with polytope discribed by A and b (the ray describes a curve)
757
756
std::pair<NT, int > trigonometric_positive_intersect (Point const & r, Point const & v,
758
757
NT const & omega, int &facet_prev) const
759
758
{
759
+ constexpr NT pi_2 = NT (2.0 ) * M_PI;
760
+ NT t = std::numeric_limits<NT>::max ();
760
761
761
- NT lamda = 0 , C, Phi, t1, t2, tmin;
762
- NT min_plus = std::numeric_limits<NT>::max (), t = std::numeric_limits<NT>::max ();
763
- NT max_minus = std::numeric_limits<NT>::lowest ();
764
- VT sum_nom, sum_denom;
765
- unsigned int j;
766
- int m = num_of_hyperplanes (), facet = -1 ;
767
-
762
+ int m = num_of_hyperplanes ();
763
+ int facet = -1 ;
768
764
765
+ VT sum_nom;
766
+ VT sum_denom;
769
767
sum_nom.noalias () = A * r.getCoefficients ();
770
768
sum_denom.noalias () = A * v.getCoefficients ();
771
769
772
770
NT* sum_nom_data = sum_nom.data ();
773
771
NT* sum_denom_data = sum_denom.data ();
774
772
const NT* b_data = b.data ();
775
773
774
+ const NT omega_sqr = omega * omega;
775
+ const NT pi_2_omega = pi_2 / omega;
776
+
776
777
for (int i = 0 ; i < m; i++) {
777
778
778
- C = std::sqrt ((*sum_nom_data) * (*sum_nom_data) + ((*sum_denom_data) * (*sum_denom_data)) / (omega * omega));
779
- Phi = std::atan ((-(*sum_denom_data)) / ((*sum_nom_data) * omega));
779
+ NT C = std::sqrt ((*sum_nom_data) * (*sum_nom_data) + ((*sum_denom_data) * (*sum_denom_data))
780
+ / omega_sqr);
781
+ NT Phi = std::atan ((-(*sum_denom_data)) / ((*sum_nom_data) * omega));
782
+
780
783
if ((*sum_denom_data) < 0.0 && Phi < 0.0 ) {
781
784
Phi += M_PI;
782
785
} else if ((*sum_denom_data) > 0.0 && Phi > 0.0 ) {
@@ -785,20 +788,20 @@ class HPolytope {
785
788
786
789
if (C > (*b_data)) {
787
790
NT acos_b = std::acos ((*b_data) / C);
788
- t1 = (acos_b - Phi) / omega;
791
+ NT t1 = (acos_b - Phi) / omega;
789
792
if (facet_prev == i && std::abs (t1) < 1e-10 ){
790
- t1 = ( 2.0 * M_PI) / omega ;
793
+ t1 = pi_2_omega ;
791
794
}
792
795
793
- t2 = (-acos_b - Phi) / omega;
796
+ NT t2 = (-acos_b - Phi) / omega;
794
797
if (facet_prev == i && std::abs (t2) < 1e-10 ){
795
- t2 = ( 2.0 * M_PI) / omega ;
798
+ t2 = pi_2_omega ;
796
799
}
797
800
798
- t1 += (t1 < NT (0 )) ? ( 2.0 * M_PI) / omega : NT (0 );
799
- t2 += (t2 < NT (0 )) ? ( 2.0 * M_PI) / omega : NT (0 );
801
+ t1 += (t1 < NT (0 )) ? pi_2_omega : NT (0 );
802
+ t2 += (t2 < NT (0 )) ? pi_2_omega : NT (0 );
800
803
801
- tmin = std::min (t1, t2);
804
+ NT tmin = std::min (t1, t2);
802
805
803
806
if (tmin < t && tmin > NT (0 )) {
804
807
facet = i;
0 commit comments