Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 #ifndef SUNDANCE_COMBINATORIALUTILS_H
00032 #define SUNDANCE_COMBINATORIALUTILS_H
00033
00034 #include "SundanceDefs.hpp"
00035 #include "Teuchos_Array.hpp"
00036 #include "SundanceMultiSet.hpp"
00037 #include "SundanceMap.hpp"
00038 #include "SundanceOrderedTuple.hpp"
00039
00040 namespace Sundance
00041 {
00042 using Teuchos::Array;
00043
00044
00045
00046
00047 Array<Array<int> > partitionInteger(int n);
00048
00049
00050
00051
00052 Array<Array<Array<int> > > compositions(int n);
00053
00054
00055
00056
00057
00058 Array<Array<int> > nonNegCompositions(int n, int J);
00059
00060
00061
00062
00063
00064
00065
00066 Array<Array<MultiSet<int> > > multisetCompositions(int s,
00067 const MultiSet<int>& x);
00068
00069
00070
00071
00072 Set<MultiSet<int> > multisetSubsets(const MultiSet<int>& x);
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088 Array<Array<MultiSet<int> > > multisetSubsetNTuples(int n,
00089 const MultiSet<int>& x);
00090
00091
00092
00093
00094
00095
00096 Array<Array<int> > distinctIndexTuples(int m, int n);
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107 Array<Array<int> > indexCombinations(const Array<int>& s);
00108
00109
00110 int pow2(int n);
00111
00112
00113
00114
00115 Array<int> bitsOfAnInteger(int x, int n);
00116
00117
00118
00119
00120
00121 template <class T>
00122 class Pair: public OrderedPair<T, T>
00123 {
00124 public:
00125 Pair(const T& a, const T& b)
00126 : OrderedPair<T, T>(a, b)
00127 {;}
00128 };
00129
00130 template <class T> inline
00131 std::ostream& operator<<(std::ostream& os, const Pair<T>& p)
00132 {
00133 os << "Pair(" << p.first() << ", " << p.second() << ")";
00134 return os;
00135 }
00136
00137
00138
00139
00140 template <class T>
00141 class SortedPair: public OrderedPair<T, T>
00142 {
00143 public:
00144 SortedPair(const T& a, const T& b)
00145 : OrderedPair<T, T>(std::min(a, b), std::max(a,b))
00146 {;}
00147 };
00148
00149 template <class T> inline
00150 std::ostream& operator<<(std::ostream& os, const SortedPair<T>& p)
00151 {
00152 os << "Pair(" << p.first() << ", " << p.second() << ")";
00153 return os;
00154 }
00155
00156
00157
00158
00159
00160
00161
00162 Set<Pair<MultiSet<int> > >
00163 loadPartitions(int x, int n,
00164 const MultiSet<int>& left,
00165 const MultiSet<int>& right);
00166
00167
00168
00169
00170
00171
00172 Set<Pair<MultiSet<int> > >
00173 binaryPartition(const MultiSet<int>& m);
00174
00175
00176
00177
00178
00179
00180 Set<MultiSet<MultiSet<int> > >
00181 multisetPartitions(const MultiSet<int>& m);
00182
00183
00184
00185
00186
00187 Map<int, int> countMap(const MultiSet<int>& m);
00188
00189
00190
00191 template <class T> inline
00192 Array<Array<Array<T> > > indexArrangements(const MultiSet<T>& mu,
00193 const Array<int>& k)
00194 {
00195 int nBins = k.size();
00196
00197 int M = 0;
00198 for (int i=0; i<nBins; i++)
00199 {
00200 M += k[i];
00201 }
00202
00203 Array<T> I;
00204 typename MultiSet<T>::const_iterator iter;
00205 for (iter=mu.begin(); iter!=mu.end(); iter++)
00206 {
00207 I.append(*iter);
00208 }
00209
00210 Array<Array<Array<T> > > rtn;
00211
00212 do
00213 {
00214 Array<Array<T> > bins(nBins);
00215 int count = 0;
00216 for (int i=0; i<nBins; i++)
00217 {
00218 for (int j=0; j<k[i]; j++)
00219 {
00220 bins[i].append(I[count++]);
00221 }
00222 }
00223 rtn.append(bins);
00224 }
00225 while (std::next_permutation(I.begin(), I.end()));
00226 return rtn;
00227 }
00228
00229
00230
00231
00232 template <class T> inline
00233 Array<Array<Array<T> > > binnings(const MultiSet<T>& mu, int n)
00234 {
00235 int N = mu.size();
00236 Array<Array<int> > c = compositions(N)[n-1];
00237 Array<Array<Array<T> > > rtn;
00238
00239 for (int i=0; i<c.size(); i++)
00240 {
00241 Array<Array<Array<T> > > a = indexArrangements(mu, c[i]);
00242 for (int j=0; j<a.size(); j++)
00243 {
00244 rtn.append(a[j]);
00245 }
00246 }
00247 return rtn;
00248 }
00249
00250
00251 inline int factorial(const MultiSet<int>& ms)
00252 {
00253 Sundance::Map<int, int> counts;
00254
00255 for (MultiSet<int>::const_iterator i=ms.begin(); i!=ms.end(); i++)
00256 {
00257 if (counts.containsKey(*i)) counts[*i]++;
00258 else counts.put(*i, 1);
00259 }
00260
00261 int rtn = 1;
00262 for (Sundance::Map<int, int>::const_iterator
00263 i=counts.begin(); i!=counts.end(); i++)
00264 {
00265 int f = 1;
00266 for (int j=1; j<=i->second; j++) f *= j;
00267 rtn *= f;
00268 }
00269 return rtn;
00270 }
00271
00272
00273 }
00274
00275
00276
00277 #endif
00278
00279
00280