hello

A single model receives input from a file, sends the input as output to a file and back to itself, receives its own output, and sends that as output to a file in the temporary directory. The input & output files are specified via the default_file parameter in the model inputs/outputs and the connection demonstrates the use of the onexit parameter.

C Version

Model Code:

 1#include <stdio.h>
 2#include "YggInterface.h"
 3
 4#define BSIZE 512 // the max
 5
 6int main(int argc, char *argv[]) {
 7  int ret = 0;
 8  char buf[BSIZE];
 9  
10  printf("Hello from C\n");
11
12  // Ins/outs matching with the the model yaml
13  yggInput_t inf = yggInput("inFile"); 
14  yggOutput_t outf = yggOutput("outFile");
15  yggInput_t inq = yggInput("helloQueueIn");
16  yggOutput_t outq = yggOutput("helloQueueOut");
17  printf("hello(C): Created I/O channels\n");
18
19  // Receive input from a local file
20  ret = ygg_recv(inf, buf, BSIZE);
21  if (ret < 0) {
22    printf("hello(C): ERROR FILE RECV\n");
23    return -1;
24  }
25  int bufsiz = ret;
26  printf("hello(C): Received %d bytes from file: %s\n", bufsiz, buf);
27
28  // Send output to the output queue
29  ret = ygg_send(outq, buf, bufsiz);
30  if (ret != 0) {
31    printf("hello(C): ERROR QUEUE SEND\n");
32    return -1;
33  }
34  printf("hello(C): Sent to outq\n");
35
36  // Receive input form the input queue
37  ret = ygg_recv(inq, buf, BSIZE);
38  if (ret < 0) {
39    printf("hello(C): ERROR QUEUE RECV\n");
40    return -1;
41  }
42  bufsiz = ret;
43  printf("hello(C): Received %d bytes from queue: %s\n", bufsiz, buf);
44  
45  // Send output to a local file
46  ret = ygg_send(outf, buf, bufsiz);
47  if (ret != 0) {
48    printf("hello(C): ERROR FILE SEND\n");
49    return -1;
50  }
51  printf("hello(C): Sent to outf\n");
52
53  printf("Goodbye from C\n");
54  return 0;
55}
56

Model YAML:

 1---
 2
 3model:
 4  name: hello_c
 5  language: c
 6  args: ./src/hello.c  # compile the C code with necessary libraries
 7
 8  inputs:
 9    - name: inFile
10      default_file: ./Input/input.txt
11    - helloQueueIn
12  outputs:
13    - helloQueueOut
14    - name: outFile
15      default_file:
16        name: output_hello.txt
17        in_temp: True
18
19connections:
20  - input: helloQueueOut
21    output: helloQueueIn
22    onexit: printStatus

C++ Version

Model Code:

 1#include "YggInterface.hpp"
 2#include <string>
 3#include <iostream>
 4using namespace std;
 5
 6#define BSIZE 512 // the max
 7
 8int main(int argc, char *argv[]) {
 9  int ret = 1;
10  char buf[BSIZE];
11
12  cout << "Hello from C++\n";
13  
14  /* Matching with the the model yaml */
15  YggInput inf("inFile"); 
16  YggOutput outf("outFile");
17  YggInput inq("helloQueueIn");
18  YggOutput outq("helloQueueOut");
19  cout << "hello(CPP): Created I/O channels\n";
20
21  // Receive input from the local file
22  ret = inf.recv(buf, BSIZE);
23  if (ret < 0) {
24    printf("hello(CPP): ERROR FILE RECV\n");
25    return -1;
26  }
27  int bufsiz = ret;
28  printf("hello(CPP): Received %d bytes from file: %s\n", bufsiz, buf);
29
30  // Send output to queue
31  ret = outq.send(buf, bufsiz);
32  if (ret != 0) {
33    printf("hello(CPP): ERROR QUEUE SEND\n");
34    return -1;
35  }
36  printf("hello(CPP): Sent to outq\n");
37
38  // Receive input from queue
39  ret = inq.recv(buf, BSIZE);
40  if (ret < 0) {
41    printf("hello(CPP): ERROR QUEUE RECV\n");
42    return -1;
43  }
44  bufsiz = ret;
45  printf("hello(CPP): Received %d bytes from queue: %s\n", bufsiz, buf);
46
47  // Send output to local file
48  ret = outf.send(buf, bufsiz);
49  if (ret != 0) {
50    printf("hello(CPP): ERROR FILE SEND\n");
51    return -1;
52  }
53  printf("hello(CPP): Sent to outf\n");
54
55  cout << "Goodbye from C++\n";
56  return 0;
57}

Model YAML:

 1---
 2
 3model:
 4  name: hello_cpp
 5  language: c++
 6  args: ./src/hello.cpp
 7
 8  inputs:
 9    - name: inFile
10      default_file: ./Input/input.txt
11    - helloQueueIn
12  outputs:
13    - helloQueueOut
14    - name: outFile
15      default_file:
16        name: output_hello.txt
17        in_temp: True
18
19connections:
20  - input: helloQueueOut
21    output: helloQueueIn
22    onexit: printStatus

Fortran Version

Model Code:

 1PROGRAM hello
 2  USE fygg
 3
 4  logical :: ret = .true.
 5  integer :: bufsiz
 6  character(len = 512) :: buf = ""
 7  TYPE(yggcomm) :: inf, outf, inq, outq
 8
 9  PRINT *, "Hello from Fortran"
10
11  ! Ins/outs matching with the the model yaml
12  inf = ygg_input("inFile")
13  outf = ygg_output("outFile")
14  inq = ygg_input("helloQueueIn")
15  outq = ygg_output("helloQueueOut")
16  PRINT *, "hello(Fortran): Created I/O channels"
17
18  ! Receive input from a local file
19  bufsiz = len(buf)
20  ret = ygg_recv(inf, buf, bufsiz)
21  IF (.not.ret) THEN
22     PRINT *, "hello(Fortran): ERROR FILE RECV"
23     STOP 1
24  END IF
25  PRINT *, "hello(Fortran): Received ", bufsiz, &
26       "bytes from file: ", buf
27
28  ! Send output to the output queue
29  ret = ygg_send(outq, buf, bufsiz)
30  IF (.not.ret) THEN
31     PRINT *, "hello(Fortran): ERROR QUEUE SEND"
32     STOP 1
33  END IF
34  PRINT *, "hello(Fortran): Sent to outq"
35  
36  ! Receive input form the input queue
37  bufsiz = len(buf)
38  ret = ygg_recv(inq, buf, bufsiz)
39  IF (.not.ret) THEN
40     PRINT *, "hello(Fortran): ERROR QUEUE RECV"
41     STOP 1
42  END IF
43  PRINT *, "hello(Fortran): Received ", bufsiz, &
44       "bytes from queue: ", buf
45
46  ! Send output to a local file
47  ret = ygg_send(outf, buf, bufsiz)
48  IF (.not.ret) THEN
49     PRINT *, "hello(Fortran): ERROR FILE SEND"
50     STOP 1
51  END IF
52  PRINT *, "hello(Fortran): Sent to outf"
53
54  PRINT *, "Goodbye from Fortran"
55  
56END PROGRAM hello

Model YAML:

 1---
 2
 3model:
 4  name: hello_fortran
 5  language: fortran
 6  args: ./src/hello.f90  # compile the Fortran code with necessary libraries
 7
 8  inputs:
 9    - inFile
10    - helloQueueIn
11  outputs:
12    - helloQueueOut
13    - outFile
14
15connections:
16  - input: ./Input/input.txt
17    output: inFile
18  - input: helloQueueOut
19    output: helloQueueIn
20    onexit: printStatus
21  - input: outFile
22    output: output_hello.txt
23    in_temp: True

Matlab Version

Model Code:

 1disp('Hello from Matlab');
 2
 3% Ins/outs matching with the the model yaml
 4inf = YggInterface('YggInput', 'inFile');
 5outf = YggInterface('YggOutput', 'outFile');
 6inq = YggInterface('YggInput', 'helloQueueIn');
 7outq = YggInterface('YggOutput', 'helloQueueOut');
 8disp('hello(M): Created I/O channels');
 9
10% Receive input from a local file
11[flag, buf] = inf.recv();
12if (~flag);
13  error('hello(M): ERROR FILE RECV');
14end
15fprintf('hello(M): Received %d bytes from file: %s\n', ...
16	length(buf), buf);
17
18% Send output to the output queue
19ret = outq.send(buf);
20if (~ret);
21  error('hello(M): ERROR QUEUE SEND');
22end
23disp('hello(M): Sent to outq');
24outq.send_eof();
25
26% Receive input form the input queue
27[flag, buf] = inq.recv();
28if (~flag);
29  error('hello(M): ERROR QUEUE RECV');
30end
31fprintf('hello(M): Received %d bytes from queue: %s\n', ...
32	length(buf), buf);
33
34% Send output to a local file
35ret = outf.send(buf);
36if (~ret);
37  error('hello(M): ERROR FILE SEND');
38end
39disp('hello(M): Sent to outf');
40
41disp('Goodbye from Matlab');

Model YAML:

 1---
 2
 3model:
 4  name: hello_matlab
 5  language: matlab
 6  args: ./src/hello.m  # Runs the matlab script using Matlab engine
 7
 8  inputs:
 9    - name: inFile
10      default_file: ./Input/input.txt
11    - helloQueueIn
12  outputs:
13    - helloQueueOut
14    - name: outFile
15      default_file:
16        name: output_hello.txt
17        in_temp: True
18
19connections:
20  - input: helloQueueOut
21    output: helloQueueIn
22    onexit: printStatus

Python Version

Model Code:

 1from __future__ import print_function
 2from yggdrasil.interface.YggInterface import YggInput, YggOutput
 3
 4
 5def runhello():
 6    print('Hello from Python')
 7
 8    # Ins/outs matching with the the model yaml
 9    inf = YggInput('inFile')
10    outf = YggOutput('outFile')
11    inq = YggInput('helloQueueIn')
12    outq = YggOutput('helloQueueOut')
13    print("hello(P): Created I/O channels")
14
15    # Receive input from a local file
16    ret, buf = inf.recv()
17    if not ret:
18        raise RuntimeError('hello(P): ERROR FILE RECV')
19    print('hello(P): Received %d bytes from file: %s' % (len(buf), buf))
20
21    # Send output to the output queue
22    ret = outq.send(buf)
23    if not ret:
24        raise RuntimeError('hello(P): ERROR QUEUE SEND')
25    print('hello(P): Sent to outq')
26
27    # Receive input form the input queue
28    ret, buf = inq.recv()
29    if not ret:
30        raise RuntimeError('hello(P): ERROR QUEUE RECV')
31    print('hello(P): Received %d bytes from queue: %s' % (len(buf), buf))
32
33    # Send output to a local file
34    ret = outf.send(buf)
35    if not ret:
36        raise RuntimeError('hello(P): ERROR FILE SEND')
37    print('hello(P): Sent to outf')
38
39    print('Goodbye from Python')
40
41    
42if __name__ == '__main__':
43    runhello()

Model YAML:

 1---
 2
 3model:
 4  name: hello_python
 5  language: python
 6  args: ./src/hello.py  # Runs the python script using default python
 7
 8  inputs:
 9    - name: inFile
10      default_file: ./Input/input.txt
11    - helloQueueIn
12  outputs:
13    - helloQueueOut
14    - name: outFile
15      default_file:
16        name: output_hello.txt
17        in_temp: True
18
19connections:
20  - input: helloQueueOut
21    output: helloQueueIn
22    onexit: printStatus

R Version

Model Code:

 1library(yggdrasil)
 2
 3print('Hello from R')
 4
 5# Ins/outs matching with the the model yaml
 6inf <- YggInterface('YggInput', 'inFile')
 7outf <- YggInterface('YggOutput', 'outFile')
 8inq <- YggInterface('YggInput', 'helloQueueIn')
 9outq <- YggInterface('YggOutput', 'helloQueueOut')
10print("hello(R): Created I/O channels")
11
12# Receive input from a local file
13c(ret, buf) %<-% inf$recv()
14if (!ret) {
15  stop('hello(R): ERROR FILE RECV')
16}
17fprintf('hello(R): Received %d bytes from file: %s', length(buf), buf)
18
19# Send output to the output queue
20ret <- outq$send(buf)
21if (!ret) {
22  stop('hello(R): ERROR QUEUE SEND')
23}
24print('hello(R): Sent to outq')
25
26# Receive input form the input queue
27c(ret, buf) %<-% inq$recv()
28if (!ret) {
29  stop('hello(R): ERROR QUEUE RECV')
30}
31fprintf('hello(R): Received %d bytes from queue: %s', length(buf), buf)
32
33# Send output to a local file
34ret <- outf$send(buf)
35if (!ret) {
36  stop('hello(R): ERROR FILE SEND')
37}
38print('hello(R): Sent to outf')
39
40print('Goodbye from R')

Model YAML:

 1---
 2
 3model:
 4  name: hello_R
 5  language: R
 6  args: ./src/hello.R  # Runs the R script using the R interpreter
 7
 8  inputs:
 9    - name: inFile
10      default_file: ./Input/input.txt
11    - helloQueueIn
12  outputs:
13    - helloQueueOut
14    - name: outFile
15      default_file:
16        name: output_hello.txt
17        in_temp: True
18
19connections:
20  - input: helloQueueOut
21    output: helloQueueIn
22    onexit: printStatus