14 #include <mpark/variant.hpp>
41 using OutputVal = std::tuple<Output, VariablePtr, Eigen::MatrixXd>;
47 mpark::variant<Output, Update>
val;
48 std::vector<std::unique_ptr<ProbeNode>>
children;
59 static constexpr
auto absInRange = [](
double rmin,
double rmax) {
60 return [rmin, rmax](
const Eigen::MatrixXd & M) {
return hasElemAbsInRange(M, rmin, rmax); };
67 static constexpr
auto hasNan = [](
const Eigen::MatrixXd & M) {
return M.hasNaN(); };
80 template<
typename T,
typename MethodT,
typename EnumOutput,
typename ConvertT = std::nullopt_t>
81 void registerAccessor(EnumOutput o, MethodT method, ConvertT convert = std::nullopt);
85 void registerTVMFunction();
89 void registerTVMConstraint();
93 void registerTVMTaskDynamics();
116 const std::function<
bool(
const Eigen::MatrixXd &)> & select = [](
const Eigen::MatrixXd &) {
return true; })
const;
123 const std::function<
bool(
const Eigen::MatrixXd &)> & select = [](
const Eigen::MatrixXd &) {
return true; })
const;
126 void print(std::ostream & os,
const std::unique_ptr<ProbeNode> & root)
const;
128 void print(std::ostream & os,
const std::vector<std::unique_ptr<ProbeNode>> & roots)
const;
134 Processed() =
default;
137 std::map<Output, bool> outputs;
138 std::map<Update, bool> updates;
139 std::vector<Output> allOutputs;
143 bool addOutputVal(std::vector<OutputVal> & ov,
const Output & o)
const;
145 std::vector<OutputVal> outputVal(
const Output & o)
const;
147 std::vector<OutputVal> listOutputVal(
const std::vector<graph::internal::Log::Output> & o,
bool verbose)
const;
149 std::unique_ptr<ProbeNode> followUp(
const Output & o,
150 const std::function<
bool(
const Eigen::MatrixXd &)> & select,
151 Processed & processed)
const;
153 std::unique_ptr<ProbeNode> followUp(
const Update & u,
154 const std::function<
bool(
const Eigen::MatrixXd &)> & select,
155 Processed & processed)
const;
158 void print(std::ostream & os,
const std::unique_ptr<ProbeNode> & node,
int depth)
const;
160 using OutputKey = std::pair<std::size_t, graph::internal::Log::EnumValue>;
161 using VarMatrixPair = std::pair<VariablePtr, Eigen::MatrixXd>;
164 std::unordered_map<OutputKey, std::function<std::vector<VarMatrixPair>(uintptr_t)>,
internal::PairHasher>
165 varDepOutputAccessor_;
168 template<
typename T,
typename MethodT,
typename EnumOutput,
typename ConvertT>
172 if constexpr(CheckAccessor::isVoidAccessor)
174 using ReturnT =
typename CheckAccessor::ReturnT;
175 auto convert = internal::MakeConvert<ReturnT>(std::move(convertIn));
177 outputAccessor_[k] = [method, convert](uintptr_t t) {
return convert((
reinterpret_cast<T *
>(t)->*method)()); };
179 else if constexpr(CheckAccessor::isVariableAccessor)
181 using ReturnT =
typename CheckAccessor::ReturnT;
182 auto convert = internal::MakeConvert<ReturnT>(std::move(convertIn));
184 varDepOutputAccessor_[k] = [method, convert](uintptr_t t) {
185 std::vector<VarMatrixPair> ret;
186 T * ptr =
reinterpret_cast<T *
>(t);
187 for(
const auto & v : ptr->variables())
188 ret.emplace_back(v, convert((ptr->*method)(*v)));
194 static_assert(!std::is_same_v<T, T>,
"Provided method does not have a valid signature");
201 using GetVectorT =
const Eigen::VectorXd & (T::*)()
const;
204 registerAccessor<T>(T::Output::Value,
static_cast<GetVectorT
>(&T::value));
205 registerAccessor<T>(T::Output::Velocity,
static_cast<GetVectorT
>(&T::velocity));
206 registerAccessor<T>(T::Output::Jacobian,
static_cast<GetJacobianT
>(&T::jacobian));
207 registerAccessor<T>(T::Output::NormalAcceleration,
static_cast<GetVectorT
>(&T::normalAcceleration));
208 registerAccessor<T>(T::Output::JDot,
static_cast<GetJDotT
>(&T::JDot));
214 using GetVectorT =
const Eigen::VectorXd & (T::*)()
const;
216 registerAccessor<T>(T::Output::Value,
static_cast<GetVectorT
>(&T::value));
217 registerAccessor<T>(T::Output::Jacobian,
static_cast<GetJacobianT
>(&T::jacobian));
218 registerAccessor<T>(T::Output::L,
static_cast<GetVectorT
>(&T::l));
219 registerAccessor<T>(T::Output::U,
static_cast<GetVectorT
>(&T::u));
220 registerAccessor<T>(T::Output::E,
static_cast<GetVectorT
>(&T::e));
226 using GetVectorT =
const Eigen::VectorXd & (T::Impl::*)()
const;
227 registerAccessor<typename T::Impl>(T::Impl::Output::Value,
static_cast<GetVectorT
>(&T::Impl::value));
232 const std::vector<tvm::diagnostic::GraphProbe::OutputVal> & vals);
TVM_DLLAPI std::ostream & operator<<(std::ostream &os, const std::vector< tvm::diagnostic::GraphProbe::OutputVal > &vals)
#define TVM_DLLAPI
Definition: api.h:35
Definition: Variable.h:49
Definition: GraphProbe.h:37
std::vector< OutputVal > listOutputVal(const graph::CallGraph *const g, bool verbose=false) const
void print(std::ostream &os, const std::unique_ptr< ProbeNode > &root) const
void registerTVMConstraint()
Definition: GraphProbe.h:212
void registerTVMFunction()
Definition: GraphProbe.h:199
void print(std::ostream &os, const std::vector< std::unique_ptr< ProbeNode >> &roots) const
void registerAccessor(EnumOutput o, MethodT method, ConvertT convert=std::nullopt)
Definition: GraphProbe.h:169
void registerTVMTaskDynamics()
Definition: GraphProbe.h:224
std::vector< OutputVal > listOutputVal(const Output &o, bool verbose=false) const
std::unique_ptr< ProbeNode > followUp(const Output &o, const std::function< bool(const Eigen::MatrixXd &)> &select=[](const Eigen::MatrixXd &) { return true;}) const
std::tuple< Output, VariablePtr, Eigen::MatrixXd > OutputVal
Definition: GraphProbe.h:41
std::vector< std::unique_ptr< ProbeNode > > followUp(const graph::CallGraph *const g, const std::function< bool(const Eigen::MatrixXd &)> &select=[](const Eigen::MatrixXd &) { return true;}) const
GraphProbe(const graph::internal::Log &log=tvm::graph::internal::Logger::logger().log())
Definition: CallGraph.h:23
Definition: GraphProbe.h:26
bool hasElemAbsInRange(const Eigen::MatrixBase< Derived > &A, typename Derived::Scalar emin, typename Derived::Scalar emax)
Definition: matrix.h:53
ObjectWithProperties< Eigen::Ref< const Eigen::MatrixXd > > MatrixConstRefWithProperties
Definition: MatrixWithProperties.h:164
std::unordered_map< KeyWithId, Value, HashId< KeyWithId >, IdEqual< KeyWithId >, Allocator > unordered_map
Definition: map.h:44
Eigen::Ref< const Eigen::MatrixXd > MatrixConstRef
Definition: defs.h:48
Definition: GraphProbe.h:44
mpark::variant< Output, Update > val
Definition: GraphProbe.h:47
std::vector< std::unique_ptr< ProbeNode > > children
Definition: GraphProbe.h:48
ProbeNode(const ProbeNode &)=delete
ProbeNode(const Output &o)
Definition: GraphProbe.h:45
ProbeNode & operator=(const ProbeNode &)=delete
ProbeNode(const Update &u)
Definition: GraphProbe.h:46