user_guide:tutorials:latest:data

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

user_guide:tutorials:latest:data [2020/01/22 09:02] (current)
Line 1: Line 1:
 +====== Save and load data in polymake ======
 +
 +In polymake there are different ways to save and load data depending on the type and the format of the data. We distinguish between `big' objects (Polytope, Matroid,​...),​ complex data types (Set, Matrix, Array<​html><​Vector<​Rational></​html>>,​...),​ and data from files in arbitrary formats.
 +
 +===== Handling polymake objects =====
 +
 +Let us take this nice example object:
 +
 +<code perl>
 +> $p = cube(3);
 +</​code>​
 +To store big objects use the command
 +
 +<code perl>
 +> save($p,"​myPolyObject.poly"​);​
 +</​code>​
 +This will create a file in JSON format. An existing files will be silently overwritten.
 +
 +To load a big object from such a file use the command
 +
 +<code perl>
 +> $p=load("​myPolyObject.poly"​);​
 +</​code>​
 +If you did not start ''​polymake''​ in the directory containing your object, it is necessary to add the relative or absolute path, e.g. $p=load("​MyFolder/​myPolyObject.poly"​);​ TAB completion like in a usual UNIX shell supports you in navigating through the file system.
 +
 +**Note:** If you load a polymake object and compute new properties, these properties will automatically be added to the original file at the end of the session. You can suppress this with the command
 +
 +<code perl>
 +> $p->​dont_save;​
 +</​code>​
 +called prior to leaving the session (but after the last computation with $p).
 +
 +If you want to store a collection of objects into a single file, there is an [[.tarballs|extra tutorial]] for you.
 +
 +===== Handling complex data types =====
 +
 +Apart from big objects, you can also persistently store arbitrary data structures like matrices or graphs format via ''​save_data'',​ e.g.
 +
 +<code perl>
 +> $s=new Set<​Int>​(1,​2,​3,​4);​
 +> save_data($s,​ "​mySet.poly"​);​
 +</​code>​
 +To load data objects from such a file use the command
 +
 +<code perl>
 +> $s=load_data("​mySet.poly"​);​
 +</​code>​
 +In fact, the command pairs ''​load''/''​save''​ and ''​load_data''/''​save_data''​ are almost equivalent. The only difference is in filename handling: ''​load''​ can find a data file by trying to append file suffixes configured for the current application,​ while ''​save''​ by default overwrites the file the object was initially loaded from. ''​load_data''​ and ''​save_data''​ always require full file name and do not try to guess anything.
 +
 +===== Pretty formatting of JSON files =====
 +
 +Files produced by ''​save''​ and ''​save_data''​ are very dense, they don't contain line breaks and other redundant whitespaces. The order of properties in a big object is random, they can be arbitrarily reshuffled with every new ''​save''​ operation. If you are going to keep your data files under version control like git, or just want to have a look into such file, create it with an option ''​canonical'':​
 +
 +<code perl>
 +> save($p,"​myPrettyObject.poly",​canonical=>​true);​
 +</​code>​
 +===== Saving visualized objects =====
 +
 +Furthermore,​ most visualization methods provide an option to save the visualized object in a suitable format. Consult the [[:​user_guide:​intro_tutorial#​getting_help|F1 help]] for information on the file format and further options.
 +
 +To save the cube visualized via JReality in a new file called ''​mycube.bsh'',​ do this:
 +
 +<​code>​
 +jreality(cube(3)->​VISUAL,​File=>"​mycube"​);​
 +</​code>​
 +To save the cube as a TiKz file named ''​mycube.tikz''​ that you can e.g. import in a LaTeX document, do this instead:
 +
 +<​code>​
 +tikz(cube(3)->​VISUAL,​File=>"​mycube"​);​
 +</​code>​
 +===== Handling arbitrary files =====
 +
 +Of course, it is also possible to load data from files in other formats. For this purpose use the standard Perl functions for reading and writing. Here is an example:
 +
 +Assume you want to load some points stored in the file points.txt which looks like this: 1 0 0 0 1 1 0 0 1 0 1 0 1 1 1 0 1 0 0 1 1 1 0 1 1 0 1 1 1 1 1 1 For the sake of the example, let's create this file:
 +
 +<code perl>
 +> open(my $f, ">",​ "​points.txt"​);​ print $f "1 0 0 0\n1 1 0 0\n1 0 1 0\n1 1 1 0\n1 0 0 1\n1 1 0 1\n1 0 1 1\n1 1 1 1\n"; close $f;
 +</​code>​
 +To read this file try the following:
 +
 +<code perl>
 +> open(INPUT, "<",​ "​points.txt"​);​
 +> while(<​INPUT>​){
 +>   print $_;
 +> }
 +> close(INPUT);​
 +1 0 0 0
 +1 1 0 0
 +1 0 1 0
 +1 1 1 0
 +1 0 0 1
 +1 1 0 1
 +1 0 1 1
 +1 1 1 1
 +</​code>​
 +''<​INPUT>''​ is a perl input iterator reading the file line by line. Variable ''​$_''​ refers to the current line within this loop; it has a plain string value.
 +
 +A reasonable task could be to store the points from the file as a matrix. This can be done immediately,​ because the matrix constructor called with a list of values interprets each value as a matrix line:
 +
 +<code perl>
 +> open(INPUT, "<",​ "​points.txt"​);​
 +> $matrix=new Matrix<​Rational>​(<​INPUT>​);​
 +> close(INPUT);​
 +> print $matrix;
 +1 0 0 0
 +1 1 0 0
 +1 0 1 0
 +1 1 1 0
 +1 0 0 1
 +1 1 0 1
 +1 0 1 1
 +1 1 1 1
 +</​code>​
 +
  
  • user_guide/tutorials/latest/data.txt
  • Last modified: 2020/01/22 09:02
  • (external edit)