scope.h 1.4 KB
Newer Older
Q
qiaolongfei 已提交
1 2 3
#pragma once

#include <unordered_map>
4
#include <vector>
Q
qiaolongfei 已提交
5 6 7 8 9 10 11 12 13
#include "paddle/framework/variable.h"
#include "paddle/utils/Error.h"

namespace paddle {
namespace framework {

const static Error AlreadyCreated("Variable has already been created");

/**
14 15 16 17
 * 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.
Q
qiaolongfei 已提交
18 19 20 21 22
 */
class Scope {
 public:
  Scope() {}

23
  explicit Scope(const std::shared_ptr<Scope>& scope) : parent_(scope) {}
Q
qiaolongfei 已提交
24 25 26 27 28 29 30 31

  ~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
32
  // from it's parent scope. Return nullptr if not found.
Q
qiaolongfei 已提交
33 34 35 36 37 38 39 40 41 42 43 44 45
  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_;
46
  std::shared_ptr<Scope> parent_{nullptr};
Q
qiaolongfei 已提交
47 48 49 50
};

}  // namespace framework
}  // namespace paddle