diff --git a/.gitignore b/.gitignore index 65f3fb8..de8ffc9 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,6 @@ porta.log porta_tmp + +Manifest.toml +**/Manifest.toml diff --git a/Manifest.toml b/Manifest.toml deleted file mode 100644 index f595e71..0000000 --- a/Manifest.toml +++ /dev/null @@ -1,69 +0,0 @@ -# This file is machine-generated - editing it directly is not advised - -[[Base64]] -uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" - -[[Dates]] -deps = ["Printf"] -uuid = "ade2ca70-3891-5945-98fb-dc099432e06a" - -[[InteractiveUtils]] -deps = ["Markdown"] -uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" - -[[LibGit2]] -deps = ["Printf"] -uuid = "76f85450-5226-5b5a-8eaa-529ad045b433" - -[[Libdl]] -uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" - -[[Logging]] -uuid = "56ddb016-857b-54e1-b83d-db4d58db5568" - -[[Markdown]] -deps = ["Base64"] -uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" - -[[PORTA_jll]] -deps = ["Libdl", "Pkg"] -git-tree-sha1 = "496ece9b7344beebd5126c75f24b301b0997e394" -uuid = "c3fa2e09-48e0-5371-872a-ed3ac32dd1fc" -version = "1.4.1+0" - -[[Pkg]] -deps = ["Dates", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "REPL", "Random", "SHA", "UUIDs"] -uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" - -[[Printf]] -deps = ["Unicode"] -uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" - -[[REPL]] -deps = ["InteractiveUtils", "Markdown", "Sockets"] -uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" - -[[Random]] -deps = ["Serialization"] -uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" - -[[SHA]] -uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce" - -[[Serialization]] -uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" - -[[Sockets]] -uuid = "6462fe0b-24de-5631-8697-dd941f90decc" - -[[Suppressor]] -git-tree-sha1 = "a819d77f31f83e5792a76081eee1ea6342ab8787" -uuid = "fd094767-a336-5f1f-9728-57cf17d0bbfb" -version = "0.2.0" - -[[UUIDs]] -deps = ["Random", "SHA"] -uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" - -[[Unicode]] -uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" diff --git a/Project.toml b/Project.toml index 4471dde..7e0f085 100644 --- a/Project.toml +++ b/Project.toml @@ -5,14 +5,17 @@ version = "0.1.1" [deps] PORTA_jll = "c3fa2e09-48e0-5371-872a-ed3ac32dd1fc" +Polyhedra = "67491407-f73d-577b-9b50-8179a7c68029" Suppressor = "fd094767-a336-5f1f-9728-57cf17d0bbfb" [compat] -julia = "1.4" +Polyhedra = "0.6.13" Suppressor = "0.2.0" +julia = "1.4" [extras] +GLPK = "60bf3e95-4087-53dc-ae20-288a0d20c6a6" Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" [targets] -test = ["Test"] +test = ["GLPK", "Test"] diff --git a/docs/Manifest.toml b/docs/Manifest.toml deleted file mode 100644 index 7b3c5f8..0000000 --- a/docs/Manifest.toml +++ /dev/null @@ -1,93 +0,0 @@ -# This file is machine-generated - editing it directly is not advised - -[[Base64]] -uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" - -[[Dates]] -deps = ["Printf"] -uuid = "ade2ca70-3891-5945-98fb-dc099432e06a" - -[[Distributed]] -deps = ["Random", "Serialization", "Sockets"] -uuid = "8ba89e20-285c-5b6f-9357-94700520ee1b" - -[[DocStringExtensions]] -deps = ["LibGit2", "Markdown", "Pkg", "Test"] -git-tree-sha1 = "88bb0edb352b16608036faadcc071adda068582a" -uuid = "ffbed154-4ef7-542d-bbb7-c09d3a79fcae" -version = "0.8.1" - -[[Documenter]] -deps = ["Base64", "Dates", "DocStringExtensions", "InteractiveUtils", "JSON", "LibGit2", "Logging", "Markdown", "REPL", "Test", "Unicode"] -git-tree-sha1 = "dcdea9bcd4126be143b4367b32affaff12bd4d08" -uuid = "e30172f5-a6a5-5a46-863b-614d45cd2de4" -version = "0.24.10" - -[[InteractiveUtils]] -deps = ["Markdown"] -uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" - -[[JSON]] -deps = ["Dates", "Mmap", "Parsers", "Unicode"] -git-tree-sha1 = "b34d7cef7b337321e97d22242c3c2b91f476748e" -uuid = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" -version = "0.21.0" - -[[LibGit2]] -deps = ["Printf"] -uuid = "76f85450-5226-5b5a-8eaa-529ad045b433" - -[[Libdl]] -uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" - -[[Logging]] -uuid = "56ddb016-857b-54e1-b83d-db4d58db5568" - -[[Markdown]] -deps = ["Base64"] -uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" - -[[Mmap]] -uuid = "a63ad114-7e13-5084-954f-fe012c677804" - -[[Parsers]] -deps = ["Dates", "Test"] -git-tree-sha1 = "f8f5d2d4b4b07342e5811d2b6428e45524e241df" -uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0" -version = "1.0.2" - -[[Pkg]] -deps = ["Dates", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "REPL", "Random", "SHA", "UUIDs"] -uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" - -[[Printf]] -deps = ["Unicode"] -uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" - -[[REPL]] -deps = ["InteractiveUtils", "Markdown", "Sockets"] -uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" - -[[Random]] -deps = ["Serialization"] -uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" - -[[SHA]] -uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce" - -[[Serialization]] -uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" - -[[Sockets]] -uuid = "6462fe0b-24de-5631-8697-dd941f90decc" - -[[Test]] -deps = ["Distributed", "InteractiveUtils", "Logging", "Random"] -uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40" - -[[UUIDs]] -deps = ["Random", "SHA"] -uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" - -[[Unicode]] -uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" diff --git a/src/XPORTA.jl b/src/XPORTA.jl index 872a3b5..a045349 100644 --- a/src/XPORTA.jl +++ b/src/XPORTA.jl @@ -39,6 +39,8 @@ using PORTA_jll using Suppressor +import Polyhedra + export POI, IEQ # types export traf, portsort, dim, fmel # xporta methods export fctp, posie, vint # valid methods @@ -49,5 +51,6 @@ include("./filesystem.jl") # utilities for create and removing directories include("./file_io.jl") # read/write functionality include("./xporta_subroutines.jl") # wrapper for the xporta binaries. include("./valid_subroutines.jl") # wrapper for the valid binaries +include("./polyhedron.jl") end # module diff --git a/src/polyhedron.jl b/src/polyhedron.jl new file mode 100644 index 0000000..2a7ebd1 --- /dev/null +++ b/src/polyhedron.jl @@ -0,0 +1,96 @@ +struct Library <: Polyhedra.Library + solver + function Library(solver=nothing) + new(solver) + end +end +Polyhedra.similar_library(::Library, ::Polyhedra.FullDim, ::Type{T}) where T<:Union{Integer,Rational} = Library() +Polyhedra.similar_library(::Library, d::Polyhedra.FullDim, ::Type{T}) where T = Polyhedra.default_library(d, T) + +mutable struct Polyhedron <: Polyhedra.Polyhedron{Rational{Int}} + hrep::Union{Nothing, IEQ{Rational{Int}}} + hred::Polyhedra.Redundancy + vrep::Union{Nothing, POI{Rational{Int}}} + vred::Polyhedra.Redundancy + solver + function Polyhedron(h::Union{Nothing, IEQ{Rational{Int}}}, hred::Polyhedra.Redundancy, v::Union{Nothing, POI{Rational{Int}}}, vred::Polyhedra.Redundancy, solver) + new(h, hred, v, vred, solver) + end +end +Polyhedron(h::IEQ{Rational{Int}}, solver) = Polyhedron(h, Polyhedra.UNKNOWN_REDUNDANCY, nothing, Polyhedra.UNKNOWN_REDUNDANCY, solver) +Polyhedron(h::Polyhedra.HRepresentation, solver) = Polyhedron(convert(IEQ{Rational{Int}}, h), solver) +Polyhedron(v::POI{Rational{Int}}, solver) = Polyhedron(nothing, Polyhedra.UNKNOWN_REDUNDANCY, v, Polyhedra.UNKNOWN_REDUNDANCY, solver) +Polyhedron(v::Polyhedra.VRepresentation, solver) = Polyhedron(convert(POI{Rational{Int}}, v), solver) + +Polyhedra.FullDim(p::Polyhedron) = Polyhedra.FullDim_rep(p.hrep, p.vrep) +Polyhedra.library(p::Polyhedron) = Library(p.solver) +Polyhedra.default_solver(p::Polyhedron; T=nothing) = p.solver +Polyhedra.supportssolver(::Type{<:Polyhedron}) = true + +Polyhedra.hvectortype(::Union{Polyhedron, Type{Polyhedron}}) = Polyhedra.hvectortype(IEQ{Rational{Int}}) +Polyhedra.vvectortype(::Union{Polyhedron, Type{Polyhedron}}) = Polyhedra.vvectortype(POI{Rational{Int}}) +Polyhedra.similar_type(::Type{<:Polyhedron}, ::Polyhedra.FullDim, ::Type{Rational{Int}}) = Polyhedron +Polyhedra.similar_type(::Type{<:Polyhedron}, d::Polyhedra.FullDim, ::Type{T}) where T = Polyhedra.default_type(d, T) + + +# Implementation of Polyhedron's mandatory interface +function Polyhedron(d::Polyhedra.FullDim, hits::Polyhedra.HIt...; solver=nothing) + Polyhedron(IEQ{Rational{Int}}(d, hits...), solver) +end +function Polyhedron(d::Polyhedra.FullDim, vits::Polyhedra.VIt...; solver=nothing) + Polyhedron(POI{Rational{Int}}(d, vits...), solver) +end + +Polyhedra.polyhedron(rep::Polyhedra.Representation, lib::Library) = Polyhedron(rep, lib.solver) + +# We don't copy as we don't implement any mutable operation. +Base.copy(p::Polyhedron) = Polyhedron(p.hrep, p.hred, p.vrep, p.vred, p.solver) + +Polyhedra.hredundancy(p::Polyhedron) = p.hred +Polyhedra.vredundancy(p::Polyhedron) = p.vred + +Polyhedra.hrepiscomputed(p::Polyhedron) = p.hrep !== nothing +function Polyhedra.computehrep!(p::Polyhedron) + p.hrep = traf(p.vrep) + p.hred = Polyhedra.NO_REDUNDANCY +end +function Polyhedra.hrep(p::Polyhedron) + if !Polyhedra.hrepiscomputed(p) + Polyhedra.computehrep!(p) + end + return p.hrep +end +Polyhedra.vrepiscomputed(p::Polyhedron) = p.vrep !== nothing +function Polyhedra.computevrep!(p::Polyhedron) + p.vrep = traf(p.hrep) + p.vred = Polyhedra.NO_REDUNDANCY +end +function Polyhedra.vrep(p::Polyhedron) + if !Polyhedra.vrepiscomputed(p) + Polyhedra.computevrep!(p) + end + return p.vrep +end + +function Polyhedra.sethrep!(p::Polyhedron, h::Polyhedra.HRepresentation, redundancy = UNKNOWN_REDUNDANCY) + p.hrep = h + p.hred = redundancy +end +function Polyhedra.setvrep!(p::Polyhedron, v::Polyhedra.VRepresentation, redundancy = UNKNOWN_REDUNDANCY) + p.vrep = v + p.vred = redundancy +end +function Polyhedra.resethrep!(p::Polyhedron, h::Polyhedra.HRepresentation, redundancy = UNKNOWN_REDUNDANCY) + p.hrep = h + p.hred = redundancy + p.vrep = nothing + p.vred = Polyhedra.UNKNOWN_REDUNDANCY +end +function Polyhedra.resetvrep!(p::Polyhedron, v::Polyhedra.VRepresentation, redundancy = UNKNOWN_REDUNDANCY) + p.vrep = v + p.vred = redundancy + p.hrep = nothing + p.hred = Polyhedra.UNKNOWN_REDUNDANCY +end + +@_norepelem Polyhedron Line diff --git a/src/types.jl b/src/types.jl index ca1a1ad..c6e6bd7 100644 --- a/src/types.jl +++ b/src/types.jl @@ -6,6 +6,55 @@ PORTA is a rational solver, its methods accept integer or rational valued matric """ PortaMatrix = Union{Matrix{Int}, Matrix{Rational{Int}}} +macro _norepelem(rep, elem) + idxs = Symbol(string(elem) * "Indices") + idx = Symbol(string(elem) * "Index") + quote + Base.length(idxs::Polyhedra.$idxs{T, <:$rep}) where {T} = 0 + Base.isempty(idxs::Polyhedra.$idxs{T, <:$rep}) where {T} = true + Base.iterate(idxs::Polyhedra.$idxs{T, <:$rep}) where {T} = nothing + end +end + +macro norepelem(rep, elem) + idxs = Symbol(string(elem) * "Indices") + idx = Symbol(string(elem) * "Index") + quote + Base.length(idxs::Polyhedra.$idxs{T, <:$rep{T}}) where {T} = 0 + Base.isempty(idxs::Polyhedra.$idxs{T, <:$rep{T}}) where {T} = true + Base.iterate(idxs::Polyhedra.$idxs{T, <:$rep{T}}) where {T} = nothing + end +end + + +""" +The representation `rep` contain the elements `elem` inside a vector in the field `field`. +""" +macro matrepelem(rep, elem, field) + idxs = Symbol(string(elem) * "Indices") + idx = Symbol(string(elem) * "Index") + esc(quote + Base.length(idxs::Polyhedra.$idxs{T, <:$rep{T}}) where {T} = size(idxs.rep.$field, 1) + Base.isempty(idxs::Polyhedra.$idxs{T, <:$rep{T}}) where {T} = isempty(idxs.rep.$field) + function Polyhedra.startindex(idxs::Polyhedra.$idxs{T, <:$rep{T}}) where {T} + if isempty(idxs.rep.$field) + return nothing + else + return eltype(idxs)(1) + end + end + #Base.get(rep::$rep{T}, idx::$idx{T}) where {T} = rep.$field[idx.value, :] + function Polyhedra.nextindex(rep::$rep{T}, idx::Polyhedra.$idx{T}) where {T} + if idx.value >= size(rep.$field, 1) + return nothing + else + return typeof(idx)(idx.value + 1) + end + end + end) +end + + """ The vertex representation of a polyhedron. This struct is analogous to PORTA files with the `.poi` extension. Please refer to the [PORTA General File Format docs](https://github.com/bdoolittle/julia-porta/blob/master/README.md#general-file-format) @@ -33,7 +82,7 @@ Fields: A `DomainError` is thrown if the column dimension of rays and vertices is not equal. """ -struct POI{T} +struct POI{T} <: Polyhedra.VRepresentation{T} conv_section :: Matrix{T} # Collection of vertices cone_section :: Matrix{T} # Collection of Rays valid :: Matrix{T} @@ -64,6 +113,47 @@ struct POI{T} end end +@norepelem POI Line + +@matrepelem POI Point conv_section +function Base.get(rep::POI{T}, idx::Polyhedra.PointIndex{T}) where T + return rep.conv_section[idx.value, :] +end + +@matrepelem POI Ray cone_section +function Base.get(rep::POI{T}, idx::Polyhedra.RayIndex{T}) where T + return Polyhedra.Ray(rep.cone_section[idx.value, :]) +end + +function vmatrix!(matrix, elements, offset) + for el in elements + offset += 1 + matrix[offset, :] = Polyhedra.coord(el) + end + return offset +end + +function POI{T}(D::Polyhedra.FullDim, vits::Polyhedra.VIt{T}...) where {T} + points, lines, rays = Polyhedra.fillvits(D, vits...) + d = Polyhedra.fulldim(D) + conv = Matrix{T}(undef, length(points), d) + vmatrix!(conv, points, 0) + cone = Matrix{T}(undef, 2length(lines) + length(rays), d) + offset = 0 + for el in lines + offset += 1 + cone[offset, :] = Polyhedra.coord(el) + offset += 1 + cone[offset, :] = -Polyhedra.coord(el) + end + offset = vmatrix!(cone, rays, 2length(lines)) + @assert offset == size(cone, 1) + return POI( + vertices = conv, + rays = cone, + ) +end + @doc raw""" The intersecting halfspace representation of a polyhedron. This struct is analogous to PORTA files with the `.ieq` extension. Please refer to the [PORTA General File Format docs](https://github.com/bdoolittle/julia-porta/blob/master/README.md#general-file-format) @@ -121,7 +211,7 @@ both have the following form. A `DomainError` is thrown if the column dimension of fields is not equal. """ -struct IEQ{T} +struct IEQ{T} <: Polyhedra.HRepresentation{T} valid :: Matrix{T} inequalities :: Matrix{T} equalities :: Matrix{T} @@ -160,3 +250,34 @@ struct IEQ{T} new{ieq_type}(rational_args..., int_args..., max_dim) end end + +function hmatrix(d::Polyhedra.FullDim, hs::Polyhedra.HIt{T}) where T + A = Matrix{T}(undef, length(hs), Polyhedra.fulldim(d) + 1) + for (i, h) in enumerate(hs) + A[i, 1:(end-1)] = h.a + A[i, end] = h.β + end + return A +end + +function IEQ{T}(d::Polyhedra.FullDim, hyperplanes::Polyhedra.HyperPlaneIt{T}, halfspaces::Polyhedra.HalfSpaceIt{T}) where {T} + return IEQ( + equalities = hmatrix(d, hyperplanes), + inequalities = hmatrix(d, halfspaces), + ) +end + +@matrepelem IEQ HyperPlane equalities +function Base.get(rep::IEQ{T}, idx::Polyhedra.HyperPlaneIndex{T}) where T + return Polyhedra.HyperPlane(rep.equalities[idx.value, 1:(end - 1)], rep.equalities[idx.value, end]) +end + +@matrepelem IEQ HalfSpace inequalities +function Base.get(rep::IEQ{T}, idx::Polyhedra.HalfSpaceIndex{T}) where T + return Polyhedra.HalfSpace(rep.inequalities[idx.value, 1:(end - 1)], rep.inequalities[idx.value, end]) +end + +Polyhedra.FullDim(rep::Union{IEQ, POI}) = rep.dim +Polyhedra.vvectortype(::Type{POI{T}}) where {T} = Vector{T} +Polyhedra.hvectortype(::Type{IEQ{T}}) where {T} = Vector{T} +Polyhedra.coefficient_type(::Union{Type{POI{T}}, Type{IEQ{T}}}) where {T} = T diff --git a/test/Manifest.toml b/test/Manifest.toml deleted file mode 100644 index db86d66..0000000 --- a/test/Manifest.toml +++ /dev/null @@ -1,52 +0,0 @@ -# This file is machine-generated - editing it directly is not advised - -[[Base64]] -uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" - -[[Distributed]] -deps = ["Random", "Serialization", "Sockets"] -uuid = "8ba89e20-285c-5b6f-9357-94700520ee1b" - -[[InteractiveUtils]] -deps = ["Markdown"] -uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" - -[[Libdl]] -uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" - -[[LinearAlgebra]] -deps = ["Libdl"] -uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" - -[[Logging]] -uuid = "56ddb016-857b-54e1-b83d-db4d58db5568" - -[[Markdown]] -deps = ["Base64"] -uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" - -[[Random]] -deps = ["Serialization"] -uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" - -[[SHA]] -uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce" - -[[Serialization]] -uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" - -[[Sockets]] -uuid = "6462fe0b-24de-5631-8697-dd941f90decc" - -[[Suppressor]] -git-tree-sha1 = "a819d77f31f83e5792a76081eee1ea6342ab8787" -uuid = "fd094767-a336-5f1f-9728-57cf17d0bbfb" -version = "0.2.0" - -[[Test]] -deps = ["Distributed", "InteractiveUtils", "Logging", "Random"] -uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40" - -[[UUIDs]] -deps = ["Random", "SHA"] -uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" diff --git a/test/Project.toml b/test/Project.toml index 3fc6ee6..68d92fb 100644 --- a/test/Project.toml +++ b/test/Project.toml @@ -1,5 +1,13 @@ [deps] +Combinatorics = "861a8166-3701-5b0c-9a16-15d98fcdc6aa" +GLPK = "60bf3e95-4087-53dc-ae20-288a0d20c6a6" +GeometryBasics = "5c1252a2-5f33-56bf-86c9-59e7332b4326" +JuMP = "4076af6c-e467-56ae-b986-b466b2749572" LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" +Polyhedra = "67491407-f73d-577b-9b50-8179a7c68029" +RecipesBase = "3cdcf5f2-1ef4-517c-9805-6587b60abb01" +SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" +StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" Suppressor = "fd094767-a336-5f1f-9728-57cf17d0bbfb" Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" UUIDs = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" diff --git a/test/polyhedron.jl b/test/polyhedron.jl new file mode 100644 index 0000000..afa55d9 --- /dev/null +++ b/test/polyhedron.jl @@ -0,0 +1,23 @@ +using GLPK +using Polyhedra +const polyhedra_test = joinpath(dirname(dirname(pathof(Polyhedra))), "test") + +include(joinpath(polyhedra_test, "utils.jl")) +include(joinpath(polyhedra_test, "polyhedra.jl")) +lpsolver = tuple() + +using XPORTA +@testset "Polyhedra tests" begin + polyhedratest( + XPORTA.Library(GLPK.Optimizer), + [ + # FIXME ERROR: MethodError: no method matching similar_type(::Type{IEQ{Rational{Int64}}}, ::Int64, ::Type{Float64}) + "simplex", + # TODO Need to investigate, I get + # failed process: Process(`/home/blegat/.julia/artifacts/b0627bab322e166a7ea3c9aa777f00551e7c4fdd/bin/xporta -T ./porta_tmp/traf_tmp.ieq`, ProcessExited(1)) [1] + "ex1", "infeasible", "nonfulldimensional", "sparserect", "permutahedron", "sparse", "recipe", + # overflow + "issue224" + ] + ) +end diff --git a/test/runtests.jl b/test/runtests.jl index e8a2917..0830ee4 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -36,6 +36,11 @@ function _test_runner() end end end + + @testset "Polyhedra interface tests:" begin + println("running Polyhedra interface tests.") + include("polyhedron.jl") + end end end