Commit 9c902e0d authored by ehebrard's avatar ehebrard
Browse files

reversible types

parent a88cbe5a
......@@ -24,8 +24,94 @@ along with minicsp. If not, see <http://www.gnu.org/licenses/>.
using namespace std;
using namespace schedcl;
float foo(const float x) {
return 2 * x;
}
int main(int argc, char *argv[]) {
Reversible<float> x(0);
cout << x << endl;
cout << foo(x) << endl;
auto l{ReversibleObject::env->level()};
ReversibleObject::env->save();
x = 7.5;
cout << x << endl;
cout << foo(x) << endl;
x = 8.9;
cout << x << endl;
cout << foo(x) << endl;
ReversibleObject::env->restore(l);
cout << x << endl;
cout << foo(x) << endl;
x = 123.45;
auto y = 57 + x;
cout << y << endl;
SparseSet<Reversible<int>> X;
X.reserve(20);
X.fill();
cout << X << endl;
ReversibleObject::env->save();
X.remove_back(13);
X.remove_front(4);
X.remove_back(7);
X.remove_front(8);
X.remove_back(11);
X.remove_front(14);
cout << X << endl;
ReversibleObject::env->save();
X.remove_back(1);
X.remove_front(18);
X.remove_back(5);
X.remove_front(16);
cout << X << endl;
l = ReversibleObject::env->level();
ReversibleObject::env->restore(l--);
cout << X << endl;
ReversibleObject::env->restore(l--);
cout << X << endl;
// cout << "hello\n";
//
//
......@@ -64,104 +150,104 @@ int main(int argc, char *argv[]) {
// Constant<int>::initialise();
vector<int> events{3,5,10,1,89,12};
// map<const pair<event,event>,DistanceVariable<int>*> varmap;
for (auto e : events)
cout << e << endl;
Schedule<int> S;
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();
// vector<int> events{3,5,10,1,89,12};
//
// // map<const pair<event,event>,DistanceVariable<int>*> varmap;
//
// for (auto e : events)
// cout << e << endl;
//
// Schedule<int> S;
// 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({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({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.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;
// G.FloydWarshall();
//
// ReversibleObject::env->override();
//
// cout << "@ lvl " << ReversibleObject::env->level() << ":\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;
}
// // 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;
// }
//
}
#include "SparseDistanceGraph.hpp"
......@@ -3,306 +3,308 @@
#include "SparseSet.hpp"
SparseSet::SparseSet(const size_t n) {
size_ = 0;
start_ = 0;
reserve(n);
}
void SparseSet::reserve(const size_t n) {
while (list_.size() < n) {
index_.push_back(list_.size());
list_.push_back(list_.size());
}
}
void SparseSet::resize(const size_t n) {
reserve(n);
fill();
}
// SparseSet::SparseSet(const size_t n) {
// size_ = 0;
// start_ = 0;
// reserve(n);
// }
//
// void SparseSet::save(size_t &stamp1, size_t &stamp2) { stamp1 = size_; stamp2
// = start_; }
// void SparseSet::restore(const size_t stamp1, const size_t stamp2) { size_ =
// stamp1; start_ = stamp2; }
void SparseSet::save_start(size_t &stamp) { stamp = start_; }
void SparseSet::save_size(size_t &stamp) { stamp = size_; }
void SparseSet::restore_start(const size_t stamp) { start_ = stamp; }
void SparseSet::restore_size(const size_t stamp) { size_ = stamp; }
//@}
/*!@name Accessors*/
//@{
bool SparseSet::safe_has(const int elt) const {
if (elt >= 0 && (size_t)elt < index_.size())
return has(elt);
return false;
}
bool SparseSet::has(const int elt) const { return index_[elt] < size_ and index_[elt] >= start_; }
bool SparseSet::isfront(const int elt) const { return index_[elt] < start_; }
bool SparseSet::isback(const int elt) const { return index_[elt] >= size_; }
size_t SparseSet::count() const { return size_ - start_; }
size_t SparseSet::size() const { return size_; }
size_t SparseSet::start() const { return start_; }
size_t SparseSet::capacity() const { return index_.size(); }
bool SparseSet::empty() const { return size_ == start_; }
int SparseSet::next(const int elt) const {
size_t idx = index_[elt] + 1;
return (idx < size_ ? list_[idx] : elt);
}
int SparseSet::prev(const int elt) const {
size_t idx = index_[elt];
return (idx > start_ ? list_[idx - 1] : elt);
}
int SparseSet::operator[](const size_t idx) const { return list_[idx+start_]; }
int &SparseSet::operator[](const size_t idx) { return list_[idx+start_]; }
//@}
/*!@name List Manipulation*/
//@{
std::vector<int>::iterator SparseSet::fbegin() { return list_.begin(); }
std::vector<int>::iterator SparseSet::begin() { return list_.begin() + start_; }
std::vector<int>::iterator SparseSet::bbegin() { return list_.begin() + size_; }
std::vector<int>::reverse_iterator SparseSet::frbegin() {
return list_.rend() - start_;
}
std::vector<int>::reverse_iterator SparseSet::rbegin() {
return list_.rend() - size_;
}
std::vector<int>::reverse_iterator SparseSet::brbegin() {
return list_.rbegin();
}
std::vector<int>::iterator SparseSet::fend() { return list_.begin() + start_; }
std::vector<int>::iterator SparseSet::end() { return list_.begin() + size_; }
std::vector<int>::iterator SparseSet::bend() { return list_.end(); }
std::vector<int>::reverse_iterator SparseSet::frend() { return list_.rend(); }
std::vector<int>::reverse_iterator SparseSet::rend() {
return list_.rend() - start_;
}
std::vector<int>::reverse_iterator SparseSet::brend() {
return list_.rend() - size_;
}
std::vector<int>::const_iterator SparseSet::fbegin() const {
return list_.begin();
}
std::vector<int>::const_iterator SparseSet::begin() const {
return list_.begin() + start_;
}
std::vector<int>::const_iterator SparseSet::bbegin() const {
return list_.begin() + size_;
}
std::vector<int>::const_reverse_iterator SparseSet::frbegin() const {
return list_.rend() - start_;
}
std::vector<int>::const_reverse_iterator SparseSet::rbegin() const {
return list_.rend() - size_;
}
std::vector<int>::const_reverse_iterator SparseSet::brbegin() const {
return list_.rbegin();
}
std::vector<int>::const_iterator SparseSet::fend() const {
return list_.begin() + start_;
}
std::vector<int>::const_iterator SparseSet::end() const {
return list_.begin() + size_;
}
std::vector<int>::const_iterator SparseSet::bend() const { return list_.end(); }
std::vector<int>::const_reverse_iterator SparseSet::frend() const {
return list_.rend();
}
std::vector<int>::const_reverse_iterator SparseSet::rend() const {
return list_.rend() - start_;
}
std::vector<int>::const_reverse_iterator SparseSet::brend() const {
return list_.rend() - size_;
}
std::vector<int>::const_iterator SparseSet::get_iterator(const size_t i) const {
return list_.begin() + i;
}
std::vector<int>::iterator SparseSet::get_iterator(const size_t i) {
return list_.begin() + i;
}
// std::vector<int>::iterator SparseSet::begin_after() { return end(); }
// std::vector<int>::reverse_iterator SparseSet::rbegin_after() {
// return list_.rend();
// void SparseSet::reserve(const size_t n) {
// while (list_.size() < n) {
// index_.push_back(list_.size());
// list_.push_back(list_.size());
// }
// }
//
// void SparseSet::resize(const size_t n) {
// reserve(n);
// fill();
// }
//
// std::vector<int>::iterator SparseSet::end_after() { return list_.end(); }
// std::vector<int>::reverse_iterator SparseSet::rend_after() { return rbegin(); }
// //
// // void SparseSet::save(size_t &stamp1, size_t &stamp2) { stamp1 = size_; stamp2
// // = start_; }
// // void SparseSet::restore(const size_t stamp1, const size_t stamp2) { size_ =
// // stamp1; start_ = stamp2; }
//
// void SparseSet::save_start(size_t &stamp) { stamp = start_; }
// void SparseSet::save_size(size_t &stamp) { stamp = size_; }
// void SparseSet::restore_start(const size_t stamp) { start_ = stamp; }
// void SparseSet::restore_size(const size_t stamp) { size_ = stamp; }
//
// //@}
//
// /*!@name Accessors*/
// //@{
//
// bool SparseSet::safe_has(const int elt) const {
// if (elt >= 0 && (size_t)elt < index_.size())
// return has(elt);
// return false;
// }
//
// bool SparseSet::has(const int elt) const { return index_[elt] < size_ and index_[elt] >= start_; }
//
// bool SparseSet::isfront(const int elt) const { return index_[elt] < start_; }
//
// bool SparseSet::isback(const int elt) const { return index_[elt] >= size_; }
//
// size_t SparseSet::count() const { return size_ - start_; }
//
// size_t SparseSet::size() const { return size_; }
//
// size_t SparseSet::start() const { return start_; }
//
// size_t SparseSet::capacity() const { return index_.size(); }
//
// bool SparseSet::empty() const { return size_ == start_; }
//
// int SparseSet::next(const int elt) const {
// size_t idx = index_[elt] + 1;
// return (idx < size_ ? list_[idx] : elt);
// }
// int SparseSet::prev(const int elt) const {
// size_t idx = index_[elt];
// return (idx > start_ ? list_[idx - 1] : elt);
// }
//
// int SparseSet::operator[](const size_t idx) const { return list_[idx+start_]; }
//
// int &SparseSet::operator[](const size_t idx) { return list_[idx+start_]; }
// //@}
//
// /*!@name List Manipulation*/
// //@{
// std::vector<int>::iterator SparseSet::fbegin() { return list_.begin(); }
// std::vector<int>::iterator SparseSet::begin() { return list_.begin() + start_; }
// std::vector<int>::iterator SparseSet::bbegin() { return list_.begin() + size_; }
//
// std::vector<int>::reverse_iterator SparseSet::frbegin() {
// return list_.rend() - start_;
// }
// std::vector<int>::reverse_iterator SparseSet::rbegin() {
// return list_.rend() - size_;
// }
// std::vector<int>::reverse_iterator SparseSet::brbegin() {
// return list_.rbegin();
// }
//
// std::vector<int>::iterator SparseSet::fend() { return list_.begin() + start_; }
// std::vector<int>::iterator SparseSet::end() { return list_.begin() + size_; }
// std::vector<int>::iterator SparseSet::bend() { return list_.end(); }
//
// std::vector<int>::reverse_iterator SparseSet::frend() { return list_.rend(); }
// std::vector<int>::reverse_iterator SparseSet::rend() {
// return list_.rend() - start_;
// }
// std::vector<int>::reverse_iterator SparseSet::brend() {
// return list_.rend() - size_;
// }
//
// std::vector<int>::const_iterator SparseSet::fbegin() const {
// return list_.begin();
// }
// std::vector<int>::const_iterator SparseSet::begin() const {
// return list_.begin() + start_;
// }
// std::vector<int>::const_iterator SparseSet::bbegin() const {
// return list_.begin() + size_;
// }
//
// std::vector<int>::const_reverse_iterator SparseSet::frbegin() const {
// return list_.rend() - start_;
// }
// std::vector<int>::const_reverse_iterator SparseSet::rbegin() const {
// return list_.rend() - size_;
// }
// std::vector<int>::const_reverse_iterator SparseSet::brbegin() const {
// return list_.rbegin();
// }
//
// std::vector<int>::const_iterator SparseSet::begin_after() const {
// return end();
// std::vector<int>::const_iterator SparseSet::fend() const {
// return list_.begin() + start_;
// }
// std::vector<int>::const_iterator SparseSet::end() const {
// return list_.begin() + size_;
// }
// std::vector<int>::const_reverse_iterator SparseSet::rbegin_after() const {
// std::vector<int>::const_iterator SparseSet::bend() const { return list_.end(); }
//
// std::vector<int>::const_reverse_iterator SparseSet::frend() const {
// return list_.rend();
// }
// std::vector<int>::const_reverse_iterator SparseSet::rend() const {
// return list_.rend() - start_;
// }
// std::vector<int>::const_reverse_iterator SparseSet::brend() const {
// return list_.rend() - size_;
// }
//
// std::vector<int>::const_iterator SparseSet::end_after() const {
// return list_.end();
// std::vector<int>::const_iterator SparseSet::get_iterator(const size_t i) const {
// return list_.begin() + i;
// }
// std::vector<int>::const_reverse_iterator SparseSet::rend_after() const {
// return rend();
//
// std::vector<int>::iterator SparseSet::get_iterator(const size_t i) {
// return list_.begin() + i;
// }
void SparseSet::fill() { size_ = list_.size(); start_ = 0; }
void SparseSet::clear() { size_ = 0; start_ = 0; }
// void SparseSet::set_size(const int s) { size_ = s; }
// void SparseSet::safe_remove_back(const int elt) {
// if (elt >= 0) {
// if (static_cast<size_t>(elt) >= list_.size()) {
// reserve(elt + 1);
// }
// remove_back(elt);
// }
//
// // std::vector<int>::iterator SparseSet::begin_after() { return end(); }
// // std::vector<int>::reverse_iterator SparseSet::rbegin_after() {
// // return list_.rend();
// // }
// //
// // std::vector<int>::iterator SparseSet::end_after() { return list_.end(); }
// // std::vector<int>::reverse_iterator SparseSet::rend_after() { return rbegin(); }
// //
// // std::vector<int>::const_iterator SparseSet::begin_after() const {
// // return end();
// // }
// // std::vector<int>::const_reverse_iterator SparseSet::rbegin_after() const {
// // return list_.rend();
// // }
// // <