Note for anybody in the future;
e.backward(inputs=(c,), retain_graph=True)

works for cases where c is a Variable/Parameter and populates c.grad with the gradient output

This (should) let you do things like;
loss.backward(inputs=tuple(model.parameters()), retain_graph=True)

… which lets you backprop a model or two using retrain_graph without autograd doing any unnecessary compute. It looks like autograd will automatically figure out which latents to backprop and skip the rest.