Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
BaiXuePrincess
Paddle
提交
2f47562d
P
Paddle
项目概览
BaiXuePrincess
/
Paddle
与 Fork 源项目一致
Fork自
PaddlePaddle / Paddle
通知
1
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
P
Paddle
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
2f47562d
编写于
6月 27, 2017
作者:
Q
qiaolongfei
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
scope-impl
上级
dcece75b
变更
5
显示空白变更内容
内联
并排
Showing
5 changed file
with
158 addition
and
1 deletion
+158
-1
doc/design/scope.md
doc/design/scope.md
+1
-1
paddle/framework/CMakeLists.txt
paddle/framework/CMakeLists.txt
+5
-0
paddle/framework/scope.cc
paddle/framework/scope.cc
+54
-0
paddle/framework/scope.h
paddle/framework/scope.h
+51
-0
paddle/framework/scope_test.cc
paddle/framework/scope_test.cc
+47
-0
未找到文件。
doc/design/scope.md
浏览文件 @
2f47562d
...
...
@@ -41,7 +41,7 @@ class Scope {
const
Variable
*
GetVariable
(
const
std
::
string
&
name
)
const
;
private:
std
::
unordered_map
<
std
::
string
,
std
::
unique_ptr
<
Va
ir
able
>>
vars_
;
std
::
unordered_map
<
std
::
string
,
std
::
unique_ptr
<
Va
ri
able
>>
vars_
;
};
```
...
...
paddle/framework/CMakeLists.txt
浏览文件 @
2f47562d
# ddim lib
cc_library
(
ddim SRCS ddim.cc
)
cc_test
(
ddim_test SRCS ddim_test.cc DEPS ddim
)
nv_test
(
dim_test SRCS dim_test.cu DEPS ddim
)
cc_test
(
variable_test SRCS variable_test.cc
)
# scope lib
cc_library
(
scope SRCS scope.cc
)
cc_test
(
scope_test SRCS scope_test.cc DEPS scope
)
paddle/framework/scope.cc
0 → 100644
浏览文件 @
2f47562d
#include "paddle/framework/scope.h"
namespace
paddle
{
namespace
framework
{
Error
Scope
::
CreateVariable
(
const
std
::
string
&
name
)
{
if
(
name
==
""
)
{
return
Error
(
"Variable name should not be empty"
);
}
if
(
HaveVariable
(
name
))
{
return
AlreadyCreated
;
}
vars_
[
name
]
=
std
::
unique_ptr
<
Variable
>
(
new
Variable
());
return
Error
();
}
Variable
*
Scope
::
GetVarLocally
(
const
std
::
string
&
name
)
const
{
if
(
vars_
.
count
(
name
))
{
return
vars_
.
at
(
name
).
get
();
}
return
nullptr
;
}
Variable
*
Scope
::
GetVariable
(
const
std
::
string
&
name
)
const
{
Variable
*
var
=
GetVarLocally
(
name
);
if
(
var
!=
nullptr
)
{
return
var
;
}
else
if
(
parent_
!=
nullptr
)
{
return
parent_
->
GetVariable
(
name
);
}
else
{
return
nullptr
;
}
}
Variable
*
Scope
::
GetOrCreateVariable
(
const
std
::
string
&
name
)
{
Variable
*
var
;
var
=
GetVariable
(
name
);
if
(
var
==
nullptr
)
{
auto
err
=
CreateVariable
(
name
);
if
(
!
err
.
isOK
())
{
return
nullptr
;
}
}
return
GetVariable
(
name
);
}
bool
Scope
::
HaveVariable
(
const
std
::
string
&
name
)
{
return
vars_
.
count
(
name
)
!=
0
;
}
}
// namespace framework
}
// namespace paddle
paddle/framework/scope.h
0 → 100644
浏览文件 @
2f47562d
#pragma once
#include <vector>
#include <unordered_map>
#include "paddle/framework/variable.h"
#include "paddle/utils/Error.h"
namespace
paddle
{
namespace
framework
{
const
static
Error
AlreadyCreated
(
"Variable has already been created"
);
/**
* Scope is an association of a name to Variable. All variables belong to `Scope`.
* You need to specify a scope to run a Net, i.e., `net.Run(&scope)`. One net can
* run in different scopes and update different variable in the scope.
*/
class
Scope
{
public:
Scope
()
{}
explicit
Scope
(
const
std
::
shared_ptr
<
Scope
>
&
scope
)
:
parent_
(
scope
)
{}
~
Scope
()
{}
// Create Variable in this Scope. Return error if Variable already been
// created.
Error
__must_check
CreateVariable
(
const
std
::
string
&
name
);
// Get Variable from this Scope, this function will recursive find Variable
// from it's parent scope.
// Return nullptr if not found.
Variable
*
GetVariable
(
const
std
::
string
&
name
)
const
;
// find and return Variables in the scope it self.
Variable
*
GetVarLocally
(
const
std
::
string
&
name
)
const
;
// Get a Variable from Scope, if the Variable is not exist then create it.
// User should call this function most of time.
Variable
*
GetOrCreateVariable
(
const
std
::
string
&
name
);
bool
HaveVariable
(
const
std
::
string
&
name
);
private:
std
::
unordered_map
<
std
::
string
,
std
::
unique_ptr
<
Variable
>>
vars_
;
std
::
shared_ptr
<
Scope
>
parent_
{
nullptr
};
};
}
// namespace framework
}
// namespace paddle
paddle/framework/scope_test.cc
0 → 100644
浏览文件 @
2f47562d
#include "paddle/framework/scope.h"
#include "gtest/gtest.h"
TEST
(
Scope
,
Create
)
{
using
paddle
::
framework
::
Scope
;
using
paddle
::
Error
;
using
paddle
::
framework
::
Variable
;
using
paddle
::
framework
::
AlreadyCreated
;
Scope
*
scope
=
new
Scope
();
Error
err
=
scope
->
CreateVariable
(
""
);
EXPECT_FALSE
(
err
.
isOK
());
Variable
*
var1
=
scope
->
GetVariable
(
"a"
);
EXPECT_EQ
(
var1
,
nullptr
);
Error
err1
=
scope
->
CreateVariable
(
"a"
);
EXPECT_TRUE
(
err1
.
isOK
());
Error
err2
=
scope
->
CreateVariable
(
"a"
);
EXPECT_EQ
(
err2
,
AlreadyCreated
);
Variable
*
var2
=
scope
->
GetVariable
(
"a"
);
EXPECT_NE
(
var2
,
nullptr
);
Variable
*
var3
=
scope
->
GetOrCreateVariable
(
"b"
);
EXPECT_NE
(
var3
,
nullptr
);
}
TEST
(
Scope
,
Parent
)
{
using
paddle
::
framework
::
Scope
;
using
paddle
::
framework
::
Variable
;
using
paddle
::
Error
;
const
auto
parent_scope_ptr
=
std
::
shared_ptr
<
Scope
>
(
new
Scope
());
Scope
*
scope
=
new
Scope
(
parent_scope_ptr
);
Error
err
=
parent_scope_ptr
->
CreateVariable
(
"a"
);
EXPECT_TRUE
(
err
.
isOK
());
Variable
*
var1
=
scope
->
GetVarLocally
(
"a"
);
EXPECT_EQ
(
var1
,
nullptr
);
Variable
*
var2
=
scope
->
GetVariable
(
"a"
);
EXPECT_NE
(
var2
,
nullptr
);
}
\ No newline at end of file
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录