refactor the function to reorder arguments

This commit is contained in:
Tiago Gomes 2012-05-28 12:17:47 +01:00
parent 1239832c21
commit 6034f7a264

View File

@ -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