pythonmachine-learningopenmodelicafmi

FMU machine learning model


I had some success in deploying my machine learning model (already trained) in a simulation environment (OpenModelica, in this context) via an external C-function.

However, to standardise the process, I am aiming to use the FMI standard instead of the external C-function. Therefore I need to wrap my ML model as an FMU.

Is there any way that I can do that? I read about PyFMI, however, it seems that it only controls the Co-simulation in a Python environment, instead of wrapping your ML model as an FMU.

The goal is to produce FMU from a trained ML model, and then deploy this FMU in a simulation environment (OpenModelica, for example). Any help will be very much appreciated.

Thanks


Solution

  • Let's say you have two Modelica models A and B.

    model A
     output Real x (start=1,fixed=true);
    equation
      der(x) = 2*x;
    end A;
    
    model B
      input Real x;
      Real y;
      
      function myExternalFunction
        input Real x;
        output Real y;
        external "C" annotation(Library="myExternalLib");
      end myExternalFunction;
    
    equation
      y = myExternalFunction(x);
    end B;
    

    where B is using some external function myExternalFunction from myExternalLib.dll. This could be a function using your trained network to predict some y from some value x.

    External functions in Modelica are standardized, see the Modelica specification 3.4, Section 12.9.

    Now you can of course connect these models in a new Modelica model

    model connectedAB
      A a;
      B b;
    equation
      a.x = b.x;
    end connectedAB;
    

    Now to FMUs. The Functional Mock-up Interface is a standard that defines a container to exchange dynamic models.

    There are different tools available, some can export a dynamic model as FMU (e.g. OpenModelica, Dymola,...) and some can import FMUs to simulate them (e.g. PyFMI, OMSimulator). Of course some tools can do both.

    So models A and B could be exported as FMUs. However it's not intended to export a single external function like myExternalFunction.

    So in OpenModelica you can export A.fmu and B.fmu, create a new strongly connected SSP Model and add these FMUs as submodels. Under the hood OMEdit will use OMSimulator to simulate SSP/FMUs.

    enter image description here

    Even while it is not intended to do so you could probably still export your external function as a FMU. Just create a tiny model that will only call the external function (more or less like I did in B). But you are not getting any benefits from doing that.