From 91a5834dd701211f929fd25419dc34561ce3b4e7 Mon Sep 17 00:00:00 2001 From: Johannes Ranke Date: Fri, 14 Feb 2025 09:15:20 +0100 Subject: Initialize dev docs --- docs/dev/articles/web_only/compiled_models.html | 231 ++++++++++++++++++++++++ 1 file changed, 231 insertions(+) create mode 100644 docs/dev/articles/web_only/compiled_models.html (limited to 'docs/dev/articles/web_only/compiled_models.html') diff --git a/docs/dev/articles/web_only/compiled_models.html b/docs/dev/articles/web_only/compiled_models.html new file mode 100644 index 00000000..113f7b67 --- /dev/null +++ b/docs/dev/articles/web_only/compiled_models.html @@ -0,0 +1,231 @@ + + + + + + + +Performance benefit by using compiled model definitions in mkin • mkin + + + + + + + + + Skip to contents + + +
+ + + + +
+
+ + + +
+

How to benefit from compiled models +

+

When using an mkin version equal to or greater than 0.9-36 and a C +compiler is available, you will see a message that the model is being +compiled from autogenerated C code when defining a model using mkinmod. +Starting from version 0.9.49.9, the mkinmod() function +checks for presence of a compiler using

+
+pkgbuild::has_compiler()
+

In previous versions, it used Sys.which("gcc") for this +check.

+

On Linux, you need to have the essential build tools like make and +gcc or clang installed. On Debian based linux distributions, these will +be pulled in by installing the build-essential package.

+

On MacOS, which I do not use personally, I have had reports that a +compiler is available by default.

+

On Windows, you need to install Rtools and have the path to its bin +directory in your PATH variable. You do not need to modify the PATH +variable when installing Rtools. Instead, I would recommend to put the +line

+
+Sys.setenv(PATH = paste("C:/Rtools/bin", Sys.getenv("PATH"), sep=";"))
+

into your .Rprofile startup file. This is just a text file with some +R code that is executed when your R session starts. It has to be named +.Rprofile and has to be located in your home directory, which will +generally be your Documents folder. You can check the location of the +home directory used by R by issuing

+
+Sys.getenv("HOME")
+
+
+

Comparison with other solution methods +

+

First, we build a simple degradation model for a parent compound with +one metabolite, and we remove zero values from the dataset.

+
+library("mkin", quietly = TRUE)
+SFO_SFO <- mkinmod(
+  parent = mkinsub("SFO", "m1"),
+  m1 = mkinsub("SFO"))
+
## Temporary DLL for differentials generated and loaded
+
+FOCUS_D <- subset(FOCUS_2006_D, value != 0)
+

We can compare the performance of the Eigenvalue based solution +against the compiled version and the R implementation of the +differential equations using the benchmark package. In the output of +below code, the warnings about zero being removed from the FOCUS D +dataset are suppressed. Since mkin version 0.9.49.11, an analytical +solution is also implemented, which is included in the tests below.

+
+if (require(rbenchmark)) {
+  b.1 <- benchmark(
+    "deSolve, not compiled" = mkinfit(SFO_SFO, FOCUS_D,
+       solution_type = "deSolve",
+       use_compiled = FALSE, quiet = TRUE),
+    "Eigenvalue based" = mkinfit(SFO_SFO, FOCUS_D,
+       solution_type = "eigen", quiet = TRUE),
+    "deSolve, compiled" = mkinfit(SFO_SFO, FOCUS_D,
+       solution_type = "deSolve", quiet = TRUE),
+    "analytical" = mkinfit(SFO_SFO, FOCUS_D,
+       solution_type = "analytical",
+       use_compiled = FALSE, quiet = TRUE),
+    replications = 1, order = "relative",
+    columns = c("test", "replications", "relative", "elapsed"))
+  print(b.1)
+} else {
+  print("R package rbenchmark is not available")
+}
+
##                    test replications relative elapsed
+## 4            analytical            1    1.000   0.102
+## 3     deSolve, compiled            1    1.324   0.135
+## 2      Eigenvalue based            1    1.706   0.174
+## 1 deSolve, not compiled            1   22.627   2.308
+

We see that using the compiled model is by more than a factor of 10 +faster than using deSolve without compiled code.

+
+
+

Model without analytical solution +

+

This evaluation is also taken from the example section of mkinfit. No +analytical solution is available for this system, and now Eigenvalue +based solution is possible, so only deSolve using with or without +compiled code is available.

+
+if (require(rbenchmark)) {
+  FOMC_SFO <- mkinmod(
+    parent = mkinsub("FOMC", "m1"),
+    m1 = mkinsub( "SFO"))
+
+  b.2 <- benchmark(
+    "deSolve, not compiled" = mkinfit(FOMC_SFO, FOCUS_D,
+                                      use_compiled = FALSE, quiet = TRUE),
+    "deSolve, compiled" = mkinfit(FOMC_SFO, FOCUS_D, quiet = TRUE),
+    replications = 1, order = "relative",
+    columns = c("test", "replications", "relative", "elapsed"))
+  print(b.2)
+  factor_FOMC_SFO <- round(b.2["1", "relative"])
+} else {
+  factor_FOMC_SFO <- NA
+  print("R package benchmark is not available")
+}
+
## Temporary DLL for differentials generated and loaded
+
##                    test replications relative elapsed
+## 2     deSolve, compiled            1    1.000   0.170
+## 1 deSolve, not compiled            1   23.865   4.057
+

Here we get a performance benefit of a factor of 24 using the version +of the differential equation model compiled from C code!

+

This vignette was built with mkin 1.2.10 on

+
## R version 4.4.2 (2024-10-31)
+## Platform: x86_64-pc-linux-gnu
+## Running under: Debian GNU/Linux 12 (bookworm)
+
## CPU model: AMD Ryzen 9 7950X 16-Core Processor
+
+
+
+ + + + +
+ + + + + + + -- cgit v1.2.1