The packages are certainly cool, but do not achieve what I want. I probably
explained myself wrongly, so I have a minimal example, which I would like
to turn to macro and cannot make it work. :-/
Here is how it works without macro:
function β(from, to, lag)
# vars, lags and ntyp should be taken from the already estimated
object
col = fill(0.0, vars*lags + vars*ntyp)
col[(from + to)*lag] = 1.0
return col
end
function betaa(from, to, lag)
return β(from, to, lag)
end
test = :(begin
betaa(1,2,3) + 2.0 * betaa(2,3,1)=1
3.0 * betaa(2,1,3) + betaa(2,3,4) = 1000
end)
# Hardcode so far
vars = 20
lags = 15
ntyp = 20
ind = [typeof(test.args[i])==Expr for i=2:length(test.args)]
ind = ([1:length(ind)][ind])+1
R = apply(hcat,[eval(test.args[i].args[1]) for i=ind])
r = [eval(test.args[i].args[2]) for i=ind]
Gives the proper matrices, but when I do
macro restrictions(ex)
vars = 20
lags = 15
ntyp = 20
ind = [typeof(ex.args[i])==Expr for i=2:length(ex.args)]
ind = ([1:length(ind)][ind])+1
R = apply(hcat,[eval(ex.args[i].args[1]) for i=ind])
r = [eval(ex.args[i].args[2]) for i=ind]
(R, r)
end
@restrictions begin
betaa(1,2,3) + 2.0 * betaa(2,3,1)=1
3.0 * betaa(2,1,3) + betaa(2,3,4) = 1000
end
It does not work and I have no idea why, probably still too advanced
concept for me. Also the size of the column that is returned from betaa
depends on size of the system, that will be stored in another variable so
it would be cool if the betaa function could be evaluated in the macro
environment so that it would use the vars, lags and ntyp from the within
macro.
Thanks for any help with this.
On Saturday, 16 August 2014 17:44:26 UTC+2, Miles Lubin wrote:
>
> JuMP is also a good place to look.
>
> On Saturday, August 16, 2014 8:11:04 AM UTC-6, Stefan Karpinski wrote:
>>
>> Have you looked at CVX? I feel like it may be relevant.
>>
>> On Aug 16, 2014, at 8:47 AM, Tomas Krehlik <[email protected]> wrote:
>>
>> I have a package that implements much of vector autoregression estimation
>> and I would like to develop a macro that would implement domain specific
>> language for imposing linear restriction in multidimensional time-series
>> models. Of course, the user could input the restrictions using some
>> matrices, however I tend to think that they will be much less readable than
>> if I implement this macro and I hope it should not be that bad. Typical
>> example would be:
>>
>> restr = @restrictions begin
>> 2 beta[1,2,1] - beta[2,1,3] = 10
>> beta[1,3,1] - beta[1,4,1] = 0
>> end
>>
>> and the restr would be a tuple with matrix and vector after this.
>>
>> The beta has the following structure beta[from, to, lag]. The macro
>> should take each line and parse it and form proper restriction matrix R
>> that will be made from the signs and indexes at betas and vector r. So I
>> need to parse the signs, constants, and indeces of betas and the thing that
>> is after the equality.
>>
>> Am I right that the right direction is parsing the lines with regular
>> expressions to create the right matrices, or do you have suggestion for
>> better approach? Any further reference for something similar (or useful
>> resource) that has been done before is also very appreciated.
>>
>> Related on that note, is there any function to return all matches from
>> regex? That seems to be the biggest bottleneck so far.
>>
>> Any comments appreciated. Thanks!
>>
>>