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
00039 #include "examples/support.hh"
00040
00041 double
00042 am(double t[], int n) {
00043 if (n < 1)
00044 return 0.0;
00045 double s = 0;
00046 for (int i=n; i--; )
00047 s += t[i];
00048 return s / n;
00049 }
00050
00051 double
00052 dev(double t[], int n) {
00053 if (n < 2)
00054 return 0.0;
00055 double m = am(t,n);
00056 double s = 0.0;
00057 for (int i=n; i--; ) {
00058 double d = t[i]-m;
00059 s += d*d;
00060 }
00061 return sqrt(s / (n-1)) / m;
00062 }
00063
00064 void
00065 Example::sac_collect_vars() {
00066
00067 Reflection::VarMap vm;
00068 for (Reflection::ActorSpecIter si(this, vm); si(); ++si) {}
00069
00070 for (Reflection::VarMapIter vmi(vm); vmi(); ++vmi) {
00071 if (vmi.spec().vti() == Int::BoolVarImp::vti) {
00072 BoolVar bv = vmi.var();
00073 _sac_bva.add(this, bv);
00074 } else if (vmi.spec().vti() == Int::IntVarImp::vti) {
00075 IntVar iv = vmi.var();
00076 _sac_iva.add(this, iv);
00077 }
00078 }
00079 }
00080
00081 void
00082 Example::sac_remove_vars() {
00083
00084 }
00085
00086 bool
00087 Example::sac(unsigned long int& p) {
00088 if (status(p) == SS_FAILED) return false;
00089
00090 bool modified = false;
00091
00092
00093 for (int i = _sac_bva.size(); i--; ) {
00094 for (int val = 0; val <= 1; ++val) {
00095 if (_sac_bva[i].assigned()) break;
00096 Example* e = static_cast<Example*>(this->clone());
00097 rel(e, e->_sac_bva[i], IRT_EQ, val);
00098 if (e->status(p) == SS_FAILED) {
00099 modified = true;
00100 rel(this, this->_sac_bva[i], IRT_NQ, val);
00101 if (status(p) == SS_FAILED)
00102 return false;
00103 }
00104 delete e;
00105 }
00106 }
00107
00108
00109 for (int i = _sac_iva.size(); i--; ) {
00110 if (_sac_iva[i].assigned()) continue;
00111 IntArgs nq(_sac_iva[i].size());
00112 int nnq = 0;
00113 IntVarValues vv(_sac_iva[i]);
00114 while (vv()) {
00115 Example* e = static_cast<Example*>(this->clone());
00116 rel(e, e->_sac_iva[i], IRT_EQ, vv.val());
00117 if (e->status() == SS_FAILED) {
00118 nq[nnq++] = vv.val();
00119 }
00120 delete e;
00121 ++vv;
00122 }
00123 if (nnq > 0) modified = true;
00124 for (; nnq--; ) {
00125 rel(this, _sac_iva[i], IRT_NQ, nq[nnq]);
00126 }
00127 if (status(p) == SS_FAILED)
00128 return false;
00129 }
00130
00131 return modified;
00132 }
00133
00134