Skip to content

embed_bqm silently assumes that chain_strength is a positive number #527

@pau557

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

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