void Graph::_produce_performance_report()

in src/beanmachine/graph/perf_report.cpp [186:262]


void Graph::_produce_performance_report(
    uint num_samples,
    InferenceType algorithm,
    uint seed) {
  _performance_report = "";
  JSON js;
  if (!_collect_performance_data)
    return;

  uint edge_count = 0;
  uint factor_count = 0;
  uint const_count = 0;
  uint dist_count = 0;
  uint op_count = 0;
  uint add_count = 0;

  for (uint node_id = 0; node_id < static_cast<uint>(nodes.size()); node_id++) {
    Node* node = nodes[node_id].get();
    edge_count += static_cast<uint>(node->in_nodes.size());
    switch (node->node_type) {
      case NodeType::FACTOR:
        factor_count += 1;
        break;
      case NodeType::CONSTANT:
        const_count += 1;
        break;
      case NodeType::DISTRIBUTION:
        dist_count += 1;
        break;
      case NodeType::OPERATOR: {
        op_count += 1;
        auto op = static_cast<oper::Operator*>(node);
        if (op->op_type == OperatorType::ADD) {
          add_count += 1;
        }
        break;
      }
      default:
        break;
    }
  }

  js.start_object();
  js.text("title", "Bean Machine Graph performance report");
  js.date("generated_at", system_clock::now());
  js.number("num_samples", static_cast<long>(num_samples));
  js.number("algorithm", static_cast<uint>(algorithm));
  js.number("seed", seed);
  js.number("node_count", static_cast<long>(nodes.size()));
  js.number("edge_count", static_cast<long>(edge_count));
  js.number("factor_count", static_cast<long>(factor_count));
  js.number("dist_count", static_cast<long>(dist_count));
  js.number("const_count", static_cast<long>(const_count));
  js.number("op_count", static_cast<long>(op_count));
  js.number("add_count", static_cast<long>(add_count));

  js.member("profiler_data");
  js.start_array();
  for (auto e : profiler_data.events) {
    js.comma();
    js.start_object();
    js.boolean("begin", e.begin);
    js.event("kind", e.kind);
    js.ticks("timestamp", e.timestamp);
    js.end_object();
  }
  js.end_array();
  js.member("det_supp_count");
  js.start_array();
  for (auto pair : profiler_data.det_supp_count) {
    js.comma();
    js.number(pair.second);
  }
  js.end_array();
  js.end_object();
  _performance_report = js.str();
}