Почему я получаю недопустимую ошибку символа в Pyomo с CPLEX? - PullRequest
0 голосов
/ 08 января 2019

Я пытаюсь использовать CPLEX с простым примером Pyomo:

from pyomo.environ import *
model = ConcreteModel()
model.x = Var( initialize=-1.2, bounds=(-2, 2) )
model.y = Var( initialize= 1.0, bounds=(-2, 2) )
model.obj = Objective(
        expr= (1-model.x)**2 + 100*(model.y-model.x**2),
        sense= minimize )

opt = SolverFactory('cplex')
results = opt.solve(model)
print(results)

Когда я запускаю этот код, я получаю следующую ошибку:

ValueError: в пути / имени файла журнала CPLEX обнаружен недопустимый символ (:). По причинам переносимости разрешены только [a-zA-Z0-9.-_].

Единственное двоеточие (:) в имени пути после буквы диска:

имя файла: C: \ Users \ USERNA ~ 1 \ AppData \ Local \ Temp \ tmpl8_ty0y5.cplex.log

Ошибка возникает в CPLEX.py из следующего:

def _validate_file_name(cplex, filename, description):
    """Validate filenames against the set of allowable characters in CPLEX.

    Returns the filename, possibly enclosed in double-quotes, or raises
    a ValueError is unallowable characters are found.

    """
    if filename is None:
        return filename
    matches = _validate_file_name.illegal_characters.search(filename)
    if matches:
        raise ValueError(
            "Unallowed character (%s) found in CPLEX %s file path/name.\n\t"
            "For portability reasons, only [%s] are allowed. Filename: %s"
            % (matches.group(), description,
               _validate_file_name.allowed_characters.replace("\\",''),filename))
    # CPLEX only supports quoting spaces starting in v12.8.
    if ' ' in filename:
        if cplex.version()[:2] >= (12,8):
            filename = '"'+filename+'"'
        else:
            raise ValueError(
                "Space detected in CPLEX %s file path/name\n\t%s\nand "
                "CPLEX older than version 12.8.  Please either upgrade "
                "CPLEX or remove the space from the %s path."
                % (description, filename, description))
    return filename
_validate_file_name.allowed_characters = r"a-zA-Z0-9 \.\-_\%s" % (os.path.sep,)
_validate_file_name.illegal_characters = re.compile(
    '[^%s]' % (_validate_file_name.allowed_characters,))

Если я закомментирую проверку файла журнала, я получу ту же ошибку для решения и файлов LP.

Я не видел этой ошибки нигде. Кто-нибудь может мне помочь?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 31 января 2019

Эта ошибка была введена в интерфейс CPLEX в Pyomo 5.6 и была исправлена ​​в выпуске Pyomo 5.6.1.

0 голосов
/ 10 января 2019

В последнее время у меня такая же проблема. Основываясь на комментарии Ци Чена, когда часть «если совпадает ...» была закомментирована, это работает хорошо. Спасибо за @Qi chen.

В CPLEX.py комментирует эти строки:

# if matches:
    #raise ValueError(
    #    "Unallowed character (%s) found in CPLEX %s file path/name.\n\t"
    #    "For portability reasons, only [%s] are allowed."
    #    % (matches.group(), description,
    #       _validate_file_name.allowed_characters.replace("\\",'')))
# CPLEX only supports quoting spaces starting in v12.8.

Я предполагаю, что это может быть вызвано файлом журнала (xxx.CPLEX.log), в котором ':' существует следующим образом: 'C: \ Program Files \ IBM \ ILOG \ CPLEX_Studio128 \ cplex \ bin \ x64_win64 \ CPLEX.exe' или же 'C: \ Program Files \ IBM \ ILOG \ CPLEX_Studio128 \ cplex \ bin \ x64_win64 \ CPLEX.exe'

...