-
Notifications
You must be signed in to change notification settings - Fork 113
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Spare optimizations for GaBW sampling #331
base: develop
Are you sure you want to change the base?
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Great work thanks!
template <typename update_parameters> | ||
auto compute_reflection(Point &v, Point &p, update_parameters const& params) const | ||
-> std::enable_if_t<std::is_same_v<MT, Eigen::SparseMatrix<NT, Eigen::RowMajor>> && !std::is_same_v<update_parameters, int>, void> { // MT must be in RowMajor format | ||
-> std::enable_if_t<std::is_same_v<MT, Eigen::SparseMatrix<NT, Eigen::RowMajor>> && !std::is_same_v<update_parameters, int>, void> { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
What is update_parameters
here? I do not understand !std::is_same_v<update_parameters
could you please explain?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
basically there's another compute_reflection function above which takes an integer (just the facet) as the 3rd argument, and for some reason, if I don't have that condition the compiler decides to call this function assuming that the typename of update_parameters is int. There might maybe be better ways of dealing with these issues, but I remember I tried to solve them for some time and this is the best I could do, I couldn't at all understand how the compiler chooses which function to use when there's multiple ones that match
typedef typename Polytope::VT VT; | ||
typedef typename Point::FT NT; | ||
using AA_type = std::conditional_t< std::is_same_v<MT, typename Eigen::SparseMatrix<NT, Eigen::RowMajor>>, typename Eigen::SparseMatrix<NT>, DenseMT >; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
similar comment to AE_type
, is there a better naming?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
hmm, I'll think of one, I'm not really sure what name I could give it but I'll see if I can come up with a better name.
if constexpr (std::is_same<AA_type, Eigen::SparseMatrix<NT>>::value) { | ||
_AA = (P.get_mat() * P.get_mat().transpose()); | ||
} else { | ||
_AA.noalias() = (DenseMT)(P.get_mat() * P.get_mat().transpose()); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
should we explicitly cast it to DenseMT
?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm not sure what you mean, for the optimizations I need it to be in colmajor SparseMatrix format
E_type _E; | ||
VT _AEA; | ||
unsigned int _rho; | ||
update_parameters _update_parameters; | ||
typename Point::Coeff _lambdas; | ||
typename Point::Coeff _Av; | ||
bool was_reset; | ||
BoundaryOracleHeap<NT> _distances_set; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is defined in uniform ABW, it should be better if it is defined in a separate file and both walks include it.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
yeah, I was thinking about that too, any suggestions for that file name?
_distances_set.vec[i].first = ( *(b_data + i) - (*(Ar_data + i)) ) / (*(Av_data + i)); | ||
} | ||
// rebuild the heap with the new values of (b - Ar) / Av | ||
_distances_set.rebuild(_update_parameters.moved_dist); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Why not inserting the new values in the heap (in O(logn)) instead of rebuilding (in O(n))?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
here, this happens after we set a new direction, in which case now all the values have changed, so it's quicker to rebuild (O(n)) rather than insert each one (O(nlogn)). I'm not entirely sure if it makes a difference, but I think it does, since afterwards I never do O(nlogn) things, just O(non_zeroes * logn), so this O(nlogn) could be a bottleneck
Samples faster when the A matrix of the polytope is sparse.
Very fast when both the A matrix of the polytope and the covariance matrix are sparse.