Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
graph-tool
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Service Desk
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Incidents
Environments
Packages & Registries
Packages & Registries
Package Registry
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Malte R
graph-tool
Commits
2de7ad34
Commit
2de7ad34
authored
Aug 28, 2020
by
Tiago Peixoto
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
graph_parallel.hh: cosmetic functor -> function conversion
parent
2b51e4b5
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
71 additions
and
80 deletions
+71
-80
src/graph/stats/graph_parallel.cc
src/graph/stats/graph_parallel.cc
+3
-3
src/graph/stats/graph_parallel.hh
src/graph/stats/graph_parallel.hh
+68
-77
No files found.
src/graph/stats/graph_parallel.cc
View file @
2de7ad34
...
...
@@ -36,7 +36,7 @@ void do_label_parallel_edges(GraphInterface& gi, boost::any property,
(
gi
,
[
&
](
auto
&&
graph
,
auto
&&
a2
)
{
return
label_parallel_edges
()
return
label_parallel_edges
(
std
::
forward
<
decltype
(
graph
)
>
(
graph
),
std
::
forward
<
decltype
(
a2
)
>
(
a2
),
mark_only
);
},
...
...
@@ -50,7 +50,7 @@ void do_label_self_loops(GraphInterface& gi, boost::any property,
(
gi
,
[
&
](
auto
&&
graph
,
auto
&&
a2
)
{
return
label_self_loops
()
return
label_self_loops
(
std
::
forward
<
decltype
(
graph
)
>
(
graph
),
std
::
forward
<
decltype
(
a2
)
>
(
a2
),
mark_only
);
},
...
...
@@ -63,7 +63,7 @@ void do_remove_labeled_edges(GraphInterface& gi, boost::any property)
(
gi
,
[
&
](
auto
&&
graph
,
auto
&&
a2
)
{
return
remove_labeled_edges
()
return
remove_labeled_edges
(
std
::
forward
<
decltype
(
graph
)
>
(
graph
),
std
::
forward
<
decltype
(
a2
)
>
(
a2
));
},
...
...
src/graph/stats/graph_parallel.hh
View file @
2de7ad34
...
...
@@ -28,109 +28,100 @@ using namespace std;
using
namespace
boost
;
// label parallel edges in the order they are found, starting from 1
struct
label_parallel_edges
template
<
class
Graph
,
class
ParallelMap
>
void
label_parallel_edges
(
const
Graph
&
g
,
ParallelMap
parallel
,
bool
mark_only
)
{
template
<
class
Graph
,
class
ParallelMap
>
void
operator
()(
const
Graph
&
g
,
ParallelMap
parallel
,
bool
mark_only
)
const
{
typedef
typename
graph_traits
<
Graph
>::
vertex_descriptor
vertex_t
;
typedef
typename
graph_traits
<
Graph
>::
edge_descriptor
edge_t
;
typename
property_map
<
Graph
,
edge_index_t
>::
type
eidx
=
get
(
edge_index
,
g
);
typedef
typename
graph_traits
<
Graph
>::
vertex_descriptor
vertex_t
;
typedef
typename
graph_traits
<
Graph
>::
edge_descriptor
edge_t
;
typename
property_map
<
Graph
,
edge_index_t
>::
type
eidx
=
get
(
edge_index
,
g
);
idx_map
<
vertex_t
,
edge_t
>
vset
;
idx_map
<
size_t
,
bool
>
self_loops
;
idx_map
<
vertex_t
,
edge_t
>
vset
;
idx_map
<
size_t
,
bool
>
self_loops
;
#pragma omp parallel if (num_vertices(g) > OPENMP_MIN_THRESH) \
firstprivate(vset) firstprivate(self_loops)
parallel_vertex_loop_no_spawn
(
g
,
[
&
](
auto
v
)
#pragma omp parallel if (num_vertices(g) > OPENMP_MIN_THRESH) \
firstprivate(vset) firstprivate(self_loops)
parallel_vertex_loop_no_spawn
(
g
,
[
&
](
auto
v
)
{
for
(
auto
e
:
out_edges_range
(
v
,
g
))
{
for
(
auto
e
:
out_edges_range
(
v
,
g
))
{
vertex_t
u
=
target
(
e
,
g
);
vertex_t
u
=
target
(
e
,
g
);
// do not visit edges twice in undirected graphs
if
(
!
graph_tool
::
is_directed
(
g
)
&&
u
<
v
)
continue
;
// do not visit edges twice in undirected graphs
if
(
!
graph_tool
::
is_directed
(
g
)
&&
u
<
v
)
continue
;
if
(
u
==
v
)
{
if
(
self_loops
[
eidx
[
e
]])
continue
;
self_loops
[
eidx
[
e
]]
=
true
;
}
if
(
u
==
v
)
{
if
(
self_loops
[
eidx
[
e
]])
continue
;
self_loops
[
eidx
[
e
]]
=
true
;
}
auto
iter
=
vset
.
find
(
u
);
if
(
iter
==
vset
.
end
())
auto
iter
=
vset
.
find
(
u
);
if
(
iter
==
vset
.
end
())
{
vset
[
u
]
=
e
;
}
else
{
if
(
mark_only
)
{
vset
[
u
]
=
e
;
parallel
[
e
]
=
tru
e
;
}
else
{
if
(
mark_only
)
{
parallel
[
e
]
=
true
;
}
else
{
parallel
[
e
]
=
parallel
[
iter
->
second
]
+
1
;
vset
[
u
]
=
e
;
}
parallel
[
e
]
=
parallel
[
iter
->
second
]
+
1
;
vset
[
u
]
=
e
;
}
}
vset
.
clear
();
self_loops
.
clear
();
}
);
}
}
;
}
vset
.
clear
();
self_loops
.
clear
(
);
});
}
// label self loops edges in the order they are found, starting from 1
struct
label_self_loops
template
<
class
Graph
,
class
SelfMap
>
void
label_self_loops
(
const
Graph
&
g
,
SelfMap
self
,
bool
mark_only
)
{
template
<
class
Graph
,
class
SelfMap
>
void
operator
()(
const
Graph
&
g
,
SelfMap
self
,
bool
mark_only
)
const
{
parallel_vertex_loop
(
g
,
[
&
](
auto
v
)
parallel_vertex_loop
(
g
,
[
&
](
auto
v
)
{
size_t
n
=
1
;
for
(
auto
e
:
out_edges_range
(
v
,
g
)
)
{
size_t
n
=
1
;
for
(
auto
e
:
out_edges_range
(
v
,
g
))
{
if
(
target
(
e
,
g
)
==
v
)
put
(
self
,
e
,
mark_only
?
1
:
n
++
);
else
put
(
self
,
e
,
0
);
}
});
}
if
(
target
(
e
,
g
)
==
v
)
put
(
self
,
e
,
mark_only
?
1
:
n
++
);
else
put
(
self
,
e
,
0
);
}
});
};
// remove edges with label larger than 0
struct
remove_labeled_edges
template
<
class
Graph
,
class
LabelMap
>
void
remove_labeled_edges
(
Graph
&
g
,
LabelMap
label
)
{
template
<
class
Graph
,
class
LabelMap
>
void
operator
()(
Graph
&
g
,
LabelMap
label
)
const
typedef
typename
graph_traits
<
Graph
>::
edge_descriptor
edge_t
;
vector
<
edge_t
>
r_edges
;
for
(
auto
v
:
vertices_range
(
g
))
{
typedef
typename
graph_traits
<
Graph
>::
edge_descriptor
edge_t
;
vector
<
edge_t
>
r_edges
;
for
(
auto
v
:
vertices_range
(
g
))
for
(
auto
e
:
out_edges_range
(
v
,
g
))
{
for
(
auto
e
:
out_edges_range
(
v
,
g
))
{
if
(
label
[
e
]
>
0
)
r_edges
.
push_back
(
e
);
}
if
(
label
[
e
]
>
0
)
r_edges
.
push_back
(
e
);
}
while
(
!
r_edges
.
empty
())
{
remove_edge
(
r_edges
.
back
(),
g
);
r_edges
.
pop_back
();
}
while
(
!
r_edges
.
empty
())
{
remove_edge
(
r_edges
.
back
(),
g
);
r_edges
.
pop_back
();
}
}
}
;
}
}
// graph_tool namespace
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment