def check_DOF(pyomo,m):
    equality_number = len([i for i in m.component_data_objects(pyomo.Constraint, active=True)\
                if i.upper is not None and i.lower is not None])
    inequality_number = len([i for i in m.component_data_objects(pyomo.Constraint, active=True)\
                if i.upper is None or i.lower is None])
    variable_number = len([i for i in m.component_data_objects(pyomo.Var, active=True)])
    fixed_variable_number = sum([i.fixed for i in m.component_data_objects(pyomo.Var, active=True)])
    print('Active Equality Constraints:\t',equality_number)
    print('Active Inequality Constraints:\t',inequality_number)
    print('Active Variables:\t\t',variable_number)
    print('Fixed Variables:\t\t',fixed_variable_number)
    print('DOF:\t\t\t\t',variable_number-fixed_variable_number-equality_number)
def check_forced_variable(pyomo,m):
    counter = 0;
    for v in m.component_data_objects(pyomo.Var, active=True):
        resL = 1; resU = 1;
        if v.fixed == True: continue
        if v.lb is not None: resL = abs(pyomo.value(v)-v.lb)
        if v.ub is not None: resU = abs(v.ub-pyomo.value(v))
        if resL < 1e-8 or resU < 1e-8:
            print('-'*50)
            print(v)
            print_bounds(v.lb,pyomo.value(v),v.ub)
            counter += 1
    if counter == 0:
        print('Congratz, no variable is at bounds')
def check_violate_constraint(pyomo,m):
    counter = 0;
    for v in m.component_data_objects(pyomo.Constraint, active=True):
        resL = 0; resU = 0;
        if v.lower is not None: resL = max(0,v.lower-pyomo.value(v.body))
        if v.upper is not None: resU = max(0,pyomo.value(v.body)-v.upper)
        if resL > 1e-6 or resU > 1e-6:
            print('*'*60)
            print('Constraint: ',v)
            print(v.body)
            print('-'*60)
            print_bounds(v.lower,pyomo.value(v.body),v.upper)
            counter += 1
    if counter == 0:
        print('Congratz, all constraint vialation <= 1e-6')