Type: Package
Title: 'C' and 'Java' Source Code Generator for Fitted Glm Objects
Version: 1.0.4
Date: 2018-03-06
Author: Oscar Castro-Lopez [cre, aut], Ines Vega-Lopez [aut]
Maintainer: Oscar Castro-Lopez <castroloj@gmail.com>
License: GPL (≥ 3) | file LICENSE
Description: Provides two functions that generate source code implementing the predict function of fitted glm objects. In this version, code can be generated for either 'C' or 'Java'. The idea is to provide a tool for the easy and fast deployment of glm predictive models into production. The source code generated by this package implements two function/methods. One of such functions implements the equivalent to predict(type="response"), while the second implements predict(type="link"). Source code is written to disk as a .c or .java file in the specified path. In the case of c, an .h file is also generated.
URL: https://github.com/oscarcastrolopez/glm.deploy
BugReports: https://github.com/oscarcastrolopez/glm.deploy/issues
Encoding: UTF-8
LazyData: true
Imports: Rcpp (≥ 0.12.12), stats
LinkingTo: Rcpp
RoxygenNote: 6.0.1
Suggests: knitr, rmarkdown, testthat
NeedsCompilation: yes
Packaged: 2018-03-06 23:19:25 UTC; oscar
Repository: CRAN
Date/Publication: 2018-03-09 09:59:35 UTC

'C' and 'Java' Source Code Generator for Fitted Glm Objects

Description

Provides two functions that generate source code implementing the predict function of fitted glm objects. In this version, code can be generated for either 'C' or 'Java'. The idea is to provide a tool for the easy and fast deployment of glm predictive models into production. The source code generated by this package implements two function/methods. One of such functions implements the equivalent to predict(type="response"), while the second implements predict(type="link"). Source code is written to disk as a .c or .java file in the specified path. In the case of c, an .h file is also generated.

Details

All numeric variables used as input to the glm object are treated as doubles, whereas factors variables are treated as strings.

The glm.deploy package is compatible with the following link functions in the fitted glm object:

Author(s)

See Also

Functions:

URL: https://github.com/oscarcastrolopez/glm.deploy


C source code generator for rapid deployment of glm predictive models

Description

The glm2c() function is used to generate source code in C language implementing a given glm predictive model. It implements the following two functions; the glm_xxx_response() and glm_xxx_link(), where xxx stands for the name of the target variable of the glm object.

After the invocation of the glm2c() function two files are generated:

Usage

glm2c(model, filename = NULL, path = NULL)

Arguments

model

A fitted object of class "glm".

filename

OPTIONAL The name of the output file(s), the default filenames are "glm_xxx.c" and "glm_xxx.h", where xxx is the target variable's name.

path

The directory path where files are going to be saved.

Note

All numeric variables used as input to the glm object are treated as doubles, whereas factor variables are treated as strings.

Author(s)

Oscar Castro-Lopez, Ines Vega-Lopez

See Also

glm2java

Examples


 # Example with the iris dataset with a Logical target and numeric variables,
 # using the binomial family and the logit link function
 data(iris)
 iristest = iris
 iristest$Virginica = ifelse(iristest$Species == 'virginica', TRUE,FALSE)
 iristest$Species = NULL

 # Load Package
 library(glm.deploy)
 # For repeatable results
 set.seed(123)
 # Generate the fitted glm object
 m = glm(Virginica ~ ., family = binomial(logit), data=iristest)
 # Call the glm2c() function with default filename
 glm2c(m,,tempdir())

 # Call the glm2c() function with custom filename
 glm2c(m,'my_glm_virginica', tempdir())

 # The glm2c() function generates the files: "glm_virginica.c" and
 # "glm_virginica.h"

## Not run: 
---------------Contents of the "glm_virgninica.c" file---------------

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <math.h>

double glm_virginica_link(double sepal_length,
                          double sepal_width,
                          double petal_length,
                          double petal_width){
  double new_sepal_length = -2.46522019518341 * sepal_length;
  double new_sepal_width = -6.68088701405762 * sepal_width;
  double new_petal_length = 9.4293851538836 * petal_length;
  double new_petal_width = 18.2861368877881 * petal_width;

  return -42.6378038127854+new_sepal_length+
                           new_sepal_width+
                           new_petal_length+
                           new_petal_width;
}
double glm_virginica_response(double sepal_length,
                              double sepal_width,
                              double petal_length,
                              double petal_width){
  return 1/(1+exp(-glm_virginica_link(sepal_length,
                                      sepal_width,
                                      petal_length,
                                      petal_width)));
}
----End of Contents of the "glm_virgninica.c" file------------------
--------------------------------------------------------------------

-----Contents of the "glm_virgninica.h" file------------------------
double glm_virginica_link(double sepal_length,
                          double sepal_width,
                          double petal_length,
                          double petal_width);
double glm_virginica_response(double sepal_length,
                              double sepal_width,
                              double petal_length,
                              double petal_width);
-----End of Contents of the "glm_virgninica.h" file-----------------
--------------------------------------------------------------------

Usage of the functions in another programs;
1) We need to add an include line #include "virginica_glm.h" to all
source files that use library definitions.
2) Link the .c file with the library object file.
    gcc -c glm_virginica.c
3) The following is an example file "test.c" to call the functions
and print the result:

-------------------"test.c"---------------
#include <stdio.h>
#include "glm_virgnica.h" //Added to call the scoring functions.

int main(int argc, char *argv[]){
  printf("%f\n",glm_virginica_link(5.7,2.5,5.0,2.0));
  printf("%f\n",glm_virginica_response(5.7,2.5,5.0,2.0));
  return 0;
}
---------------End of "test.c"---------------
---------------------------------------------

4) Compile the "test.c" file and link it to the glm_virginica shared
library, we also need to add the "-lm" option to link it to the
math.h library:
gcc test.c -o test glm_virginica.o -lm

5) Finally Run the test.o program in linux:
./test

## End(Not run)

Java source code generator for rapid deployment of glm predictive models

Description

The glm2java() function is used to generate source code in Java language implementing a given glm predictive model. It implements the following two methods; the glm_xxx_response() and glm_xxx_link(), where xxx stands for the name of the target variable of the glm object.

After invocation of the glm2java(), a .java file is generated containing the two predict methods which are declared as public static inside a java class called "glm_xxx_class".

Usage

glm2java(model, filename = NULL, path = NULL)

Arguments

model

A fitted object of class "glm".

filename

OPTIONAL The name of the output file, the default file name is "glm_xxx_class.java", where xxx is the target variable's name.

path

The directory path where files are going to be saved.

Note

All numeric variables used as input to the glm object are treated as doubles, whereas factors variables are treated as strings.

Author(s)

Oscar Castro-Lopez, Ines Vega-Lopez

See Also

glm2java

Examples

 # Example with the iris dataset with a Logical target and numeric
 # variables, using the binomial family and the logit link function
 data(iris)
 iristest = iris
 iristest$Virginica = ifelse(iristest$Species == 'virginica', TRUE,FALSE)
 iristest$Species = NULL

 # Load Package
 library(glm.deploy)
 # For repeatable results
 set.seed(123)
 # Generate the fitted glm object
 m = glm(Virginica ~ ., family = binomial(logit), data=iristest)
 # Call the glm2java() function with default filename
 glm2java(m,, tempdir())
 # Call the glm2java() function with custom filename
 glm2java(m,'my_glm_virginica', tempdir())

 # The glm2java() function generates the file "glm_virginica_class.java".

## Not run: 
----------Contents of the "glm_virgninica_class.java" file-------
  package test;
  public class glm_virginica_class{

  public static double glm_virginica_link(double sepal_length,
                                          double sepal_width,
                                          double petal_length,
                                          double petal_width){
      double new_sepal_length = -2.46522019518341 * sepal_length;
      double new_sepal_width = -6.68088701405762 * sepal_width;
      double new_petal_length = 9.4293851538836 * petal_length;
      double new_petal_width = 18.2861368877881 * petal_width;

      return -42.6378038127854+new_sepal_length+
                               new_sepal_width+
                               new_petal_length+
                               new_petal_width;
    }
    public static double glm_virginica_response(double sepal_length,
                                                double sepal_width,
                                                double petal_length,
                                                double petal_width){
      return 1/(1+Math.exp(-glm_virginica_link(sepal_length,
                                               sepal_width,
                                               petal_length,
                                               petal_width)));
    }

  }
---------------End of "glm_virgninica_class.java"---------------
----------------------------------------------------------------
To use these methods in another class just add
the "import glm_virginica_class.*;"

## End(Not run)