def _attempt_to_improve_var_bounds_one_hs(solver: pywraplp.Solver, coefficient_part: str, is_leq: bool, right_hand_side: str): coefficient_part = coefficient_part.strip() if re.match(_REGEXP_SINGLE_VAR_NAME_ALL, coefficient_part): if is_leq: solver.LookupVariable(coefficient_part).SetUb( float(right_hand_side)) else: solver.LookupVariable(coefficient_part).SetLb( float(right_hand_side))
def _set_coefficients(solver: pywraplp.Solver, objective_or_constraint, coefficient_part: str, line_nr: int, var_names: set): # Strip the coefficient whitespace remainder = coefficient_part.strip() if len(remainder) == 0: raise ValueError("No variables present in equation on line %d." % line_nr) # All variables found var_names_found = set() running_constant_sum = 0.0 had_at_least_one_variable = False while len(remainder) != 0: # Combination sign coefficient = 1.0 combination_sign_match = re.search(r"^[-+]", remainder) if combination_sign_match is not None: if combination_sign_match.group() == "-": coefficient = -1.0 remainder = remainder[1:].strip() # Real sign sign_match = re.search(r"^[-+]", remainder) if sign_match is not None: if sign_match.group() == "-": coefficient = coefficient * -1.0 remainder = remainder[ 1:] # There is no strip() here, as it must be directly in front of the mantissa # Mantissa and exponent mantissa_exp_match = re.search(r"^(\d+(\.\d*)?|\.\d+)([eE][-+]?\d+)?", remainder) whitespace_after = False if mantissa_exp_match is not None: coefficient = coefficient * float(mantissa_exp_match.group()) remainder = remainder[mantissa_exp_match.span()[1]:] stripped_remainder = remainder.strip() if len(remainder) != len(stripped_remainder): whitespace_after = True remainder = stripped_remainder # Variable name var_name_match = re.search(_REGEXP_SINGLE_VAR_NAME_START, remainder) if var_name_match is not None: # It must have had at least one variable had_at_least_one_variable = True # Retrieve clean variable name clean_var = var_name_match.group() var_names.add(clean_var) if clean_var in var_names_found: raise ValueError( "Variable \"%s\" found more than once on line %d." % (clean_var, line_nr)) var_names_found.add(clean_var) solver_var = solver.LookupVariable(clean_var) if solver_var is None: solver_var = solver.NumVar(-solver.infinity(), solver.infinity(), clean_var) # Set coefficient objective_or_constraint.SetCoefficient(solver_var, coefficient) # Strip what we matched remainder = remainder[var_name_match.span()[1]:] stripped_remainder = remainder.strip() whitespace_after = False if len(remainder) != len(stripped_remainder): whitespace_after = True remainder = stripped_remainder elif mantissa_exp_match is None: raise ValueError( "Cannot process remainder coefficients of \"%s\" on line %d." % (remainder, line_nr)) else: running_constant_sum += coefficient # At the end of each element there either: # (a) Must be whitespace (e.g., x1 x2 <= 10) # (b) The next combination sign (e.g., x1+x2 <= 10) # (c) Or it was the last one, as such remainder is empty (e.g., x1 <= 10) if len(remainder) != 0 and not whitespace_after and remainder[ 0:1] != "-" and remainder[0:1] != "+": raise ValueError( "Unexpected next character \"%s\" on line %d (expected whitespace or " "combination sign character)." % (remainder[0:1], line_nr)) # There must have been at least one variable if not had_at_least_one_variable: raise ValueError( "Not a single variable present in the coefficients on line %d." % line_nr) return running_constant_sum