File: tropicalmap.cpp

package info (click to toggle)
gfan 0.5%2Bdfsg-6
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 8,348 kB
  • ctags: 5,683
  • sloc: cpp: 39,675; makefile: 454; sh: 1
file content (103 lines) | stat: -rw-r--r-- 3,048 bytes parent folder | download | duplicates (6)
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
98
99
100
101
102
103
#include "tropicalmap.h"

#include <iostream>

using namespace std;

#include "log.h"

static IntegerVectorList vectorImages(PolynomialSet const &polynomialMap, IntegerVectorList const &l)
{
  int d=polynomialMap.size();
  IntegerVectorList ret;
  for(IntegerVectorList::const_iterator i=l.begin();i!=l.end();i++)
    {
      IntegerVector v(d);
      int j=0;
      for(PolynomialSet::const_iterator J=polynomialMap.begin();J!=polynomialMap.end();J++,j++)
	v[j]=J->degree(*i);
      ret.push_back(v);
    }
  return ret;
}


PolyhedralCone imageOfConeUnderTropicalMap(PolynomialSet const &polynomialMap, PolyhedralCone const &cone)
{
	  int d=polynomialMap.size();
    IntegerVectorList linealitySpace=cone.linealitySpace().dualCone().getEquations();
    IntegerVectorList rays=cone.extremeRays();

    PolyhedralCone C=PolyhedralCone::givenByRays(vectorImages(polynomialMap,rays),vectorImages(polynomialMap,linealitySpace),d);
    C.canonicalize();
    return C;
}


PolyhedralFan imageOfTropicalMap(PolynomialSet const &polynomialMap, PolyhedralFan domain)
{
  for(PolynomialSet::const_iterator i=polynomialMap.begin();i!=polynomialMap.end();i++)
    {
      domain=refinement(domain,PolyhedralFan::normalFanOfNewtonPolytope(*i));
    }
  return imageOfTropicalMapGivenLinearityCones(polynomialMap,domain);
}

PolyhedralFan imageOfTropicalMapGivenLinearityCones(PolynomialSet const &polynomialMap, PolyhedralFan linearityCones)
{
	  int d=polynomialMap.size();
	  PolyhedralFan ret(d);
  /*
    We first put the images of the cones of the domain into the
    imageCones set. This automatically removes duplicates.
   */
  set<PolyhedralCone> imageCones;
  for(PolyhedralFan::coneIterator i=linearityCones.conesBegin();i!=linearityCones.conesEnd();i++)
	  imageCones.insert(imageOfConeUnderTropicalMap(polynomialMap,*i));
  log0 cerr << "Number of image cones "<<imageCones.size()<<endl;

  /*
    We then remove any cone which is contained in another.
   */
  for(set<PolyhedralCone>::iterator i=imageCones.begin();i!=imageCones.end();)
    {
      bool isContainedInOther=false;
      IntegerVectorList linealitySpace=i->linealitySpace().dualCone().getEquations();
      IntegerVectorList rays=i->extremeRays();
      for(set<PolyhedralCone>::iterator j=imageCones.begin();j!=imageCones.end();j++)
	{
	  if(j!=i)
	    if(j->contains(rays) && j->contains(linealitySpace))
	      {
		isContainedInOther=true;break;
	      }
	}
      if(isContainedInOther)
	{
	  set<PolyhedralCone>::iterator k=i;
	  i++;
	  imageCones.erase(k);
	}
      else
	i++;
    }
  log0 cerr << "Number of image cones "<<imageCones.size()<<endl;
  int I=0;
  for(set<PolyhedralCone>::const_iterator i=imageCones.begin();i!=imageCones.end();i++,I++)
    {
     //       if(I<31)continue;
     // if(I==32)break;
      //      AsciiPrinter P(Stderr);
      //      P<<C;



      ret.merge(*i);
      //ret.insert(*i);

      cerr<<"After merge"<< ret.size()<<endl;
      ret.removeNonMaximal();
      cerr<<"After simplification"<< ret.size()<<endl;
    }
  return ret;
}