# Help with MixedMultiOptimizer error on basic example

Hi all,

I’m modelling a problem that is non-identifiable, and to infer it I need to keep some parts fixed while adjusting others others. I understand that MixedMultiOptimizer is a suitable option for this scenario, and so I endeavoured to follow the guide here:
https://pyro.ai/examples/custom_objectives.html#Example:-Mixing-Optimizers

I wasn’t able to get it to work on my problem, so I reduced the problem to a super basic coin flip example. Here is the data and the model code:

``````class Model(object):
def __init__(self, data):
self.model(data)
self.guide(data)

def model(self, data):
p_pos = pyro.sample('p_pos', dists.Beta(1, 1))
with pyro.plate('data_plate', len(data)):
pyro.sample('obs', dists.Bernoulli(p_pos), obs=data)

def guide(self, data):
q_a = pyro.param('q_a', torch.tensor(1.0), constraint=constraints.positive)
q_b = pyro.param('q_b', torch.tensor(1.0), constraint=constraints.positive)

p_pos = pyro.sample('p_pos', dists.Beta(q_a, q_b))

data = (torch.rand(N) < 0.55).float()
``````

It’s fairly straightforward, and when I infer the parameters I get something reasonable:

``````model = Model(data)
pyro.clear_param_store()
svi = pyro.infer.SVI(model.model, model.guide, optimizer, loss=pyro.infer.Trace_ELBO())
for _ in range(10):
loss = svi.step(data) / len(data)
``````

Which gives `q_a=12.2312` and `q_b=9.7367` which roughly equals the `0.55` that I specified.

Lovely!

Adjusting this code to the MixedMultiOptimizer looked fairly straightforward:

``````from pyro.optim.multi import MixedMultiOptimizer

pyro.clear_param_store()

model = Model(data)

sgd = pyro.optim.SGD({'lr': 0.01})
optim = MixedMultiOptimizer([
([('q_b')], sgd)
])

elbo = pyro.infer.Trace_ELBO()
with pyro.poutine.trace(param_only=True) as param_capture:
loss = elbo.differentiable_loss(
lambda: model.model(data),
lambda: model.guide(data)
)

params = {'q_a': pyro.param('q_a'), 'q_b': pyro.param('q_b')}
optim.step(loss, params)
``````

Unfortunately, when I run the code above the following error is raised

RuntimeError: One of the differentiated Tensors appears to not have been used in the graph. Set allow_unused=True if this is the desired behavior.

I tried hacking the appropriate line in `pyro/optim/multi.py` and added this argument, but when I do that another exception looms:

ValueError: can’t optimize a non-leaf Tensor

I’ve spent some time trying to figure this out, but have not been able to. I’m hoping somebody here can help out!

``````params = {'q_a': pyro.param('q_a').unconstrained(),