This is an old revision of the document!
Using Perl within polymake
This is a tutorial about how to use Perl within polymake
, which was presented at the polymake-Workshop at Darmstadt, in March 2011. A short introduction to Perl in polymake
can be found at “polymake for the Perl Newbie”.
Standard data structures
The Perl programming language originally provides three different data structures, scalars($), arrays(@), and hashes(%). The user always has to specify the type of a variable using the appropriate symbol ''$,
@, or
%. If you forget to do so, you will receive the following error message:
<code>
polytope > i=5;
polymake: ERROR: Unquoted string “i” may clash with future reserved word.
</code>
Perl
Here are some simple commands illustrating how to use the different data structures:
* Scalars <code>
$i=5;
$j=6;
$sum=$i+$j; print $sum;
</code>
* Arrays <code>
@array=(“a”,“b”,“c”); print scalar(@array);
push(@array,“d”); print “@array”;
$first_entry=$array[0]; print $first_entry;
print join(“\n”,@array);
@array2=(3,1,4,2);
print sort(@array2);
</code>
* Hashes <code>
%hash=();
$hash{“zero”}=0;
$hash{“four”}=4;
print keys %hash;
print join(“, ”,keys %hash);
print join(“, ”,values %hash);
%hash=(“one”,1,“two”,2);
%hash=(“one”⇒1,“two”⇒2);
</code>
===“Small objects”: Data structures inherited from C++===
In addition to the three standard data structures, the enriched version of used in
polymake also provides special data structures that are inherited from the
C++-side of
polymake. A complete list of these so-called “small objects” can be found in the online documentation under the heading property types.
polymake'':
Here is a selection of three different structures that facilitate everyday work with
$arr1=new Array<String>(\@array); print $arr1; $arr2=new Array<Int>([3,2,5]); print $arr2; $arr3=new Array<Int>(0,1,2,3); print $arr3; $arr4=new Array<Int>(0..4); print $arr4; @arr4=@{$arr4}; print $arr2; $set=new Set<Int>(3,2,5); print $set; $mat=new Matrix<Rational>([[2,1,4,0,0],[3,1,5,2,1],[1,0,4,0,6]]); print $mat; $mat->row(1)->[1]=7; print $mat; $mat->(1,2)=8; print $mat; print 4*unit_matrix<Rational>(3); $m_rat=new Matrix<Rational>(3/5*unit_matrix<Rational>(5)); print $m_rat; $m2=$mat/$m_rat; print $m2; $m_int=new Matrix<Int>(unit_matrix<Rational>(5)); print $m_int; $m3=$m_rat/$m_int; $m3=$m_rat/(convert_to<Rational>($m_int)); print $m3; $z_vec=zero_vector<Int>($m_int->rows); $extended_matrix=($z_vec|$m_int); print $extended_matrix; $template_Ex=new Array<Set<Int>>((new Set<Int>(5,2,6)),$set); print $template_Ex;
"Big Objects": Objects with properties
$p=new Polytope<Rational>(POINTS=>cube(4)->VERTICES); $lp=new LinearProgram<Rational>(LINEAR_OBJECTIVE=>[0,1,1,1,1]); $p->LP=$lp; print $p->LP->MAXIMAL_VALUE;
Working with Perl in polymake
open(INPUT, "< /home/katrin/polymake/demo/Workshop2011/points.demo"); $matrix=new Matrix<Rational>(<INPUT>); close(INPUT); print $matrix; $p=new Polytope<Rational>(POINTS=>$matrix); print $p->FACETS; print $p->DIM; print $p->VERTEX_SIZES; ;### choose "simple" vertices for(my $i=0;$i<scalar(@{$p->VERTEX_SIZES});$i++){ if($p->VERTEX_SIZES->[$i]==$p->DIM){ print $i.": ".$p->VERTICES->row($i)."\n"; } } $s=new Set<Int>(); for(my $i=0;$i<scalar(@{$p->VERTEX_SIZES});$i++){ if($p->VERTEX_SIZES->[$i]==$p->DIM){ $s+=$i; } } $special_points=$p->VERTICES->minor($s,All); print $special_points; ; foreach(@{$s}){ print $p->VERTICES->row($_)."\n"; } foreach my $index(@{$s}){ print $p->VERTICES->row($index)."\n"; }