hilbert 0.0.2700000
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +15 -0
- data/.coveralls.yml +2 -0
- data/.gitignore +23 -0
- data/.rubocop.yml +25 -0
- data/.travis.yml +5 -0
- data/Gemfile +9 -0
- data/Guardfile +33 -0
- data/LICENSE.txt +22 -0
- data/README.md +159 -0
- data/Rakefile +20 -0
- data/bin/qlang +29 -0
- data/core/Q/Lexer.hs +9 -0
- data/core/Q/Parser.hs +9 -0
- data/core/Q.hs +19 -0
- data/ext/qlang/QMatrix/q_matrix.c +0 -0
- data/ext/qlang/extconf.rb +3 -0
- data/ext/qlang/qlang.c +65 -0
- data/ext/qlang/qlang.h +6 -0
- data/legacy_rspec/langs/Haskell/ex1_after.hs +74 -0
- data/legacy_rspec/langs/Haskell/ex1_before.hs +74 -0
- data/legacy_rspec/langs/Python/ex1_after.py +93 -0
- data/legacy_rspec/langs/Python/ex1_before.py +95 -0
- data/legacy_rspec/langs/R/ex1_after.R +89 -0
- data/legacy_rspec/langs/R/ex1_before.R +89 -0
- data/legacy_rspec/objects/list_spec.rb +31 -0
- data/legacy_rspec/objects/matrix_spec.rb +55 -0
- data/legacy_rspec/objects/vector_spec.rb +47 -0
- data/lib/qlang/api/func_api.rb +17 -0
- data/lib/qlang/api/integral_api.rb +16 -0
- data/lib/qlang/api/limit_api.rb +22 -0
- data/lib/qlang/api/list_api.rb +16 -0
- data/lib/qlang/api/matrix_api.rb +20 -0
- data/lib/qlang/api/sigma_api.rb +16 -0
- data/lib/qlang/api/vector_api.rb +19 -0
- data/lib/qlang/api.rb +23 -0
- data/lib/qlang/exec.rb +64 -0
- data/lib/qlang/iq.rb +45 -0
- data/lib/qlang/lexer/base.rb +107 -0
- data/lib/qlang/lexer/formula_lexer.rb +20 -0
- data/lib/qlang/lexer/main_lexer.rb +34 -0
- data/lib/qlang/lexer/tokens.rb +94 -0
- data/lib/qlang/lexer.rb +11 -0
- data/lib/qlang/meta_info.rb +27 -0
- data/lib/qlang/parser/base.rb +7 -0
- data/lib/qlang/parser/formula_parser.rb +36 -0
- data/lib/qlang/parser/func_parser.rb +15 -0
- data/lib/qlang/parser/integral_parser.rb +15 -0
- data/lib/qlang/parser/limit_parser.rb +16 -0
- data/lib/qlang/parser/list_parser.rb +12 -0
- data/lib/qlang/parser/matrix_parser.rb +17 -0
- data/lib/qlang/parser/sigma_parser.rb +17 -0
- data/lib/qlang/parser/vector_parser.rb +13 -0
- data/lib/qlang/parser.rb +101 -0
- data/lib/qlang/utils/langs.yml +7 -0
- data/lib/qlang/utils/ruby_ext.rb +54 -0
- data/lib/qlang/version.rb +3 -0
- data/lib/qlang.rb +37 -0
- data/qlang.gemspec +28 -0
- data/test/internal/test_tokens.rb +35 -0
- data/test/interpreter/base.rb +17 -0
- data/test/interpreter/test_differential.rb +43 -0
- data/test/interpreter/test_function.rb +44 -0
- data/test/interpreter/test_general.rb +12 -0
- data/test/interpreter/test_integral.rb +38 -0
- data/test/interpreter/test_limit.rb +37 -0
- data/test/interpreter/test_matrix.rb +70 -0
- data/test/interpreter/test_sigma.rb +25 -0
- data/test/interpreter/test_vector.rb +28 -0
- data/test/langs/test_r.rb +32 -0
- data/test/langs/test_ruby.rb +9 -0
- data/test/minitest_helper.rb +8 -0
- data/test/q_matrix/test_q_matrix.rb +13 -0
- data/test/test_qlang.rb +24 -0
- metadata +203 -0
@@ -0,0 +1,93 @@
|
|
1
|
+
from __future__ import division, print_function, absolute_import
|
2
|
+
|
3
|
+
__all__ = ['fixed_quad','quadrature','romberg','trapz','simps','romb',
|
4
|
+
'cumtrapz','newton_cotes']
|
5
|
+
|
6
|
+
from scipy.special.orthogonal import p_roots
|
7
|
+
from scipy.special import gammaln
|
8
|
+
from numpy import sum, ones, add, diff, isinf, isscalar, \
|
9
|
+
asarray, real, trapz, arange, empty
|
10
|
+
import numpy as np
|
11
|
+
import math
|
12
|
+
import warnings
|
13
|
+
|
14
|
+
from scipy.lib.six import xrange
|
15
|
+
|
16
|
+
|
17
|
+
class AccuracyWarning(Warning):
|
18
|
+
pass
|
19
|
+
|
20
|
+
|
21
|
+
def _cached_p_roots(n):
|
22
|
+
|
23
|
+
if n in _cached_p_roots.cache:
|
24
|
+
return _cached_p_roots.cache[n]
|
25
|
+
|
26
|
+
_cached_p_roots.cache[n] = p_roots(n)
|
27
|
+
return _cached_p_roots.cache[n]
|
28
|
+
_cached_p_roots.cache = dict()
|
29
|
+
|
30
|
+
|
31
|
+
def fixed_quad(func,a,b,args=(),n=5):
|
32
|
+
a = array([1, 3, 4])
|
33
|
+
|
34
|
+
[x,w] = _cached_p_roots(n)
|
35
|
+
x = real(x)
|
36
|
+
ainf, binf = map(isinf,(a,b))
|
37
|
+
if ainf or binf:
|
38
|
+
raise ValueError("Gaussian quadrature is only available for "
|
39
|
+
"finite limits.")
|
40
|
+
y = (b-a)*(x+1)/2.0 + a
|
41
|
+
return (b-a)/2.0*sum(w*func(y,*args),0), None
|
42
|
+
|
43
|
+
|
44
|
+
def vectorize1(func, args=(), vec_func=False):
|
45
|
+
if vec_func:
|
46
|
+
def vfunc(x):
|
47
|
+
return func(x, *args)
|
48
|
+
else:
|
49
|
+
def vfunc(x):
|
50
|
+
if isscalar(x):
|
51
|
+
return func(x, *args)
|
52
|
+
x = asarray(x)
|
53
|
+
# call with first point to get output type
|
54
|
+
y0 = func(x[0], *args)
|
55
|
+
n = len(x)
|
56
|
+
if hasattr(y0, 'dtype'):
|
57
|
+
output = empty((n,), dtype=y0.dtype)
|
58
|
+
else:
|
59
|
+
output = empty((n,), dtype=type(y0))
|
60
|
+
output[0] = y0
|
61
|
+
for i in xrange(1, n):
|
62
|
+
output[i] = func(x[i], *args)
|
63
|
+
return output
|
64
|
+
return vfunc
|
65
|
+
|
66
|
+
|
67
|
+
def quadrature(func, a, b, args=(), tol=1.49e-8, rtol=1.49e-8, maxiter=50,
|
68
|
+
vec_func=True, miniter=1):
|
69
|
+
|
70
|
+
if not isinstance(args, tuple):
|
71
|
+
args = (args,)
|
72
|
+
vfunc = vectorize1(func, args, vec_func=vec_func)
|
73
|
+
val = np.inf
|
74
|
+
err = np.inf
|
75
|
+
maxiter = max(miniter+1, maxiter)
|
76
|
+
for n in xrange(miniter, maxiter+1):
|
77
|
+
newval = fixed_quad(vfunc, a, b, (), n)[0]
|
78
|
+
err = abs(newval-val)
|
79
|
+
val = newval
|
80
|
+
|
81
|
+
if err < tol or err < rtol*abs(val):
|
82
|
+
break
|
83
|
+
else:
|
84
|
+
warnings.warn(
|
85
|
+
"maxiter (%d) exceeded. Latest difference = %e" % (maxiter, err),
|
86
|
+
AccuracyWarning)
|
87
|
+
return val, err
|
88
|
+
|
89
|
+
|
90
|
+
def tupleset(t, i, value):
|
91
|
+
l = list(t)
|
92
|
+
l[i] = value
|
93
|
+
return tuple(l)
|
@@ -0,0 +1,95 @@
|
|
1
|
+
from __future__ import division, print_function, absolute_import
|
2
|
+
|
3
|
+
__all__ = ['fixed_quad','quadrature','romberg','trapz','simps','romb',
|
4
|
+
'cumtrapz','newton_cotes']
|
5
|
+
|
6
|
+
from scipy.special.orthogonal import p_roots
|
7
|
+
from scipy.special import gammaln
|
8
|
+
from numpy import sum, ones, add, diff, isinf, isscalar, \
|
9
|
+
asarray, real, trapz, arange, empty
|
10
|
+
import numpy as np
|
11
|
+
import math
|
12
|
+
import warnings
|
13
|
+
|
14
|
+
from scipy.lib.six import xrange
|
15
|
+
|
16
|
+
|
17
|
+
class AccuracyWarning(Warning):
|
18
|
+
pass
|
19
|
+
|
20
|
+
|
21
|
+
def _cached_p_roots(n):
|
22
|
+
|
23
|
+
if n in _cached_p_roots.cache:
|
24
|
+
return _cached_p_roots.cache[n]
|
25
|
+
|
26
|
+
_cached_p_roots.cache[n] = p_roots(n)
|
27
|
+
return _cached_p_roots.cache[n]
|
28
|
+
_cached_p_roots.cache = dict()
|
29
|
+
|
30
|
+
|
31
|
+
def fixed_quad(func,a,b,args=(),n=5):
|
32
|
+
I love mathematics.
|
33
|
+
a = (1 3 4)
|
34
|
+
Q.E.D
|
35
|
+
|
36
|
+
[x,w] = _cached_p_roots(n)
|
37
|
+
x = real(x)
|
38
|
+
ainf, binf = map(isinf,(a,b))
|
39
|
+
if ainf or binf:
|
40
|
+
raise ValueError("Gaussian quadrature is only available for "
|
41
|
+
"finite limits.")
|
42
|
+
y = (b-a)*(x+1)/2.0 + a
|
43
|
+
return (b-a)/2.0*sum(w*func(y,*args),0), None
|
44
|
+
|
45
|
+
|
46
|
+
def vectorize1(func, args=(), vec_func=False):
|
47
|
+
if vec_func:
|
48
|
+
def vfunc(x):
|
49
|
+
return func(x, *args)
|
50
|
+
else:
|
51
|
+
def vfunc(x):
|
52
|
+
if isscalar(x):
|
53
|
+
return func(x, *args)
|
54
|
+
x = asarray(x)
|
55
|
+
# call with first point to get output type
|
56
|
+
y0 = func(x[0], *args)
|
57
|
+
n = len(x)
|
58
|
+
if hasattr(y0, 'dtype'):
|
59
|
+
output = empty((n,), dtype=y0.dtype)
|
60
|
+
else:
|
61
|
+
output = empty((n,), dtype=type(y0))
|
62
|
+
output[0] = y0
|
63
|
+
for i in xrange(1, n):
|
64
|
+
output[i] = func(x[i], *args)
|
65
|
+
return output
|
66
|
+
return vfunc
|
67
|
+
|
68
|
+
|
69
|
+
def quadrature(func, a, b, args=(), tol=1.49e-8, rtol=1.49e-8, maxiter=50,
|
70
|
+
vec_func=True, miniter=1):
|
71
|
+
|
72
|
+
if not isinstance(args, tuple):
|
73
|
+
args = (args,)
|
74
|
+
vfunc = vectorize1(func, args, vec_func=vec_func)
|
75
|
+
val = np.inf
|
76
|
+
err = np.inf
|
77
|
+
maxiter = max(miniter+1, maxiter)
|
78
|
+
for n in xrange(miniter, maxiter+1):
|
79
|
+
newval = fixed_quad(vfunc, a, b, (), n)[0]
|
80
|
+
err = abs(newval-val)
|
81
|
+
val = newval
|
82
|
+
|
83
|
+
if err < tol or err < rtol*abs(val):
|
84
|
+
break
|
85
|
+
else:
|
86
|
+
warnings.warn(
|
87
|
+
"maxiter (%d) exceeded. Latest difference = %e" % (maxiter, err),
|
88
|
+
AccuracyWarning)
|
89
|
+
return val, err
|
90
|
+
|
91
|
+
|
92
|
+
def tupleset(t, i, value):
|
93
|
+
l = list(t)
|
94
|
+
l[i] = value
|
95
|
+
return tuple(l)
|
@@ -0,0 +1,89 @@
|
|
1
|
+
if (base::getRversion() >= "2.15.1") {
|
2
|
+
utils::globalVariables(c("county.fips", "long", "lat", "group", "value", "label", "zipcode", "longitude", "latitude", "value"))
|
3
|
+
}
|
4
|
+
|
5
|
+
bind_df_to_zip_map = function(df)
|
6
|
+
{
|
7
|
+
stopifnot(c("region", "value") %in% colnames(df))
|
8
|
+
df = rename(df, replace=c("region" = "zip"))
|
9
|
+
|
10
|
+
data(zipcode, package="zipcode", envir=environment())
|
11
|
+
choropleth = merge(zipcode, df, all.x=F, all.y=T);
|
12
|
+
|
13
|
+
choropleth = choropleth[choropleth$longitude < -10, ]
|
14
|
+
}
|
15
|
+
|
16
|
+
print_zip_choropleth = function(choropleth.df, states, scaleName, theme, min, max)
|
17
|
+
{
|
18
|
+
stopifnot(states %in% state.abb)
|
19
|
+
|
20
|
+
a = c(1, 3, 4)
|
21
|
+
|
22
|
+
state.df = subset_map("state", states)
|
23
|
+
colnames(state.df)[names(state.df) == "long"] = "longitude"
|
24
|
+
colnames(state.df)[names(state.df) == "lat"] = "latitude"
|
25
|
+
state.df = arrange(state.df, group, order);
|
26
|
+
|
27
|
+
if (is.numeric(choropleth.df$value))
|
28
|
+
{
|
29
|
+
ggplot(choropleth.df, aes(x=longitude, y=latitude, color=value)) +
|
30
|
+
geom_point() +
|
31
|
+
scale_color_continuous(scaleName, labels=comma) +
|
32
|
+
geom_polygon(data = state.df, color = "black", fill = NA, size = 0.2, aes(group=group)) +
|
33
|
+
theme;
|
34
|
+
} else {
|
35
|
+
stopifnot(length(unique(na.omit(choropleth.df$value))) <= 9)
|
36
|
+
ggplot(choropleth.df, aes(x=longitude, y=latitude, color=value)) +
|
37
|
+
geom_point() +
|
38
|
+
scale_colour_brewer(scaleName, labels=comma) +
|
39
|
+
geom_polygon(data = state.df, color = "black", fill = NA, size = 0.2, aes(group=group)) +
|
40
|
+
theme;
|
41
|
+
}
|
42
|
+
}
|
43
|
+
|
44
|
+
render_zip_choropleth = function(choropleth.df, title="", scaleName="", states=state.abb, renderAsInsets=TRUE)
|
45
|
+
{
|
46
|
+
choropleth.df = choropleth.df[choropleth.df$state %in% states, ]
|
47
|
+
|
48
|
+
min_val = 0
|
49
|
+
max_val = 0
|
50
|
+
if (is.numeric(choropleth.df$value))
|
51
|
+
{
|
52
|
+
min_val = min(choropleth.df$value)
|
53
|
+
max_val = max(choropleth.df$value)
|
54
|
+
}
|
55
|
+
|
56
|
+
if (length(states) == length(state.abb) &&
|
57
|
+
states == state.abb &&
|
58
|
+
renderAsInsets)
|
59
|
+
{
|
60
|
+
alaska.df = choropleth.df[choropleth.df$state=="AK",]
|
61
|
+
alaska.ggplot = print_zip_choropleth(alaska.df, "AK", "", theme_inset(), min_val, max_val)
|
62
|
+
alaska.grob = ggplotGrob(alaska.ggplot)
|
63
|
+
|
64
|
+
hawaii.df = choropleth.df[choropleth.df$state=="HI",]
|
65
|
+
hawaii.ggplot = print_zip_choropleth(hawaii.df, "HI", "", theme_inset(), min_val, max_val)
|
66
|
+
hawaii.grob = ggplotGrob(hawaii.ggplot)
|
67
|
+
|
68
|
+
choropleth.df = choropleth.df[!choropleth.df$state %in% c("AK", "HI"), ]
|
69
|
+
choropleth = print_zip_choropleth(choropleth.df, setdiff(state.abb, c("AK", "HI")), scaleName, theme_clean(), min_val, max_val) + ggtitle(title)
|
70
|
+
|
71
|
+
choropleth = choropleth +
|
72
|
+
annotation_custom(grobTree(hawaii.grob), xmin=-107.5, xmax=-102.5, ymin=25, ymax=27.5) +
|
73
|
+
annotation_custom(grobTree(alaska.grob), xmin=-125, xmax=-110, ymin=22.5, ymax=30)
|
74
|
+
|
75
|
+
} else {
|
76
|
+
choropleth = print_zip_choropleth(choropleth.df, states, scaleName, theme_clean(), min_val, max_val) + ggtitle(title)
|
77
|
+
}
|
78
|
+
|
79
|
+
choropleth
|
80
|
+
}
|
81
|
+
|
82
|
+
zip_choropleth_auto = function(df, num_buckets = 9, title = "", scaleName = "", states, renderAsInsets)
|
83
|
+
{
|
84
|
+
df = clip_df(df, "zip", states)
|
85
|
+
df = discretize_df(df, num_buckets)
|
86
|
+
|
87
|
+
choropleth.df = bind_df_to_zip_map(df)
|
88
|
+
render_zip_choropleth(choropleth.df, title, scaleName, states, renderAsInsets)
|
89
|
+
}
|
@@ -0,0 +1,89 @@
|
|
1
|
+
if (base::getRversion() >= "2.15.1") {
|
2
|
+
utils::globalVariables(c("county.fips", "long", "lat", "group", "value", "label", "zipcode", "longitude", "latitude", "value"))
|
3
|
+
}
|
4
|
+
|
5
|
+
bind_df_to_zip_map = function(df)
|
6
|
+
{
|
7
|
+
stopifnot(c("region", "value") %in% colnames(df))
|
8
|
+
df = rename(df, replace=c("region" = "zip"))
|
9
|
+
|
10
|
+
data(zipcode, package="zipcode", envir=environment())
|
11
|
+
choropleth = merge(zipcode, df, all.x=F, all.y=T);
|
12
|
+
|
13
|
+
choropleth = choropleth[choropleth$longitude < -10, ]
|
14
|
+
}
|
15
|
+
|
16
|
+
print_zip_choropleth = function(choropleth.df, states, scaleName, theme, min, max)
|
17
|
+
{
|
18
|
+
stopifnot(states %in% state.abb)
|
19
|
+
I love mathematics.
|
20
|
+
a = (1 3 4)
|
21
|
+
Q.E.D
|
22
|
+
state.df = subset_map("state", states)
|
23
|
+
colnames(state.df)[names(state.df) == "long"] = "longitude"
|
24
|
+
colnames(state.df)[names(state.df) == "lat"] = "latitude"
|
25
|
+
state.df = arrange(state.df, group, order);
|
26
|
+
|
27
|
+
if (is.numeric(choropleth.df$value))
|
28
|
+
{
|
29
|
+
ggplot(choropleth.df, aes(x=longitude, y=latitude, color=value)) +
|
30
|
+
geom_point() +
|
31
|
+
scale_color_continuous(scaleName, labels=comma) +
|
32
|
+
geom_polygon(data = state.df, color = "black", fill = NA, size = 0.2, aes(group=group)) +
|
33
|
+
theme;
|
34
|
+
} else {
|
35
|
+
stopifnot(length(unique(na.omit(choropleth.df$value))) <= 9)
|
36
|
+
ggplot(choropleth.df, aes(x=longitude, y=latitude, color=value)) +
|
37
|
+
geom_point() +
|
38
|
+
scale_colour_brewer(scaleName, labels=comma) +
|
39
|
+
geom_polygon(data = state.df, color = "black", fill = NA, size = 0.2, aes(group=group)) +
|
40
|
+
theme;
|
41
|
+
}
|
42
|
+
}
|
43
|
+
|
44
|
+
render_zip_choropleth = function(choropleth.df, title="", scaleName="", states=state.abb, renderAsInsets=TRUE)
|
45
|
+
{
|
46
|
+
choropleth.df = choropleth.df[choropleth.df$state %in% states, ]
|
47
|
+
|
48
|
+
min_val = 0
|
49
|
+
max_val = 0
|
50
|
+
if (is.numeric(choropleth.df$value))
|
51
|
+
{
|
52
|
+
min_val = min(choropleth.df$value)
|
53
|
+
max_val = max(choropleth.df$value)
|
54
|
+
}
|
55
|
+
|
56
|
+
if (length(states) == length(state.abb) &&
|
57
|
+
states == state.abb &&
|
58
|
+
renderAsInsets)
|
59
|
+
{
|
60
|
+
alaska.df = choropleth.df[choropleth.df$state=="AK",]
|
61
|
+
alaska.ggplot = print_zip_choropleth(alaska.df, "AK", "", theme_inset(), min_val, max_val)
|
62
|
+
alaska.grob = ggplotGrob(alaska.ggplot)
|
63
|
+
|
64
|
+
hawaii.df = choropleth.df[choropleth.df$state=="HI",]
|
65
|
+
hawaii.ggplot = print_zip_choropleth(hawaii.df, "HI", "", theme_inset(), min_val, max_val)
|
66
|
+
hawaii.grob = ggplotGrob(hawaii.ggplot)
|
67
|
+
|
68
|
+
choropleth.df = choropleth.df[!choropleth.df$state %in% c("AK", "HI"), ]
|
69
|
+
choropleth = print_zip_choropleth(choropleth.df, setdiff(state.abb, c("AK", "HI")), scaleName, theme_clean(), min_val, max_val) + ggtitle(title)
|
70
|
+
|
71
|
+
choropleth = choropleth +
|
72
|
+
annotation_custom(grobTree(hawaii.grob), xmin=-107.5, xmax=-102.5, ymin=25, ymax=27.5) +
|
73
|
+
annotation_custom(grobTree(alaska.grob), xmin=-125, xmax=-110, ymin=22.5, ymax=30)
|
74
|
+
|
75
|
+
} else {
|
76
|
+
choropleth = print_zip_choropleth(choropleth.df, states, scaleName, theme_clean(), min_val, max_val) + ggtitle(title)
|
77
|
+
}
|
78
|
+
|
79
|
+
choropleth
|
80
|
+
}
|
81
|
+
|
82
|
+
zip_choropleth_auto = function(df, num_buckets = 9, title = "", scaleName = "", states, renderAsInsets)
|
83
|
+
{
|
84
|
+
df = clip_df(df, "zip", states)
|
85
|
+
df = discretize_df(df, num_buckets)
|
86
|
+
|
87
|
+
choropleth.df = bind_df_to_zip_map(df)
|
88
|
+
render_zip_choropleth(choropleth.df, title, scaleName, states, renderAsInsets)
|
89
|
+
}
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Qlang do
|
4
|
+
describe 'List' do
|
5
|
+
it do
|
6
|
+
# expect(
|
7
|
+
# Q.to_r.compile('{name: "Gogotanaka", age: 21, birth: (1992 8 10) }')
|
8
|
+
# ).to eq(
|
9
|
+
# "list(name=\"Gogotanaka\", age=21, birth=c(1992, 8, 10))"
|
10
|
+
# )
|
11
|
+
|
12
|
+
expect(
|
13
|
+
Q.to_r.compile('{key1: 234234, key2: 387342 }')
|
14
|
+
).to eq(
|
15
|
+
'list(key1=234234, key2=387342)'
|
16
|
+
)
|
17
|
+
|
18
|
+
expect(
|
19
|
+
Q.to_r.compile('{key1:234234,key2:387342,key3:38733242}')
|
20
|
+
).to eq(
|
21
|
+
'list(key1=234234, key2=387342, key3=38733242)'
|
22
|
+
)
|
23
|
+
|
24
|
+
# expect(
|
25
|
+
# Q.to_r.compile('{key1:(1 3 2; 8 2 3),key2:387342,key3:38733242}')
|
26
|
+
# ).to eq(
|
27
|
+
# "list(key1=matrix(c(1, 3, 2, 8, 2, 3), 2, 3, byrow = TRUE), key2=387342, key3=38733242)"
|
28
|
+
# )
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Qlang do
|
4
|
+
describe 'Matrix' do
|
5
|
+
context 'into R' do
|
6
|
+
it do
|
7
|
+
expect(
|
8
|
+
Q.to_r.compile('(1 2 3; 4 5 6)')
|
9
|
+
).to eq(
|
10
|
+
'matrix(c(1, 2, 3, 4, 5, 6), 2, 3, byrow = TRUE)'
|
11
|
+
)
|
12
|
+
|
13
|
+
expect(
|
14
|
+
Q.to_r.compile('(1 2 3 ; 4 5 6)')
|
15
|
+
).to eq(
|
16
|
+
'matrix(c(1, 2, 3, 4, 5, 6), 2, 3, byrow = TRUE)'
|
17
|
+
)
|
18
|
+
|
19
|
+
expect(
|
20
|
+
Q.to_r.compile('(1 2 3 ; 4 5 6; 7 8 9)')
|
21
|
+
).to eq(
|
22
|
+
'matrix(c(1, 2, 3, 4, 5, 6, 7, 8, 9), 3, 3, byrow = TRUE)'
|
23
|
+
)
|
24
|
+
|
25
|
+
expect(
|
26
|
+
Q.to_r.compile('(1;2;3)')
|
27
|
+
).to eq(
|
28
|
+
'matrix(c(1, 2, 3), 3, 1, byrow = TRUE)'
|
29
|
+
)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
context 'into Ruby' do
|
34
|
+
it do
|
35
|
+
expect(
|
36
|
+
Q.to_ruby.compile('(1 2 3; 4 5 6)')
|
37
|
+
).to eq(
|
38
|
+
'Matrix[[1, 2, 3], [4, 5, 6]]'
|
39
|
+
)
|
40
|
+
|
41
|
+
expect(
|
42
|
+
Q.to_ruby.compile('(1 2 3 ; 4 5 6; 7 8 9)')
|
43
|
+
).to eq(
|
44
|
+
'Matrix[[1, 2, 3], [4, 5, 6], [7, 8, 9]]'
|
45
|
+
)
|
46
|
+
|
47
|
+
expect(
|
48
|
+
Q.to_ruby.compile('(1;2;3)')
|
49
|
+
).to eq(
|
50
|
+
'Matrix[[1], [2], [3]]'
|
51
|
+
)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Qlang do
|
4
|
+
describe 'Vector' do
|
5
|
+
context 'into R' do
|
6
|
+
it do
|
7
|
+
expect(
|
8
|
+
Q.to_r.compile('(1 2 3)')
|
9
|
+
).to eq(
|
10
|
+
'c(1, 2, 3)'
|
11
|
+
)
|
12
|
+
|
13
|
+
expect(
|
14
|
+
Q.to_r.compile('(1 2 3 4 5 6)')
|
15
|
+
).to eq(
|
16
|
+
'c(1, 2, 3, 4, 5, 6)'
|
17
|
+
)
|
18
|
+
|
19
|
+
expect(
|
20
|
+
Q.to_r.compile('(1 2 3 4 5 6)')
|
21
|
+
).to eq(
|
22
|
+
'c(1, 2, 3, 4, 5, 6)'
|
23
|
+
)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
context 'into Ruby' do
|
28
|
+
it do
|
29
|
+
expect(
|
30
|
+
Q.to_ruby.compile('(1 2 3)')
|
31
|
+
).to eq(
|
32
|
+
'Vector[1, 2, 3]'
|
33
|
+
)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
context 'into Python' do
|
38
|
+
it do
|
39
|
+
expect(
|
40
|
+
Q.to_python.compile('(1 2 3)')
|
41
|
+
).to eq(
|
42
|
+
'array([1, 2, 3])'
|
43
|
+
)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Qlang
|
2
|
+
module Api
|
3
|
+
module FuncApi
|
4
|
+
def execute(func_name, args, contents)
|
5
|
+
case $meta_info.lang
|
6
|
+
when :r
|
7
|
+
"#{func_name} <- function(#{ args.join(' ,') }) #{contents}"
|
8
|
+
when :ruby
|
9
|
+
"#{func_name}(#{ args.join(' ,') }) <= #{contents}"
|
10
|
+
else
|
11
|
+
fail "Function is not implemented for #{$meta_info.lang_str}"
|
12
|
+
end
|
13
|
+
end
|
14
|
+
module_function :execute
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module Qlang
|
2
|
+
module Api
|
3
|
+
module IntegralApi
|
4
|
+
def execute(func, delta, range)
|
5
|
+
a, b = range.split('..')
|
6
|
+
case $meta_info.lang
|
7
|
+
when :ruby
|
8
|
+
"S(#{func}, #{delta})[#{a}, #{b}]"
|
9
|
+
else
|
10
|
+
fail "Integral is not implemented for #{$meta_info.lang_str}"
|
11
|
+
end
|
12
|
+
end
|
13
|
+
module_function :execute
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Qlang
|
2
|
+
module Api
|
3
|
+
module LimitApi
|
4
|
+
def self.execute(formula, var, close_to)
|
5
|
+
case $meta_info.lang
|
6
|
+
# TODO: I know what you want to say.......!
|
7
|
+
when :ruby
|
8
|
+
case close_to
|
9
|
+
when 'oo'
|
10
|
+
"temp_cal_f(#{var}) <= #{formula};
|
11
|
+
temp_cal_f(100000)"
|
12
|
+
else
|
13
|
+
"temp_cal_f(#{var}) <= #{formula};
|
14
|
+
temp_cal_f(#{close_to} + Float::EPSILON ** 20)"
|
15
|
+
end
|
16
|
+
else
|
17
|
+
fail "List is not implemented for #{$meta_info.lang_str}"
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module Qlang
|
2
|
+
module Api
|
3
|
+
module ListApi
|
4
|
+
def execute(arys)
|
5
|
+
case $meta_info.lang
|
6
|
+
when :r
|
7
|
+
combineds_by_equal = arys.map { |ary| "#{ary[0]}=#{ary[1]}" }.join(', ')
|
8
|
+
"list(#{combineds_by_equal})"
|
9
|
+
else
|
10
|
+
fail "List is not implemented for #{$meta_info.lang_str}"
|
11
|
+
end
|
12
|
+
end
|
13
|
+
module_function :execute
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Qlang
|
2
|
+
module Api
|
3
|
+
module MatrixApi
|
4
|
+
def execute(rows)
|
5
|
+
row_count = rows.count
|
6
|
+
column_count = rows.first.count
|
7
|
+
case $meta_info.lang
|
8
|
+
when :r
|
9
|
+
"matrix(#{VectorApi.execute(rows.flatten)}, #{row_count}, #{column_count}, byrow = TRUE)"
|
10
|
+
when :ruby
|
11
|
+
arys_str = rows.map { |row| "[#{row.join(', ')}]" }.join(', ')
|
12
|
+
"Matrix[#{arys_str}]"
|
13
|
+
else
|
14
|
+
fail "Matrix is not implemented for #{$meta_info.lang_str}"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
module_function :execute
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module Qlang
|
2
|
+
module Api
|
3
|
+
module SigmaApi
|
4
|
+
def self.execute(formula, var, from, to)
|
5
|
+
case $meta_info.lang
|
6
|
+
# TODO: I know what you want to say.
|
7
|
+
when :ruby
|
8
|
+
"temp_cal_f(#{var}) <= #{formula};
|
9
|
+
(#{from}..#{to}).inject(0) {|sum, i| sum+=temp_cal_f(i) }"
|
10
|
+
else
|
11
|
+
fail "List is not implemented for #{$meta_info.lang_str}"
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Qlang
|
2
|
+
module Api
|
3
|
+
module VectorApi
|
4
|
+
def execute(nums)
|
5
|
+
case $meta_info.lang
|
6
|
+
when :r
|
7
|
+
"c(#{nums.join(', ')})"
|
8
|
+
when :ruby
|
9
|
+
"Vector[#{nums.join(', ')}]"
|
10
|
+
when :python
|
11
|
+
"array([#{nums.join(', ')}])"
|
12
|
+
else
|
13
|
+
fail "Vector is not implemented for #{$meta_info.lang_str}"
|
14
|
+
end
|
15
|
+
end
|
16
|
+
module_function :execute
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
data/lib/qlang/api.rb
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'qlang/api/matrix_api'
|
2
|
+
require 'qlang/api/vector_api'
|
3
|
+
require 'qlang/api/list_api'
|
4
|
+
require 'qlang/api/func_api'
|
5
|
+
require 'qlang/api/integral_api'
|
6
|
+
require 'qlang/api/limit_api'
|
7
|
+
require 'qlang/api/sigma_api'
|
8
|
+
|
9
|
+
module Qlang
|
10
|
+
module Api
|
11
|
+
class ::Matrix
|
12
|
+
def to_q
|
13
|
+
rows.map(&:join_by_sp).join('; ').parentheses
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
class ::Vector
|
18
|
+
def to_q
|
19
|
+
elements.join_by_sp.parentheses
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|