Могу ли я преобразовать строку в переменную pyomo? - PullRequest
0 голосов
/ 29 января 2020

У меня есть файл .txt, который содержит переменную для моей модели. Если я копирую и вставляю содержимое файла в мою программу как

def Wind_phi_definition(model, i):
         return m.Wind_phi[i] ==-19.995904426195736*Sinc(0.04188790204786391*(0. + m.lammda[i]*180/np.pi))*Sinc(0.08975979010256552*(-65. + m.phi[i]*180/np.pi))
m.Wind_phi_const = Constraint(m.N, rule = Wind_phi_definition)

Код выполняется без проблем. Я хочу ускорить это, заставив программу читать прямо из файла .txt.

Я пытался прочитать переменную как

f = open("savedWindXPython.txt", "r")
a=f.readline()
f.close

def Wind_lammda_definition(model, i):
    return m.Wind_phi[i] == a
m.Wind_phi_const = Constraint(m.N, rule = Wind_lammda_definition)

Однако возвращается ошибка AttributeError: у объекта 'str' нет атрибута 'is_relational'

Я понимаю, что это происходит потому, что python читает это как строку, а не как переменную pyomo. Я попытался go обойти эту проблему, используя exec(a) вместо просто a в определении m.Wind_phi. Тем не менее, я все еще получаю сообщение об ошибке, на этот раз он говорит:

Объект 'NoneType' не имеет атрибута 'is_relational'

Есть ли способ сделать то, что я хочу, и определить переменную с помощью чтение файла .txt не является обязательным копированием его содержимого вручную?

1 Ответ

1 голос
/ 29 января 2020

То, что вы пытаетесь достичь, называется unmarshalling (или десериализация)

Если ваша переменная - простое число, десериализация так же проста, как int(my_string_var). Если он похож на тот, который вы связали (где вам нужны вызовы функций в нем), то предстоит еще много работы. Используемая вами библиотека также может предоставлять некоторые функции сериализации / десериализации. К сожалению, для вас кажется, что pyomo не предоставляет эту функцию в данный момент .

Итак, теперь, если у вас есть доступ к тому, кто или что пишет ваши файлы .txt в Во-первых, рассмотрите возможность сериализации в json (или в любой формат хранения данных, который вам наиболее удобен; если вам не нравится какой-либо из них, попробуйте json). Затем вы узнаете, как десериализовать его в своем коде.

В противном случае вам придется написать анализатор строк, чтобы извлечь данные из вашей строки и сериализовать ее в python объекты. Это может быть тривиально, если вы пытаетесь только проанализировать эту указанную c переменную, но также может оказаться довольно сложным, если вы пытаетесь десериализовать многие из этих переменных.

...