Repository files navigation

nCompiler

nCompiler is designed to provide a new R development tool for code-generating C++ and easily interfacing between R and C++. It harnesses numerous packages, including:

  • Rcpp
  • Eigen (included via RcppEigen)
  • CppAD (included via RcppEigenAD)
  • Cereal (included via Rcereal)
  • Threading Building Blocks (in the future, to be included via RcppParallel)

An in-progress User Manual that gives brief examples of what works and outlines of future plans is here.

nCompiler grew out of the nimble (on CRAN and github) package. nimble is a framework for hierarchical statistical models and algorithms such as Markov chain Monte Carlo (MCMC). nimble includes the "nimble compiler", which code-generates C++ from models and algorithms written as nimbleFunctions. Basic math, including distributions, vectorized math and linear algebra, as well as basic flow control, is automatically generated and interfaced from R without directly coding any C++. The nimble developers recognized that the successful ideas from the nimble compiler could be redesigned and into a more general package that could provide a more general R programming tool. We dubbed this "nCompiler" to give a first-letter call-out to its nimble roots but emphasize its compiler capabilities.

nCompiler will provide a C++ code-generation and integration system to support:

  • Automatic C++ code-generation for many of R's math functions and possibly more R features.
  • Classes and functions that support mixing of R and C++.
  • Support for uncompiled execution (for debugging) or compiled execution of the same source code when possible.
  • Automatic differentiation.
  • Parallelization.
  • Saving and loading compiled objects.
  • Embedding nCompiler code into R packages.

Like nimble, nCompiler supports both uncompiled and compiled execution. Code to be compiled works in R. This means that one can debug program logic in R, which is typically easier than doing so in C++.

To learn more and see examples, go to the User Manual, which is really a mix of what works and future goals.

Specifically, nCompiler provides two basic constructs:

  • nClass: a class with reference semantics that can have some data and methods implemented in R and others in C++, either code-generated or hand-coded. (nClass definitions inherit from R6 classes.)
  • nFunction: a function that can be compiled via C++, either code-generated or hand-coded, with static types. nClass methods are nFunctions.

Currently, the strategy for building nCompiler is to achieve working skeletons of all major design goals before fleshing out all details such as all function supported for C++ code-generation.

In more detail, some of the main goals for nCompiler and their status are as follows:

  • Make use of the Tensor classes of the Eigen C++ library as the core numeric objects. This differs from nimble, which code-generates for Eigen one- and two-dimensional arrays and matrices but does not support math above two dimensions. This works.
  • Code-generate C++ from R math and distributions and automatically interface to nFunctions. These features mean that a programmer can boost performance without directly coding any C++. This mostly works, although some gaps remain to be filled.
  • Code-generate C++ and automatically interface to nClasses. Interfaces can be "full", meaning there is a specialized class definition whose purpose it to access methods and fields in a compiled C++ object. Or an interface can be "generic", meaning there is simply an external pointer with ad hoc access to data and methods available when needed. The full interface design is inspired by but different from Rcpp modules. This works.
  • Provide basic flow-control structures such as if-then-else, for-loops, etc. This works but has room for generalization, particularly of for-loops.
  • Support pass-by-copy, pass-by-reference, and pass-by-block-reference. Pass-by-reference is important for efficient compiled execution. Pass-by-copy is important for R-like semantics. In nimble, code-generated C++ always uses pass-by-reference, but there is some inconsistent behavior between compiled and uncompiled execution. Pass-by-copy and pass-by-reference work in uncompiled and compiled execution.
  • Make use of the CppAD C++ library to provide automatic differentiation from nFunction code. This ports features from nimble that are development versions but are not released. It allows a programmer to simply declare that they need derivatives of a function and obtain them automatically. nCompiler generates the necessary CppAD code. This works but needs extensions for higher-order derivatives and other features.
  • Make use of the cereal C++ library for serialization. This will allow nClass objects to be naturally saved and loaded. Serialization code for cereal is automatically generated and used. This works, but only for basic types. Handling of objects that point to each other remains to be developed, as does coordination between R and C++ objects.
  • Allow nClass and nFunction code to be easily integrated into R packages. This works in a basic way but needs some enhancements.
  • Allow directly coded C++ and code-generated C++ to be mixed and matched. This works in a basic way.
  • Make use of TBB (Intel Threading Building Blocks) for automatic parallelization. The idea here is that a nClass or nFunction programmer will be able to specify where paralellization should happen, what objects need to be shared or copied across threads, and automatically generate a TBB implementation. This works in a basic way.
  • Support access to more kinds of native R objects. This has not been implemented in code-generation. It will be facilitied by Rcpp.
  • Harness many features of Rcpp: its compilation management; its C++ annotation for automatically generating R functions that interface to compiled functions (Rcpp::export) and automatically manage package dependencies (Rcpp::depends and Rcpp::plugin); its as<> and wrap<> C++ template system; and its classes for easily coding C++ that uses R objects. Most of these features are in use.

About

Code-generate C++ from R

Resources

Stars

64 stars

Watchers

7 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

nCompiler

nCompiler is designed to provide a new R development tool for code-generating C++ and easily interfacing between R and C++. It harnesses numerous packages, including:

  • Rcpp
  • Eigen (included via RcppEigen)
  • CppAD (included via RcppEigenAD)
  • Cereal (included via Rcereal)
  • Threading Building Blocks (in the future, to be included via RcppParallel)

An in-progress User Manual that gives brief examples of what works and outlines of future plans is here.

nCompiler grew out of the nimble (on CRAN and github) package. nimble is a framework for hierarchical statistical models and algorithms such as Markov chain Monte Carlo (MCMC). nimble includes the "nimble compiler", which code-generates C++ from models and algorithms written as nimbleFunctions. Basic math, including distributions, vectorized math and linear algebra, as well as basic flow control, is automatically generated and interfaced from R without directly coding any C++. The nimble developers recognized that the successful ideas from the nimble compiler could be redesigned and into a more general package that could provide a more general R programming tool. We dubbed this "nCompiler" to give a first-letter call-out to its nimble roots but emphasize its compiler capabilities.

nCompiler will provide a C++ code-generation and integration system to support:

  • Automatic C++ code-generation for many of R's math functions and possibly more R features.
  • Classes and functions that support mixing of R and C++.
  • Support for uncompiled execution (for debugging) or compiled execution of the same source code when possible.
  • Automatic differentiation.
  • Parallelization.
  • Saving and loading compiled objects.
  • Embedding nCompiler code into R packages.

Like nimble, nCompiler supports both uncompiled and compiled execution. Code to be compiled works in R. This means that one can debug program logic in R, which is typically easier than doing so in C++.

To learn more and see examples, go to the User Manual, which is really a mix of what works and future goals.

Specifically, nCompiler provides two basic constructs:

  • nClass: a class with reference semantics that can have some data and methods implemented in R and others in C++, either code-generated or hand-coded. (nClass definitions inherit from R6 classes.)
  • nFunction: a function that can be compiled via C++, either code-generated or hand-coded, with static types. nClass methods are nFunctions.

Currently, the strategy for building nCompiler is to achieve working skeletons of all major design goals before fleshing out all details such as all function supported for C++ code-generation.

In more detail, some of the main goals for nCompiler and their status are as follows:

  • Make use of the Tensor classes of the Eigen C++ library as the core numeric objects. This differs from nimble, which code-generates for Eigen one- and two-dimensional arrays and matrices but does not support math above two dimensions. This works.
  • Code-generate C++ from R math and distributions and automatically interface to nFunctions. These features mean that a programmer can boost performance without directly coding any C++. This mostly works, although some gaps remain to be filled.
  • Code-generate C++ and automatically interface to nClasses. Interfaces can be "full", meaning there is a specialized class definition whose purpose it to access methods and fields in a compiled C++ object. Or an interface can be "generic", meaning there is simply an external pointer with ad hoc access to data and methods available when needed. The full interface design is inspired by but different from Rcpp modules. This works.
  • Provide basic flow-control structures such as if-then-else, for-loops, etc. This works but has room for generalization, particularly of for-loops.
  • Support pass-by-copy, pass-by-reference, and pass-by-block-reference. Pass-by-reference is important for efficient compiled execution. Pass-by-copy is important for R-like semantics. In nimble, code-generated C++ always uses pass-by-reference, but there is some inconsistent behavior between compiled and uncompiled execution. Pass-by-copy and pass-by-reference work in uncompiled and compiled execution.
  • Make use of the CppAD C++ library to provide automatic differentiation from nFunction code. This ports features from nimble that are development versions but are not released. It allows a programmer to simply declare that they need derivatives of a function and obtain them automatically. nCompiler generates the necessary CppAD code. This works but needs extensions for higher-order derivatives and other features.
  • Make use of the cereal C++ library for serialization. This will allow nClass objects to be naturally saved and loaded. Serialization code for cereal is automatically generated and used. This works, but only for basic types. Handling of objects that point to each other remains to be developed, as does coordination between R and C++ objects.
  • Allow nClass and nFunction code to be easily integrated into R packages. This works in a basic way but needs some enhancements.
  • Allow directly coded C++ and code-generated C++ to be mixed and matched. This works in a basic way.
  • Make use of TBB (Intel Threading Building Blocks) for automatic parallelization. The idea here is that a nClass or nFunction programmer will be able to specify where paralellization should happen, what objects need to be shared or copied across threads, and automatically generate a TBB implementation. This works in a basic way.
  • Support access to more kinds of native R objects. This has not been implemented in code-generation. It will be facilitied by Rcpp.
  • Harness many features of Rcpp: its compilation management; its C++ annotation for automatically generating R functions that interface to compiled functions (Rcpp::export) and automatically manage package dependencies (Rcpp::depends and Rcpp::plugin); its as<> and wrap<> C++ template system; and its classes for easily coding C++ that uses R objects. Most of these features are in use.

About

Code-generate C++ from R

Resources

Stars

64 stars

Watchers

7 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

nCompiler

nCompiler is designed to provide a new R development tool for code-generating C++ and easily interfacing between R and C++. It harnesses numerous packages, including:

  • Rcpp
  • Eigen (included via RcppEigen)
  • CppAD (included via RcppEigenAD)
  • Cereal (included via Rcereal)
  • Threading Building Blocks (in the future, to be included via RcppParallel)

An in-progress User Manual that gives brief examples of what works and outlines of future plans is here.

nCompiler grew out of the nimble (on CRAN and github) package. nimble is a framework for hierarchical statistical models and algorithms such as Markov chain Monte Carlo (MCMC). nimble includes the "nimble compiler", which code-generates C++ from models and algorithms written as nimbleFunctions. Basic math, including distributions, vectorized math and linear algebra, as well as basic flow control, is automatically generated and interfaced from R without directly coding any C++. The nimble developers recognized that the successful ideas from the nimble compiler could be redesigned and into a more general package that could provide a more general R programming tool. We dubbed this "nCompiler" to give a first-letter call-out to its nimble roots but emphasize its compiler capabilities.

nCompiler will provide a C++ code-generation and integration system to support:

  • Automatic C++ code-generation for many of R's math functions and possibly more R features.
  • Classes and functions that support mixing of R and C++.
  • Support for uncompiled execution (for debugging) or compiled execution of the same source code when possible.
  • Automatic differentiation.
  • Parallelization.
  • Saving and loading compiled objects.
  • Embedding nCompiler code into R packages.

Like nimble, nCompiler supports both uncompiled and compiled execution. Code to be compiled works in R. This means that one can debug program logic in R, which is typically easier than doing so in C++.

To learn more and see examples, go to the User Manual, which is really a mix of what works and future goals.

Specifically, nCompiler provides two basic constructs:

  • nClass: a class with reference semantics that can have some data and methods implemented in R and others in C++, either code-generated or hand-coded. (nClass definitions inherit from R6 classes.)
  • nFunction: a function that can be compiled via C++, either code-generated or hand-coded, with static types. nClass methods are nFunctions.

Currently, the strategy for building nCompiler is to achieve working skeletons of all major design goals before fleshing out all details such as all function supported for C++ code-generation.

In more detail, some of the main goals for nCompiler and their status are as follows:

  • Make use of the Tensor classes of the Eigen C++ library as the core numeric objects. This differs from nimble, which code-generates for Eigen one- and two-dimensional arrays and matrices but does not support math above two dimensions. This works.
  • Code-generate C++ from R math and distributions and automatically interface to nFunctions. These features mean that a programmer can boost performance without directly coding any C++. This mostly works, although some gaps remain to be filled.
  • Code-generate C++ and automatically interface to nClasses. Interfaces can be "full", meaning there is a specialized class definition whose purpose it to access methods and fields in a compiled C++ object. Or an interface can be "generic", meaning there is simply an external pointer with ad hoc access to data and methods available when needed. The full interface design is inspired by but different from Rcpp modules. This works.
  • Provide basic flow-control structures such as if-then-else, for-loops, etc. This works but has room for generalization, particularly of for-loops.
  • Support pass-by-copy, pass-by-reference, and pass-by-block-reference. Pass-by-reference is important for efficient compiled execution. Pass-by-copy is important for R-like semantics. In nimble, code-generated C++ always uses pass-by-reference, but there is some inconsistent behavior between compiled and uncompiled execution. Pass-by-copy and pass-by-reference work in uncompiled and compiled execution.
  • Make use of the CppAD C++ library to provide automatic differentiation from nFunction code. This ports features from nimble that are development versions but are not released. It allows a programmer to simply declare that they need derivatives of a function and obtain them automatically. nCompiler generates the necessary CppAD code. This works but needs extensions for higher-order derivatives and other features.
  • Make use of the cereal C++ library for serialization. This will allow nClass objects to be naturally saved and loaded. Serialization code for cereal is automatically generated and used. This works, but only for basic types. Handling of objects that point to each other remains to be developed, as does coordination between R and C++ objects.
  • Allow nClass and nFunction code to be easily integrated into R packages. This works in a basic way but needs some enhancements.
  • Allow directly coded C++ and code-generated C++ to be mixed and matched. This works in a basic way.
  • Make use of TBB (Intel Threading Building Blocks) for automatic parallelization. The idea here is that a nClass or nFunction programmer will be able to specify where paralellization should happen, what objects need to be shared or copied across threads, and automatically generate a TBB implementation. This works in a basic way.
  • Support access to more kinds of native R objects. This has not been implemented in code-generation. It will be facilitied by Rcpp.
  • Harness many features of Rcpp: its compilation management; its C++ annotation for automatically generating R functions that interface to compiled functions (Rcpp::export) and automatically manage package dependencies (Rcpp::depends and Rcpp::plugin); its as<> and wrap<> C++ template system; and its classes for easily coding C++ that uses R objects. Most of these features are in use.

About

Code-generate C++ from R

Resources

Stars

64 stars

Watchers

7 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

nCompiler

nCompiler is designed to provide a new R development tool for code-generating C++ and easily interfacing between R and C++. It harnesses numerous packages, including:

  • Rcpp
  • Eigen (included via RcppEigen)
  • CppAD (included via RcppEigenAD)
  • Cereal (included via Rcereal)
  • Threading Building Blocks (in the future, to be included via RcppParallel)

An in-progress User Manual that gives brief examples of what works and outlines of future plans is here.

nCompiler grew out of the nimble (on CRAN and github) package. nimble is a framework for hierarchical statistical models and algorithms such as Markov chain Monte Carlo (MCMC). nimble includes the "nimble compiler", which code-generates C++ from models and algorithms written as nimbleFunctions. Basic math, including distributions, vectorized math and linear algebra, as well as basic flow control, is automatically generated and interfaced from R without directly coding any C++. The nimble developers recognized that the successful ideas from the nimble compiler could be redesigned and into a more general package that could provide a more general R programming tool. We dubbed this "nCompiler" to give a first-letter call-out to its nimble roots but emphasize its compiler capabilities.

nCompiler will provide a C++ code-generation and integration system to support:

  • Automatic C++ code-generation for many of R's math functions and possibly more R features.
  • Classes and functions that support mixing of R and C++.
  • Support for uncompiled execution (for debugging) or compiled execution of the same source code when possible.
  • Automatic differentiation.
  • Parallelization.
  • Saving and loading compiled objects.
  • Embedding nCompiler code into R packages.

Like nimble, nCompiler supports both uncompiled and compiled execution. Code to be compiled works in R. This means that one can debug program logic in R, which is typically easier than doing so in C++.

To learn more and see examples, go to the User Manual, which is really a mix of what works and future goals.

Specifically, nCompiler provides two basic constructs:

  • nClass: a class with reference semantics that can have some data and methods implemented in R and others in C++, either code-generated or hand-coded. (nClass definitions inherit from R6 classes.)
  • nFunction: a function that can be compiled via C++, either code-generated or hand-coded, with static types. nClass methods are nFunctions.

Currently, the strategy for building nCompiler is to achieve working skeletons of all major design goals before fleshing out all details such as all function supported for C++ code-generation.

In more detail, some of the main goals for nCompiler and their status are as follows:

  • Make use of the Tensor classes of the Eigen C++ library as the core numeric objects. This differs from nimble, which code-generates for Eigen one- and two-dimensional arrays and matrices but does not support math above two dimensions. This works.
  • Code-generate C++ from R math and distributions and automatically interface to nFunctions. These features mean that a programmer can boost performance without directly coding any C++. This mostly works, although some gaps remain to be filled.
  • Code-generate C++ and automatically interface to nClasses. Interfaces can be "full", meaning there is a specialized class definition whose purpose it to access methods and fields in a compiled C++ object. Or an interface can be "generic", meaning there is simply an external pointer with ad hoc access to data and methods available when needed. The full interface design is inspired by but different from Rcpp modules. This works.
  • Provide basic flow-control structures such as if-then-else, for-loops, etc. This works but has room for generalization, particularly of for-loops.
  • Support pass-by-copy, pass-by-reference, and pass-by-block-reference. Pass-by-reference is important for efficient compiled execution. Pass-by-copy is important for R-like semantics. In nimble, code-generated C++ always uses pass-by-reference, but there is some inconsistent behavior between compiled and uncompiled execution. Pass-by-copy and pass-by-reference work in uncompiled and compiled execution.
  • Make use of the CppAD C++ library to provide automatic differentiation from nFunction code. This ports features from nimble that are development versions but are not released. It allows a programmer to simply declare that they need derivatives of a function and obtain them automatically. nCompiler generates the necessary CppAD code. This works but needs extensions for higher-order derivatives and other features.
  • Make use of the cereal C++ library for serialization. This will allow nClass objects to be naturally saved and loaded. Serialization code for cereal is automatically generated and used. This works, but only for basic types. Handling of objects that point to each other remains to be developed, as does coordination between R and C++ objects.
  • Allow nClass and nFunction code to be easily integrated into R packages. This works in a basic way but needs some enhancements.
  • Allow directly coded C++ and code-generated C++ to be mixed and matched. This works in a basic way.
  • Make use of TBB (Intel Threading Building Blocks) for automatic parallelization. The idea here is that a nClass or nFunction programmer will be able to specify where paralellization should happen, what objects need to be shared or copied across threads, and automatically generate a TBB implementation. This works in a basic way.
  • Support access to more kinds of native R objects. This has not been implemented in code-generation. It will be facilitied by Rcpp.
  • Harness many features of Rcpp: its compilation management; its C++ annotation for automatically generating R functions that interface to compiled functions (Rcpp::export) and automatically manage package dependencies (Rcpp::depends and Rcpp::plugin); its as<> and wrap<> C++ template system; and its classes for easily coding C++ that uses R objects. Most of these features are in use.

About

Code-generate C++ from R

Resources

Stars

64 stars

Watchers

7 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

nCompiler

nCompiler is designed to provide a new R development tool for code-generating C++ and easily interfacing between R and C++. It harnesses numerous packages, including:

  • Rcpp
  • Eigen (included via RcppEigen)
  • CppAD (included via RcppEigenAD)
  • Cereal (included via Rcereal)
  • Threading Building Blocks (in the future, to be included via RcppParallel)

An in-progress User Manual that gives brief examples of what works and outlines of future plans is here.

nCompiler grew out of the nimble (on CRAN and github) package. nimble is a framework for hierarchical statistical models and algorithms such as Markov chain Monte Carlo (MCMC). nimble includes the "nimble compiler", which code-generates C++ from models and algorithms written as nimbleFunctions. Basic math, including distributions, vectorized math and linear algebra, as well as basic flow control, is automatically generated and interfaced from R without directly coding any C++. The nimble developers recognized that the successful ideas from the nimble compiler could be redesigned and into a more general package that could provide a more general R programming tool. We dubbed this "nCompiler" to give a first-letter call-out to its nimble roots but emphasize its compiler capabilities.

nCompiler will provide a C++ code-generation and integration system to support:

  • Automatic C++ code-generation for many of R's math functions and possibly more R features.
  • Classes and functions that support mixing of R and C++.
  • Support for uncompiled execution (for debugging) or compiled execution of the same source code when possible.
  • Automatic differentiation.
  • Parallelization.
  • Saving and loading compiled objects.
  • Embedding nCompiler code into R packages.

Like nimble, nCompiler supports both uncompiled and compiled execution. Code to be compiled works in R. This means that one can debug program logic in R, which is typically easier than doing so in C++.

To learn more and see examples, go to the User Manual, which is really a mix of what works and future goals.

Specifically, nCompiler provides two basic constructs:

  • nClass: a class with reference semantics that can have some data and methods implemented in R and others in C++, either code-generated or hand-coded. (nClass definitions inherit from R6 classes.)
  • nFunction: a function that can be compiled via C++, either code-generated or hand-coded, with static types. nClass methods are nFunctions.

Currently, the strategy for building nCompiler is to achieve working skeletons of all major design goals before fleshing out all details such as all function supported for C++ code-generation.

In more detail, some of the main goals for nCompiler and their status are as follows:

  • Make use of the Tensor classes of the Eigen C++ library as the core numeric objects. This differs from nimble, which code-generates for Eigen one- and two-dimensional arrays and matrices but does not support math above two dimensions. This works.
  • Code-generate C++ from R math and distributions and automatically interface to nFunctions. These features mean that a programmer can boost performance without directly coding any C++. This mostly works, although some gaps remain to be filled.
  • Code-generate C++ and automatically interface to nClasses. Interfaces can be "full", meaning there is a specialized class definition whose purpose it to access methods and fields in a compiled C++ object. Or an interface can be "generic", meaning there is simply an external pointer with ad hoc access to data and methods available when needed. The full interface design is inspired by but different from Rcpp modules. This works.
  • Provide basic flow-control structures such as if-then-else, for-loops, etc. This works but has room for generalization, particularly of for-loops.
  • Support pass-by-copy, pass-by-reference, and pass-by-block-reference. Pass-by-reference is important for efficient compiled execution. Pass-by-copy is important for R-like semantics. In nimble, code-generated C++ always uses pass-by-reference, but there is some inconsistent behavior between compiled and uncompiled execution. Pass-by-copy and pass-by-reference work in uncompiled and compiled execution.
  • Make use of the CppAD C++ library to provide automatic differentiation from nFunction code. This ports features from nimble that are development versions but are not released. It allows a programmer to simply declare that they need derivatives of a function and obtain them automatically. nCompiler generates the necessary CppAD code. This works but needs extensions for higher-order derivatives and other features.
  • Make use of the cereal C++ library for serialization. This will allow nClass objects to be naturally saved and loaded. Serialization code for cereal is automatically generated and used. This works, but only for basic types. Handling of objects that point to each other remains to be developed, as does coordination between R and C++ objects.
  • Allow nClass and nFunction code to be easily integrated into R packages. This works in a basic way but needs some enhancements.
  • Allow directly coded C++ and code-generated C++ to be mixed and matched. This works in a basic way.
  • Make use of TBB (Intel Threading Building Blocks) for automatic parallelization. The idea here is that a nClass or nFunction programmer will be able to specify where paralellization should happen, what objects need to be shared or copied across threads, and automatically generate a TBB implementation. This works in a basic way.
  • Support access to more kinds of native R objects. This has not been implemented in code-generation. It will be facilitied by Rcpp.
  • Harness many features of Rcpp: its compilation management; its C++ annotation for automatically generating R functions that interface to compiled functions (Rcpp::export) and automatically manage package dependencies (Rcpp::depends and Rcpp::plugin); its as<> and wrap<> C++ template system; and its classes for easily coding C++ that uses R objects. Most of these features are in use.

About

Code-generate C++ from R

Resources

Stars

64 stars

Watchers

7 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

nCompiler

nCompiler is designed to provide a new R development tool for code-generating C++ and easily interfacing between R and C++. It harnesses numerous packages, including:

  • Rcpp
  • Eigen (included via RcppEigen)
  • CppAD (included via RcppEigenAD)
  • Cereal (included via Rcereal)
  • Threading Building Blocks (in the future, to be included via RcppParallel)

An in-progress User Manual that gives brief examples of what works and outlines of future plans is here.

nCompiler grew out of the nimble (on CRAN and github) package. nimble is a framework for hierarchical statistical models and algorithms such as Markov chain Monte Carlo (MCMC). nimble includes the "nimble compiler", which code-generates C++ from models and algorithms written as nimbleFunctions. Basic math, including distributions, vectorized math and linear algebra, as well as basic flow control, is automatically generated and interfaced from R without directly coding any C++. The nimble developers recognized that the successful ideas from the nimble compiler could be redesigned and into a more general package that could provide a more general R programming tool. We dubbed this "nCompiler" to give a first-letter call-out to its nimble roots but emphasize its compiler capabilities.

nCompiler will provide a C++ code-generation and integration system to support:

  • Automatic C++ code-generation for many of R's math functions and possibly more R features.
  • Classes and functions that support mixing of R and C++.
  • Support for uncompiled execution (for debugging) or compiled execution of the same source code when possible.
  • Automatic differentiation.
  • Parallelization.
  • Saving and loading compiled objects.
  • Embedding nCompiler code into R packages.

Like nimble, nCompiler supports both uncompiled and compiled execution. Code to be compiled works in R. This means that one can debug program logic in R, which is typically easier than doing so in C++.

To learn more and see examples, go to the User Manual, which is really a mix of what works and future goals.

Specifically, nCompiler provides two basic constructs:

  • nClass: a class with reference semantics that can have some data and methods implemented in R and others in C++, either code-generated or hand-coded. (nClass definitions inherit from R6 classes.)
  • nFunction: a function that can be compiled via C++, either code-generated or hand-coded, with static types. nClass methods are nFunctions.

Currently, the strategy for building nCompiler is to achieve working skeletons of all major design goals before fleshing out all details such as all function supported for C++ code-generation.

In more detail, some of the main goals for nCompiler and their status are as follows:

  • Make use of the Tensor classes of the Eigen C++ library as the core numeric objects. This differs from nimble, which code-generates for Eigen one- and two-dimensional arrays and matrices but does not support math above two dimensions. This works.
  • Code-generate C++ from R math and distributions and automatically interface to nFunctions. These features mean that a programmer can boost performance without directly coding any C++. This mostly works, although some gaps remain to be filled.
  • Code-generate C++ and automatically interface to nClasses. Interfaces can be "full", meaning there is a specialized class definition whose purpose it to access methods and fields in a compiled C++ object. Or an interface can be "generic", meaning there is simply an external pointer with ad hoc access to data and methods available when needed. The full interface design is inspired by but different from Rcpp modules. This works.
  • Provide basic flow-control structures such as if-then-else, for-loops, etc. This works but has room for generalization, particularly of for-loops.
  • Support pass-by-copy, pass-by-reference, and pass-by-block-reference. Pass-by-reference is important for efficient compiled execution. Pass-by-copy is important for R-like semantics. In nimble, code-generated C++ always uses pass-by-reference, but there is some inconsistent behavior between compiled and uncompiled execution. Pass-by-copy and pass-by-reference work in uncompiled and compiled execution.
  • Make use of the CppAD C++ library to provide automatic differentiation from nFunction code. This ports features from nimble that are development versions but are not released. It allows a programmer to simply declare that they need derivatives of a function and obtain them automatically. nCompiler generates the necessary CppAD code. This works but needs extensions for higher-order derivatives and other features.
  • Make use of the cereal C++ library for serialization. This will allow nClass objects to be naturally saved and loaded. Serialization code for cereal is automatically generated and used. This works, but only for basic types. Handling of objects that point to each other remains to be developed, as does coordination between R and C++ objects.
  • Allow nClass and nFunction code to be easily integrated into R packages. This works in a basic way but needs some enhancements.
  • Allow directly coded C++ and code-generated C++ to be mixed and matched. This works in a basic way.
  • Make use of TBB (Intel Threading Building Blocks) for automatic parallelization. The idea here is that a nClass or nFunction programmer will be able to specify where paralellization should happen, what objects need to be shared or copied across threads, and automatically generate a TBB implementation. This works in a basic way.
  • Support access to more kinds of native R objects. This has not been implemented in code-generation. It will be facilitied by Rcpp.
  • Harness many features of Rcpp: its compilation management; its C++ annotation for automatically generating R functions that interface to compiled functions (Rcpp::export) and automatically manage package dependencies (Rcpp::depends and Rcpp::plugin); its as<> and wrap<> C++ template system; and its classes for easily coding C++ that uses R objects. Most of these features are in use.

About

Code-generate C++ from R

Resources

Stars

64 stars

Watchers

7 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

nCompiler

nCompiler is designed to provide a new R development tool for code-generating C++ and easily interfacing between R and C++. It harnesses numerous packages, including:

  • Rcpp
  • Eigen (included via RcppEigen)
  • CppAD (included via RcppEigenAD)
  • Cereal (included via Rcereal)
  • Threading Building Blocks (in the future, to be included via RcppParallel)

An in-progress User Manual that gives brief examples of what works and outlines of future plans is here.

nCompiler grew out of the nimble (on CRAN and github) package. nimble is a framework for hierarchical statistical models and algorithms such as Markov chain Monte Carlo (MCMC). nimble includes the "nimble compiler", which code-generates C++ from models and algorithms written as nimbleFunctions. Basic math, including distributions, vectorized math and linear algebra, as well as basic flow control, is automatically generated and interfaced from R without directly coding any C++. The nimble developers recognized that the successful ideas from the nimble compiler could be redesigned and into a more general package that could provide a more general R programming tool. We dubbed this "nCompiler" to give a first-letter call-out to its nimble roots but emphasize its compiler capabilities.

nCompiler will provide a C++ code-generation and integration system to support:

  • Automatic C++ code-generation for many of R's math functions and possibly more R features.
  • Classes and functions that support mixing of R and C++.
  • Support for uncompiled execution (for debugging) or compiled execution of the same source code when possible.
  • Automatic differentiation.
  • Parallelization.
  • Saving and loading compiled objects.
  • Embedding nCompiler code into R packages.

Like nimble, nCompiler supports both uncompiled and compiled execution. Code to be compiled works in R. This means that one can debug program logic in R, which is typically easier than doing so in C++.

To learn more and see examples, go to the User Manual, which is really a mix of what works and future goals.

Specifically, nCompiler provides two basic constructs:

  • nClass: a class with reference semantics that can have some data and methods implemented in R and others in C++, either code-generated or hand-coded. (nClass definitions inherit from R6 classes.)
  • nFunction: a function that can be compiled via C++, either code-generated or hand-coded, with static types. nClass methods are nFunctions.

Currently, the strategy for building nCompiler is to achieve working skeletons of all major design goals before fleshing out all details such as all function supported for C++ code-generation.

In more detail, some of the main goals for nCompiler and their status are as follows:

  • Make use of the Tensor classes of the Eigen C++ library as the core numeric objects. This differs from nimble, which code-generates for Eigen one- and two-dimensional arrays and matrices but does not support math above two dimensions. This works.
  • Code-generate C++ from R math and distributions and automatically interface to nFunctions. These features mean that a programmer can boost performance without directly coding any C++. This mostly works, although some gaps remain to be filled.
  • Code-generate C++ and automatically interface to nClasses. Interfaces can be "full", meaning there is a specialized class definition whose purpose it to access methods and fields in a compiled C++ object. Or an interface can be "generic", meaning there is simply an external pointer with ad hoc access to data and methods available when needed. The full interface design is inspired by but different from Rcpp modules. This works.
  • Provide basic flow-control structures such as if-then-else, for-loops, etc. This works but has room for generalization, particularly of for-loops.
  • Support pass-by-copy, pass-by-reference, and pass-by-block-reference. Pass-by-reference is important for efficient compiled execution. Pass-by-copy is important for R-like semantics. In nimble, code-generated C++ always uses pass-by-reference, but there is some inconsistent behavior between compiled and uncompiled execution. Pass-by-copy and pass-by-reference work in uncompiled and compiled execution.
  • Make use of the CppAD C++ library to provide automatic differentiation from nFunction code. This ports features from nimble that are development versions but are not released. It allows a programmer to simply declare that they need derivatives of a function and obtain them automatically. nCompiler generates the necessary CppAD code. This works but needs extensions for higher-order derivatives and other features.
  • Make use of the cereal C++ library for serialization. This will allow nClass objects to be naturally saved and loaded. Serialization code for cereal is automatically generated and used. This works, but only for basic types. Handling of objects that point to each other remains to be developed, as does coordination between R and C++ objects.
  • Allow nClass and nFunction code to be easily integrated into R packages. This works in a basic way but needs some enhancements.
  • Allow directly coded C++ and code-generated C++ to be mixed and matched. This works in a basic way.
  • Make use of TBB (Intel Threading Building Blocks) for automatic parallelization. The idea here is that a nClass or nFunction programmer will be able to specify where paralellization should happen, what objects need to be shared or copied across threads, and automatically generate a TBB implementation. This works in a basic way.
  • Support access to more kinds of native R objects. This has not been implemented in code-generation. It will be facilitied by Rcpp.
  • Harness many features of Rcpp: its compilation management; its C++ annotation for automatically generating R functions that interface to compiled functions (Rcpp::export) and automatically manage package dependencies (Rcpp::depends and Rcpp::plugin); its as<> and wrap<> C++ template system; and its classes for easily coding C++ that uses R objects. Most of these features are in use.

About

Code-generate C++ from R

Resources

Stars

64 stars

Watchers

7 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

nCompiler

nCompiler is designed to provide a new R development tool for code-generating C++ and easily interfacing between R and C++. It harnesses numerous packages, including:

  • Rcpp
  • Eigen (included via RcppEigen)
  • CppAD (included via RcppEigenAD)
  • Cereal (included via Rcereal)
  • Threading Building Blocks (in the future, to be included via RcppParallel)

An in-progress User Manual that gives brief examples of what works and outlines of future plans is here.

nCompiler grew out of the nimble (on CRAN and github) package. nimble is a framework for hierarchical statistical models and algorithms such as Markov chain Monte Carlo (MCMC). nimble includes the "nimble compiler", which code-generates C++ from models and algorithms written as nimbleFunctions. Basic math, including distributions, vectorized math and linear algebra, as well as basic flow control, is automatically generated and interfaced from R without directly coding any C++. The nimble developers recognized that the successful ideas from the nimble compiler could be redesigned and into a more general package that could provide a more general R programming tool. We dubbed this "nCompiler" to give a first-letter call-out to its nimble roots but emphasize its compiler capabilities.

nCompiler will provide a C++ code-generation and integration system to support:

  • Automatic C++ code-generation for many of R's math functions and possibly more R features.
  • Classes and functions that support mixing of R and C++.
  • Support for uncompiled execution (for debugging) or compiled execution of the same source code when possible.
  • Automatic differentiation.
  • Parallelization.
  • Saving and loading compiled objects.
  • Embedding nCompiler code into R packages.

Like nimble, nCompiler supports both uncompiled and compiled execution. Code to be compiled works in R. This means that one can debug program logic in R, which is typically easier than doing so in C++.

To learn more and see examples, go to the User Manual, which is really a mix of what works and future goals.

Specifically, nCompiler provides two basic constructs:

  • nClass: a class with reference semantics that can have some data and methods implemented in R and others in C++, either code-generated or hand-coded. (nClass definitions inherit from R6 classes.)
  • nFunction: a function that can be compiled via C++, either code-generated or hand-coded, with static types. nClass methods are nFunctions.

Currently, the strategy for building nCompiler is to achieve working skeletons of all major design goals before fleshing out all details such as all function supported for C++ code-generation.

In more detail, some of the main goals for nCompiler and their status are as follows:

  • Make use of the Tensor classes of the Eigen C++ library as the core numeric objects. This differs from nimble, which code-generates for Eigen one- and two-dimensional arrays and matrices but does not support math above two dimensions. This works.
  • Code-generate C++ from R math and distributions and automatically interface to nFunctions. These features mean that a programmer can boost performance without directly coding any C++. This mostly works, although some gaps remain to be filled.
  • Code-generate C++ and automatically interface to nClasses. Interfaces can be "full", meaning there is a specialized class definition whose purpose it to access methods and fields in a compiled C++ object. Or an interface can be "generic", meaning there is simply an external pointer with ad hoc access to data and methods available when needed. The full interface design is inspired by but different from Rcpp modules. This works.
  • Provide basic flow-control structures such as if-then-else, for-loops, etc. This works but has room for generalization, particularly of for-loops.
  • Support pass-by-copy, pass-by-reference, and pass-by-block-reference. Pass-by-reference is important for efficient compiled execution. Pass-by-copy is important for R-like semantics. In nimble, code-generated C++ always uses pass-by-reference, but there is some inconsistent behavior between compiled and uncompiled execution. Pass-by-copy and pass-by-reference work in uncompiled and compiled execution.
  • Make use of the CppAD C++ library to provide automatic differentiation from nFunction code. This ports features from nimble that are development versions but are not released. It allows a programmer to simply declare that they need derivatives of a function and obtain them automatically. nCompiler generates the necessary CppAD code. This works but needs extensions for higher-order derivatives and other features.
  • Make use of the cereal C++ library for serialization. This will allow nClass objects to be naturally saved and loaded. Serialization code for cereal is automatically generated and used. This works, but only for basic types. Handling of objects that point to each other remains to be developed, as does coordination between R and C++ objects.
  • Allow nClass and nFunction code to be easily integrated into R packages. This works in a basic way but needs some enhancements.
  • Allow directly coded C++ and code-generated C++ to be mixed and matched. This works in a basic way.
  • Make use of TBB (Intel Threading Building Blocks) for automatic parallelization. The idea here is that a nClass or nFunction programmer will be able to specify where paralellization should happen, what objects need to be shared or copied across threads, and automatically generate a TBB implementation. This works in a basic way.
  • Support access to more kinds of native R objects. This has not been implemented in code-generation. It will be facilitied by Rcpp.
  • Harness many features of Rcpp: its compilation management; its C++ annotation for automatically generating R functions that interface to compiled functions (Rcpp::export) and automatically manage package dependencies (Rcpp::depends and Rcpp::plugin); its as<> and wrap<> C++ template system; and its classes for easily coding C++ that uses R objects. Most of these features are in use.

About

Code-generate C++ from R

Resources

Stars

64 stars

Watchers

7 watching

Forks

Releases

Packages

Used by

Contributors

Languages