Skip to content

Commit

Permalink
simplify
Browse files Browse the repository at this point in the history
  • Loading branch information
joshgoebel committed Dec 7, 2021
1 parent 0f181b0 commit 54f14dc
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 55 deletions.
70 changes: 26 additions & 44 deletions src/languages/stan.js
Expand Up @@ -7,6 +7,7 @@ Category: scientific
*/

export default function(hljs) {
const regex = hljs.regex;
// variable names cannot conflict with block identifiers
const BLOCKS = [
'functions',
Expand All @@ -29,7 +30,7 @@ export default function(hljs) {
'return'
];

const VAR_TYPES = [
const TYPES = [
'array',
'complex',
'int',
Expand Down Expand Up @@ -377,7 +378,6 @@ export default function(hljs) {
className: 'meta',
begin: /#include\b/,
end: /$/,
relevance: 0, // relevance comes from keywords
contains: [
{
match: /[a-z][a-z-.]+/,
Expand All @@ -387,27 +387,21 @@ export default function(hljs) {
]
};

const numberRegex = new RegExp([
// Comes from @RunDevelopment accessed 11/29/2021 at
// https://github.com/PrismJS/prism/blob/c53ad2e65b7193ab4f03a1797506a54bbb33d5a2/components/prism-stan.js#L56

// start of big noncapture group which
// 1. gets numbers that are by themselves
// 2. numbers that are separated by _
// 3. numbers that are separted by .
/(?:\b\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\B\.\d+(?:_\d+)*)/,
// grabs scientific notation
// grabs complex numbers with i
/(?:[eE][+-]?\d+(?:_\d+)*)?i?(?!\w)/
].map(function(r) { return r.source; }).join(''), 'i');
const RANGE_CONSTRAINTS = [
"lower",
"upper",
"offset",
"multiplier"
];

return {
name: 'Stan',
aliases: [ 'stanfuncs' ],
keywords: {
$pattern: hljs.IDENT_RE,
title: BLOCKS,
keyword: STATEMENTS.concat(VAR_TYPES),
type: TYPES,
keyword: STATEMENTS,
built_in: FUNCTIONS
},
contains: [
Expand All @@ -421,28 +415,8 @@ export default function(hljs) {
relevance: 0
},
{
// hack: in range constraints, lower must follow either , or <
// <upper = ..., lower = ...> or <lower = ...>
begin: /[<,]\s*lower\s*=/,
keywords: 'lower'
},
{
// hack: in range constraints, upper must follow either , or <
// <lower = ..., upper = ...> or <upper = ...>
begin: /[<,]\s*upper\s*=/,
keywords: 'upper'
},
{
// hack: in range constraints, upper must follow either , or <
// <multiplier = ..., offest = ...> or <offset = ...>
begin: /[<,]\s*offset\s*=/,
keywords: 'offset'
},
{
// hack: in range constraints, upper must follow either , or <
// <offset = ..., multiplier = ...> or <multiplier = ...>
begin: /[<,]\s*multiplier\s*=/,
keywords: 'multiplier'
begin: regex.concat(/[<,]\s*/, regex.either(...RANGE_CONSTRAINTS), /\s*=/),
keywords: RANGE_CONSTRAINTS
},
{
className: 'keyword',
Expand Down Expand Up @@ -485,17 +459,25 @@ export default function(hljs) {
},
{
className: 'number',
variants: [
{ begin: numberRegex },
{ begin: /\.\d+(?:[eE][+-]?\d+)?\b/ }
],
begin: regex.concat(
// Comes from @RunDevelopment accessed 11/29/2021 at
// https://github.com/PrismJS/prism/blob/c53ad2e65b7193ab4f03a1797506a54bbb33d5a2/components/prism-stan.js#L56

// start of big noncapture group which
// 1. gets numbers that are by themselves
// 2. numbers that are separated by _
// 3. numbers that are separted by .
/(?:\b\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\B\.\d+(?:_\d+)*)/,
// grabs scientific notation
// grabs complex numbers with i
/(?:[eE][+-]?\d+(?:_\d+)*)?i?(?!\w)/
),
relevance: 0
},
{
className: 'string',
begin: '"',
end: '"',
relevance: 0
end: '"'
}
]
};
Expand Down
22 changes: 11 additions & 11 deletions test/markup/stan/default.expect.txt
Expand Up @@ -2,20 +2,20 @@
<span class="hljs-meta">#include <span class="hljs-string">normal</span>_<span class="hljs-string">copula.stanfunctions</span></span>
}
<span class="hljs-title">data</span> {
<span class="hljs-keyword">int</span>&lt;<span class="hljs-keyword">lower</span>=<span class="hljs-number">0</span>&gt; N;
<span class="hljs-keyword">int</span> K;
<span class="hljs-keyword">matrix</span>[N, K] x;
<span class="hljs-type">int</span>&lt;<span class="hljs-keyword">lower</span>=<span class="hljs-number">0</span>&gt; N;
<span class="hljs-type">int</span> K;
<span class="hljs-type">matrix</span>[N, K] x;
}
<span class="hljs-title">transformed</span> <span class="hljs-title">data</span> {
<span class="hljs-keyword">complex</span> zi = <span class="hljs-number">1</span>+<span class="hljs-number">3.14i</span>;
<span class="hljs-type">complex</span> zi = <span class="hljs-number">1</span>+<span class="hljs-number">3.14i</span>;
zi = zi * <span class="hljs-number">0i</span>;
<span class="hljs-keyword">complex</span> yi = <span class="hljs-built_in">to_complex</span>(<span class="hljs-number">0</span>, <span class="hljs-number">1.1</span>) + <span class="hljs-built_in">to_complex</span>(<span class="hljs-number">0.0</span>, <span class="hljs-number">2.2</span>) + <span class="hljs-built_in">to_complex</span>();
<span class="hljs-keyword">real</span> x = <span class="hljs-built_in">get_real</span>(<span class="hljs-number">3i</span> - <span class="hljs-number">40e-3i</span> + <span class="hljs-number">1e10i</span>);
<span class="hljs-type">complex</span> yi = <span class="hljs-built_in">to_complex</span>(<span class="hljs-number">0</span>, <span class="hljs-number">1.1</span>) + <span class="hljs-built_in">to_complex</span>(<span class="hljs-number">0.0</span>, <span class="hljs-number">2.2</span>) + <span class="hljs-built_in">to_complex</span>();
<span class="hljs-type">real</span> x = <span class="hljs-built_in">get_real</span>(<span class="hljs-number">3i</span> - <span class="hljs-number">40e-3i</span> + <span class="hljs-number">1e10i</span>);
}›
<span class="hljs-title">parameters</span> {
<span class="hljs-keyword">array</span>[K - <span class="hljs-number">1</span>] <span class="hljs-keyword">real</span> mu;
<span class="hljs-keyword">array</span>[K + <span class="hljs-number">1</span>] <span class="hljs-keyword">real</span>&lt;<span class="hljs-keyword">lower</span>=<span class="hljs-number">0</span>&gt; sigma;
<span class="hljs-keyword">cholesky_factor_corr</span>[K] L;
<span class="hljs-type">array</span>[K - <span class="hljs-number">1</span>] <span class="hljs-type">real</span> mu;
<span class="hljs-type">array</span>[K + <span class="hljs-number">1</span>] <span class="hljs-type">real</span>&lt;<span class="hljs-keyword">lower</span>=<span class="hljs-number">0</span>&gt; sigma;
<span class="hljs-type">cholesky_factor_corr</span>[K] L;
}
<span class="hljs-title">model</span> {
<span class="hljs-keyword">target </span>+= <span class="hljs-built_in">normal_lpdf</span>(x[ : , <span class="hljs-number">1</span>] | mu[<span class="hljs-number">1</span>], sigma[<span class="hljs-number">1</span>]);
Expand All @@ -24,7 +24,7 @@
<span class="hljs-keyword">target </span>+= <span class="hljs-built_in">weibull_lpdf</span>(x[ : , <span class="hljs-number">4</span>] | sigma[<span class="hljs-number">4</span>], sigma[<span class="hljs-number">5</span>]);

{
<span class="hljs-keyword">matrix</span>[K, N] y;
<span class="hljs-type">matrix</span>[K, N] y;
<span class="hljs-keyword">for</span> (n <span class="hljs-keyword">in</span> <span class="hljs-number">1</span> : N) {
y[<span class="hljs-number">1</span>, n] = <span class="hljs-built_in">inv_Phi</span>(<span class="hljs-built_in">normal_cdf</span>(x[n, <span class="hljs-number">1</span>] | mu[<span class="hljs-number">1</span>], sigma[<span class="hljs-number">1</span>]));
y[<span class="hljs-number">2</span>, n] = <span class="hljs-built_in">inv_Phi</span>(<span class="hljs-built_in">gumbel_cdf</span>(x[n, <span class="hljs-number">2</span>] | mu[<span class="hljs-number">2</span>], sigma[<span class="hljs-number">2</span>]));
Expand All @@ -36,5 +36,5 @@
}
}
<span class="hljs-title">generated</span> <span class="hljs-title">quantities</span> {
<span class="hljs-keyword">matrix</span>[K, K] Sigma = <span class="hljs-built_in">multiply_lower_tri_self_transpose</span>(L);
<span class="hljs-type">matrix</span>[K, K] Sigma = <span class="hljs-built_in">multiply_lower_tri_self_transpose</span>(L);
}

0 comments on commit 54f14dc

Please sign in to comment.