CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutSign UpSign In

Real-time collaboration for Jupyter Notebooks, Linux Terminals, LaTeX, VS Code, R IDE, and more,
all in one place.

| Download

GAP 4.8.9 installation with standard packages -- copy to your CoCalc project to get it

Views: 418346
#############################################################################
##
##  Polyhedron.gi         Convex package         Sebastian Gutsche
##
##  Copyright 2011 Lehrstuhl B für Mathematik, RWTH Aachen
##
##  Polyhedrons for Convex.
##
#############################################################################

DeclareRepresentation( "IsExternalPolyhedronRep",
                       IsPolyhedron and IsExternalConvexObjectRep,
                       [ ]
                      );

####################################
##
## Types and Families
##
####################################


BindGlobal( "TheFamilyOfPolyhedrons",
        NewFamily( "TheFamilyOfPolyhedrons" , IsPolyhedron ) );

BindGlobal( "TheTypeExternalPolyhedron",
        NewType( TheFamilyOfPolyhedrons,
                 IsPolyhedron and IsExternalPolyhedronRep ) );

#####################################
##
## Structural Elements
##
#####################################

##
InstallMethod( ContainingGrid,
               "for polyhedrons",
               [ IsPolyhedron ],
               
  function( polyhedron )
    
    if HasTailCone( polyhedron ) then
        
        return ContainingGrid( TailCone( polyhedron ) );
        
    elif HasMainPolytope( polyhedron ) then
        
        return ContainingGrid( MainPolytope( polyhedron ) );
        
    fi;
    
end );

##
InstallMethod( ExternalObject,
               "for polyhedrons",
               [ IsPolyhedron and HasMainPolytope and HasTailCone ],
               
  function( polyhedron )
    local verts, rays;
    
    verts := Vertices( MainPolytope( polyhedron ) );
    
    verts := List( verts, i -> Concatenation( [ 1 ], i ) );
    
    rays := RayGenerators( TailCone( polyhedron ) );
    
    rays := List( rays, i -> Concatenation( [ 0 ], i ) );
    
    polyhedron := Concatenation( rays, verts );
    
    polyhedron := EXT_CREATE_POLYTOPE_BY_HOMOGENEOUS_POINTS( polyhedron );
    
    return polyhedron;
    
end );

##
InstallMethod( ExternalObject,
               "for polyhedrons",
               [ IsPolyhedron and HasHomogeneousPointsOfPolyhedron ],
               
  function( polyhedron )
    
    return EXT_CREATE_POLYTOPE_BY_HOMOGENEOUS_POINTS( HomogeneousPointsOfPolyhedron( polyhedron ) );
    
end );

##
InstallMethod( ExternalObject,
               "for polyhedrons with inequalities",
               [ IsExternalPolyhedronRep ],
               
  function( polyhedron )
    
    if IsBound( polyhedron!.inequalities ) then
        
        if IsEmpty( polyhedron!.inequalities ) then
            
            polyhedron!.inequalities := [ [ 0 ] ];
            
        fi;
        
        return EXT_CREATE_POLYTOPE_BY_INEQUALITIES( polyhedron!.inequalities );
        
    fi;
    
    TryNextMethod();
    
end );

##
InstallMethod( MainPolytope,
               "for polyhedrons",
               [ IsExternalPolyhedronRep ],
               
  function( polyhedron )
    local polytope;
    
    polytope := LatticePointsGenerators( polyhedron )[ 1 ];
    
    return Polytope( polytope );
    
end );

##
InstallMethod( MainPolytope,
               "for polyhedrons",
               [ IsPolyhedron and HasVerticesOfMainPolytope ],
               
  function( polyhedron )
    local polytope;
    
    polytope := Polytope( VerticesOfMainPolytope( polyhedron ) );
    
    SetContainingGrid( polytope, ContainingGrid( polyhedron ) );
    
    return polytope;
    
end );

##
InstallMethod( VerticesOfMainPolytope,
               "for polyhedrons",
               [ IsPolyhedron ],
               
  function( polyhedron )
    
    return Vertices( MainPolytope( polyhedron ) );
    
end );

##
InstallMethod( TailCone,
               "for polyhedrons",
               [ IsPolyhedron ],
               
  function( polyhedron )
    local ineqs, i;
    
    if not IsBound( polyhedron!.inequalities ) or HasExternalObject( polyhedron ) then
        
        TryNextMethod();
        
    fi;
    
    ineqs := StructuralCopy( polyhedron!.inequalities );
    
    for i in [ 1 .. Length( ineqs ) ] do
        
        Remove( ineqs[ i ], 1 );
        
    od;
    
    ineqs := ConeByInequalities( ineqs );
    
    SetContainingGrid( ineqs, ContainingGrid( polyhedron ) );
    
    return ineqs;
    
end );

##
InstallMethod( TailCone,
               "for polyhedrons",
               [ IsPolyhedron and HasExternalObject ],
               
  function( polyhedron )
    local rays;
    
    rays := EXT_TAIL_CONE_OF_POLYTOPE( ExternalObject( polyhedron ) );
    
    if rays = [] then
        
        rays := [ List( [ 1 .. Dimension( polyhedron ) ], i -> 0 ) ];
        
    fi;
    
    return Cone( rays );
    
end );

##
InstallMethod( TailCone,
               "for polyhedrons",
               [ IsExternalPolyhedronRep ],
               
  function( polyhedron )
    local generators;
    
    generators := LatticePointsGenerators( polyhedron );
    
    generators := Concatenation( generators[ 2 ], generators[ 3 ], - generators[ 3 ] );
    
    return Cone( generators );
    
end );

##
## FIXME: DOES THIS EVEN MAKE SENSE?
InstallMethod( TailCone,
               "for polyhedrons",
               [ IsPolyhedron and HasRayGeneratorsOfTailCone ],
               
  function( polyhedron )
    local tail;
    
    tail := Cone( RayGeneratorsOfTailCone( polyhedron ) );
    
    SetContainingGrid( tail, ContainingGrid( polyhedron ) );
    
    return tail;
    
end );

##
InstallMethod( RayGeneratorsOfTailCone,
               "for polyhedrons",
               [ IsPolyhedron ],
               
  function( polyhedron )
    
    return RayGenerators( TailCone( polyhedron ) );
    
end );

##
InstallMethod( HomogeneousPointsOfPolyhedron,
               "for polyhedrons",
               [ IsPolyhedron and HasExternalObject ],
               
  function( polyhedron )
    
    return EXT_HOMOGENEOUS_POINTS_OF_POLYTOPE( ExternalObject( polyhedron ) );
    
end );

##
InstallMethod( HomogeneousPointsOfPolyhedron,
               "for polyhedrons",
               [ IsPolyhedron and HasMainPolytope and HasTailCone ],
               
  function( polyhedron )
    local verts, rays;
    
    verts := Vertices( MainPolytope( polyhedron ) );
    
    verts := List( verts, i -> Concatenation( [ 1 ], i ) );
    
    rays := RayGenerators( TailCone( polyhedron ) );
    
    rays := List( rays, i -> Concatenation( [ 0 ], i ) );
    
    polyhedron := Concatenation( rays, verts );
    
    return polyhedron;
    
end );

##
InstallMethod( LatticePointsGenerators,
               "for polyhedrons",
               [ IsExternalPolyhedronRep ],
               
  function( polyhedron )
    
    return EXT_LATTICE_POINTS_GENERATORS( ExternalObject( polyhedron ) );
    
end );

##
InstallMethod( BasisOfLinealitySpace,
               "for ext polyhedrons",
               [ IsExternalPolyhedronRep ],
               
  function( polyhedron )
    
    return LatticePointsGenerators( polyhedron )[ 3 ];
    
end );

#####################################
##
## Constructors
##
#####################################

##
InstallMethod( PolyhedronByInequalities,
               "for list of inequalities",
               [ IsList ],
               
  function( inequalities )
    local polyhedron;
    
    polyhedron := rec();
    
    ObjectifyWithAttributes( polyhedron, TheTypeExternalPolyhedron );
    
    polyhedron!.inequalities := inequalities;
    
    if not IsEmpty( inequalities ) then
        
        SetAmbientSpaceDimension( polyhedron, Length( inequalities[ 1 ] ) - 1 );
        
    else
        
        SetAmbientSpaceDimension( polyhedron, 0 );
    fi;
    
    return polyhedron;
    
end );

##
InstallMethod( Polyhedron,
               "for a polytope and a cone",
               [ IsPolytope, IsCone ],
               
  function( polytope, cone )
    local polyhedron;
    
    if not IsIdenticalObj( ContainingGrid( polytope ), ContainingGrid( cone ) ) then
        
        Error( "Two objects are not comparable" );
        
    fi;
    
    polyhedron := rec();
    
    ObjectifyWithAttributes( polyhedron, TheTypeExternalPolyhedron,
                                          MainPolytope, polytope,
                                          TailCone, cone,
                                          ContainingGrid, ContainingGrid( polytope ),
                                          AmbientSpaceDimension, AmbientSpaceDimension( polytope )
                                        );
    
    return polyhedron;
    
end );

##
InstallMethod( Polyhedron,
               "for a polytope and a list",
               [ IsPolytope, IsList ],
               
  function( polytope, cone )
    local polyhedron;
    
    if Length( cone ) > 0 and Length( cone[ 1 ] ) <> AmbientSpaceDimension( polytope ) then
        
        Error( "the two objects are not comparable" );
        
    fi;
    
    polyhedron := rec( );
    
    ObjectifyWithAttributes( polyhedron, TheTypeExternalPolyhedron,
                                          MainPolytope, polytope,
                                          RayGeneratorsOfTailCone, cone,
                                          ContainingGrid, ContainingGrid( polytope ),
                                          AmbientSpaceDimension, AmbientSpaceDimension( polytope )
                                        );
    
    return polyhedron;
    
end );


##
InstallMethod( Polyhedron,
               "for a polytope and a cone",
               [ IsList, IsCone ],
               
  function( polytope, cone )
    local polyhedron;
    
    if Length( polytope ) > 0 and Length( polytope[ 1 ] ) <> AmbientSpaceDimension( cone ) then
        
        Error( "the two objects are not comparable" );
        
    fi;
    
    polytope := Polytope( polytope );
    
    SetContainingGrid( polytope, ContainingGrid( cone ) );
    
    polyhedron := rec( );
    
    ObjectifyWithAttributes( polyhedron, TheTypeExternalPolyhedron,
                                          MainPolytope, polytope,
                                          TailCone, cone,
                                          ContainingGrid, ContainingGrid( cone ),
                                          AmbientSpaceDimension, AmbientSpaceDimension( cone )
                                        );
    
    return polyhedron;
    
end );

##
InstallMethod( Polyhedron,
               "for a polytope and a cone",
               [ IsList, IsList ],
               
  function( polytope, cone )
    local polyhedron;
    
    if Length( polytope ) > 0 and Length( cone ) > 0 and Length( cone[ 1 ] ) <> Length( polytope[ 1 ] ) then
        
        Error( "two objects are not comparable\n" );
        
    fi;
    
    if Length( polytope ) = 0 then
        
        Error( "no empty polytope" );
        
    fi;
    
    if Length( cone ) = 0 then
        
        cone := [ List( [ 1 .. Length( polytope[ 1 ] ) ], i -> 0 ) ];
        
    fi;
    
    polyhedron := rec();
    
    ObjectifyWithAttributes( polyhedron, TheTypeExternalPolyhedron,
                                          MainPolytope, Polytope( polytope ),
                                          TailCone, Cone( cone ),
                                          AmbientSpaceDimension, Length( polytope[ 1 ] ) 
                                        );
    
    SetContainingGrid( TailCone( polyhedron ), ContainingGrid( MainPolytope( polyhedron ) ) );
    
    SetContainingGrid( polyhedron, ContainingGrid( MainPolytope( polyhedron ) ) );
    
    return polyhedron;
    
end );


##############################
##
## View & Display
##
##############################

##
InstallMethod( ViewObj,
               "for homalg polytopes",
               [ IsPolyhedron ],
               
  function( polytope )
    local str;
    
    Print( "<A" );
    
    if HasIsNotEmpty( polytope ) then
        
        if IsNotEmpty( polytope ) then
            
            Print( " not empty" );
            
        fi;
    
    fi;
    
    Print( " polyhedron in |R^" );
    
    Print( String( AmbientSpaceDimension( polytope ) ) );
    
    Print( ">" );
    
end );

##
InstallMethod( Display,
               "for homalg polytopes",
               [ IsPolyhedron ],
               
  function( polytope )
    local str;
    
    Print( "A" );
    
    if HasIsNotEmpty( polytope ) then
        
        if IsNotEmpty( polytope ) then
            
            Print( " not empty" );
            
        fi;
    
    fi;
    
    Print( " polyhedron in |R^" );
    
    Print( String( AmbientSpaceDimension( polytope ) ) );
    
    Print( ".\n" );
    
end );