dwavesystems / dimod

A shared API for QUBO/Ising samplers.
https://docs.ocean.dwavesys.com/en/stable/docs_dimod/
Apache License 2.0
121 stars 80 forks source link

Add methods to get more statistics from the CQM object #1000

Open mhramani opened 3 years ago

mhramani commented 3 years ago

It would be nice to have methods to quickly get some statistics about the CQM model. These are my wish list:

cqm.num_variables
cqm.num_binaries
cqm.num_integers
cqm.num_discretes
cqm.num_linear_constraints
cqm.num_quadratic_constraints
cqm.num_le_ineqaultiy_constraints
cqm.num_ge_ineqaultiy_constraints
cqm.num_equality_constraints

I currently get some of these information using this script.

    integer_count = 0
    binary_count = 0
    for vtype in cqm.variables.vartypes:
        if vtype is vartypes.INTEGER:
            integer_count += 1
        elif vtype is vartypes.BINARY:
            binary_count += 1
        else:
            raise ValueError

    print("------ variables information:")
    print("total num vars:", len(cqm.variables))
    print("num_binary:", binary_count)
    print("num_Integers:", integer_count)
    assert (binary_count + integer_count == len(cqm.variables))

    num_quad_cstr = 0
    num_linear_cstr = 0
    for c, v in cqm.constraints.items():
        if len(v.lhs.quadratic) > 0:
            num_quad_cstr += 1
        else:
            num_linear_cstr += 1

    print("----- constraints info")
    print("total num cstr:", len(cqm.constraints))
    if num_linear_cstr > 0:
        print("num_linear_cstr:", num_linear_cstr)

    if num_quad_cstr > 0:
        print("num_quad_cstr:", num_quad_cstr)
    assert (num_quad_cstr + num_linear_cstr == len(cqm.constraints))
arcondello commented 3 years ago

I am a tiny bit hesitant to implement some of these, pending a resolution to https://github.com/dwavesystems/dimod/issues/849.

Some useful snippets in the mean time


num_variables = len(cqm.variables)
num_binaries = sum(cqm.vartype(v) is dimod.BINARY for v in cqm.variables)
num_integers = sum(cqm.vartype(v) is dimod.INTEGER for v in cqm.variables)
num_discretes = len(cqm.discrete)
num_linear_constraints = sum(constraint.lhs.is_linear() for constraint in cqm.constriants.values())
num_quadratic_constraints = sum(not constraint.lhs.is_linear() for constraint in cqm.constriants.values())
num_le_inequality_constraints = sum(constraint.sense is dimod.sym.Sense.Le for constraint in constraints.values())
num_ge_inequality_constraints = sum(constraint.sense is dimod.sym.Sense.Ge for constraint in constraints.values())
num_equality_constraints = sum(constraint.sense is dimod.sym.Sense.Eq for constraint in constraints.values())