# ___________________________________________________________________________
#
# Pyomo: Python Optimization Modeling Objects
# Copyright (c) 2008-2024
# National Technology and Engineering Solutions of Sandia, LLC
# Under the terms of Contract DE-NA0003525 with National Technology and
# Engineering Solutions of Sandia, LLC, the U.S. Government retains certain
# rights in this software.
# This software is distributed under the 3-clause BSD License.
# ___________________________________________________________________________
import re
# Literals are used in parsing string names (and indicate tuples,
# indexing, and token separators)
literals = '()[],.'
# Special characters are additional characters that if they appear in
# the string force us to quote the string. This includes the obvious
# things like single and double quote characters, but also backslash
# (indicates that the string contains escaped - possibly unicode -
# characters), and the colon (used as a token separator in the old
# ComponentUID "v1" format).
special_chars = literals + '\'":\\'
re_number = re.compile(
r'(?:[-+]?(?:[0-9]+\.?[0-9]*|\.[0-9]+)(?:[eE][-+]?[0-9]+)?|-?inf|nan)'
)
re_special_char = re.compile(r'[' + re.escape(special_chars) + ']')
[docs]
def name_repr(x, unknown_handler=str):
if not isinstance(x, str):
return _repr_map.get(x.__class__, unknown_handler)(x)
else:
x = repr(x)
if x[1] == '|':
return x
unquoted = x[1:-1]
if re_special_char.search(unquoted):
return x
if re_number.fullmatch(unquoted):
return x
return unquoted
[docs]
def tuple_repr(x, unknown_handler=str):
return (
'('
+ ','.join(name_repr(_, unknown_handler) for _ in x)
+ (',)' if len(x) == 1 else ')')
)
[docs]
def index_repr(idx, unknown_handler=str):
"""
Return a string representation of an index.
"""
if idx.__class__ is tuple and len(idx) > 1:
idx_str = ",".join(name_repr(i, unknown_handler) for i in idx)
else:
idx_str = name_repr(idx, unknown_handler)
return "[" + idx_str + "]"
_repr_map = {
slice: lambda x: '*',
Ellipsis.__class__: lambda x: '**',
int: repr,
float: repr,
str: repr,
# Note: the function is unbound at this point; extract with __func__
tuple: tuple_repr,
}