dwavesystems / dwave-system

An API for easily incorporating the D-Wave system as a sampler, either directly or through Leap's cloud-based hybrid samplers
https://docs.ocean.dwavesys.com/
Apache License 2.0
90 stars 64 forks source link

embed_bqm silently assumes that chain_strength is a positive number #527

Open pau557 opened 3 months ago

pau557 commented 3 months ago

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

  1. Applies the sign passed (your sampler could be a maximizer)
  2. Assumes minimization: It accepts any number and enforces the sign by taking abs of the input.

The current scheme where the sign is flipped is unexpected

arcondello commented 3 months ago

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.

pau557 commented 3 months ago

In that case, the docstring should explain that the embedded chain coupler will be -1 * chain_strength

arcondello commented 3 months ago

Agreed. Want to make the PR?