Class Expression

  • All Implemented Interfaces:
    java.lang.Cloneable, Actor, Executable, FiringsRecordable, Initializable, TypedActor, Changeable, Debuggable, DebugListener, Derivable, Instantiable, ModelErrorHandler, MoMLExportable, Moveable, Nameable

    public class Expression
    extends TypedAtomicActor
    On each firing send an expression for evaluation to a matlab Engine. The expression is any valid matlab expression, e.g.:
     [out1, out2, ... ] = SomeMatlabFunctionOrExpression( in1, in2, ... );...
     

    The expression may include references to the input port names, current time (time), and a count of the firing (iteration). This is similar to Expression. To refer to parameters in scope, use $name or ${name} within the expression.

    The matlab engine is opened (started) during prefire() by the first matlab Expression actor. Subsequent open()s simply increment a use count.

    At the start of fire(), clear variables;clear globals commands are sent to matlab to clear its workspace. This helps detect errors where the matlab expression refers to a matlab variable not initialized from the input ports of this actor instance.

    After the evaluation of the matlab expression is complete, the fire() method iterates through names of output ports and converts matlab variables with corresponding names to Tokens that are sent to the corresponding output ports. Incorrect expressions are usually first detected at this point by not finding the expected variables. If an output port variable is not found in the matlab Engine, an exception is thrown. The exception description string contains the last stdout of the matlab engine that usually describes the error.

    The get1x1asScalars and getIntegerMatrices control data conversion (see Engine and Engine.ConversionParameters).

    A Parameter named packageDirectories may be added to this actor to augment the search path of the matlab engine during the firing of this actor. The value of this parameter should evaluate to a StringToken, e.g.:

     "path1, path2, ..."
     

    containing a comma-separated list of paths to be prepended to the matlab engine search path before expression is evaluated. The list may contain paths relative to the directory in which ptolemy was started, or any directory listed in the current classpath (in that order, first match wins). See UtilityFunctions.findFile(String). After evaluation, the previous search path is restored.

    A Parameter named _debugging may be used to turn on debug print statements to stdout from Engine and the ptmatlab JNI. An IntToken with a value of 1 turns on Engine debug statements, a value of 2 adds ptmatlab debug statements as well. A value of 0 or the absence of the _debugging parameter yields normal operation.

    For this actor to work, Matlab must be installed on your local machine. In addition, your environment must be set properly. The $PTII/bin/vergil script does this for you, below are instructions for users, such as Eclipse users, who are not using $PTII/bin/vergil.

    Add the Matlab shared libraries to your the library path. In the examples below $MATLAB should be the location of your Matlab installation. For example, if /usr/bin/matlab is a link:

     bash-3.2$ which matlab
     /usr/bin/matlab
     bash-3.2$ ls -l /usr/bin/matlab
     lrwxr-xr-x  1 root  wheel  42 Jan 15 20:57 /usr/bin/matlab -> /Applications/MATLAB_R2009b.app/bin/matlab
     bash-3.2$
     
    Then $MATLAB would be /Applications/MATLAB_R2009b.app
    32 Bit Mac (10.5?, Edit ~/.MacOSX/environment.plist)
    export DYLD_LIBRARY_PATH=$MATLAB/bin/maci
    64 Bit Mac (10.6?, Edit ~/.MacOSX/environment.plist)
    export DYLD_LIBRARY_PATH=$MATLAB/bin/maci64
    32 Bit Linux (Edit
    export LD_LIBRARY_PATH=$MATLAB/bin/gnlx86
    64 Bit Linux
    export LD_LIBRARY_PATH=$MATLAB/bin/glnxa64
    Windows (Start|My Computer|Properties|Advanced Environment Variables| Add the directory that contains matlab.exe to your path)
    Be sure that the matlab binary is in your path

    Notes about Matlab 10.8 and later

    Note that under recent version of MacOS, the DYLD_LIBRARY_PATH is no longer used. The workaround is to be sure that matlab is in your path and to run ./configure.

    For example:

     bash-3.2$ bash-3.2$ which matlab
     /Applications/MATLAB_R2018a.app/bin/matlab
     

    Then, running:

     ./configure --enable-verbose
     

    shows:

     checking for matlab... /Applications/MATLAB_R2018a.app/bin/matlab
     checking the value of the Matlab root directory ... '/Applications/MATLAB_R2018a.app'
     checking for gcc... checking for gcc... /usr/bin/gcc
     checking for malloc_size... yes
     checking the extension for Matlab .mex files... mexmaci64
     checking which major type of OS we are running under... MacOSX
     using '/Applications/MATLAB_R2018a.app/bin/maci' for Matlab's engine libraries
     

    Then run

     cd $PTII
     ant
     cd $PTII/bin
     make
     cd $PTII/ptolemy/matlab
     make clean; make
     

    Here's what libraries are used by libptmatlab.jnilib

     bash-3.2$ otool -L libptmatlab.jnilib
     libptmatlab.jnilib:
             libptmatlab64.jnilib (compatibility version 0.0.0, current version 0.0.0)
    Since:
    Ptolemy II 2.0
    Version:
    $Id$
    Author:
    Zoltan Kemenczy and Sean Simmons, Research in Motion Limited
    Pt.AcceptedRating:
    Red (cxh)
    Pt.ProposedRating:
    Yellow (zkemenczy)