stress-extensional.cc
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
00032
00033
00034
00035
00036
00037
00038 #include "examples/support.hh"
00039
00040
00049 class StressExtensional : public Example {
00050 protected:
00052 IntVarArray x;
00053 public:
00055 typedef Support::DynamicArray<DFA::Transition> Transitions;
00057 void
00058 permute(int i_state, int i, int n, int p,
00059 Transitions& t, int& n_t, int& n_state) {
00060 if (i<n-1) {
00061 for (int j=n; j--; )
00062 if (!(p & (1 << j))) {
00063 t[n_t].i_state = i_state;
00064 t[n_t].symbol = j;
00065 t[n_t].o_state = ++n_state;
00066 n_t++;
00067 permute(n_state,i+1,n,p | (1 << j),
00068 t,n_t,n_state);
00069 }
00070 } else {
00071 for (int j=n; j--; )
00072 if (!(p & (1 << j))) {
00073 t[n_t].i_state = i_state;
00074 t[n_t].symbol = j;
00075 t[n_t].o_state = 1;
00076 n_t++;
00077 }
00078 }
00079 }
00081 DFA
00082 construct(int n) {
00083 Transitions t;
00084 int n_t = 0;
00085 int n_state = 1;
00086 permute(0,0,n,0,t,n_t,n_state);
00087 t[n_t].i_state = -1;
00088 int f[] = {1,-1};
00089 DFA d(0,t,f);
00090 return d;
00091 }
00093 StressExtensional(const SizeOptions& opt)
00094 : x(this,4*opt.size(),0,opt.size()) {
00095 DFA a = construct(opt.size());
00096 IntVarArgs y(opt.size());
00097 for (unsigned int i=0; i <= 3*opt.size(); i++) {
00098 for (int j = opt.size(); j--; )
00099 y[j] = x[i+j];
00100 extensional(this, y, a);
00101 }
00102 for (int j=opt.size(); j--; )
00103 y[j] = x[j];
00104 branch(this, y, INT_VAR_NONE, INT_VAL_MED);
00105 }
00107 StressExtensional(bool share, StressExtensional& s) : Example(share,s) {
00108 x.update(this, share, s.x);
00109 }
00111 virtual Space*
00112 copy(bool share) {
00113 return new StressExtensional(share,*this);
00114 }
00116 virtual void
00117 print(std::ostream& os) {
00118 os << "\tx[" << x.size() << "] = " << x << std::endl;
00119 }
00120 };
00121
00125 int
00126 main(int argc, char* argv[]) {
00127 SizeOptions opt("StressExtensional");
00128 opt.size(7);
00129 opt.parse(argc,argv);
00130 Example::run<StressExtensional,DFS,SizeOptions>(opt);
00131 return 0;
00132 }
00133
00134