code: def create_dep_usage_graph(self, targets):
      
      with self.invalidated(targets,
                            invalidate_dependents=True) as invalidation_check:
        target_to_vts = {}
        for vts in invalidation_check.all_vts:
          target_to_vts[vts.target] = vts
  
        if not self.get_options().use_cached:
          node_creator = self.calculating_node_creator(
            self.context.products.get_data('classes_by_source'),
            self.context.products.get_data('runtime_classpath'),
            self.context.products.get_data('product_deps_by_src'),
            target_to_vts)
        else:
          node_creator = self.cached_node_creator(target_to_vts)
  
        return DependencyUsageGraph(self.create_dep_usage_nodes(targets, node_creator),
                                    self.size_estimators[self.get_options().size_estimator])
docs: Creates a graph of concrete targets, with their sum of products and dependencies.
  
      Synthetic targets contribute products and dependencies to their concrete target.