|  | #ifndef CAFFE2_CONTRIB_OBSERVERS_TIME_OBSERVER_H_ | 
|  | #define CAFFE2_CONTRIB_OBSERVERS_TIME_OBSERVER_H_ | 
|  |  | 
|  | #include <unordered_map> | 
|  |  | 
|  | #include "caffe2/core/common.h" | 
|  | #include "caffe2/core/net.h" | 
|  | #include "caffe2/core/observer.h" | 
|  | #include "caffe2/core/operator.h" | 
|  | #include "caffe2/core/timer.h" | 
|  | #include "caffe2/observers/operator_attaching_net_observer.h" | 
|  |  | 
|  | namespace caffe2 { | 
|  |  | 
|  | class TimeObserver; | 
|  |  | 
|  | class TORCH_API TimeCounter { | 
|  | public: | 
|  | explicit TimeCounter() {} | 
|  | inline float average_time() const { | 
|  | return total_time_ / iterations_; | 
|  | } | 
|  |  | 
|  | protected: | 
|  | Timer timer_; | 
|  | float start_time_ = 0.0f; | 
|  | float total_time_ = 0.0f; | 
|  | int iterations_ = 0; | 
|  | }; | 
|  |  | 
|  | class TORCH_API TimeOperatorObserver final | 
|  | : public TimeCounter, | 
|  | public ObserverBase<OperatorBase> { | 
|  | public: | 
|  | explicit TimeOperatorObserver(OperatorBase* subject) = delete; | 
|  | explicit TimeOperatorObserver( | 
|  | OperatorBase* subject, | 
|  | TimeObserver* /* unused */) | 
|  | : ObserverBase<OperatorBase>(subject) {} | 
|  | std::unique_ptr<ObserverBase<OperatorBase>> rnnCopy( | 
|  | OperatorBase* subject, | 
|  | int rnn_order) const override; | 
|  |  | 
|  | private: | 
|  | void Start() override; | 
|  | void Stop() override; | 
|  | }; | 
|  |  | 
|  | class TORCH_API TimeObserver final | 
|  | : public TimeCounter, | 
|  | public OperatorAttachingNetObserver<TimeOperatorObserver, TimeObserver> { | 
|  | public: | 
|  | explicit TimeObserver(NetBase* subject) | 
|  | : OperatorAttachingNetObserver<TimeOperatorObserver, TimeObserver>( | 
|  | subject, | 
|  | this) {} | 
|  |  | 
|  | float average_time_children() const { | 
|  | float sum = 0.0f; | 
|  | for (const auto* observer : operator_observers_) { | 
|  | sum += observer->average_time(); | 
|  | } | 
|  | return sum / subject_->GetOperators().size(); | 
|  | } | 
|  |  | 
|  | private: | 
|  | void Start() override; | 
|  | void Stop() override; | 
|  | }; | 
|  |  | 
|  | } // namespace caffe2 | 
|  |  | 
|  | #endif // CAFFE2_CONTRIB_OBSERVERS_TIME_OBSERVER_H_ |