Commit 62e6d43f authored by ehebrard's avatar ehebrard
Browse files

format

parent 125e25a2
......@@ -31,17 +31,12 @@ using namespace std;
using namespace schedcl;
int main(int argc, char *argv[]) {
vector<int> duration;
vector<vector<int>> resource;
osp::read_instance("j3-per0-1.txt", duration, resource);
cout << duration.size() << " tasks:";
for (auto d : duration) {
cout << " " << d;
......@@ -57,35 +52,32 @@ int main(int argc, char *argv[]) {
cout << ")";
}
cout << endl;
Schedule<int> S1;
Schedule<int> S2;
Schedule<int> S1;
Schedule<int> S2;
for (auto d : duration) {
S1.addTask("t" + to_string(S1.numTask()), d, d);
S2.addTask("t" + to_string(S2.numTask()), d, d);
}
auto ub{osp::getUb(duration, resource)};
S2.addTask("t" + to_string(S2.numTask()), d, d);
}
auto ub{osp::getUb(duration, resource)};
S1.setUpperBound(ub);
S2.setUpperBound(ub);
S2.setUpperBound(ub);
for (auto R : resource) {
for (auto x : R) {
for (auto y : R) if (x != y) {
S1.addEdge(START(x), START(y));
S1.addEdge(START(x), END(y));
S1.addEdge(END(x), START(y));
S1.addEdge(END(x), END(y));
S2.addEdge(START(x), START(y));
S2.addEdge(START(x), END(y));
S2.addEdge(END(x), START(y));
S2.addEdge(END(x), END(y));
}
for (auto y : R)
if (x != y) {
S1.addEdge(START(x), START(y));
S1.addEdge(START(x), END(y));
S1.addEdge(END(x), START(y));
S1.addEdge(END(x), END(y));
S2.addEdge(START(x), START(y));
S2.addEdge(START(x), END(y));
S2.addEdge(END(x), START(y));
S2.addEdge(END(x), END(y));
}
}
}
......@@ -95,174 +87,203 @@ int main(int argc, char *argv[]) {
// demand.resize(job.size(), 1);
// for (auto j : job)
// scope.push_back(j);
// SparseDistanceGraph<int> SG(S);
// cout << SG << endl;
DistanceGraph<int> G(S2);
// cout << G << endl;
// G.FloydWarshall();
// cout << G << endl;
// BellmanFord<int> BF(SG.size());
// vector<int> shortest_path(S.numEvent(), numeric_limits<int>::max());
//
// BF.allShortestPaths(ORIGIN, SG.successor, shortest_path);
// for(auto v{0}; v<S.numEvent(); ++v)
// cout << S.label(v) << ": " << shortest_path[v] << endl;
S1.initialise();
S2.initialise();
// cout << S1 << endl;
// cout << S2 << endl;
//
// // S1.update(0,1)
//
// auto v2{S2.getVariable(START(1), END(0))};
// v2->set(0);
//
// // S2.addPrecedence(END(0), START(1), 0);
//
// G.FloydWarshall();
//
// cout << S2 << endl;
S1.updateDistances();
S2.updateDistances();
G.FloydWarshall();
cout << S1 << endl;
cout << S2 << endl;
for (auto v : S1.variables) {
auto x{v->from};
auto y{v->to};
auto w{v->get()};
auto u{S2.getVariable(x, y)};
if(w != u->get()) {
cout << "d[" << S1.label(x) << "][" << S1.label(y) << "]=" << w << "/" << u->get() << endl;
}
}
auto u{S1.getVariable(START(1), END(0))};
S1.addConstraint(u, 0);
S1.updateDistances();
cout << S1 << endl;
// auto v2{S2.getVariable(START(1), END(0))};
// v2->set(0);
// G.FloydWarshall();
// auto v1{S1.getVariable(START(1), END(0))};
// S1.set(v1, 0);
//
// cout << S1 << endl;
//
//
// DistanceGraph<int> G(S, events.begin(), events.end());
// G.initialise();
//
// // G.create_and_collect_var(varmap);
//
// cout << "@ lvl " << ReversibleObject::env->level() << ":\n"
// << G << endl;
//
// G.addEdge({0, 1, 5});
// G.FloydWarshall();
//
// ReversibleObject::env->save();
//
// cout << "@ lvl " << ReversibleObject::env->level() << ":\n" << G << endl;
//
// G.addEdge({1,3,10});
// G.FloydWarshall();
//
// // cout << "@ lvl " << ReversibleObject::env->level() << ":\n" << G << endl;
//
// G.addEdge({5,1,3});
// G.FloydWarshall();
//
// ReversibleObject::env->save();
//
// cout << "@ lvl " << ReversibleObject::env->level() << ":\n" << G << endl;
//
// // Edge<int> e5{4,0,-2};
// G.addEdge({0,4,2});
// G.FloydWarshall();
//
// ReversibleObject::env->save();
//
// cout << "@ lvl " << ReversibleObject::env->level() << ":\n" << G << endl;
//
// G.addEdge({4,0,-2});
// G.FloydWarshall();
//
// ReversibleObject::env->override();
//
// cout << "@ lvl " << ReversibleObject::env->level() << ":\n" << G << endl;
//
//
// // G.addEdge({4,0,-2});
//
// G.addEdge({3,5,-13});
// G.FloydWarshall();
//
// G.addEdge({4,5,7});
// G.FloydWarshall();
//
// cout << "extra edges:\n" << G << endl;
//
//
// G.merge(0,4);
//
//
// cout << "\nmerge 0 4\n" << G << endl;
//
//
// G.merge(5,3);
//
// cout << "\nmerge 5 3\n" << G << endl;
//
//
// ReversibleObject::env->save();
//
// G.merge(5,1);
//
// cout << "\nmerge 5 1\n" << G << endl;
//
// auto l{ReversibleObject::env->level()};
//
// ReversibleObject::env->restore(l);
//
// cout << "\nrestore to lvl " << l << "\n" << G << endl;
//
// // cout << "\nrestore merge 5 1\n" << G << endl;
// //
// //
// // ReversibleObject::env->restore(--l);
// //
// // cout << "\nrestore other merges\n" << G << endl;
//
// while(l > 0) {
// ReversibleObject::env->restore(--l);
//
// cout << "\nrestore to lvl " << l << "\n" << G << endl;
// }
//
// SparseDistanceGraph<int> SG(S);
// cout << SG << endl;
DistanceGraph<int> G(S2);
// cout << G << endl;
// G.FloydWarshall();
// cout << G << endl;
// BellmanFord<int> BF(SG.size());
// vector<int> shortest_path(S.numEvent(), numeric_limits<int>::max());
//
// BF.allShortestPaths(ORIGIN, SG.successor, shortest_path);
// for(auto v{0}; v<S.numEvent(); ++v)
// cout << S.label(v) << ": " << shortest_path[v] << endl;
S1.initialise();
S2.initialise();
// cout << S1 << endl;
// cout << S2 << endl;
//
// // S1.update(0,1)
//
// auto v2{S2.getVariable(START(1), END(0))};
// v2->set(0);
//
// // S2.addPrecedence(END(0), START(1), 0);
//
// G.FloydWarshall();
//
// cout << S2 << endl;
S1.updateDistances();
S2.updateDistances();
G.FloydWarshall();
cout << S1 << endl;
cout << S2 << endl;
for (auto v : S1.variables) {
auto x{v->from};
auto y{v->to};
auto w{v->get()};
auto u{S2.getVariable(x, y)};
if (w != u->get()) {
cout << "d[" << S1.label(x) << "][" << S1.label(y) << "]=" << w << "/"
<< u->get() << endl;
}
}
auto u{S1.getVariable(START(1), END(0))};
S1.addConstraint(u, 0);
S1.updateDistances();
cout << S1 << endl;
cout << "save\n";
ReversibleObject::env->save();
cout << S1.graph << endl;
cout << "merge\n";
S1.graph.merge(START(0), END(0));
cout << S1.graph << endl;
// cout << "undo\n";
//
// ReversibleObject::env->restore(ReversibleObject::env->level());
//
// cout << S1.graph << endl;
// auto v2{S2.getVariable(START(1), END(0))};
// v2->set(0);
// G.FloydWarshall();
// auto v1{S1.getVariable(START(1), END(0))};
// S1.set(v1, 0);
//
// cout << S1 << endl;
//
//
// DistanceGraph<int> G(S,
// events.begin(), events.end());
// G.initialise();
//
// // G.create_and_collect_var(varmap);
//
// cout << "@ lvl " <<
// ReversibleObject::env->level() <<
// ":\n"
// << G << endl;
//
// G.addEdge({0, 1, 5});
// G.FloydWarshall();
//
// ReversibleObject::env->save();
//
// cout << "@ lvl " <<
// ReversibleObject::env->level() << ":\n" << G
// << endl;
//
// G.addEdge({1,3,10});
// G.FloydWarshall();
//
// // cout << "@ lvl " <<
// ReversibleObject::env->level() << ":\n" << G
// << endl;
//
// G.addEdge({5,1,3});
// G.FloydWarshall();
//
// ReversibleObject::env->save();
//
// cout << "@ lvl " <<
// ReversibleObject::env->level() << ":\n" << G
// << endl;
//
// // Edge<int> e5{4,0,-2};
// G.addEdge({0,4,2});
// G.FloydWarshall();
//
// ReversibleObject::env->save();
//
// cout << "@ lvl " <<
// ReversibleObject::env->level() << ":\n" << G
// << endl;
//
// G.addEdge({4,0,-2});
// G.FloydWarshall();
//
// ReversibleObject::env->override();
//
// cout << "@ lvl " <<
// ReversibleObject::env->level() << ":\n" << G
// << endl;
//
//
// // G.addEdge({4,0,-2});
//
// G.addEdge({3,5,-13});
// G.FloydWarshall();
//
// G.addEdge({4,5,7});
// G.FloydWarshall();
//
// cout << "extra edges:\n" << G << endl;
//
//
// G.merge(0,4);
//
//
// cout << "\nmerge 0 4\n" << G << endl;
//
//
// G.merge(5,3);
//
// cout << "\nmerge 5 3\n" << G << endl;
//
//
// ReversibleObject::env->save();
//
// G.merge(5,1);
//
// cout << "\nmerge 5 1\n" << G << endl;
//
// auto l{ReversibleObject::env->level()};
//
// ReversibleObject::env->restore(l);
//
// cout << "\nrestore to lvl " << l << "\n" << G
// << endl;
//
// // cout << "\nrestore merge 5 1\n" << G <<
// endl;
// //
// //
// // ReversibleObject::env->restore(--l);
// //
// // cout << "\nrestore other merges\n" << G <<
// endl;
//
// while(l > 0) {
// ReversibleObject::env->restore(--l);
//
// cout << "\nrestore to lvl " << l << "\n"
// << G << endl;
// }
//
}
......@@ -6,45 +6,37 @@ using namespace schedcl;
BacktrackEnvironment* ReversibleObject::env = new BacktrackEnvironment();
BacktrackEnvironment::BacktrackEnvironment() {}
BacktrackEnvironment::~BacktrackEnvironment() {}
int BacktrackEnvironment::level() const { return static_cast<int>(stamps.size()); }
void BacktrackEnvironment::save(ReversibleObject *o) {
trail.push_back(o);
}
void BacktrackEnvironment::save() {
stamps.push_back(trail.size());
}
void BacktrackEnvironment::override() {
*(stamps.rbegin()) = trail.size();
}
void BacktrackEnvironment::restore(const int lvl) {
assert(level() >= lvl);
size_t stamp = (lvl == 0 ? 0 : stamps[lvl-1]);
while (trail.size() > stamp) {
trail.back()->undo();
trail.pop_back();
}
stamps.resize(lvl);
// while(level() > lvl) {
// size_t stamp = stamps.back();
// stamps.pop_back();
// while(trail.size() > stamp) {
// trail.back()->undo();
// trail.pop_back();
// }
// }
}
ReversibleObject::ReversibleObject() {}
ReversibleObject::~ReversibleObject() {}
// void ReversibleObject::undo() = 0;
void ReversibleObject::save() { env->save(this); }
BacktrackEnvironment::BacktrackEnvironment() {}
BacktrackEnvironment::~BacktrackEnvironment() {}
int BacktrackEnvironment::level() const {
return static_cast<int>(stamps.size());
}
void BacktrackEnvironment::save(ReversibleObject *o) { trail.push_back(o); }
void BacktrackEnvironment::save() { stamps.push_back(trail.size()); }
void BacktrackEnvironment::override() { *(stamps.rbegin()) = trail.size(); }
void BacktrackEnvironment::restore(const int lvl) {
assert(level() >= lvl);
size_t stamp = (lvl == 0 ? 0 : stamps[lvl - 1]);
while (trail.size() > stamp) {
trail.back()->undo();
trail.pop_back();
}
stamps.resize(lvl);
// while(level() > lvl) {
// size_t stamp = stamps.back();
// stamps.pop_back();
// while(trail.size() > stamp) {
// trail.back()->undo();
// trail.pop_back();
// }
// }
}
ReversibleObject::ReversibleObject() {}
ReversibleObject::~ReversibleObject() {}
// void ReversibleObject::undo() = 0;
void ReversibleObject::save() { env->save(this); }
......@@ -5,7 +5,7 @@
#include <string>
#include <vector>
#include <boost/dynamic_bitset.hpp>
// #include <boost/dynamic_bitset.hpp>
#include "Global.hpp"
#include "BellmanFord.hpp"
......@@ -82,14 +82,12 @@ public:
vector<DistanceVariable<T> *> variables;
//@}
// the graph of distances
SparseDistanceGraph<T> graph;
private:
/*!@name Private Parameters*/
//@{
// // whether the distance variable has already been added to the graph
// boost::dynamic_bitset<> declared;
// the graph of distances
SparseDistanceGraph<T> graph;
// map of variables indexed by pairs of events, used only when creating the
// variables to avoid duplicates
......@@ -117,23 +115,22 @@ public:
ostream& display(ostream &os) const;
};
template <class T> Schedule<T>::Schedule() : graph(*this) {
template <class T> Schedule<T>::Schedule() {
// variables.push_back(new DistanceVariable<T>(*this, ORIGIN, HORIZON, 0));
addMaximumLag(ORIGIN, HORIZON, INFTY);
addMaximumLag(HORIZON, ORIGIN, 0);
}
template <class T> void Schedule<T>::initialise() {
graph.initialise();
shortest_path_from_x.resize(numEvent(), INFTY);
shortest_path_to_y.resize(numEvent(), INFTY);
fCandidates.reserve(numEvent());
bCandidates.reserve(numEvent());
// declared.resize(numVar(), 0);
// declared.clear();
graph.initialise(*this);
shortest_path_from_x.resize(numEvent(), INFTY);
shortest_path_to_y.resize(numEvent(), INFTY);
fCandidates.reserve(numEvent());
bCandidates.reserve(numEvent());
// declared.resize(numVar(), 0);
// declared.clear();
}
// assert(x != y);
......@@ -777,8 +774,39 @@ template <class T> string Schedule<T>::label(const int event) const {
//
template <class T> ostream &Schedule<T>::display(ostream &os) const
{
graph.display(os);
vector<T> dbuffer(numEvent(), -INFTY);
os << " ";
for (auto i{0}; i < numEvent(); ++i)
// if (vertices.has(i))
os << " " << setw(4) << label(i);
os << endl;
for (auto i{0}; i < numEvent(); ++i) {
// if (vertices.has(i)) {
os << setw(4) << label(i) << ":";
for (auto &e : graph.successor[i])
dbuffer[e.to()] = e.length();
for (auto j{0}; j < numEvent(); ++j)
if (dbuffer[j] != -INFTY) {
if (dbuffer[j] == INFTY) {
os << " oo";
} else {
os << " " << setw(4) << dbuffer[j];
}
} else {
os << " ";
}
for (auto &e : graph.successor[i])
dbuffer[e.to()] = -INFTY;
os << endl;
// }
}
return os;
// graph.display(os);
// return os;
}
//
// template <class T>
......
......@@ -22,23 +22,12 @@ template <typename T> struct Edge {
DistanceVariable<T> *var;