forked from apache/tvm
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[Relay][Text Format] Text Printer Refactor and Debug Printing (apache…
- Loading branch information
Showing
10 changed files
with
961 additions
and
918 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,98 @@ | ||
/*! | ||
* Copyright (c) 2019 by Contributors | ||
* \file src/tvm/relay/doc.cc | ||
* \brief Doc ADT used for pretty printing. | ||
* Based on Section 1 of https://homepages.inf.ed.ac.uk/wadler/papers/prettier/prettier.pdf. | ||
*/ | ||
#include <memory> | ||
#include <vector> | ||
#include "doc.h" | ||
|
||
namespace tvm { | ||
namespace relay { | ||
|
||
// Text constructor | ||
DocAtom Text(const std::string& str) { | ||
return std::make_shared<TextNode>(str); | ||
} | ||
|
||
// Line constructor | ||
DocAtom Line(int indent = 0) { | ||
return std::make_shared<LineNode>(indent); | ||
} | ||
|
||
Doc::Doc(const std::string& str) { | ||
if (str == "\n") { | ||
this->stream_ = {Line()}; | ||
} else { | ||
this->stream_ = {Text(str)}; | ||
} | ||
} | ||
|
||
// DSL function implementations | ||
|
||
Doc& Doc::operator<<(const Doc& right) { | ||
assert(this != &right); | ||
this->stream_.insert(this->stream_.end(), right.stream_.begin(), right.stream_.end()); | ||
return *this; | ||
} | ||
|
||
Doc& Doc::operator<<(const std::string& right) { | ||
return *this << Doc(right); | ||
} | ||
|
||
Doc Indent(int indent, const Doc& doc) { | ||
Doc ret; | ||
for (auto atom : doc.stream_) { | ||
if (auto text = std::dynamic_pointer_cast<TextNode>(atom)) { | ||
ret.stream_.push_back(text); | ||
} else if (auto line = std::dynamic_pointer_cast<LineNode>(atom)) { | ||
ret.stream_.push_back(Line(indent + line->indent)); | ||
} else {assert(false);} | ||
} | ||
return ret; | ||
} | ||
|
||
std::string Doc::str() { | ||
std::ostringstream os; | ||
for (auto atom : this->stream_) { | ||
if (auto text = std::dynamic_pointer_cast<TextNode>(atom)) { | ||
os << text->str; | ||
} else if (auto line = std::dynamic_pointer_cast<LineNode>(atom)) { | ||
os << "\n" << std::string(line->indent, ' '); | ||
} else {assert(false);} | ||
} | ||
return os.str(); | ||
} | ||
|
||
Doc PrintVec(const std::vector<Doc>& vec, const Doc& sep) { | ||
Doc seq; | ||
if (vec.size() != 0) { | ||
seq = vec[0]; | ||
for (size_t i = 1; i < vec.size(); i++) { | ||
seq << sep << vec[i]; | ||
} | ||
} | ||
return seq; | ||
} | ||
|
||
Doc PrintBool(bool value) { | ||
if (value) { | ||
return Doc("True"); | ||
} else { | ||
return Doc("False"); | ||
} | ||
} | ||
|
||
Doc PrintDType(DataType dtype) { | ||
return Doc(runtime::TVMType2String(Type2TVMType(dtype))); | ||
} | ||
|
||
Doc PrintString(const std::string& value) { | ||
// TODO(M.K.): add escape. | ||
Doc doc; | ||
return doc << "\"" << value << "\""; | ||
} | ||
|
||
} // namespace relay | ||
} // namespace tvm |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,99 @@ | ||
/*! | ||
* Copyright (c) 2019 by Contributors | ||
* \file tvm/relay/doc.h | ||
* \brief Doc ADT used for pretty printing. | ||
* Based on Section 1 of | ||
* https://homepages.inf.ed.ac.uk/wadler/papers/prettier/prettier.pdf, but with | ||
* a vector instead of an implicitly linked list. | ||
*/ | ||
#ifndef TVM_RELAY_IR_DOC_H_ | ||
#define TVM_RELAY_IR_DOC_H_ | ||
|
||
#include <tvm/relay/expr.h> | ||
#include <memory> | ||
#include <string> | ||
#include <vector> | ||
|
||
namespace tvm { | ||
namespace relay { | ||
|
||
// Doc Atom ADT | ||
struct DocAtomNode { | ||
virtual ~DocAtomNode() = default; | ||
}; | ||
|
||
using DocAtom = std::shared_ptr<DocAtomNode>; | ||
|
||
struct TextNode : DocAtomNode { | ||
std::string str; | ||
|
||
explicit TextNode(const std::string& str) : str(str) {} | ||
}; | ||
|
||
struct LineNode : DocAtomNode { | ||
int indent; | ||
|
||
explicit LineNode(int indent) : indent(indent) {} | ||
}; | ||
|
||
// Doc is a stream-like interface | ||
class Doc { | ||
public: | ||
Doc() {} | ||
explicit Doc(const std::string& str); | ||
|
||
// Append right to this. | ||
Doc& operator<<(const Doc& right); | ||
// Like above, but automatically lifts string to a Doc. | ||
Doc& operator<<(const std::string& right); | ||
// Like above, but converts right to a string first. | ||
template<typename T> | ||
Doc& operator<<(const T& right) { | ||
std::ostringstream os; | ||
os << right; | ||
return *this << os.str(); | ||
} | ||
|
||
// Indent a doc stream. | ||
friend Doc Indent(int indent, const Doc& doc); | ||
|
||
// Wadler's `layout` | ||
std::string str(); | ||
|
||
private: | ||
std::vector<DocAtom> stream_; | ||
}; | ||
|
||
// DSL functions | ||
|
||
// Render vectors of docs with a separator. e.g. PrintVec([1, 2, 3], f) -> 1f2f3 | ||
Doc PrintVec(const std::vector<Doc>& vec, const Doc& sep = Doc(", ")); | ||
// Print a constant bool value. | ||
Doc PrintBool(bool value); | ||
// Print a data type. | ||
Doc PrintDType(DataType dtype); | ||
// Print a string. | ||
Doc PrintString(const std::string& value); | ||
/*! | ||
* \brief special method to print out const scalar | ||
* \param dtype The data type | ||
* \param data The pointer to hold the data. | ||
*/ | ||
template<typename T> | ||
Doc PrintConstScalar(DataType dtype, const T* data) { | ||
std::ostringstream os; | ||
if (dtype == Int(32)) { | ||
os << data[0]; | ||
} else if (dtype == Float(32)) { | ||
os << data[0] << 'f'; | ||
} else if (dtype == Bool()) { | ||
return PrintBool(data[0] != 0); | ||
} else { | ||
os << dtype << "(" << data[0] << ")"; | ||
} | ||
return Doc(os.str()); | ||
} | ||
|
||
} // namespace relay | ||
} // namespace tvm | ||
#endif // TVM_RELAY_IR_DOC_H_ |
Oops, something went wrong.