Esempio n. 1
0
 vector<string> letterCombinations(string digits) {
     vector<string> ret, alpha;
     if (digits.length() == 0) return ret;
     string n2s[10] = {" ","","abc","def","ghi","jkl"
                         ,"mno","pqrs","tuv","wxyz"};
     for (auto x : digits) {
         alpha.push_back(n2s[x-'0']);
     }
     cartesianProduct(ret, "", alpha);
     return ret;
 }
Esempio n. 2
0
 void cartesianProduct(vector<string> &ret, string foo
                             , vector<string> &alpha) {
     int len=foo.length(), size=alpha.size();
     if (len >= size) {
         ret.push_back(foo); return;
     }
     string sigma = alpha[len];
     for (auto x : sigma) {
         string bar=foo; bar.push_back(x);
         cartesianProduct(ret, bar, alpha);
     }
 }
Esempio n. 3
0
template <typename T> GenericFactor<T>&
GenericFactor<T>::multiply (const GenericFactor<T>& g)
{
  if (args_ == g.arguments()) {
    // optimization
    Globals::logDomain
      ? params_ += g.params()
      : params_ *= g.params();
    return *this;
  }
  unsigned range_prod = 1;
  bool share_arguments = false;
  const std::vector<T>& g_args = g.arguments();
  const Ranges& g_ranges  = g.ranges();
  const Params& g_params  = g.params();
  for (size_t i = 0; i < g_args.size(); i++) {
    size_t idx = indexOf (g_args[i]);
    if (idx == args_.size()) {
      range_prod *= g_ranges[i];
      args_.push_back (g_args[i]);
      ranges_.push_back (g_ranges[i]);
    } else {
      share_arguments = true;
    }
  }
  if (share_arguments == false) {
    // optimization
    cartesianProduct (g_params.begin(), g_params.end());
  } else {
    extend (range_prod);
    Params::iterator it = params_.begin();
    MapIndexer indexer (args_, ranges_, g_args, g_ranges);
    if (Globals::logDomain) {
      for (; indexer.valid(); ++it, ++indexer) {
        *it += g_params[indexer];
      }
    } else {
      for (; indexer.valid(); ++it, ++indexer) {
        *it *= g_params[indexer];
      }
    }
  }
  return *this;
}
Esempio n. 4
0
const std::set<std::pair<T, U>> operator* (const std::set<T>& set1, const std::set<U>& set2)
{
    return cartesianProduct(set1, set2);
}