A previous article provides an introduction and overview of the iml action, which is available in SAS Viya 3.5. The article compares the iml action to PROC IML and states that most PROC IML programs can be modified to run in the iml action. This article takes a closer look at what a SAS/IML program looks like in the iml action. If you have an existing PROC IML program, how can you modify it to run in the iml action?
PROC CAS and the SOURCE/ENDSOURCE block
A feature of SAS Viya is that the actions can be called from multiple languages: SAS, Python, R, Lua, etc. I am a SAS programmer, so in my blog, I will use SAS to call actions.
An action (sometimes called a "CAS action") runs by using the SAS Cloud Analytic Services (CAS). The CAS procedure provides a language (called "CASL," for "CAS Language") that enables you to call CAS actions. The documentation for CASL states that "CASL is a scripting language that you use to prepare arguments for the execution of CAS actions, submit actions to the CAS server, and then process action results." In short, PROC CAS enables you to "stitch together" a sequence of action calls into a workflow.
PROC CAS supports a SOURCE/ENDSOURCE block, which defines a program that you can submit to an action that supports programming statements. I will use the SOURCE/ENDSOURCE block to define programs for the iml action. To call the iml action by using PROC CAS, you need to do three things:
- Load the iml action set. Any CAS action set that is not auto-loaded must be loaded before you can use it. It only needs to be loaded once per session.
- Use the SOURCE/ENDSOURCE block to define the IML program.
- Call the iml action to run the program. The syntax to call the action is iml / code=ProgramName
In terms of syntax, a typical program in the iml action has the following structure:
PROC CAS; loadactionset 'iml'; /* load the iml action set */ source ProgramName; < put the IML program here > endsource; iml / code=ProgramName; /* run the program in the iml action */ RUN; |
Convert a program from PROC IML to the iml action
The following SAS/IML program defines two vectors and computes their inner product. It then computes the variance of the x data vector. Lastly, it centers and scales the data and computes the variance of the standardized data. This program runs in PROC IML:
PROC IML; c = {1, 2, 1, 3, 2, 0, 1}; /* weights */ x = {0, 2, 3, 1, 0, 2, 2}; /* data */ wtSum = c` * x; /* inner product (weighted sum) */ var1 = var(x); /* variance of original data */ stdX = (x-mean(x)) / std(x); /* standardize data */ var2 = var(stdX); /* variance of standardized data */ print wtSum var1 var2; QUIT; |
This program does not read or write any data sets, which makes it easy to convert to the iml action. The following statements assume that you have a license for the SAS IML product in Viya and that you have already connected to a CAS server.
/* Example of using PROC CAS in SAS to call the iml action */ PROC CAS; loadactionset 'iml'; /* load the action set (once) */ source pgm; c = {1, 2, 1, 3, 2, 0, 1}; /* weights */ x = {0, 2, 3, 1, 0, 2, 2}; /* data */ wtSum = c` * x; /* inner product (weighted sum) */ var1 = var(x); /* variance of original data */ stdX = (x-mean(x)) / std(x); /* standardize data */ var2 = var(stdX); /* variance of standardized data */ print wtSum var1 var2; endsource; iml / code=pgm; /* call iml action to run the 'pgm' program */ RUN; |
For this example, the SAS/IML statements are exactly the same in both programs. The difference is the way that the program is submitted for execution. For this example, the program is named 'pgm', but you could also have named the program 'MyProgram' or 'StdAnalysis' or 'Robert' or 'Jane'. Whatever identifier you use on the SOURCE statement, use that same identifier for the CODE= parameter when you call in the action.
Calling the iml action from Python
I use PROC CAS in SAS to call CAS actions. However, I know that Python is a popular programming language for some data scientists, so here is how to call the iml action from Python. You first need to install the SAS Scripting Wrapper for Analytics Transfer (SWAT) package. You can then use the following statements to connect to a CAS server and load the action:
# Example of using Python to call the iml action import swat # load the swat package s = swat.CAS('myhost', 12345) # use server='myhost'; port=12345 s.loadactionset('iml') # load the action set (once) |
As mentioned earlier, you only need to load the action set one time per session. After the action set is loaded, you can call the iml action by using the following. In Python, triple quotes enable you to preserve the indention and comments in the IML program.
m = s.iml(code= """ c = {1, 2, 1, 3, 2, 0, 1}; /* weights */ x = {0, 2, 3, 1, 0, 2, 2}; /* data */ wtSum = c` * x; /* inner product (weighted sum) */ var1 = var(x); /* variance of original data */ stdX = (x-mean(x)) / std(x); /* standardize data */ var2 = var(stdX); /* variance of standardized data */ print wtSum var1 var2; """) |
More realistic examples
In this case, the program did not read or write data. However, a typical IML program reads in data, analyzes it, and optionally writes out the results. This is the first (and most common) difference between a program that runs in PROC IML and a similar program that runs in the iml action. A PROC IML program reads and writes SAS data sets, whereas actions read and write CAS data tables.
The next article shows an example of a PROC IML program that reads and writes SAS data sets. It compares the PROC IML program to an analogous program that runs in the iml action and reads and writes CAS tables.
Further reading
- Wicklin and Banadaki (2020), "Write Custom Parallel Programs by Using the iml Action," which is the basis for these blog posts.
- SAS IML Programming Guide, which includes documentation and examples for the iml action.
1 Comment
Pingback: Read a CAS data table by using the iml action - The DO Loop