1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
|
# Copyright (c) 1997-2024
# Ewgenij Gawrilow, Michael Joswig, and the polymake team
# Technische Universität Berlin, Germany
# https://polymake.org
#
# This program is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by the
# Free Software Foundation; either version 2, or (at your option) any
# later version: http://www.gnu.org/licenses/gpl.txt.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#-------------------------------------------------------------------------------
object ValuatedMatroid {
### PROPERTIES ###
# @category Valuation
# Whether the valuated matroid is transversal
property TRANSVERSAL_VALUATED_MATROID : Bool;
# @category Valuation
# Whether the valuated matroid is transversal
property POSITIVE_VALUATION : Bool;
# @category Valuation
# Defines a valuation on each basis. Entry number i is a valuation on
# the i-th element of [[BASES]]. Must fulfill the tropical Plücker relations.
property VALUATION_ON_BASES : Vector<TropicalNumber<Addition,Scalar>> {
sub canonical { &canonicalize_tropical_rays; }
};
# @category Valuation
# Defines a valuation on each circuit. Row i is a representative of
# the i-th element of [[CIRCUITS]]. Must fulfill the tropical circuit
# valuation axioms. The representative is normalized such that the first
# non-tropical-zero entry is 0.
property VALUATION_ON_CIRCUITS : Matrix<TropicalNumber<Addition,Scalar>> {
sub canonical { &canonicalize_tropical_rays; }
};
# @category Combinatorics
# This is the matroid subdivision of [[POLYTOPE]] according to the lifting defined by
# [[VALUATION_ON_BASES]] (or minus [[VALUATION_ON_BASES]] in the case of max).
property SUBDIVISION : Array<Set<Int>> {
sub equal {
defined(find_permutation(@_))
}
}
### RULES ###
rule VALUATION_ON_BASES : N_ELEMENTS, BASES, CIRCUITS, VALUATION_ON_CIRCUITS {
valuated_bases_from_circuits($this);
}
rule VALUATION_ON_CIRCUITS : N_ELEMENTS, BASES, CIRCUITS, VALUATION_ON_BASES {
valuated_circuits_from_bases($this);
}
rule CIRCUITS, N_ELEMENTS : VALUATION_ON_CIRCUITS {
circuits_supports($this);
}
rule SUBDIVISION : POLYTOPE, VALUATION_ON_BASES {
my $v = Addition->orientation * (new Vector<Scalar>($this->VALUATION_ON_BASES));
$this->SUBDIVISION = polytope::regular_subdivision($this->POLYTOPE->VERTICES, $v);
}
rule TRANSVERSAL_VALUATED_MATROID, POSITIVE_VALUATION : SUBDIVISION, BASES, N_ELEMENTS {
my ($flag_pos,$flag_trans) = (1,1);
foreach my $cell (@{$this->SUBDIVISION}){
for my $i (0..$this->SUBDIVISION->size-1){
my @bases = map {$this->BASES->[$_]} (@{$this->SUBDIVISION->[$i]});
my $mat = new Matroid(BASES=>\@bases,N_ELEMENTS=>$this->N_ELEMENTS);
if(!$mat->POSITROID){$flag_pos=0}
if(!$mat->TRANSVERSAL){$flag_trans=0}
last if(!$flag_pos && !$flag_trans);
}
}
$this->POSITIVE_VALUATION = $flag_pos;
$this->TRANSVERSAL_VALUATED_MATROID = $flag_trans;
}
precondition : POSITROID;
}
# Local Variables:
# mode: perl
# cperl-indent-level: 3
# indent-tabs-mode:nil
# End:
|