Dominik:

To what parts of the graph does this refer?


This refers to every part of the graph that were visited during the backward pass.



 Dominik:

And what does “anything” mean in that context? What else than gradient computation would / could you use a graph for?


Yes only gradient computation in this case.
Be careful if playing with super simple example, you can create simple graphs that don’t have any buffer or intermediary result and so you will be able to backprop through them multiple times. But this is an artefact of the fact that these graphs are super simple.



 Dominik:

Based on the above statement that .backward() frees any resources / buffers / intermediary results of the graph, I would expect the computation of d and e not to work


It does free ressources of the graph. Not the Tensors that the user created during the forward.
You don’t have a strong link between Tensors from the forward pass and nodes in the graph. The only thing is that computing a new tensor creates a new node in the graph. But you can remove the Tensor without impacting the graph and you can remove the graph’s buffers (by doing backward) without impacting the Tensor that created it.
In your example, b and c are not part of the graph.
So even after calling backprop, you can still use them.
The same way, you could del b and the c.backward() call will still work without any problem.