массив ctypes не вызывается - PullRequest
0 голосов
/ 10 мая 2019

Я хочу использовать функцию scipy.optimize.minimize. Функция содержит команды из DLL, для которых требуется массив ctypes. Цель состоит в том, чтобы варьировать входные данные в массиве ctypes для оптимизации конкретного вывода, которое также является массивом ctypes (см. Код ниже).

import os
import ctypes
import tkinter as tk
from PIL import ImageTk
from tkinter import filedialog
import numpy as np
from scipy.optimize import minimize

dll = ctypes.cdll.LoadLibrary(library)

LoadModelDef = dll.addModelDef(model)

nrExperiments = 1
nrin = dll.getNumInputs(LoadModelDef)

PDBL2ARR = ctypes.c_double * nrin * nrExperiments
inputs = PDBL2ARR()
inputs_init = PDBL2ARR()


def evaluaterel(library,Model,InputArray):
    nrExp = len(InputArray)
    DBL2ARR = ctypes.c_double * nrExp
    outputs = DBL2ARR()
    for i in range(2,13):
        Name= outputName(Model,i)
        library.evalVBA(Model,InputArray,nrExp,i,outputs)
        for i in range(nrExp):
            Value = str(outputs[i])
#        text = label.cget("text") + '\n' + str(Name)+ ' ' + str(Value)
#        label.configure(text=text)
    return outputs

data = np.array([line.split()[-1] for line in open("DATA.txt")], dtype=np.float64)
for i in range(nrExperiments):
    for j in range(nrin):
        inputs_init[i][j]= 0

for i in range(nrExperiments):
    for j in range(0,nrin):
        inputs[i][j]=data[j]

solution=minimize(evaluaterel(dll,LoadModelDef,inputs),inputs_init,method='SLSQP')
print(solution)

  File "c:\app\python27\lib\site-packages\scipy\optimize\optimize.py", line 292, in function_wrapper
    return function(*(wrapper_args + args))

TypeError: 'c_double_Array_1' object is not callable

1 Ответ

0 голосов
/ 10 мая 2019

Согласно [SciPy.Docs]: scipy.optimize.minimize ( fun, x0, args = (), метод = Нет, jac = Нет, hess = Нет,hessp = Нет, границы = Нет, ограничения = (), tol = Нет, обратный вызов = Нет, параметры = Нет ) , аргумент 1 st должен быть вызываемым (функция, в вашем случае).
Но вы сами вызываете функцию при ее передаче, и поэтому вы передаете возвращаемое значение функции .

Измените свой код (неисправная строка) на:

solution = minimize(evaluaterel, inputs_init, args=(dll, LoadModelDef, inputs), method="SLSQP")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...