embed_bqm silently assumes that chain_strength is a positive number
https://github.com/dwavesystems/dwave-system/blob/b233941673cda08c194d769b067ab06ce43ea077/dwave/embedding/transforms.py#L274-L278
embed_bqm assumes a positive sign for chain_strength:
import networkx as nx
from dwave.embedding import embed_bqm
import dimod
g = nx.Graph()
g.add_edge(100, 101)
bqm = dimod.BQM.from_ising({1: 0}, {})
emb = {1: [100, 101]}
for chain_strength in [-2, 2]:
print(
embed_bqm(bqm, embedding=emb, target_adjacency=g, chain_strength=chain_strength).quadratic
)
Output:
{(101, 100): 2.0}
{(101, 100): -2.0}
The parameter is described as "coupling strength". I would expect that it either
- Applies the sign passed (your sampler could be a maximizer)
- Assumes minimization: It accepts any number and enforces the sign by taking
absof the input.
The current scheme where the sign is flipped is unexpected
I think silently correcting it would be the more unexpected behavior. So IMO the current behavior, while slightly strange, is consistent and easy to explain. So if we were to make a change, it would be to raise an error.
In that case, the docstring should explain that the embedded chain coupler will be -1 * chain_strength
Agreed. Want to make the PR?