Skip to content
This repository was archived by the owner on Sep 24, 2025. It is now read-only.
This repository was archived by the owner on Sep 24, 2025. It is now read-only.

"dwavebinarycsp.stitch" raises AttributeError #105

@ghost

Description

Description
When I use dwavebinarycsp in following code as Steps To Reproduce,
I faced "AttibuteError: 'NoneType' object has no attibute 'classical_gap'".

I suspect that this should be modified as ImpossibleBQM or anything else.

Steps To Reproduce

import dwavebinarycsp

csp = dwavebinarycsp.ConstraintSatisfactionProblem(dwavebinarycsp.SPIN)

csp.add_constraint(lambda a, b, c, d, e, f, g, h, i: a * b * c * d * e * f * g * h * i == 1, ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i'])
csp.add_constraint(lambda a, b, c, d, e, f, g, h, i: a + b + c + d + e + f + g + h * i < 2,  ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i'])

bqm = dwavebinarycsp.stitch(csp, max_graph_size=9)

print(bqm)

This example code raises following error message.

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-12-3030c141576b> in <module>
      4 csp.add_constraint(lambda a, b, c, d, e, f, g, h, i: a + b + c + d + e + f + g + h * i < 2,  ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i'])
      5 
----> 6 bqm = dwavebinarycsp.stitch(csp, max_graph_size=9)
      7 
      8 print(bqm)

~/.pyenv/versions/3.6.10/lib/python3.6/site-packages/dwavebinarycsp/compilers/stitcher.py in stitch(csp, min_classical_gap, max_graph_size)
    185                 continue
    186 
--> 187             if pmodel.classical_gap >= min_classical_gap:
    188                 break
    189 

AttributeError: 'NoneType' object has no attribute 'classical_gap'

Expected Behavior
I think that "ImpossibleBQM: No penalty model can be build for constraint xxx." should be raised as written in dwavebinarycsp/compilers/stitcher.py line 195, though the example above raised AttributeError.

Environment

  • OS: MacOS Catalina 10.15.6
  • Python version: 3.6.0

Additional Context
In my understanding, this issue may be related to following files:

  • "stitch" (in dwavebinarycsp/compilers/stitcher.py)
  • "get_penalty_model" (in penaltymodel_mip/penaltymodel/mip/interface.py)
  • "generate_bqm" (in penaltymodel_mip/penaltymodel/mip/generation.py)

Original Implementation:
pm.get_penalty_model(spec) on "stitch" line 182 raises pm.ImpossiblePenaltyModel if the calculation is fault.
Many such cases are caught by try-except on line 183 and continued, so these are caught by else block on line 193 and line 195 raises ImpossibleBQM Error finally.

Problem:
If the max_graph_size is larger than 8 (max_graph_size=9 on my code example),
the graph instance G in "stitch" line 173 becomes larger than 8.

It seems that this max_graph_size isn't inputted into max_decision parameter on "generate_bqm" appropriately.
And especially if max_graph_size is larger than 8, this unexpected problem occurs.

On "get_penalty_model" line 56-60, no input parameter is assigned for max_decision for "generate_bqm".
This lead to the ValueError on "generate_bqm" line 111 because len(decision)=9 is larger than max_decision=8 (8 is default value on generate_bqm).

Question:
I wonder whether this behavior is bug or not...
I would appreciate it if you would give me some advice.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions