From e0db351a9b1da72263b3c40138d1801541011dce Mon Sep 17 00:00:00 2001 From: =?utf8?q?=EB=B0=95=EC=A2=85=ED=98=84/=EB=8F=99=EC=9E=91=EC=A0=9C?= =?utf8?q?=EC=96=B4Lab=28SR=29/Senior=20Engineer/=EC=82=BC=EC=84=B1?= =?utf8?q?=EC=A0=84=EC=9E=90?= Date: Wed, 25 Apr 2018 10:31:40 +0900 Subject: [PATCH] [caffegen] Take the ownership of 'NetParameter' (#126) This commit revises 'Network' class to take the ownership of 'NetParameter' (to ensure the liveness of pointer). Signed-off-by: Jonghyun Park --- contrib/caffegen/include/internal/Network.h | 14 ++++++++++++++ contrib/caffegen/include/internal/NetworkBuilder.h | 4 +++- contrib/caffegen/src/FillCommand.cpp | 10 ++++++---- contrib/caffegen/src/internal/Network.cpp | 6 ++++++ contrib/caffegen/src/internal/NetworkBuilder.cpp | 8 ++++---- 5 files changed, 33 insertions(+), 9 deletions(-) create mode 100644 contrib/caffegen/src/internal/Network.cpp diff --git a/contrib/caffegen/include/internal/Network.h b/contrib/caffegen/include/internal/Network.h index 7c6eaec..7a82010 100644 --- a/contrib/caffegen/include/internal/Network.h +++ b/contrib/caffegen/include/internal/Network.h @@ -4,9 +4,16 @@ #include "BlobContext.h" #include "LayerContext.h" +#include + +#include + class Network { public: + explicit Network(std::unique_ptr<::caffe::NetParameter> &¶m); + +public: LayerContext &layers(void) { return _layers; } const LayerContext &layers(void) const { return _layers; } @@ -14,6 +21,13 @@ public: BlobContext &blobs(void) { return _blobs; } const BlobContext &blobs(void) const { return _blobs; } +public: + ::caffe::NetParameter ¶m(void) { return *_param; } + const ::caffe::NetParameter ¶m(void) const { return *_param; } + +private: + const std::unique_ptr<::caffe::NetParameter> _param; + private: BlobContext _blobs; LayerContext _layers; diff --git a/contrib/caffegen/include/internal/NetworkBuilder.h b/contrib/caffegen/include/internal/NetworkBuilder.h index 7ab3e32..302e486 100644 --- a/contrib/caffegen/include/internal/NetworkBuilder.h +++ b/contrib/caffegen/include/internal/NetworkBuilder.h @@ -5,13 +5,15 @@ #include +#include + class NetworkBuilder { public: NetworkBuilder(const LayerResolver &resolver); public: - std::unique_ptr build(caffe::NetParameter *param); + std::unique_ptr build(std::unique_ptr &&); private: const LayerResolver &_resolver; diff --git a/contrib/caffegen/src/FillCommand.cpp b/contrib/caffegen/src/FillCommand.cpp index 266b205..8fd83b3 100644 --- a/contrib/caffegen/src/FillCommand.cpp +++ b/contrib/caffegen/src/FillCommand.cpp @@ -5,6 +5,8 @@ #include +#include + #include #include #include @@ -15,17 +17,17 @@ int FillCommand::run(int, char **) const { - caffe::NetParameter param; + auto param = nncc::foundation::make_unique<::caffe::NetParameter>(); // Read from standard input google::protobuf::io::FileInputStream is{0}; - if (!google::protobuf::TextFormat::Parse(&is, ¶m)) + if (!google::protobuf::TextFormat::Parse(&is, param.get())) { std::cerr << "ERROR: Failed to parse prototxt" << std::endl; return 255; } - auto net = NetworkBuilder{LayerResolver{}}.build(¶m); + auto net = NetworkBuilder{LayerResolver{}}.build(std::move(param)); uint32_t seed = std::chrono::system_clock::now().time_since_epoch().count(); @@ -52,7 +54,7 @@ int FillCommand::run(int, char **) const // Write to standard output google::protobuf::io::FileOutputStream output(1); - google::protobuf::TextFormat::Print(param, &output); + google::protobuf::TextFormat::Print(net->param(), &output); return 0; } diff --git a/contrib/caffegen/src/internal/Network.cpp b/contrib/caffegen/src/internal/Network.cpp new file mode 100644 index 0000000..cb015ae --- /dev/null +++ b/contrib/caffegen/src/internal/Network.cpp @@ -0,0 +1,6 @@ +#include "internal/Network.h" + +Network::Network(std::unique_ptr<::caffe::NetParameter> &¶m) : _param{std::move(param)} +{ + // DO NOTHING +} diff --git a/contrib/caffegen/src/internal/NetworkBuilder.cpp b/contrib/caffegen/src/internal/NetworkBuilder.cpp index 6d45ace..d13df2a 100644 --- a/contrib/caffegen/src/internal/NetworkBuilder.cpp +++ b/contrib/caffegen/src/internal/NetworkBuilder.cpp @@ -7,13 +7,13 @@ NetworkBuilder::NetworkBuilder(const LayerResolver &resolver) : _resolver{resolv // DO NOTHING } -std::unique_ptr NetworkBuilder::build(caffe::NetParameter *param) +std::unique_ptr NetworkBuilder::build(std::unique_ptr &&p) { - auto res = nncc::foundation::make_unique(); + auto res = nncc::foundation::make_unique(std::move(p)); - for (int n = 0; n < param->layer_size(); ++n) + for (int n = 0; n < res->param().layer_size(); ++n) { - caffe::LayerParameter *layer_param = param->mutable_layer(n); + caffe::LayerParameter *layer_param = res->param().mutable_layer(n); const std::string &layer_type = layer_param->type(); auto l = _resolver.resolve(layer_type).make(res.get(), layer_param); -- 2.7.4