Skip to content

Commit 93b05ce

Browse files
authored
Merge pull request #15 from JuliaAlgebra/polyvar-matrix
Add possibility to construct matrix with @[nc]polyvar
2 parents 4ebe3e2 + cc27252 commit 93b05ce

File tree

2 files changed

+17
-4
lines changed

2 files changed

+17
-4
lines changed

src/var.jl

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,27 @@ function polyvecvar(::Type{PV}, prefix, idxset) where {PV}
55
[PV("$(prefix * string(i))") for i in idxset]
66
end
77

8+
function polymatrixvar(::Type{PV}, prefix, rowidxset, colidxset) where {PV}
9+
[PV("$(prefix * string(i) * "_" * string(j))") for i in rowidxset, j in colidxset]
10+
end
11+
812
function buildpolyvar(::Type{PV}, var) where {PV}
913
if isa(var, Symbol)
1014
:($(esc(var)) = $PV($"$var"))
1115
else
1216
isa(var, Expr) || error("Expected $var to be a variable name")
1317
Base.Meta.isexpr(var, :ref) || error("Expected $var to be of the form varname[idxset]")
14-
length(var.args) == 2 || error("Expected $var to have one index set")
18+
(2 length(var.args) 3) || error("Expected $var to have one or two index sets")
1519
varname = var.args[1]
1620
prefix = string(var.args[1])
17-
idxset = esc(var.args[2])
18-
:($(esc(varname)) = polyvecvar($PV, $prefix, $idxset))
21+
if length(var.args) == 2
22+
idxset = esc(var.args[2])
23+
:($(esc(varname)) = polyvecvar($PV, $prefix, $idxset))
24+
else
25+
rowidxset = esc(var.args[2])
26+
colidxset = esc(var.args[3])
27+
:($(esc(varname)) = polymatrixvar($PV, $prefix, $rowidxset, $colidxset))
28+
end
1929
end
2030
end
2131

test/mono.jl

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,16 @@
11
@testset "PolyVar and Monomial tests" begin
22
@testset "polyvar macro index set" begin
33
n = 3
4-
@polyvar x[1:n] y z[1:n-1]
4+
@polyvar x[1:n] y z[1:n-1] u[1:n,1:n-1]
55
@test x isa Vector{PolyVar{true}}
66
@test y isa PolyVar{true}
77
@test z isa Vector{PolyVar{true}}
8+
@test u isa Matrix{PolyVar{true}}
89
@test length(x) == 3
910
@test length(z) == 2
11+
@test size(u) == (3, 2)
1012
@test x[1] > x[2] > x[3] > y > z[1] > z[2]
13+
@test u[1, 1] > u[2, 1] > u[2, 2]
1114
end
1215
@testset "PolyVar" begin
1316
@test zeroterm(PolyVar{true}) == 0

0 commit comments

Comments
 (0)