tvm
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
attrs.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  */
44 #ifndef TVM_IR_ATTRS_H_
45 #define TVM_IR_ATTRS_H_
46 
47 #include <dmlc/common.h>
48 #include <tvm/ir/expr.h>
52 
53 #include <functional>
54 #include <string>
55 #include <type_traits>
56 #include <unordered_map>
57 #include <utility>
58 #include <vector>
59 
60 namespace tvm {
66 #define TVM_DECLARE_ATTRS(ClassName, TypeKey) \
67  static constexpr const char* _type_key = TypeKey; \
68  TVM_DECLARE_FINAL_OBJECT_INFO(ClassName, ::tvm::BaseAttrsNode) \
69  template <typename FVisit> \
70  void _tvm_VisitAttrs(FVisit& _tvm_fvisit) // NOLINT(*)
71 
76 #define TVM_ATTR_FIELD(FieldName) _tvm_fvisit(#FieldName, &FieldName)
77 
83 template <typename TObjectRef>
84 inline TObjectRef NullValue() {
85  static_assert(TObjectRef::_type_is_nullable, "Can only get NullValue for nullable types");
86  return TObjectRef(ObjectPtr<Object>(nullptr));
87 }
88 
89 template <>
91  return DataType(DataType::kHandle, 0, 0);
92 }
93 
95 struct AttrError : public Error {
100  explicit AttrError(std::string msg) : Error("AttributeError:" + msg) {}
101 };
102 
106 class AttrFieldInfoNode : public Object {
107  public:
114 
116  v->Visit("name", &name);
117  v->Visit("type_info", &type_info);
118  v->Visit("description", &description);
119  }
120 
121  static constexpr const char* _type_key = "AttrFieldInfo";
122  static constexpr bool _type_has_method_sequal_reduce = false;
123  static constexpr bool _type_has_method_shash_reduce = false;
125 };
126 
128 class AttrFieldInfo : public ObjectRef {
129  public:
131 };
132 
139 class BaseAttrsNode : public Object {
140  public:
144  virtual ~BaseAttrsNode() {}
145  // visit function
146  virtual void VisitAttrs(AttrVisitor* v) {}
152  template <typename... Args>
153  inline void InitBySeq(Args&&... args);
158  inline void PrintDocString(std::ostream& os) const; // NOLINT(*)
165  TVM_DLL virtual void VisitNonDefaultAttrs(AttrVisitor* v) = 0;
170  TVM_DLL virtual Array<AttrFieldInfo> ListFieldInfo() const = 0;
178  TVM_DLL virtual void InitByPackedArgs(const TVMArgs& kwargs, bool allow_unknown = false) = 0;
179 
180  static constexpr const bool _type_has_method_sequal_reduce = true;
181  static constexpr const bool _type_has_method_shash_reduce = true;
182  static constexpr const char* _type_key = "Attrs";
184 };
185 
190 class Attrs : public ObjectRef {
191  public:
193 };
194 
201 class DictAttrsNode : public BaseAttrsNode {
202  public:
205 
206  bool SEqualReduce(const DictAttrsNode* other, SEqualReducer equal) const {
207  return equal(dict, other->dict);
208  }
209 
210  void SHashReduce(SHashReducer hash_reduce) const { hash_reduce(dict); }
211 
212  // implementations
213  void VisitAttrs(AttrVisitor* v) final;
214  void VisitNonDefaultAttrs(AttrVisitor* v) final;
215  void InitByPackedArgs(const runtime::TVMArgs& args, bool allow_unknown) final;
216  Array<AttrFieldInfo> ListFieldInfo() const final;
217 
218  // type info
219  static constexpr const char* _type_key = "DictAttrs";
221 };
222 
227 class DictAttrs : public Attrs {
228  public:
234  TVM_DLL explicit DictAttrs(Map<String, ObjectRef> dict);
235 
236  // Utils for accessing attributes
237  // This needs to be on DictAttrs, not DictAttrsNode because we return the default
238  // value if DictAttrsNode is not defined.
258  template <typename TObjectRef>
260  const std::string& attr_key,
261  Optional<TObjectRef> default_value = Optional<TObjectRef>(nullptr)) const {
262  static_assert(std::is_base_of<ObjectRef, TObjectRef>::value,
263  "Can only call GetAttr with ObjectRef types.");
264  if (!defined()) return default_value;
265  const DictAttrsNode* node = this->as<DictAttrsNode>();
266 
267  auto it = node->dict.find(attr_key);
268  if (it != node->dict.end()) {
269  return Downcast<Optional<TObjectRef>>((*it).second);
270  } else {
271  return default_value;
272  }
273  }
274  // variant that uses TObjectRef to enable implicit conversion to default value.
275  template <typename TObjectRef>
276  Optional<TObjectRef> GetAttr(const std::string& attr_key, TObjectRef default_value) const {
277  return GetAttr<TObjectRef>(attr_key, Optional<TObjectRef>(default_value));
278  }
298  bool HasNonzeroAttr(const std::string& attr_key) const {
299  return GetAttr<Integer>(attr_key, 0).value_or(0).IntValue() != 0;
300  }
301 
304 };
305 
311 template <typename TAttrs>
312 inline TAttrs AttrsWithDefaultValues() {
313  static_assert(std::is_base_of<Attrs, TAttrs>::value, "Can only take attr nodes");
314  auto n = make_object<typename TAttrs::ContainerType>();
315  n->InitByPackedArgs(runtime::TVMArgs(nullptr, nullptr, 0), false);
316  return TAttrs(n);
317 }
318 
346 template <typename TFunc>
347 inline TFunc WithAttr(TFunc input, const std::string& attr_key, ObjectRef attr_value) {
348  using TNode = typename TFunc::ContainerType;
349  static_assert(TNode::_type_final, "Can only operate on the leaf nodes");
350  TNode* node = input.CopyOnWrite();
351  if (node->attrs.defined()) {
352  node->attrs.CopyOnWrite()->dict.Set(attr_key, attr_value);
353  } else {
354  Map<String, ObjectRef> dict = {{attr_key, attr_value}};
355  node->attrs = DictAttrs(dict);
356  }
357  return input;
358 }
359 
370 template <typename TFunc>
371 inline TFunc WithAttrs(TFunc input, Map<String, ObjectRef> attrs) {
372  using TNode = typename TFunc::ContainerType;
373  static_assert(TNode::_type_final, "Can only operate on the leaf nodes");
374  TNode* node = input.CopyOnWrite();
375  if (node->attrs.defined()) {
376  for (const auto& pair : attrs) {
377  node->attrs.CopyOnWrite()->dict.Set(pair.first, pair.second);
378  }
379  } else {
380  node->attrs = DictAttrs(std::move(attrs));
381  }
382  return input;
383 }
384 
411 template <typename TFunc>
412 inline TFunc WithoutAttr(TFunc input, const std::string& attr_key) {
413  using TNode = typename TFunc::ContainerType;
414  static_assert(TNode::_type_final, "Can only operate on the leaf nodes");
415 
416  if (input->attrs.defined()) {
417  TNode* node = input.CopyOnWrite();
418  node->attrs.CopyOnWrite()->dict.erase(attr_key);
419  if (node->attrs->dict.size() == 0) {
420  node->attrs = NullValue<DictAttrs>();
421  }
422  }
423  return input;
424 }
425 
426 // Namespace containing detail implementations
427 namespace detail {
429 
430 // helper entry that does nothing in set_default/bound/describe calls.
431 struct AttrNopEntry {
433 
434  TSelf& describe(DMLC_ATTRIBUTE_UNUSED const char* str) { return *this; }
435  template <typename T>
436  TSelf& set_default(DMLC_ATTRIBUTE_UNUSED const T& value) {
437  return *this;
438  }
439  template <typename T>
440  TSelf& set_lower_bound(DMLC_ATTRIBUTE_UNUSED const T& begin) {
441  return *this;
442  }
443  template <typename T>
444  TSelf& set_upper_bound(DMLC_ATTRIBUTE_UNUSED const T& end) {
445  return *this;
446  }
447 };
448 
449 // Wrapper for normal visitor.
451  public:
452  explicit AttrNormalVisitor(AttrVisitor* visitor) : visitor_(visitor) {}
453  template <typename T>
454  AttrNopEntry operator()(const char* key, T* value) {
455  visitor_->Visit(key, value);
456  return AttrNopEntry();
457  }
458 
459  private:
460  AttrVisitor* visitor_;
461 };
462 
464  public:
465  bool result_{true};
466  // constructor
467  AttrsSEqualVisitor(const Object* lhs, const Object* rhs, const SEqualReducer& equal)
468  : lhs_(lhs), rhs_(rhs), equal_(equal) {}
469  template <typename T>
470  AttrNopEntry operator()(const char* key, T* lhs_value) {
471  if (!result_) return AttrNopEntry();
472  const T* rhs_value = reinterpret_cast<const T*>(
473  reinterpret_cast<const char*>(rhs_) +
474  (reinterpret_cast<const char*>(lhs_value) - reinterpret_cast<const char*>(lhs_)));
475  if (!equal_(*lhs_value, *rhs_value)) {
476  result_ = false;
477  }
478  return AttrNopEntry();
479  }
480 
481  private:
482  const Object* lhs_;
483  const Object* rhs_;
484  const SEqualReducer& equal_;
485 };
486 
488  public:
489  explicit AttrsSHashVisitor(const SHashReducer& hash_reducer) : hash_reducer_(hash_reducer) {}
490 
491  template <typename T>
492  AttrNopEntry operator()(const char* key, T* value) {
493  hash_reducer_(*value);
494  return AttrNopEntry();
495  }
496 
497  private:
498  const SHashReducer& hash_reducer_;
499 };
500 
501 // helper entry that does initialization, set default.
502 template <typename T>
504  // The attributes
506  // The type key
507  const char* type_key_;
508  // field name
509  const char* key_;
510  // internal value.
511  T* value_;
512  // whether the value is missing.
513  // NOTE: initialize to false so that the destructor does not throw unless
514  // AttrInitVisitor::operator() is committed to returning an instance of this class.
515  // It is expected not to set this to true until that is true.
516  bool value_missing_{false};
517 
518  AttrInitEntry() = default;
519 
521  type_key_ = other.type_key_;
522  key_ = other.key_;
523  value_ = other.value_;
524  value_missing_ = other.value_missing_;
525  // avoid unexpected throw
526  other.value_missing_ = false;
527  }
528 
529  // If the value is still missing in destruction time throw an error.
530  ~AttrInitEntry() DMLC_THROW_EXCEPTION {
531  if (value_missing_) {
532  std::ostringstream os;
533  os << type_key_ << ": Cannot find required field \'" << key_ << "\' during initialization. "
534  << "If the key is defined check that its type matches the declared type.";
535  throw AttrError(os.str());
536  }
537  }
538  // override fields.
539  // This function sets the lower bound of the attribute
540  TSelf& set_lower_bound(const T& begin) {
541  if (this->value_missing_) return *this;
542  const T& val = *value_;
543  if (begin > val) {
544  std::ostringstream os;
545  os << type_key_ << "." << key_ << ": "
546  << "value " << val << " is smaller than the lower bound " << begin;
547  throw AttrError(os.str());
548  }
549  return *this;
550  }
551  // This function sets the upper bound of the attribute
552  TSelf& set_upper_bound(const T& end) {
553  if (this->value_missing_) return *this;
554  const T& val = *value_;
555  if (val > end) {
556  std::ostringstream os;
557  os << type_key_ << "." << key_ << ": "
558  << "value " << val << " is bigger than the upper bound " << end;
559  throw AttrError(os.str());
560  }
561  return *this;
562  }
563  // set default when
564  TSelf& set_default(const T& value) {
565  if (!value_missing_) return *this;
566  *value_ = value;
567  value_missing_ = false;
568  return *this;
569  }
570  TSelf& describe(DMLC_ATTRIBUTE_UNUSED const char* str) { return *this; }
571 };
572 
573 // Template function to allow smart conversion
574 // from Expr types into the constants.
575 template <typename T>
576 inline void SetValue(T* ptr, const TVMArgValue& val) {
577  *ptr = val.operator T();
578 }
579 
580 template <typename T>
581 inline void SetIntValue(T* ptr, const TVMArgValue& val) {
582  if (val.type_code() == kDLInt) {
583  *ptr = static_cast<T>(val.value().v_int64);
584  } else {
585  IntImm expr = val;
586  *ptr = static_cast<T>(expr->value);
587  }
588 }
589 
590 // Workaround for GCC8.1 / GCC8.2
591 template <>
592 inline void SetValue<DataType>(DataType* ptr, const TVMArgValue& val) {
593  *ptr = val.operator DataType();
594 }
595 
596 template <>
597 inline void SetValue<std::string>(std::string* ptr, const TVMArgValue& val) {
598  if (String::CanConvertFrom(val)) {
599  *ptr = val.operator std::string();
600  } else {
601  LOG(FATAL) << "Expect str";
602  }
603 }
604 
605 template <>
606 inline void SetValue<double>(double* ptr, const TVMArgValue& val) {
607  if (val.type_code() == kDLFloat || val.type_code() == kDLInt) {
608  *ptr = val.operator double();
609  } else {
610  ObjectRef expr = val;
611  ICHECK(expr.defined());
612  if (const IntImmNode* op = expr.as<IntImmNode>()) {
613  *ptr = static_cast<double>(op->value);
614  } else if (const FloatImmNode* op = expr.as<FloatImmNode>()) {
615  *ptr = static_cast<double>(op->value);
616  } else {
617  LOG(FATAL) << "Expect float value, but get " << expr->GetTypeKey();
618  }
619  }
620 }
621 template <>
622 inline void SetValue<int>(int* ptr, const TVMArgValue& val) {
623  SetIntValue(ptr, val);
624 }
625 template <>
626 inline void SetValue<int64_t>(int64_t* ptr, const TVMArgValue& val) {
627  SetIntValue(ptr, val);
628 }
629 template <>
630 inline void SetValue<uint64_t>(uint64_t* ptr, const TVMArgValue& val) {
631  SetIntValue(ptr, val);
632 }
633 template <>
634 inline void SetValue<bool>(bool* ptr, const TVMArgValue& val) {
635  SetIntValue(ptr, val);
636 }
637 
638 // Visitor for value initialization
639 template <typename FFind>
641  public:
642  // Counter of number of matched attributes during visit.
643  // This is used to decide if there is additional unmatched attributes.
644  size_t hit_count_{0};
645  // constructor
646  AttrInitVisitor(const char* type_key, FFind ffind) : type_key_(type_key), ffind_(ffind) {}
647 
648  template <typename T>
649  AttrInitEntry<T> operator()(const char* key, T* value) {
650  TVMArgValue val;
651  AttrInitEntry<T> opt;
652  opt.type_key_ = type_key_;
653  opt.key_ = key;
654  opt.value_ = value;
655  if (ffind_(key, &val)) {
656  SetValue(value, val);
657  opt.value_missing_ = false;
658  ++hit_count_;
659  } else {
660  opt.value_missing_ = true;
661  }
662 #if defined(__GNUC__)
663 #pragma GCC diagnostic ignored "-Wpragmas"
664 #pragma GCC diagnostic ignored "-Wpessimizing-move"
665 #endif
666  return std::move(opt);
667  }
668 
669  private:
670  // the type key
671  const char* type_key_;
672  FFind ffind_;
673 };
674 
675 template <typename FFind>
676 inline AttrInitVisitor<FFind> CreateInitVisitor(const char* type_key, FFind ffind) {
677  return AttrInitVisitor<FFind>(type_key, ffind);
678 }
679 
684 template <typename T>
685 struct TypeName {
686  static constexpr const char* value = T::ContainerType::_type_key;
687 };
688 
689 template <>
690 struct TypeName<int> {
691  static constexpr const char* value = "int";
692 };
693 
694 template <>
695 struct TypeName<int64_t> {
696  static constexpr const char* value = "int64";
697 };
698 
699 template <>
700 struct TypeName<uint64_t> {
701  static constexpr const char* value = "uint64_t";
702 };
703 
704 template <>
706  static constexpr const char* value = "DataType";
707 };
708 
709 template <>
710 struct TypeName<std::string> {
711  static constexpr const char* value = "str";
712 };
713 
714 template <>
715 struct TypeName<bool> {
716  static constexpr const char* value = "bool";
717 };
718 
719 template <>
720 struct TypeName<void*> {
721  static constexpr const char* value = "handle";
722 };
723 
724 template <>
725 struct TypeName<double> {
726  static constexpr const char* value = "double";
727 };
728 
730  public:
732 
733  explicit AttrDocEntry(ObjectPtr<AttrFieldInfoNode> info) : info_(info) {}
734  TSelf& describe(const char* str) {
735  info_->description = str;
736  return *this;
737  }
738  template <typename T>
739  TSelf& set_default(const T& value) {
740  std::ostringstream os;
741  os << info_->type_info << ", default=" << value;
742  info_->type_info = os.str();
743  return *this;
744  }
745  template <typename T>
746  TSelf& set_lower_bound(DMLC_ATTRIBUTE_UNUSED T begin) {
747  return *this;
748  }
749  template <typename T>
750  TSelf& set_upper_bound(DMLC_ATTRIBUTE_UNUSED T end) {
751  return *this;
752  }
753 
754  private:
756 };
757 
759  public:
760  template <typename T>
761  AttrDocEntry operator()(const char* key, T* v) {
762  ObjectPtr<AttrFieldInfoNode> info = make_object<AttrFieldInfoNode>();
763  info->name = key;
764  info->type_info = TypeName<T>::value;
765  fields_.push_back(AttrFieldInfo(info));
766  return AttrDocEntry(info);
767  }
768 
770 };
771 
773  public:
774  std::string key_;
775  bool exist_{false};
776 
777  template <typename T>
778  AttrNopEntry operator()(const char* key, T* v) {
779  if (exist_) return AttrNopEntry();
780  if (key == key_) exist_ = true;
781  return AttrNopEntry();
782  }
783 };
784 
785 template <typename T>
788  // constructor
789  AttrTriggerNonDefaultEntry(AttrVisitor* visitor, const char* key, T* data)
790  : visitor_(visitor), key_(key), data_(data) {}
791 
792  ~AttrTriggerNonDefaultEntry() DMLC_THROW_EXCEPTION {
793  if (trigger_) {
794  visitor_->Visit(key_, data_);
795  }
796  }
797  TSelf& describe(DMLC_ATTRIBUTE_UNUSED const char* str) { return *this; }
798  TSelf& set_default(const T& value) {
799  if (tvm::StructuralEqual()(value, *data_)) {
800  trigger_ = false;
801  }
802  return *this;
803  }
804  TSelf& set_lower_bound(DMLC_ATTRIBUTE_UNUSED const T& begin) { return *this; }
805  TSelf& set_upper_bound(DMLC_ATTRIBUTE_UNUSED const T& end) { return *this; }
806 
807  private:
808  AttrVisitor* visitor_;
809  const char* key_;
810  T* data_;
811  bool trigger_{true};
812 };
813 
815  public:
816  explicit AttrNonDefaultVisitor(AttrVisitor* visitor) : visitor_(visitor) {}
817  template <typename T>
818  AttrTriggerNonDefaultEntry<T> operator()(const char* key, T* value) {
819  return AttrTriggerNonDefaultEntry<T>(visitor_, key, value);
820  }
821 
822  private:
823  AttrVisitor* visitor_;
824 };
825 } // namespace detail
826 
833 template <typename DerivedType>
834 class AttrsNode : public BaseAttrsNode {
835  public:
838  self()->_tvm_VisitAttrs(vis);
839  }
840 
843  self()->_tvm_VisitAttrs(vis);
844  }
845 
846  void InitByPackedArgs(const runtime::TVMArgs& args, bool allow_unknown) final {
847  ICHECK_EQ(args.size() % 2, 0);
848  const int kLinearSearchBound = 16;
849  int hit_count = 0;
850  // applies two strategies to lookup
851  if (args.size() < kLinearSearchBound) {
852  // linear search.
853  auto ffind = [&args](const char* key, runtime::TVMArgValue* val) {
854  for (int i = 0; i < args.size(); i += 2) {
855  ICHECK_EQ(args.type_codes[i], kTVMStr);
856  if (!std::strcmp(key, args.values[i].v_str)) {
857  *val = args[i + 1];
858  return true;
859  }
860  }
861  return false;
862  };
863  auto vis = ::tvm::detail::CreateInitVisitor(DerivedType::_type_key, ffind);
864  self()->_tvm_VisitAttrs(vis);
865  hit_count = vis.hit_count_;
866  } else {
867  // construct a map then do lookup.
868  std::unordered_map<std::string, runtime::TVMArgValue> kwargs;
869  for (int i = 0; i < args.size(); i += 2) {
870  ICHECK_EQ(args.type_codes[i], kTVMStr);
871  kwargs[args[i].operator std::string()] = args[i + 1];
872  }
873  auto ffind = [&kwargs](const char* key, runtime::TVMArgValue* val) {
874  auto it = kwargs.find(key);
875  if (it != kwargs.end()) {
876  *val = it->second;
877  return true;
878  }
879  return false;
880  };
881  auto vis = ::tvm::detail::CreateInitVisitor(DerivedType::_type_key, ffind);
882  self()->_tvm_VisitAttrs(vis);
883  hit_count = vis.hit_count_;
884  }
885  // error handling, slow path
886  if (hit_count * 2 != args.size() && !allow_unknown) {
887  for (int i = 0; i < args.size(); i += 2) {
889  visitor.key_ = args[i].operator std::string();
890  self()->_tvm_VisitAttrs(visitor);
891  if (!visitor.exist_) {
892  std::ostringstream os;
893  os << DerivedType::_type_key << ": does not have field \'" << visitor.key_
894  << "\', Possible fields:\n";
895  os << "----------------\n";
896  this->PrintDocString(os);
897  throw AttrError(os.str());
898  }
899  }
900  }
901  }
902 
903  bool SEqualReduce(const DerivedType* other, SEqualReducer equal) const {
904  DerivedType* pself = self();
905  ::tvm::detail::AttrsSEqualVisitor visitor(pself, other, equal);
906  self()->_tvm_VisitAttrs(visitor);
907  return visitor.result_;
908  }
909 
910  void SHashReduce(SHashReducer hash_reducer) const {
911  ::tvm::detail::AttrsSHashVisitor visitor(hash_reducer);
912  self()->_tvm_VisitAttrs(visitor);
913  }
914 
917  self()->_tvm_VisitAttrs(visitor);
918  return visitor.fields_;
919  }
920 
921  private:
922  DerivedType* self() const {
923  return const_cast<DerivedType*>(static_cast<const DerivedType*>(this));
924  }
925 };
926 
927 template <typename... Args>
928 inline void BaseAttrsNode::InitBySeq(Args&&... args) {
930  [this](const TVMArgs& args, TVMRetValue* rv) { this->InitByPackedArgs(args); });
931  pf(std::forward<Args>(args)...);
932 }
933 
934 inline void BaseAttrsNode::PrintDocString(std::ostream& os) const { // NOLINT(*)
935  Array<AttrFieldInfo> entry = this->ListFieldInfo();
936  for (AttrFieldInfo info : entry) {
937  os << info->name << " : " << info->type_info << '\n';
938  if (info->description.length() != 0) {
939  os << " " << info->description << '\n';
940  }
941  }
942 }
943 
944 } // namespace tvm
945 #endif // TVM_IR_ATTRS_H_
int64_t v_int64
Definition: c_runtime_api.h:209
Map< String, ObjectRef > dict
internal attrs map
Definition: attrs.h:204
AttrError(std::string msg)
constructor
Definition: attrs.h:100
TSelf & set_lower_bound(const T &begin)
Definition: attrs.h:540
bool value_missing_
Definition: attrs.h:516
Return Value container, Unlike TVMArgValue, which only holds reference and do not delete the underlyi...
Definition: packed_func.h:799
void SetValue< uint64_t >(uint64_t *ptr, const TVMArgValue &val)
Definition: attrs.h:630
void SetValue< bool >(bool *ptr, const TVMArgValue &val)
Definition: attrs.h:634
void SetValue< DataType >(DataType *ptr, const TVMArgValue &val)
Definition: attrs.h:592
A custom smart pointer for Object.
Definition: object.h:358
AttrNormalVisitor(AttrVisitor *visitor)
Definition: attrs.h:452
TSelf & describe(const char *str)
Definition: attrs.h:734
void VisitAttrs(AttrVisitor *v)
Definition: attrs.h:115
void PrintDocString(std::ostream &os) const
Print readible docstring to ostream, add newline.
Definition: attrs.h:934
Definition: attrs.h:431
A Reducer class to reduce the structural equality result of two objects.
Definition: structural_equal.h:124
void SetIntValue(T *ptr, const TVMArgValue &val)
Definition: attrs.h:581
void SHashReduce(SHashReducer hash_reduce) const
Definition: attrs.h:210
Managed reference to BaseAttrsNode.
Definition: attrs.h:190
Base expr nodes in TVM.
Definition: attrs.h:729
AttrFieldInfo.
Definition: attrs.h:128
runtime implementation for LibTorch/TorchScript.
Definition: analyzer.h:36
struct TVMArgs TVMArgs
A Reducer class to reduce the structural hash value.
Definition: structural_hash.h:110
PrimExpr equal(PrimExpr a, PrimExpr b, Span span=Span())
equal
Definition: data_type.h:55
TFunc WithAttr(TFunc input, const std::string &attr_key, ObjectRef attr_value)
Copy the function or module, but overrides the attribute value key with the value.
Definition: attrs.h:347
Structural equality comparison.
AttrInitEntry(AttrInitEntry &&other)
Definition: attrs.h:520
Constant floating point literals in the program.
Definition: expr.h:538
void SetValue< double >(double *ptr, const TVMArgValue &val)
Definition: attrs.h:606
bool exist_
Definition: attrs.h:775
Definition: attrs.h:758
AttrTriggerNonDefaultEntry< T > operator()(const char *key, T *value)
Definition: attrs.h:818
Definition: loop_state.h:456
void SetValue< int >(int *ptr, const TVMArgValue &val)
Definition: attrs.h:622
TSelf & set_lower_bound(DMLC_ATTRIBUTE_UNUSED T begin)
Definition: attrs.h:746
AttrTriggerNonDefaultEntry(AttrVisitor *visitor, const char *key, T *data)
Definition: attrs.h:789
bool SEqualReduce(const DerivedType *other, SEqualReducer equal) const
Definition: attrs.h:903
TSelf & set_lower_bound(DMLC_ATTRIBUTE_UNUSED const T &begin)
Definition: attrs.h:440
const char * key_
Definition: attrs.h:509
Array< AttrFieldInfo > ListFieldInfo() const final
Get the field information.
Definition: attrs.h:915
Information about attribute fields in string representations.
Definition: attrs.h:106
AttrNopEntry operator()(const char *key, T *v)
Definition: attrs.h:778
Managed reference to DictAttrsNode.
Definition: attrs.h:227
base class of all object containers.
Definition: object.h:167
AttrsSEqualVisitor(const Object *lhs, const Object *rhs, const SEqualReducer &equal)
Definition: attrs.h:467
Specialized attribute type that is backed by a map. The DictAttrsNode implements the Attrs behavior...
Definition: attrs.h:201
AttrDocEntry operator()(const char *key, T *v)
Definition: attrs.h:761
Constant integer literals in the program.
Definition: expr.h:491
Content-aware structural equality comparator for objects.
Definition: structural_equal.h:103
Optional< TObjectRef > GetAttr(const std::string &attr_key, TObjectRef default_value) const
Definition: attrs.h:276
Helper struct to get the type name known to tvm.
Definition: attrs.h:685
AttrNopEntry operator()(const char *key, T *lhs_value)
Definition: attrs.h:470
TSelf & set_default(const T &value)
Definition: attrs.h:564
Definition: attrs.h:772
Visitor class to get the attributes of an AST/IR node. The content is going to be called for each fie...
Definition: reflection.h:52
TSelf & describe(DMLC_ATTRIBUTE_UNUSED const char *str)
Definition: attrs.h:434
String name
name of the field
Definition: attrs.h:109
Definition: attrs.h:640
void InitByPackedArgs(const runtime::TVMArgs &args, bool allow_unknown) final
Initialize the attributes by arguments.
Definition: attrs.h:846
bool defined() const
Definition: object.h:544
Runtime primitive data type.
Definition: data_type.h:41
AttrInitVisitor< FFind > CreateInitVisitor(const char *type_key, FFind ffind)
Definition: attrs.h:676
Arguments into TVM functions.
Definition: packed_func.h:391
Definition: attrs.h:503
Optional< TObjectRef > GetAttr(const std::string &attr_key, Optional< TObjectRef > default_value=Optional< TObjectRef >(nullptr)) const
Get a function attribute.
Definition: attrs.h:259
String description
detailed description of the type
Definition: attrs.h:113
Error thrown during attribute checking.
Definition: attrs.h:95
Array, container representing a contiguous sequence of ObjectRefs.
Definition: array.h:289
TSelf & set_upper_bound(DMLC_ATTRIBUTE_UNUSED T end)
Definition: attrs.h:750
virtual ~BaseAttrsNode()
virtual destructor
Definition: attrs.h:144
TFunc WithoutAttr(TFunc input, const std::string &attr_key)
Copy the function or module, but removes the specified attribute.
Definition: attrs.h:412
Managed reference class to IntImmNode.
Definition: expr.h:520
TSelf & set_default(DMLC_ATTRIBUTE_UNUSED const T &value)
Definition: attrs.h:436
Reference to string objects.
Definition: string.h:98
AttrInitVisitor(const char *type_key, FFind ffind)
Definition: attrs.h:646
void InitBySeq(Args &&... args)
Initialize the attributes by sequence of arguments.
Definition: attrs.h:928
TSelf & set_upper_bound(DMLC_ATTRIBUTE_UNUSED const T &end)
Definition: attrs.h:805
AttrDocEntry(ObjectPtr< AttrFieldInfoNode > info)
Definition: attrs.h:733
#define TVM_DEFINE_OBJECT_REF_METHODS(TypeName, ParentType, ObjectName)
Definition: object.h:713
const char * type_key_
Definition: attrs.h:507
Definition: attrs.h:487
~AttrTriggerNonDefaultEntry() DMLC_THROW_EXCEPTION
Definition: attrs.h:792
std::string key_
Definition: attrs.h:774
static bool CanConvertFrom(const TVMArgValue &val)
Check if a TVMArgValue can be converted to String, i.e. it can be std::string or String.
Definition: packed_func.h:1981
Base class of all object reference.
Definition: object.h:511
DataType NullValue< DataType >()
Definition: attrs.h:90
#define TVM_DEFINE_OBJECT_REF_COW_METHOD(ObjectName)
Define CopyOnWrite function in an ObjectRef.
Definition: object.h:785
void SHashReduce(SHashReducer hash_reducer) const
Definition: attrs.h:910
std::string GetTypeKey() const
Definition: object.h:180
String type_info
type docstring information in str.
Definition: attrs.h:111
Definition: attrs.h:450
#define TVM_DECLARE_FINAL_OBJECT_INFO(TypeName, ParentType)
helper macro to declare type information in a final class.
Definition: object.h:671
TSelf & describe(DMLC_ATTRIBUTE_UNUSED const char *str)
Definition: attrs.h:570
virtual void VisitAttrs(AttrVisitor *v)
Definition: attrs.h:146
bool SEqualReduce(const DictAttrsNode *other, SEqualReducer equal) const
Definition: attrs.h:206
The base class of the all the Use "curiously recurring template pattern".
Definition: attrs.h:834
void VisitNonDefaultAttrs(AttrVisitor *v)
Visit attributes that do not equal the default value.
Definition: attrs.h:841
TSelf & set_default(const T &value)
Definition: attrs.h:798
Map container of NodeRef->NodeRef in DSL graph. Map implements copy on write semantics, which means map is mutable but copy will happen when array is referenced in more than two places.
Definition: map.h:1271
int type_code() const
Definition: packed_func.h:610
A single argument value to PackedFunc. Containing both type_code and TVMValue.
Definition: packed_func.h:646
Packed function is a type-erased function. The arguments are passed by packed format.
Definition: packed_func.h:138
Optional container that to represent to a Nullable variant of T.
Definition: optional.h:51
const TVMValue & value() const
Definition: packed_func.h:691
Array< AttrFieldInfo > fields_
Definition: attrs.h:769
void SetValue(T *ptr, const TVMArgValue &val)
Definition: attrs.h:576
AttrNopEntry operator()(const char *key, T *value)
Definition: attrs.h:454
T * value_
Definition: attrs.h:511
TSelf & set_upper_bound(const T &end)
Definition: attrs.h:552
Base class of all attribute class.
Definition: attrs.h:139
TObjectRef NullValue()
Create a NodeRef type that represents null.
Definition: attrs.h:84
TSelf & describe(DMLC_ATTRIBUTE_UNUSED const char *str)
Definition: attrs.h:797
Definition: attrs.h:463
TFunc WithAttrs(TFunc input, Map< String, ObjectRef > attrs)
Copy the function or module, but overrides the attributes with the entries from attrs.
Definition: attrs.h:371
void SetValue< int64_t >(int64_t *ptr, const TVMArgValue &val)
Definition: attrs.h:626
AttrNonDefaultVisitor(AttrVisitor *visitor)
Definition: attrs.h:816
~AttrInitEntry() DMLC_THROW_EXCEPTION
Definition: attrs.h:530
TSelf & set_default(const T &value)
Definition: attrs.h:739
const ObjectType * as() const
Try to downcast the internal Object to a raw pointer of a corresponding type.
Definition: object.h:865
void VisitAttrs(AttrVisitor *v)
Definition: attrs.h:836
bool result_
Definition: attrs.h:465
TSelf & set_upper_bound(DMLC_ATTRIBUTE_UNUSED const T &end)
Definition: attrs.h:444
TSelf & set_lower_bound(DMLC_ATTRIBUTE_UNUSED const T &begin)
Definition: attrs.h:804
#define TVM_DECLARE_BASE_OBJECT_INFO(TypeName, ParentType)
helper macro to declare a base object type that can be inherited.
Definition: object.h:648
Definition: attrs.h:814
runtime::DataType DataType
Definition: data_type.h:398
Definition: c_runtime_api.h:185
AttrInitEntry< T > operator()(const char *key, T *value)
Definition: attrs.h:649
TAttrs AttrsWithDefaultValues()
Create an Attr object with all default values.
Definition: attrs.h:312
AttrNopEntry operator()(const char *key, T *value)
Definition: attrs.h:492
Type-erased function used across TVM API.
AttrsSHashVisitor(const SHashReducer &hash_reducer)
Definition: attrs.h:489
bool HasNonzeroAttr(const std::string &attr_key) const
Check whether the function has an non-zero integer attr.
Definition: attrs.h:298