#include "smart_tensor_printer.h" #include "caffe2/core/operator.h" namespace caffe2 { namespace { // Since DispatchHelper doesn't support passing arguments through the call() // method to DoRunWithType we have to create an object that will hold these // arguments explicitly. struct ProxyPrinter { template bool DoRunWithType() { tensorPrinter->Print(*tensor); return true; } void Print() { // Pulled in printable types from caffe2/core/types.cc // Unfortunately right now one has to add them by hand DispatchHelper>::call(this, tensor->dtype()); } const Tensor* tensor; TensorPrinter* tensorPrinter; }; } SmartTensorPrinter::SmartTensorPrinter(const std::string& tensor_name) : tensorPrinter_(tensor_name) {} SmartTensorPrinter::SmartTensorPrinter( const std::string& tensor_name, const std::string& file_name) : tensorPrinter_(tensor_name, file_name) {} SmartTensorPrinter::SmartTensorPrinter( const std::string& tensor_name, const std::string& file_name, int limit) : tensorPrinter_(tensor_name, file_name, limit) {} void SmartTensorPrinter::Print(const Tensor& tensor) { ProxyPrinter printer; printer.tensor = &tensor; printer.tensorPrinter = &tensorPrinter_; printer.Print(); } SmartTensorPrinter& SmartTensorPrinter::DefaultTensorPrinter() { // TODO(janusz): thread_local does not work under mac. #if __APPLE__ CAFFE_THROW( "SmartTensorPrinter does not work on mac yet due to thread_local."); #else static thread_local SmartTensorPrinter printer; return printer; #endif } void SmartTensorPrinter::PrintTensor(const Tensor& tensor) { DefaultTensorPrinter().Print(tensor); } }