tvm
ir_docsifier_functor.h
Go to the documentation of this file.
1 /*
2  * Licensed to the Apache Software Foundation (ASF) under one
3  * or more contributor license agreements. See the NOTICE file
4  * distributed with this work for additional information
5  * regarding copyright ownership. The ASF licenses this file
6  * to you under the Apache License, Version 2.0 (the
7  * "License"); you may not use this file except in compliance
8  * with the License. You may obtain a copy of the License at
9  *
10  * http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing,
13  * software distributed under the License is distributed on an
14  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15  * KIND, either express or implied. See the License for the
16  * specific language governing permissions and limitations
17  * under the License.
18  */
19 #ifndef TVM_SCRIPT_PRINTER_IR_DOCSIFIER_FUNCTOR_H_
20 #define TVM_SCRIPT_PRINTER_IR_DOCSIFIER_FUNCTOR_H_
21 
22 #include <tvm/node/node.h>
23 #include <tvm/runtime/logging.h>
25 
26 #include <optional>
27 #include <string>
28 #include <type_traits>
29 #include <unordered_map>
30 #include <utility>
31 #include <vector>
32 
33 namespace tvm {
34 namespace script {
35 namespace printer {
36 
42 template <typename R, typename... Args>
44  private:
45  using TSelf = IRDocsifierFunctor<R, Args...>;
46 
47  template <class TObjectRef, class TCallable>
48  using IsDispatchFunction =
49  typename std::is_convertible<TCallable, std::function<R(TObjectRef, Args...)>>;
50 
51  public:
63  template <class TObjectRef>
64  R operator()(const String& token, TObjectRef obj, Args... args) const {
65  uint32_t type_index = obj.defined() ? obj->type_index() : 0;
66  const runtime::PackedFunc* pf = nullptr;
67  if ((pf = LookupDispatchTable(token, type_index)) != nullptr) {
68  return (*pf)(obj, args...);
69  }
70  if ((pf = LookupDispatchTable("", type_index)) != nullptr) {
71  return (*pf)(obj, args...);
72  }
73  if ((pf = LookupFallback()) != nullptr) {
74  return (*pf)(obj, args...);
75  }
76 
77  LOG(WARNING) << "ObjectFunctor calls un-registered function on type: "
78  << runtime::Object::TypeIndex2Key(type_index) << " (token: " << token << ")"
79  << ". ObjectType: " << obj->GetTypeKey() << ". Object: " << obj;
80  ICHECK(false) << "ObjectFunctor calls un-registered function on type: "
81  << runtime::Object::TypeIndex2Key(type_index) << " (token: " << token << ")"
82  << ". ObjectType: " << obj->GetTypeKey() << ". Object: " << obj;
83  }
84 
94  TSelf& set_dispatch(String token, uint32_t type_index, runtime::PackedFunc f) {
95  std::vector<runtime::PackedFunc>* table = &dispatch_table_[token];
96  if (table->size() <= type_index) {
97  table->resize(type_index + 1, nullptr);
98  }
99  runtime::PackedFunc& slot = (*table)[type_index];
100  if (slot != nullptr) {
101  ICHECK(false) << "Dispatch for type is already registered: "
102  << runtime::Object::TypeIndex2Key(type_index);
103  }
104  slot = f;
105  return *this;
106  }
107 
109  ICHECK(!dispatch_fallback_.has_value()) << "Fallback is already defined";
110  dispatch_fallback_ = f;
111  return *this;
112  }
113 
114  void remove_fallback() { dispatch_fallback_ = std::nullopt; }
115 
121  template <typename TObjectRef, typename TCallable,
122  typename = std::enable_if_t<IsDispatchFunction<TObjectRef, TCallable>::value>>
123  TSelf& set_dispatch(String token, TCallable f) {
124  return set_dispatch(token, TObjectRef::ContainerType::RuntimeTypeIndex(),
125  runtime::TypedPackedFunc<R(TObjectRef, Args...)>(f));
126  }
127 
128  template <typename TCallable,
129  typename = std::enable_if_t<IsDispatchFunction<ObjectRef, TCallable>::value>>
130  TSelf& set_fallback(TCallable f) {
132  return set_fallback(func);
133  }
134 
143  void remove_dispatch(String token, uint32_t type_index) {
144  std::vector<runtime::PackedFunc>* table = &dispatch_table_[token];
145  if (table->size() <= type_index) {
146  return;
147  }
148  (*table)[type_index] = nullptr;
149  }
150 
151  private:
158  const runtime::PackedFunc* LookupDispatchTable(const String& token, uint32_t type_index) const {
159  auto it = dispatch_table_.find(token);
160  if (it == dispatch_table_.end()) {
161  return nullptr;
162  }
163  const std::vector<runtime::PackedFunc>& tab = it->second;
164  if (type_index >= tab.size()) {
165  return nullptr;
166  }
167  const PackedFunc* f = &tab[type_index];
168  if (f->defined()) {
169  return f;
170  } else {
171  return nullptr;
172  }
173  }
174 
178  const runtime::PackedFunc* LookupFallback() const {
179  if (dispatch_fallback_.has_value()) {
180  return &*dispatch_fallback_;
181  } else {
182  return nullptr;
183  }
184  }
185 
186  /*
187  * This type alias and the following free functions are created to reduce the binary bloat
188  * from template and also hide implementation details from this header
189  */
190  using DispatchTable = std::unordered_map<std::string, std::vector<runtime::PackedFunc>>;
192  DispatchTable dispatch_table_;
193  std::optional<runtime::PackedFunc> dispatch_fallback_;
194 };
195 
196 } // namespace printer
197 } // namespace script
198 } // namespace tvm
199 #endif // TVM_SCRIPT_PRINTER_IR_DOCSIFIER_FUNCTOR_H_
Base class of all object reference.
Definition: object.h:519
bool defined() const
Definition: object.h:552
static std::string TypeIndex2Key(uint32_t tindex)
Get the type key of the corresponding index from runtime.
Packed function is a type-erased function. The arguments are passed by packed format.
Definition: packed_func.h:141
Reference to string objects.
Definition: string.h:98
Please refer to TypedPackedFunc<R(Args..)>.
Definition: packed_func.h:63
Dynamic dispatch functor based on ObjectPath.
Definition: ir_docsifier_functor.h:43
TSelf & set_fallback(TCallable f)
Definition: ir_docsifier_functor.h:130
void remove_dispatch(String token, uint32_t type_index)
Remove dispatch function.
Definition: ir_docsifier_functor.h:143
R operator()(const String &token, TObjectRef obj, Args... args) const
Call the dispatch function.
Definition: ir_docsifier_functor.h:64
void remove_fallback()
Definition: ir_docsifier_functor.h:114
TSelf & set_fallback(runtime::PackedFunc f)
Definition: ir_docsifier_functor.h:108
TSelf & set_dispatch(String token, uint32_t type_index, runtime::PackedFunc f)
Set the dispatch function.
Definition: ir_docsifier_functor.h:94
TSelf & set_dispatch(String token, TCallable f)
Set the dispatch function.
Definition: ir_docsifier_functor.h:123
runtime implementation for LibTorch/TorchScript.
Definition: analyzer.h:36
Definitions and helper macros for IR/AST nodes.
Type-erased function used across TVM API.