refactor the function to reorder arguments
This commit is contained in:
parent
1239832c21
commit
6034f7a264
@ -157,41 +157,26 @@ class TFactor
|
|||||||
ranges_.erase (ranges_.begin() + idx);
|
ranges_.erase (ranges_.begin() + idx);
|
||||||
}
|
}
|
||||||
|
|
||||||
void reorderArguments (const vector<T> newArgs)
|
void reorderArguments (const vector<T> new_args)
|
||||||
{
|
{
|
||||||
assert (newArgs.size() == args_.size());
|
assert (new_args.size() == args_.size());
|
||||||
if (newArgs == args_) {
|
if (new_args == args_) {
|
||||||
return; // already in the wanted order
|
return; // already on the desired order
|
||||||
}
|
}
|
||||||
Ranges newRanges;
|
Ranges new_ranges;
|
||||||
vector<size_t> positions;
|
for (size_t i = 0; i < new_args.size(); i++) {
|
||||||
for (size_t i = 0; i < newArgs.size(); i++) {
|
size_t idx = indexOf (new_args[i]);
|
||||||
size_t idx = indexOf (newArgs[i]);
|
assert (idx != args_.size());
|
||||||
newRanges.push_back (ranges_[idx]);
|
new_ranges.push_back (ranges_[idx]);
|
||||||
positions.push_back (idx);
|
|
||||||
}
|
}
|
||||||
size_t N = ranges_.size();
|
Params backup = params_;
|
||||||
Params newParams (params_.size());
|
params_.clear();
|
||||||
for (size_t i = 0; i < params_.size(); i++) {
|
CutIndexer indexer (new_args, new_ranges, args_, ranges_);
|
||||||
size_t li = i;
|
for (; indexer.valid(); ++indexer) {
|
||||||
// calculate vector index corresponding to linear index
|
params_.push_back (backup[indexer]);
|
||||||
vector<unsigned> vi (N);
|
|
||||||
for (unsigned k = N; k-- > 0; ) {
|
|
||||||
vi[k] = li % ranges_[k];
|
|
||||||
li /= ranges_[k];
|
|
||||||
}
|
|
||||||
// convert permuted vector index to corresponding linear index
|
|
||||||
size_t prod = 1;
|
|
||||||
size_t new_li = 0;
|
|
||||||
for (int k = N - 1; k >= 0; k--) {
|
|
||||||
new_li += vi[positions[k]] * prod;
|
|
||||||
prod *= ranges_[positions[k]];
|
|
||||||
}
|
|
||||||
newParams[new_li] = params_[i];
|
|
||||||
}
|
}
|
||||||
args_ = newArgs;
|
args_ = new_args;
|
||||||
ranges_ = newRanges;
|
ranges_ = new_ranges;
|
||||||
params_ = newParams;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool contains (const T& arg) const
|
bool contains (const T& arg) const
|
||||||
|
Reference in New Issue
Block a user