Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
Emmanuel Hebrard
SchedCL
Commits
9c902e0d
Commit
9c902e0d
authored
Oct 19, 2021
by
ehebrard
Browse files
reversible types
parent
a88cbe5a
Changes
12
Expand all
Hide whitespace changes
Inline
Side-by-side
examples/src/test.cpp
View file @
9c902e0d
...
...
@@ -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
<<
"
\n
merge 0 4
\n
"
<<
G
<<
endl
;
G
.
merge
(
5
,
3
);
cout
<<
"
\n
merge 5 3
\n
"
<<
G
<<
endl
;
ReversibleObject
::
env
->
save
();
G
.
merge
(
5
,
1
);
cout
<<
"
\n
merge 5 1
\n
"
<<
G
<<
endl
;
auto
l
{
ReversibleObject
::
env
->
level
()};
ReversibleObject
::
env
->
restore
(
l
);
cout
<<
"
\n
restore 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
<<
"
\n
restore 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;
// }
//
}
src/cpp/SparseDistanceGraph.cpp
deleted
100644 → 0
View file @
a88cbe5a
#include
"SparseDistanceGraph.hpp"
src/cpp/SparseSet.cpp
View file @
9c902e0d
...
...
@@ -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();
// // }
// //
<