High Chain Break Fractions

I'm submitting some (relatively) complex problems with several hundred quadratic terms, governing a few dozen variables (44, in one particular example), and I'm seeing a couple of interesting things. One is that if I run 100 samples on D-Wave, I'm getting 100 different results. The other is that I seem to get a very high chain-break fraction--above 90% for almost all samples. Is this normal? Are there any tips available on managing high chain-break fractions?

0

Comments

5 comments
  • Hello,

    Have you tried adjusting the chain_strength?

    What happens in a lot of cases is that the biases on the qubits and couplers from the problem are large enough that they rival the chains for qubit value.

    Since the qubits in the chain are just normal qubits, they can be coerced into taking on conflicting values, resulting in a "break" in the chain.

    If you increase the chain_strength, the qubits in the chain will want take on the same value as one another more ardently.

    The usual rule of thumb is to use a chain strength that is around the order of magnitude of the largest coupler/qubit bias in the problem, and increase if necessary.

    Since each problem is slightly different, the optimal chain_strength value will vary from problem to problem.

    When the problem is unembedded, the chains are resolved to a single value, and the breaks are fixed by selecting either 1 or 0 and making the chain consistent throughout, 

    Because chains can break at different positions, and the resolution will result in a chain that looks the same regardless of the break location, when the energies are output, there might be multiple entries with the same qubit values, and the same energy values.

    This can be a little confusing at first, but as stated, it is due to the different chain breaks being resolved to look alike.

    Here is a great community post about this:
    https://support.dwavesys.com/hc/en-us/community/posts/360025285033-Different-output-frequency-despite-same-energy-

    Please let us know if adjusting the chain_strength helps to reduce the chain break fraction, and also if you have any further questions, don't hesitate to ask!

    1
    Comment actions Permalink
  • Thanks, that helps a lot with the chain-break fraction. I still find that taking 1,000 different samples yields 1,000 different (unembedded) results, with a wide range of energies. BUT I notice that my QUBO weights range from magnitudes on the order of 10^0 to 10^7. I can see how that might cause some instability, and it suggests that some debugging might be in order on my end.

    0
    Comment actions Permalink
  • To mitigate the breadth of the results I'm getting, I'm interested in increasing the annealing_time parameter. Seems straightforward in principle, except that I've read that it has to fit within the annealing_time_range, and, for the life of me, I can't seem to find out what the default values are for the annealing_time_range, or how to modify those values. Any advice?

    0
    Comment actions Permalink
  • Hey Greyson

    The annealing_time_range is a property of the sampler and is not modifiable to my knowledge.
    For the current systems the annealing_time_range is [1,2000] micro seconds. That means you must set annealing_time to a value higher or equal to 1 and lower or equal to 2000. This is (i think) more of a technical limitation and there is no need to modify it.

    Your Qubo weights will be auto scaled to values around [-2,+2] (see properties extended_j_range, j_range, h_range). If you have values in such a big range as you wrote, the differences might be very small and that might be a problem for your sampler as the precision is finite (so maybe values like 1 and 2 are indistinguishable in comparison to 10^7). In another guide it was also suggested to keep as few distinct values as possible.

    I would be interested in your findings with different annealing_times. As it turned out in my case, changing your QUBO will increase the quality of your solutions far more than fine-tuning the annealing parameters (such as annealing_time).

    To change the QUBO itself I

    • tried to reduce the number of qubits
    • looked for the sweet spot of constraint parameters vs. chain_strength 
    • If you have constraints and an objective also look for the sweet spot of the weights of those two.

    Especially because you have a high chain break fraction you should start with finding a good chain strength.

    I hope that helps

    1
    Comment actions Permalink
  • This information can be a bit tricky to locate. 
    Here is a link to solver properties:
    https://docs.dwavesys.com/docs/latest/c_solver_properties.html

    You can then create a sampler and query its parameters like this:

    from dwave.system import DWaveSampler
    sampler = DWaveSampler()
    sampler.properties['annealing_time_range']

    The time range cannot be changed, but the annealing_time property can be.

    Annealing time can just be added as a parameter to the sample function like this:

    response = sampler.sample_qubo(Q, num_reads=num_reads, annealing_time=annealing_time)
    0
    Comment actions Permalink

Please sign in to leave a comment.

Didn't find what you were looking for?

New post