docstr: Calculate dout/d(eta1, eta2), which are:
  eta1 = mu
  eta2 = mu*mu^T + LL^T = mu*mu^T + Sigma
  
  Thus:
  dout/deta1 = dout/dmu + dout/dL dL/deta1
  dout/deta2 = dout/dL dL/deta1
  
  For L = chol(eta2 - eta1*eta1^T).
  dout/dSigma = _cholesky_backward(dout/dL, L)
  dout/deta2 = dout/dSigma
  dSigma/deta1 = -2* (dout/dSigma) mu
docstr_tok: ["Calculate","dout\/d","(","eta1",",","eta2",")",",","which","are",":","eta1","=","mu","eta2","=","mu","*","mu^T","+","LL^T","=","mu","*","mu^T","+","Sigma","Thus",":","dout\/deta1","=","dout\/dmu","+","dout\/dL","dL\/deta1","dout\/deta2","=","dout\/dL","dL\/deta1","For","L","=","chol","(","eta2","-","eta1","*","eta1^T",")",".","dout\/dSigma","=","_cholesky_backward","(","dout\/dL",",","L",")","dout\/deta2","=","dout\/dSigma","dSigma\/deta1","=","-2","*","(","dout\/dSigma",")","mu"]
code: def _backward(dout_dmu, dout_dL, mu, L, C):
      """Calculate dout/d(eta1, eta2), which are:
      eta1 = mu
      eta2 = mu*mu^T + LL^T = mu*mu^T + Sigma
  
      Thus:
      dout/deta1 = dout/dmu + dout/dL dL/deta1
      dout/deta2 = dout/dL dL/deta1
  
      For L = chol(eta2 - eta1*eta1^T).
      dout/dSigma = _cholesky_backward(dout/dL, L)
      dout/deta2 = dout/dSigma
      dSigma/deta1 = -2* (dout/dSigma) mu
      """
      dout_dSigma = _cholesky_backward(dout_dL, L, C)
      dout_deta1 = dout_dmu - 2 * (
          dout_dSigma @ mu.unsqueeze(-1)
      ).squeeze(-1)
      return dout_deta1, dout_dSigma
  
imports: import abc
  import torch
  from linear_operator.operators import CholLinearOperator, TriangularLinearOperator
  from linear_operator.utils.cholesky import psd_safe_cholesky
  from ..distributions import MultivariateNormal
  from ._variational_distribution import _VariationalDistribution
label_desc: Use image node_id 3 for calling the _NaturalToMuVarSqrt obj's underlying member method code with example usage: obj._backward(dout_dmu, dout_dL, mu, L, C) and returns: dout_deta1,  dout_dSigma