Python gekko не может найти файл "options. json" - PullRequest
3 голосов
/ 12 марта 2020

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

Я новичок в пакете Python Gekko и пытаюсь запустить нелинейный решатель, чтобы решить, что происходит. Я получаю странное сообщение об ошибке (FileNotFoundError: [Errno 2] No such file or directory: '/var/folders/03/vyh22j3j45j2rqjmnygfw2l80000gn/T/tmpatrk8y36gk_model0/options.json'), которое кажется программным / синтаксическим, а не математическим. Это одна функция из гораздо более крупной функции / данных / ввода, поэтому мне сложно предоставить достаточно, чтобы помочь вам ее воспроизвести - но -

Y (то есть результат self.get_days_energy (date = дата)) - это вектор значений энергии, а также экзогенные входные данные из self.get_exogenous_inputs_of_day (date). Z-переменные - это переменные скрытого состояния, а A и B - матрицы перехода для скрытых состояний и экзогенных переменных соответственно. Цель этой функции - обновить три вышеупомянутые переменные.

Вот эта функция:

def daily_weight_fit(self, date):

    """ 
    Update function to the weights of the dynamic system, this will be called 
    once a day after the data has arrived. 
    """

    m = GEKKO(remote = False)
    A = m.Array(
            m.Var, 
            (self.state_weights.shape), 
            value = 1, 
            lb = -10, 
            ub = 10, 
        )
    B = m.Array(
            m.Var, 
            (self.input_weights.shape), 
            value = 1, 
            lb = -100, 
            ub = 100, 
        )

    dates = pd.date_range(start=self.starting_date, end=date)
    date_list = dates.tolist()
    hours = list(range(24))

    y = [[self.get_days_energy(date = date)] for date in dates]
    flat_y = np.reshape(y, -1)
    timesteps = len(flat_y)

    u = [self.get_exogenous_inputs_of_day(date) for date in dates for hour in hours]

    z = m.Array(m.Var, (timesteps, 4), lb = -1, ub = 1)      
    C = np.array([0, 0, 1, 0])

    m.Obj(
        m.sqrt(
            m.sum([(flat_y[i] - z[i][3])**2 for i in range(len(flat_y))])
            )
        )

    for i in range(timesteps - 2):
        state_contribution = np.dot(A, z[i])
        ex_contribution = np.dot(B, u[i])
        for j in range(4):
            m.Equation(z[i + 1][j] == state_contribution[j] + ex_contribution[j])

    m.options.solver = 1
    m.solve()

    return A, B, z

Вот вывод ошибки:

 ----------------------------------------------------------------
 APMonitor, Version 0.9.2
 APMonitor Optimization Suite
 ----------------------------------------------------------------


 --------- APM Model Size ------------
 Each time step contains
   Objects      :            1
   Constants    :            0
   Variables    :         1849
   Intermediates:            0
   Connections  :          361
   Equations    :         1793
   Residuals    :         1793

 Number of state variables:           1849
 Number of total equations: -         1793
 Number of slack variables: -            0
 ---------------------------------------
 Degrees of freedom       :             56

 ----------------------------------------------
 Steady State Optimization with APOPT Solver
 ----------------------------------------------

 Iter    Objective  Convergence
    0  4.12076E+08  8.12928E+01
    1  5.38520E+02  1.00000E+00
    2  5.38512E+02  3.75145E-12
    3  5.38450E+02  2.00000E+00
    4  5.38506E+02  1.80710E-01
 NEGATIVE NDF:           -1
    5  1.10270E+07  3.34638E-01
    6  4.89845E+06  1.93472E+00
    7  4.73333E+05  3.99952E+00
    8  3.76178E+05  2.00000E+00
    9  1.69753E+05  1.31302E+00

 Iter    Objective  Convergence
   10  1.90770E+07  5.86504E-01
   11  3.03623E+16  3.34638E-01
   12  9.38385E+11  3.34304E-01
   13  1.14353E+12  1.09011E-02
   14  8.91928E+12  7.65181E-03

Error: 
Program received signal SIGSEGV: Segmentation fault - invalid memory reference.

Backtrace for this error:
#0  0x108c7718d
#1  0x108c7661b
#2  0x7fff661ccf59
#3  0x108a92b6b
apm_mac(33870,0x7fff9e9c1380) malloc: *** error for object 0x7fb371862e00: incorrect checksum for freed object - object was probably modified after being freed.
*** set a breakpoint in malloc_error_break to debug

Program received signal SIGABRT: Process abort signal.

Backtrace for this error:
#0  0x108c7718d
#1  0x108c7661b
#2  0x7fff661ccf59

Error: 'results.json' not found. Check above for additional error details
Traceback (most recent call last):

.... (my own irrelevant function trace)..... 

    m.solve()
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/gekko/gekko.py", line 2145, in solve
    self.load_JSON()
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/gekko/gk_post_solve.py", line 13, in load_JSON
    f = open(os.path.join(self._path,'options.json'))
FileNotFoundError: [Errno 2] No such file or directory: '/var/folders/03/vyh22j3j45j2rqjmnygfw2l80000gn/T/tmp42metzl9gk_model0/options.json'

Любые советы или рекомендации будут высоко оценены! Джон Хеденгрен, привет, и я люблю твою работу !!

1 Ответ

4 голосов
/ 12 марта 2020

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

  1. Первый вариант - попробовать другой решатель, такой как BPOPT с m.options.SOLVER=2 или IPOPT с m.options.SOLVER=3.
  2. Второй вариант - связать некоторые переменные решения или не допустить деления на ноль в ваших уравнениях или целевой функции.

При каждом сбое решателя Пожалуйста, рассмотрите возможность отправки содержимого вашего каталога запуска в m.path, чтобы разработчики могли исправить ошибку.

Справочная информация: Файлы options.json или results.json записываются базовый исполняемый файл C ++ / Fortran либо локально с m=GEKKO(remote=False), либо через веб-сервис m=GEKKO(remote=True). Во всех случаях исполняемый файл выдает результаты в виде json файлов либо в локальном каталоге выполнения m.path, либо на удаленном сервере. Когда исполняемый файл вылетает из-за ошибки, файлы json не создаются, и это приводит к появившейся ошибке. Вы также можете увидеть, что решатель останавливается на итерации 14. При remote=False исполняемый файл запускается локально из каталога bin Gekko (apm для Linux, apm_mac для MacOS или apm.exe для Windows), но производит файлы в каталоге run m.path.

...