Skip to content

embed_bqm silently assumes that chain_strength is a positive number #527

Description

@pau557

target_bqm.add_quadratic_from((p, q, -strength) for p, q in self.chain_edges(v))
offset += strength * len(self._chain_edges[v])
else: # if smear_vartype is dimod.BINARY
target_bqm.add_variables_from((p, 2 * strength) for p in itertools.chain(*self.chain_edges(v)))
target_bqm.add_quadratic_from((p, q, -4 * strength) for p, q in self.chain_edges(v))

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

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions