Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in / Register
Toggle navigation
N
ngraph
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Packages
Packages
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
submodule
ngraph
Commits
293ba8b7
Commit
293ba8b7
authored
6 years ago
by
Nick Korovaiko
Committed by
Robert Kimball
6 years ago
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
subgraph_topological_sort (#1608)
parent
e20876db
master
v0.29.0-rc.0
v0.28.0-rc.1
v0.28.0-rc.0
v0.27.1-rc.3
v0.27.1-rc.2
v0.27.1-rc.1
v0.27.1-rc.0
v0.27.0-rc.1
v0.27.0-rc.0
v0.26.1-rc.0
v0.26.0
v0.26.0-rc.8
v0.26.0-rc.7
v0.26.0-rc.6
v0.26.0-rc.5
v0.26.0-rc.4
v0.26.0-rc.3
v0.26.0-rc.2
v0.26.0-rc.0
v0.25.1-rc.11
v0.25.1-rc.10
v0.25.1-rc.9
v0.25.1-rc.8
v0.25.1-rc.7
v0.25.1-rc.6
v0.25.1-rc.5
v0.25.1-rc.4
v0.25.1-rc.3
v0.25.1-rc.2
v0.25.1-rc.1
v0.25.1-rc.0
v0.25.0
v0.25.0-rc.3
v0.25.0-rc.2
v0.25.0-rc.1
v0.25.0-rc.0
v0.25.0-dev.0
v0.24.0
v0.24.0-rc.3
v0.24.0-rc.2
v0.24.0-rc.1
v0.24.0-rc.0
v0.23.0-rc.7
v0.23.0-rc.6
v0.23.0-rc.5
v0.23.0-rc.4
v0.23.0-rc.3
v0.23.0-rc.2
v0.23.0-rc.1
v0.23.0-rc.0
v0.22.2-rc.0
v0.22.1
v0.22.1-rc.0
v0.22.0
v0.22.0-rc.2
v0.22.0-rc.0
v0.21.0
v0.21.0-rc.1
v0.21.0-rc.0
v0.20.1-rc.4
v0.20.1-rc.3
v0.20.1-rc.2
v0.20.1-rc.1
v0.20.1-rc.0
v0.20.0-rc.2
v0.20.0-rc.1
v0.20.0-rc.0
v0.20.0-dev.0
v0.19.1
v0.19.1-rc.0
v0.19.0
v0.19.0-rc.5
v0.19.0-rc.4
v0.19.0-rc.3
v0.19.0-rc.2
v0.19.0-rc.1
v0.19.0-rc.0
v0.18.1
v0.18.1-rc.1
v0.18.1-rc.0
v0.18.0
v0.18.0-rc.2
v0.18.0-rc.1
v0.18.0-rc.0
v0.17.0-rc.1
v0.17.0-rc.0
v0.16.0-rc.3
v0.16.0-rc.2
v0.16.0-rc.1
v0.16.0-rc.0
v0.15.1-rc.2
v0.15.1-rc.1
v0.15.0
v0.15.0-rc.2
v0.15.0-rc.1
v0.15.0-rc.0
v0.14.0
v0.14.0-rc.1
v0.14.0-rc.0
v0.13.0
v0.12.0
v0.12.0-rc.2
v0.12.0-rc.1
v0.12.0-rc.0
v0.11.1
v0.11.0
v0.11.0-rc.1
v0.11.0-rc.0
v0.10.1
v0.10.0
v0.10.0-rc.6
v0.10.0-rc.5
v0.10.0-rc.4
v0.10.0-rc.3
v0.10.0-rc.2
v0.10.0-rc.1
v0.10.0-rc.0
v0.9.1
v0.9.1-rc.0
v0.9.0
v0.9.0-rc.5
v0.9.0-rc.4
v0.9.0-rc.3
v0.9.0-rc.2
v0.9.0-rc.1
v0.9.0-rc.0
v0.8.2-rc.0
v0.8.1
v0.8.1-rc.0
v0.8.0
v0.8.0-rc.2
v0.8.0-rc.1
v0.8.0-rc.0
No related merge requests found
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
110 additions
and
0 deletions
+110
-0
graph_util.hpp
src/ngraph/graph_util.hpp
+80
-0
util.cpp
test/util.cpp
+30
-0
No files found.
src/ngraph/graph_util.hpp
View file @
293ba8b7
...
...
@@ -127,6 +127,86 @@ namespace ngraph
return
result_list
;
}
template
<
typename
T
>
std
::
list
<
std
::
shared_ptr
<
Node
>>
subgraph_topological_sort
(
const
T
&
nodes
,
bool
include_control_deps
=
false
)
{
std
::
deque
<
ngraph
::
Node
*>
independent_nodes
;
std
::
unordered_map
<
const
ngraph
::
Node
*
,
size_t
>
node_dependency_count
;
std
::
unordered_map
<
ngraph
::
Node
*
,
std
::
shared_ptr
<
ngraph
::
Node
>>
node_map
;
std
::
unordered_map
<
ngraph
::
Node
*
,
std
::
set
<
Node
*>>
control_deps_users
;
std
::
unordered_set
<
std
::
shared_ptr
<
ngraph
::
Node
>>
nodes_set
(
nodes
.
begin
(),
nodes
.
end
());
for
(
auto
node
:
nodes
)
{
//build an equivalent of node->get_users() but for control dependencies
size_t
deps_count
=
0
;
if
(
include_control_deps
)
{
for
(
auto
cd
:
node
->
get_control_dependencies
())
{
if
(
nodes_set
.
count
(
cd
)
!=
0
)
{
control_deps_users
[
cd
.
get
()].
insert
(
node
.
get
());
deps_count
++
;
}
}
}
node_map
[
node
.
get
()]
=
node
;
for
(
auto
arg
:
node
->
get_arguments
())
{
if
(
nodes_set
.
count
(
arg
)
!=
0
)
{
deps_count
++
;
}
}
node_dependency_count
[
node
.
get
()]
=
deps_count
;
if
(
deps_count
==
0
)
{
independent_nodes
.
push_back
(
node
.
get
());
}
}
std
::
list
<
std
::
shared_ptr
<
ngraph
::
Node
>>
result_list
;
while
(
independent_nodes
.
size
()
>
0
)
{
auto
independent_node
=
independent_nodes
.
front
();
result_list
.
push_back
(
node_map
[
independent_node
]);
independent_nodes
.
pop_front
();
for
(
auto
user_sp
:
independent_node
->
get_users
())
{
Node
*
user
=
user_sp
.
get
();
node_dependency_count
[
user
]
-=
1
;
size_t
count
=
node_dependency_count
[
user
];
if
(
count
==
0
)
{
independent_nodes
.
push_back
(
user
);
}
}
if
(
include_control_deps
)
{
auto
cdit
=
control_deps_users
.
find
(
independent_node
);
if
(
cdit
!=
control_deps_users
.
end
())
for
(
auto
cd_user
:
cdit
->
second
)
{
node_dependency_count
[
cd_user
]
-=
1
;
size_t
count
=
node_dependency_count
[
cd_user
];
if
(
count
==
0
)
{
independent_nodes
.
push_back
(
cd_user
);
}
}
}
}
NGRAPH_ASSERT
(
nodes
.
size
()
==
result_list
.
size
());
return
result_list
;
}
template
<
typename
T
>
void
validate_nodes_and_infer_types
(
const
T
&
nodes
)
{
...
...
This diff is collapsed.
Click to expand it.
test/util.cpp
View file @
293ba8b7
...
...
@@ -384,3 +384,33 @@ TEST(util, test_fprop_cache)
EXPECT_EQ
(
fprop_cache
.
fprop
->
get_results
().
size
(),
2
);
EXPECT_EQ
(
fprop_cache
.
bprop
->
get_parameters
().
size
(),
5
);
}
TEST
(
graph_util
,
test_subgraph_topological_sort
)
{
Shape
shape
{
2
,
2
};
auto
A
=
make_shared
<
op
::
Parameter
>
(
element
::
f32
,
shape
);
auto
B
=
make_shared
<
op
::
Parameter
>
(
element
::
f32
,
shape
);
auto
C
=
make_shared
<
op
::
Parameter
>
(
element
::
f32
,
shape
);
auto
add
=
A
+
B
;
auto
mul
=
C
*
add
;
auto
sorted
=
ngraph
::
subgraph_topological_sort
(
NodeVector
{
mul
,
add
,
A
});
std
::
list
<
std
::
shared_ptr
<
Node
>>
expected
{
A
,
add
,
mul
};
ASSERT_EQ
(
expected
,
sorted
);
}
TEST
(
graph_util
,
test_subgraph_topological_sort_control_dependencies
)
{
Shape
shape
{
2
,
2
};
auto
A
=
make_shared
<
op
::
Parameter
>
(
element
::
f32
,
shape
);
auto
B
=
make_shared
<
op
::
Parameter
>
(
element
::
f32
,
shape
);
auto
C
=
make_shared
<
op
::
Parameter
>
(
element
::
f32
,
shape
);
auto
D
=
make_shared
<
op
::
Abs
>
(
A
);
auto
E
=
make_shared
<
op
::
Abs
>
(
B
);
auto
add
=
A
+
B
;
add
->
add_control_dependency
(
D
);
add
->
add_control_dependency
(
E
);
auto
mul
=
C
*
add
;
auto
sorted
=
ngraph
::
subgraph_topological_sort
(
NodeVector
{
mul
,
add
,
A
,
D
},
true
);
std
::
list
<
std
::
shared_ptr
<
Node
>>
expected
{
A
,
D
,
add
,
mul
};
ASSERT_EQ
(
expected
,
sorted
);
}
This diff is collapsed.
Click to expand it.
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