Документация Engee
Notebook

From Workspace и To Workspace

Открыть пример в Engee

В данной демонстрации опишем особенности использования блоков From Workspace и To Workspace. Наша цель – показать, как мы можем подать данные в модель или считать их из неё. Для этого реализована простая модель, показанная на рисунке ниже.

image_2.png

Далее мы подключим библиотеку, необходимую для формирования структуры данных WorkspaceArray.

Для начала создадим структуру DataFrame со столбцами временных отметок и данных.

После этого создаем объект WorkspaceArray, первый параметр которого – это внутреннее имя базы данных, а второй – данные из структуры DataFrame.

In [ ]:
using DataFrames
In [ ]:
# Задаем данные:
t = [1.0, 2.0, 4.0];
d = rand(Float64, size(t));
In [ ]:
df = DataFrame(time=t, value=d)
Out[0]:

3 rows × 2 columns

timevalue
Float64Float64
11.00.554436
22.00.564866
34.00.116877
In [ ]:
wa = WorkspaceArray(string(rand()), df)
Out[0]:
WorkspaceArray("0.7893540708500778")

Перейдём к запуску нашей модели.

In [ ]:
function run_model( name_model, path_to_folder )
    
    Path = path_to_folder * "/" * name_model * ".engee"
    
    if name_model in [m.name for m in engee.get_all_models()] # Проверка условия загрузки модели в ядро
        model = engee.open( name_model ) # Открыть модель
        model_output = engee.run( model, verbose=true ); # Запустить модель
    else
        model = engee.load( Path, force=true ) # Загрузить модель
        model_output = engee.run( model, verbose=true ); # Запустить модель
        engee.close( name_model, force=true ); # Закрыть модель
    end

    return model_output
end
Out[0]:
run_model (generic function with 1 method)
In [ ]:
run_model("from_to_workspace", @__DIR__)
Building...
Progress 0%
Progress 0%
Progress 5%
Progress 10%
Progress 15%
Progress 20%
Progress 25%
Progress 30%
Progress 35%
Progress 40%
Progress 45%
Progress 50%
Progress 55%
Progress 60%
Progress 65%
Progress 70%
Progress 75%
Progress 80%
Progress 85%
Progress 90%
Progress 95%
Progress 100%

На выходе мы также получим структуру WorkspaceArray. Выполним просмотр её полей и сравним с входными данными.

In [ ]:
dump(out)
WorkspaceArray{Any}
  name: String "out"
  vecsize: Int64 11
  method: Symbol file
  chunks: OrderedCollections.OrderedDict{Int64, Array}
    slots: Array{Int32}((16,)) Int32[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
    keys: Array{Int64}((0,)) Int64[]
    vals: Array{Array}((0,))
    ndel: Int64 0
    maxprobe: Int64 0
    dirty: Bool false
  type: Symbol pair
  range: StepRange{Int64, Int64}
    start: Int64 1
    step: Int64 1
    stop: Int64 11
  parent: Nothing nothing
  time: WorkspaceArray{Any}
    name: String "out"
    vecsize: Int64 11
    method: Symbol file
    chunks: OrderedCollections.OrderedDict{Int64, Array}
      slots: Array{Int32}((16,)) Int32[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
      keys: Array{Int64}((0,)) Int64[]
      vals: Array{Array}((0,))
      ndel: Int64 0
      maxprobe: Int64 0
      dirty: Bool false
    type: Symbol time
    range: StepRange{Int64, Int64}
      start: Int64 1
      step: Int64 1
      stop: Int64 11
    parent: Nothing nothing
    time: ErrorException
      msg: String "WorkspaceArray типа :time не имеет поля time"
    value: ErrorException
      msg: String "WorkspaceArray типа :time не имеет поля value"
  value: WorkspaceArray{Any}
    name: String "out"
    vecsize: Int64 11
    method: Symbol file
    chunks: OrderedCollections.OrderedDict{Int64, Array}
      slots: Array{Int32}((16,)) Int32[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
      keys: Array{Int64}((0,)) Int64[]
      vals: Array{Array}((0,))
      ndel: Int64 0
      maxprobe: Int64 0
      dirty: Bool false
    type: Symbol value
    range: StepRange{Int64, Int64}
      start: Int64 1
      step: Int64 1
      stop: Int64 11
    parent: Nothing nothing
    time: ErrorException
      msg: String "WorkspaceArray типа :value не имеет поля time"
    value: ErrorException
      msg: String "WorkspaceArray типа :value не имеет поля value"
In [ ]:
data = collect(out)
Out[0]:

11 rows × 2 columns

timevalue
AnyAny
10.01.08801
21.01.10887
32.01.12973
43.00.681743
54.00.233753
65.00.0
76.00.0
87.00.0
98.00.0
109.00.0
1110.00.0
In [ ]:
using Plots
plot(df.time,df.value) # Входные данные
plot!(data.time,data.value) # Выходные данные
Out[0]:

Как мы видим из сравнения, в результате данные, которые мы подали в модель, были увеличены в два раза.

Вывод

Мы продемонстрировали опции передачи данных из рабочей области в модели и обратно. Эти возможности среды существенно упрощают ваше взаимодействие с моделями.

Блоки, использованные в примере