Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

tropical determinant via Hungarian method #3943

Merged
merged 10 commits into from
Jul 18, 2024
20 changes: 10 additions & 10 deletions src/TropicalGeometry/matrix.jl
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,9 @@
@doc raw"""
det(A::Generic.MatSpaceElem{<: TropicalSemiringElem})
benlorenz marked this conversation as resolved.
Show resolved Hide resolved

Return the tropical determinant of `A`.
Return the tropical determinant of `A`. That is, this function evaluates the tropicalization of the ordinary determinant considered as a multivariate polynomial at `A`.

That computation is equivalent to solving a linear assignment problem from combinatorial optimization. The implementation employs the Hungarian method, which is polynomial time. See Chapter 3 in [Jos21](@cite).

!!! note
This function effectively overwrites the `det` command for tropical matrices. This means that functions like `minors` will use the tropical determinant when used on a tropical matrix.
Expand All @@ -29,15 +31,13 @@ julia> det(A)
(5)
```
"""
function det(A::Generic.MatSpaceElem{R}) where {R<:Union{TropicalSemiringElem,MPolyRingElem{<:TropicalSemiringElem},PolyRingElem{<:TropicalSemiringElem}}}
detA = zero(base_ring(A))
nrows(A)!=ncols(A) && return detA # return tropical zero if matrix not square
for sigma in AbstractAlgebra.SymmetricGroup(nrows(A)) # otherwise follow Leibniz Formula
detA += prod([ A[i,sigma[i]] for i in 1:nrows(A) ])
end
return detA
function det(A::MatrixElem{<:TropicalSemiringElem})
@req nrows(A) == ncols(A) "Non-square matrix"
T = base_ring(A)
return T(Polymake.tropical.tdet(A))
end

function det(A::Matrix{R}) where {R<:Union{TropicalSemiringElem,MPolyRingElem{<:TropicalSemiringElem},PolyRingElem{<:TropicalSemiringElem}}}
return det(matrix(parent(first(A)),A))
function det(A::Matrix{<:TropicalSemiringElem})
@req 0 < nrows(A) == ncols(A) "Non-square or empty matrix"
return det(matrix(parent(first(A)),A))
end
YueRen marked this conversation as resolved.
Show resolved Hide resolved
3 changes: 0 additions & 3 deletions test/TropicalGeometry/matrix.jl
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,6 @@
@testset "det(A::Generic.MatSpaceElem{<:TropicalSemiringElem})" begin
A = Matrix(T[1 2; 3 5]) # (julia) matrix over tropical numbers
@test det(A) == (minOrMax==min ? T(5) : T(6))
R, (x,y) = T[:x,:y]
A = Matrix(identity_matrix(R,2)) # (julia) matrix over tropical polynomials
@test det(A) == one(R)
end
end

Expand Down
Loading