Quellcodebibliothek Statistik Leitseite products/Sources/formale Sprachen/GAP/pkg/fining/lib/   (Algebra von RWTH Aachen Version 4.15.1©)  Datei vom 27.6.2023 mit Größe 38 kB image not shown  

Quelle  geometry.gi   Sprache: unbekannt

 
#############################################################################
##
##  geometry.gi              FinInG package
##                                                              John Bamberg
##                                                              Anton Betten
##                                                              Jan De Beule
##                                                             Philippe Cara
##                                                            Michel Lavrauw
##                                                           Max Neunhoeffer
##
##  Copyright 2018 Colorado State University
##                  Sabancı Üniversitesi
##     Università degli Studi di Padova
##     Universiteit Gent
##     University of St. Andrews
##     University of Western Australia
##                  Vrije Universiteit Brussel
##
##
##  Implementation stuff for geometries.
##
#############################################################################

#############################################################################
# General methods for incidence structures.
#############################################################################

# CHECKED 14/11/2011 jdb
# 140813 modified by pc : TypesOfIncidenceStructure
#############################################################################
#O  IncidenceStructure( <eles>, <inc>, <typ>, <typeset> )
# method for IncidenceStructure.
##
InstallMethod( IncidenceStructure, 
 "for a set, incidence, type function and type set",
 [ IsList, IsFunction, IsFunction, IsList ],
 function( eles, inc, typ, typeset )
  local geo, ty, t, typesetstrings, typesetstringsplural;
  geo := rec( elements := eles, increl := inc, 
     typefun := typ, typeset := typeset );
  ty := NewType( GeometriesFamily,
     IsIncidenceStructure and IsIncidenceStructureRep );
  typesetstrings:=[];
     typesetstringsplural:=[];
  for t in typeset do
   Add(typesetstrings, Concatenation("element of type ", String(t)));
      Add(typesetstringsplural, Concatenation("elements of type ", String(t)));
  od;
  ObjectifyWithAttributes( geo, ty, RankAttr, Size(typeset), TypesOfElementsOfIncidenceStructure, 
            typesetstrings, TypesOfElementsOfIncidenceStructurePlural, typesetstringsplural);
  return geo;
 end );

# CHECKED 18/4/2011 jdb
#############################################################################
#O  Rank( <i> )
# generic method that calls RankAttr to return the rank of a particular 
# incidence structure.
## 
InstallMethod( Rank, 
 "for IsIncidenceStructure", 
 [IsIncidenceStructure], 
 i -> RankAttr(i) );

# added 140901, pc
#############################################################################
#O  IncidenceGraph( <incstr> )
# Generic method for incidence graph, with trivial group
##
InstallMethod( IncidenceGraph,
        "for an incidence structure",
        [ IsIncidenceStructure ],
        function( incstr )
   local all, adj, gamma;
            if IsBound(incstr!.IncidenceGraphAttr) then
                return incstr!.IncidenceGraphAttr;
            fi;
   all:=List([1..Rank(incstr)], i -> AsSet(ElementsOfIncidenceStructure(incstr,i)));
   all:=Union(all);
   adj:=function(i,j)
    if i=j then 
     return false; # Otherwise problem with loops
    else 
     return IsIncident(all[i],all[j]);
    fi;
   end;
   gamma := Graph( Group(()), [1..Size(all)], OnPoints, adj, true);
            Setter( IncidenceGraphAttr )( incstr, gamma );
   return gamma;
        end );

#############################################################################
# Elements of incidence structures.
#############################################################################

######################################################################
##
## The following operations just make "nice" versions of functions for
## specific geometries when the corresponding functions are defined.
## this means: methods for the functions here are generic and relying
## on installed methods for more particular objects.
##
######################################################################

#############################################################################
#O  ElementsOfIncidenceStructure( <inc>, <j> )
# returns the elements of the incidence structure <inc> of type <j>
## 
InstallMethod( ElementsOfIncidenceStructure, 
    "for an incidence structure and a type",
 [IsIncidenceStructure, IsPosInt],
 function( inc, j )
  local r;
  r := Rank(inc);
  if j > r then
   Error("<inc> has no elements of type <j>");
  else
   return Objectify(
   NewType( ElementsCollFamily, IsElementsOfIncidenceStructure and IsElementsOfIncidenceStructureRep ),
    rec( geometry := inc,
     type := j )
     );
  fi;
 end);

# CHECKED 18/4/2011 jdb
#############################################################################
#O  ElementsOfIncidenceStructure( <ps>, <str> )
# returns the elements of an incidence structure <ps> provided there is an
# installed method for ElementsOfIncidenceStructure for the particular <ps>
# and <str> is occuring in TypesOfElementsOfIncidenceStructurePlural(<ps>).
## 
InstallMethod( ElementsOfIncidenceStructure,
 "for an incidence structure and a string",
 [IsIncidenceStructure, IsString],
 function( ps, str )
  local m;
  m := Position(TypesOfElementsOfIncidenceStructurePlural(ps), str);
  if m = fail then
   Error("No such element type!");
  else
  return ElementsOfIncidenceStructure(ps, m);
  fi;
  end);

# added 140813, pc
#############################################################################
#O  Iterator( <vs> )
# Iterator for ElementsOfIncidenceStructure of a given type.
##
InstallMethod( Iterator,
        "for IsElementsOfIncidenceStructure",
        [ IsElementsOfIncidenceStructure ],
        function( vs )
            local incstr, elements, wrapped, type;
            incstr := vs!.geometry;
            type := vs!.type;
            elements:=Filtered(incstr!.elements, e -> Position(incstr!.typeset,incstr!.typefun(e)) = type);
            wrapped:=List(elements, e -> Wrap(incstr, type, e));
            return IteratorList(wrapped);
        end );
 
# CHECKED 4/9/2011 jdb
# but maybe to be changed later on. See to do list on top of file.
#############################################################################
#O  Enumerator( <D> )
# generic method that enumerates D, using an Iterator for D
# assuming D belongs to IsElementsOfIncidenceStructure
##
InstallMethod( Enumerator,
 "generic method for IsElementsOfIncidenceStructure",
 [ IsElementsOfIncidenceStructure ],
 function ( D )
 local  iter, elms;
 iter := Iterator( D );
 elms := [  ];
 while not IsDoneIterator( iter )  do
  Add( elms, NextIterator( iter ) );
 od;
 return elms;
 end);

#############################################################################
#O  NrElementsOfIncidenceStructure( <ps>, <str> )
# returns the number of elements of an incidence structure <ps> provided there 
# is an  installed method for ElementsOfIncidenceStructure for the 
# particular <ps> and <str> is occuring in 
# TypesOfElementsOfIncidenceStructurePlural(<ps>). 
## 
InstallMethod( NrElementsOfIncidenceStructure,
 "for an incidence structure and a string",
 [IsIncidenceStructure, IsString],
 function( ps, str )
  return Size(ElementsOfIncidenceStructure(ps, str));
  end);

#############################################################################
#O  NrElementsOfIncidenceStructure( <ps>, <typ> )
# returns the number of elements of an incidence structure <ps> provided there 
# is an  installed method for ElementsOfIncidenceStructure for the 
# particular <ps>.
## 
InstallMethod( NrElementsOfIncidenceStructure,
 "for an incidence structure and a type",
 [IsIncidenceStructure, IsPosInt],
 function( ps, typ )
  return Size(ElementsOfIncidenceStructure(ps, typ));
  end);

#############################################################################
# Hash functions for elements are important to use the orb package to compute
# orbits (quickly). We implement hash functions for elements and sets of elements.
# Note that the hash functions for elements rely on the hash functions for the underlying
# object. For cvec/cmats, such hash functions are provided in the package cvec of course
#
# The idea for a hashfunction of a set of elements is as follows: if set has length n,
# then we add all hashvalues of the objects in set. The initial length is estimated
# through the orb functionality. So if set has n elements, the resulting value might
# increase the size of a hash table for the individual elements. Therefore we call
# the hash function for the elements with length len/n.
# Note that more clever ideas might lead to faster orbit computation.
##
InstallGlobalFunction( HashFuncForElements,
 function( v, data )
  return data.func(v!.obj,data.data);
 end );

InstallGlobalFunction( HashFuncForSetElements,
 function( v, data )
        return Sum(List(v,x->data.func(x!.obj,data.data)));
 end );

InstallMethod( ChooseHashFunction,
 "for an element and a hash length",
 [ IsElementOfIncidenceStructure, IsPosInt ],
 function( v, len )
  local data;
  data := ChooseHashFunction( v!.obj, len );
  return rec( func := HashFuncForElements, data := data );
 end );

InstallMethod( ChooseHashFunction, 
 "for a set of elements and a hash length",
 [ CategoryCollections(IsElementOfIncidenceStructure), IsPosInt ],
 function( set, len )
  local v,data;
        v := set[1];
        data := ChooseHashFunction( v!.obj, Int(len/Length(set)) );
  return rec( func := HashFuncForSetElements, data := data );
 end );

#############################################################################
# General methods for collection of elements of incidence structures.
#############################################################################

# CHECKED 18/04/11 jdb
#############################################################################
#O  AmbientGeometry( <x> )
# general method that returns the ambient geometry of a collection of 
# elements of a particular type.
# notice the small difference with the previous method :-)
## 
InstallMethod( AmbientGeometry, 
 [ IsElementsOfIncidenceStructure and IsElementsOfIncidenceStructureRep ], 
 x -> x!.geometry );

# CHECKED 18/04/11 jdb
#############################################################################
#O  AmbientGeometry( <x> )
# general method that returns the ambient geometry of a collection of elements
## 
InstallMethod( AmbientGeometry, 
 [ IsAllElementsOfIncidenceStructure ],
 x -> x!.geometry );

# CHECKED 14/4/2011 jdb
#############################################################################
#O  Type( <x> )
# general method that returns the type of a collection of elements of a particular type.
## 
InstallMethod( Type, 
 "for IsElementsOfIncidenceStructure(Rep)",
 [IsElementsOfIncidenceStructure and IsElementsOfIncidenceStructureRep], 
 x -> x!.type );

#############################################################################
# General methods for particular elements of incidence structures.
#############################################################################

# CHECKED 18/04/11 jdb
# 140813 pc Changed filter for geo to IsIncidenceStructure (was 
# IsIncidenceGeometry)
#############################################################################
#O  Wrap( <geo>, <type>, <o> )
# general method that just wraps the data (<o>) as an element of a incidence geometry.
# does not do any checking. <geo> and <type> are obviously also arguments. 
# Not for users, not documented. More particular wrap methods can be derived from this.
##
InstallMethod( Wrap, 
 "for a geometry and an object",
 [IsIncidenceStructure, IsPosInt, IsObject],
 function( geo, type, o )
  local w;
  w := rec( geo := geo, type := type, obj := o );
  Objectify( NewType( ElementsOfIncidenceStructureFamily, 
   IsElementOfIncidenceStructure and IsElementOfIncidenceStructureRep ), w );
  return w; 
 end );

# CHECKED 17/04/11 jdb
#############################################################################
#O  Unwrap( <v> )
# general method that returns the data of an element <v>. 
# Not for users, not documented.
##
InstallMethod( Unwrap, 
 "for an element",
 [IsElementOfIncidenceStructure and IsElementOfIncidenceStructureRep],
 function( v )
  return v!.obj;
 end );

#jdb 30/10/15: This method is not used anymore after commenting out the Unwrapper stuff in geometry.gd
#see the comment there.
# CHECKED 17/04/11 jdb
#InstallMethod( \^,
# "for an element of a incidence structure and an unwrapper",
# [IsElementOfIncidenceStructure, IsUnwrapper ],
# function( x, u )
#  return x!.obj;
# end );

# added 3/9/14 jdb
#############################################################################
#O  UnderlyingObject( <x> )
# general method that returns the ambient geometry of a particular element.
## 
InstallMethod( UnderlyingObject,
    "for an element of an incidence structure",
 [ IsElementOfIncidenceStructure and IsElementOfIncidenceStructureRep ], 
 x -> x!.obj );

# added 3/9/14 jdb
#############################################################################
#O  ObjectToElement( <inc>, <type>, <obj> )
# general method that returns the element of type represtented by obj.
## 
InstallMethod( ObjectToElement,
    "for an incidence structure, a type, and an object",
 [ IsIncidenceStructure, IsPosInt, IsObject ],
 function(inc,t,obj)
        local typeset;
        typeset := inc!.typeset;
        if not t in typeset then
            Error("<t> is not a type of elements of <inc>");
        elif not obj in inc!.elements then
            Error("<t> does not represent any element of <inc>");
        elif not inc!.typefun(obj) = t then
            Error("<obj> does not represent an element of type <t>");
        else
            return Wrap(inc,t,obj);
        fi;
    end );

# CHECKED 18/04/11 jdb
#############################################################################
#O  AmbientGeometry( <x> )
# general method that returns the ambient geometry of a particular element.
## 
InstallMethod( AmbientGeometry, 
 [ IsElementOfIncidenceStructure and IsElementOfIncidenceStructureRep ], 
 x -> x!.geo );

# CHECKED 27/6/2011 jdb and pc
#############################################################################
#O  Intersection2( <el1>, <el2> )
# method for Intersection2, referring to Meet.
##
InstallOtherMethod( Intersection2,
 "for two elements of an incidence structure, relying on Meet",
 [IsElementOfIncidenceStructure, IsElementOfIncidenceStructure],
 function( el1, el2 )
  return Meet(el1,el2);
 end);

# CHECKED 14/4/2011 jdb
#############################################################################
#O  Type( <x> )
# general method that returns the type of a particular element.
## 
InstallMethod( Type, 
 [ IsElementOfIncidenceStructure and IsElementOfIncidenceStructureRep ], 
 x -> x!.type );

# CHECKED 18/4/2011 jdb
#############################################################################
#O  \=( <a>, <b> )
# test equality method for elements of an incidence structure
# relies to testing equality of underlying 'obj' fields of the arguments.
## 
InstallMethod( \=, 
 "for two IsElementOfIncidenceStructure", 
 [IsElementOfIncidenceStructure, IsElementOfIncidenceStructure], 
 function( a, b ) 
  return a!.obj = b!.obj; 
 end );

# CHECKED 18/4/2011 jdb, but also changed 18/4/2011. Volunteers to check again?
#############################################################################
#O  \<( <a>, <b> )
# LT for two elements of an incidence structure.
# first compares types of elements, in case of equality, 
# relies to comparing underlying 'obj' fields of the arguments.
## 
InstallMethod( \<, "for two IsElementOfIncidenceStructure",
 [IsElementOfIncidenceStructure, IsElementOfIncidenceStructure], 
 function( a, b ) 
  if a!.type = b!.type then
   return a!.obj < b!.obj;
  else
   return a!.type < b!.type;
  fi;
 end );

# CHECKED 17/04/11 jdb
#############################################################################
#O  \*( <a,b> )
# Alternative for IsIncident.
# Remind that IsIncident is an operation declared for elements of any incidence
# structure.
##
InstallOtherMethod( \*, 
 "for two elements of an incidence structure",
 [IsElementOfIncidenceStructure, IsElementOfIncidenceStructure],
 function( a, b )
  return IsIncident(b, a);
 end );

# added by pc 140813
############################################################################
#O  IsIncident( <x,y> )
# For two elements of an incidence structure, generic.
##
InstallMethod( IsIncident,
        "for two elements of an incidence structure",
        [IsElementOfIncidenceStructure, IsElementOfIncidenceStructure],
        function( x, y )
  local geo;
  if AmbientGeometry(x) <> AmbientGeometry(y) then
   Error("Elements must have the same ambient geometry.");
  fi;
  geo:=AmbientGeometry(x);
                return geo!.increl(x!.obj,y!.obj);
        end );

#############################################################################
# General methods for flags of incidence structures.
#############################################################################

# added by pc 140813
# changed by jdb 161214 (added check after test).
#############################################################################
#O  FlagOfIncidenceStructure( <incgeo>, <els> )
# returns the flag of the incidence structure <incgeo> with elements in 
# the list <els>.
# the method checks whether the input really determines a flag.
##
InstallMethod( FlagOfIncidenceStructure,
        "for an incidence structure and a list of elements",
        [ IsIncidenceStructure, IsElementOfIncidenceStructureCollection ],
        function(incgeo,els)
                local list,i,test,type,flag;
                list := Set(ShallowCopy(els));
                if Length(list) > Rank(incgeo) then
                    Error("A flag can contain at most Rank(<incstr>) elements");
                fi;
                test := List(list,x->AmbientGeometry(x));
                if not ForAll(test,x->x=incgeo) then
                    Error("not all elements have <incgeo> as ambient geometry");
                fi;
                #if test[1] <> incgeo then
                #    Error("<els> is not a list of elements of <incgeo>");
                #fi;
                test := Set(Flat(List([1..Length(list)-1],i ->
                    List([i..Length(list)], j -> IsIncident(list[i], list[j])))));
                if (test <> [ true ] and test <> []) then
                  Error("<els> does not determine a flag>");
                fi;
                flag := rec(geo := incgeo, types := List(list,x->x!.type), 
                        els := list);
                ObjectifyWithAttributes(flag, 
                    IsFlagOfIncidenceStructureType, IsEmptyFlag, false, RankAttr,
                        Size(list));
                return flag;
        end);

# added by pc 140901
#############################################################################
#O  FlagOfIncidenceStructure( <incgeo>, <els> )
# returns the empty flag of incidence sturcture <incgeo>.
##
InstallMethod( FlagOfIncidenceStructure,
        "for an incidence structure and an empty list",
        [ IsIncidenceStructure, IsList and IsEmpty ],
        function(incgeo,els)
                local flag;
                flag := rec(geo := incgeo, types := [], els := []);
                ObjectifyWithAttributes(flag, 
                    IsFlagOfIncidenceStructureType, IsEmptyFlag, true, RankAttr, 0);
                return flag;
        end);

# CHECKED 18/4/2011 jdb
#############################################################################
#A  IsChamberOfIncidenceStructure( <flag> )
# returns true if <flag> is a chamber.
# remind that flags of projective spaces, polar spaces are constructed in 
# IsFlagOfIncidenceStructureRep, which makes this method generic
##
InstallMethod( IsChamberOfIncidenceStructure,
 "for a flag of an incidence structure",
 [ IsFlagOfIncidenceStructure and IsFlagOfIncidenceStructureRep ],
 flag -> Length(flag!.types) = Rank(flag!.geo)
 );

# added 140813 pc
#############################################################################
#O  AmbientGeometry( <x> )
# general method that returns the ambient geometry of a flag
##
InstallMethod( AmbientGeometry,
        [ IsFlagOfIncidenceStructure and IsFlagOfIncidenceStructureRep],
        x -> x!.geo );

# added by pc, moved to here 31/3/14
#############################################################################
#O  ElementsOfFlag( <flag> )
# returns elements of a flag 

##
InstallMethod( ElementsOfFlag, 
 "for an incidence structure flag",
 [ IsFlagOfIncidenceStructure and IsFlagOfIncidenceStructureRep ],
 function(flag)
  return flag!.els;
 end );

# added by pc, 140813
#############################################################################
#O  Size( <flag> )
# returns size of a flag
#
##
InstallMethod( Size,
        "for an incidence structure flag",
        [ IsFlagOfIncidenceStructure and IsFlagOfIncidenceStructureRep ],
        function(flag)
                return Size(ElementsOfFlag(flag));
        end );

# added by pc, 140901
#############################################################################
#O  Rank( <flag> )
# returns rank of a flag
#
##
InstallMethod( Rank,
        "for IsFlagOfIncidenceStructure",
        [ IsFlagOfIncidenceStructure ],
        i -> RankAttr(i) );

# Added 140813, pc
#############################################################################
#O  Type( <x> )
# general method that returns the type of a flag
##
InstallMethod( Type,
        "for IsElementsOfIncidenceStructure(Rep)",
        [ IsFlagOfIncidenceStructure and IsFlagOfIncidenceStructureRep ],
        x -> Set(x!.els,Type) );

# added 140813, pc
#############################################################################
#O  ResidueOfFlag( <flag> )
# completely generic residue computation
##
InstallMethod( ResidueOfFlag,
        "for a flag",
        [ IsFlagOfIncidenceStructure ],
        function( flag )
                local ambigeo, geo, typfun, typset, resrank, eles, inc;
  ambigeo:=AmbientGeometry(flag);
  typset:=Difference([1..Rank(ambigeo)], Type(flag));
  resrank:=Size(typset);
  typfun:=function(ele)
   return Position(typset, Type(ele));
  end;
  eles:=List(typset, j -> List(ShadowOfFlag(ambigeo,flag,j)));
  inc:=function(x,y)
   return IsIncident(x,y);
  end;
        geo := IncidenceStructure(Union(eles), inc, typfun, [1..resrank]);
  SetAmbientGeometry(geo,ambigeo);
        return geo;
 end );

#############################################################################
# methods that allow us to make an ordered Set from a list of flags,
# and to make an ordered Set of a list of elements and flags.
#############################################################################

# added 2/9/14 pc+jdb
#############################################################################
#O  \=( <a>, <b> )
# test equality method for flags of an incidence structure
# relies to testing equality of underlying 'obj' fields of the arguments.
## 
InstallMethod( \=, 
 "for two IsElementOfIncidenceStructure", 
 [ IsFlagOfIncidenceStructure, IsFlagOfIncidenceStructure ],
 function( a, b )
  return Set(a!.els) = Set(b!.els);
 end );

# added 2/9/14 pc+jdb
#############################################################################
#O  \<( <a>, <b> )
# LT for two flags of an incidence structure.
# first compares types of elements, in case of equality, 
# relies to comparing underlying 'obj' fields of the arguments.
## 
InstallMethod( \<, "for two IsFlagOfIncidenceStructure",
 [ IsFlagOfIncidenceStructure, IsFlagOfIncidenceStructure ],
 function( a, b ) 
  if a!.types = b!.types then
   return a!.els < b!.els;
  else
   return a!.types < b!.types;
  fi;
 end );

# added 2/9/14 pc+jdb
#############################################################################
#O  \<( <a>, <b> )
# LT for a flag and an element.
# first compares types of elements, in case of equality, 
# relies to comparing underlying 'obj' fields of the arguments.
## 
InstallMethod( \<, "for two IsElementOfIncidenceStructure",
 [ IsFlagOfIncidenceStructure, IsElementOfIncidenceStructure ],
 function( a, b ) 
        if a!.geo <> b!.geo then
            Error("<flag> and <element> do not belong to the same geometry");
        fi;
        return false;
    end );

# added 2/9/14 pc+jdb
#############################################################################
#O  \<( <a>, <b> )
# LT for two flags of an incidence structure.
# first compares types of elements, in case of equality, 
# relies to comparing underlying 'obj' fields of the arguments.
## 
InstallMethod( \<, "for two IsElementOfIncidenceStructure",
 [ IsElementOfIncidenceStructure, IsFlagOfIncidenceStructure ],
 function( a, b )
        if a!.geo <> b!.geo then
            Error("<element> and <flag> do not belong to the same geometry");
        fi;
        return true;
    end );

# added by pc 140813
############################################################################
#O  IsIncident( <x,F> )
# For an element and a flag of an incidence structure
# An element is incident with a flag if it is incident with all elements 
# of the flag.
##
InstallMethod( IsIncident,
        "for an element and a flag of an incidence structure",
        [ IsElementOfIncidenceStructure, IsFlagOfIncidenceStructure ],
        function( x, f )
  local iter, inc;
  iter:=Iterator(ElementsOfFlag(f));
  inc:=true;
                while inc and not(IsDoneIterator(iter)) do
   inc:=IsIncident(x,NextIterator(iter));
  od;
  return inc;
        end );
        
# added by pc 140813
############################################################################
#O  IsIncident( <x,F> )
# For an element and a flag of an incidence structure
# An element is incident with a flag if it is incident with all elements 
# of the flag.
##
InstallMethod( IsIncident,
        "for an element and a flag of an incidence structure",
        [IsFlagOfIncidenceStructure, IsElementOfIncidenceStructure],
        function( f, x )
  local iter, inc;
  iter:=Iterator(ElementsOfFlag(f));
  inc:=true;
                while inc and not(IsDoneIterator(iter)) do
   inc:=IsIncident(x,NextIterator(iter));
  od;
  return inc;
        end );

#############################################################################
#O  \in( <x>, <y> )
# x: an element of an incidence structure, y a flag of that incidence structure
##
InstallOtherMethod( \in, 
 "for an element and a flag of an incidence structure",
 [ IsElementOfIncidenceStructure, IsFlagOfIncidenceStructure ],
 function( x, y )
  if x!.geo <> y!.geo then
   Error( "<x> and <y> have not the same ambient geometry" );
  else
            return x in y!.els;
        fi;
 end );

# CHECKED 11/09/11 jdb
# this is a method that is generic for more geometries than projective spaces, so
# this was moved from projectivespace.gi to geometry.gi on 5/4/2018.
#############################################################################
#O  \in( <x>, <dom> )
# returns true if <x> belongs to the elements collected in <dom> It is checked if their
# geometry matches.
##
InstallMethod( \in,
    "for an element and domain",
    # 1*SUM_FLAGS+3 increases the ranking for this method
    # 5/4/2018: jdb wonders if the above line is necessary.
    [IsElementOfIncidenceStructure, IsAllElementsOfIncidenceStructure], 1*SUM_FLAGS+3,
    function( x, dom )
        return x in dom!.geometry;
    end );

# CHECKED 11/09/11 jdb
# this was moved from projectivespace.gi to geometry.gi on 5/4/2018.
#############################################################################
#O  \in( <x>, <dom> )
# returns true if <x> belongs to the elements collected in <dom> It is checked if their
# geometry matches.
##
InstallMethod( \in,
    "for an element and set of elements of an incidence structure",
    # 1*SUM_FLAGS+3 increases the ranking for this method
    # 5/4/2018: jdb wonders if the above line is necessary.
    [IsElementOfIncidenceStructure, IsElementsOfIncidenceStructure], 1*SUM_FLAGS+3,
    function( x, dom )
        return x in dom!.geometry and x!.type = dom!.type;
    end );

# new since 5/4/2018 jdb
# this was necessary, since the above method causes prblems when dom is
# IsShadowElementsOf...
# this new method is generic. Since e.g. IsShadowSubspacesOfProjectiveSpace
# is not a subcategory of IsShadowElementsOfIncidenceStructure, we have
# to create an operation for Lie geometries (and probably others) as well.
#############################################################################
#O  \in( <x>, <dom> )
# returns true if <x> belongs to the elements collected in <dom> It is checked if their
# geometry matches.
##
#InstallMethod( \in,
#    "for an element and collection of shadow elements of an incidence structure",
    # 1*SUM_FLAGS+3 increases the ranking for this method
    # 5/4/2018: jdb wonders if the above line is necessary.
#    [IsElementOfIncidenceStructure, IsShadowElementsOfIncidenceStructure], 1*SUM_FLAGS+3,
#    function( x, dom )
#        return x in dom!.geometry and x!.type = dom!.type and IsIncident(x,dom!.flag); #there is no representation declared for IsShadowElementsOfIncidenceStructure, so we have no idea whether a flag is available.
#    end );

#############################################################################
# General methods for shadows of elements/flags
#############################################################################

# added by pc 140901
############################################################################
#O  ShadowOfElement( <inc>, <f> ,<j> )
# Completely generic shadow computation
# For an element of an incidence structure and a type j
# Returns all elements of type j which are incident to e
##
InstallMethod( ShadowOfElement,
        "for an element of an incidence structure and a type",
        [IsIncidenceStructure, IsElementOfIncidenceStructure, IsPosInt],
        function( inc, f, j )
            local iter, shad, x;
            return Objectify( NewType( ElementsCollFamily, IsElementsOfIncidenceStructure and 
                                    IsShadowElementsOfIncidenceStructure),
                rec( geometry := inc,
                     type := j,
                     parentflag := FlagOfIncidenceStructure(inc,[f]) )
                );
        end );

# CHECKED 18/4/2011 jdb
#############################################################################
#O  ShadowOfElement( <ps>, <v>, <str> )
# returns the shadow elements of type <str> in element <v> in the inc str <ps>
# relies on installed method for ShadowOfElement for the particular <ps>
# and <str> is occuring in TypesOfElementsOfIncidenceStructurePlural(<ps>).
##
InstallMethod( ShadowOfElement,
 "for an incidence structure, an element of, and a string",
 [IsIncidenceStructure, IsElementOfIncidenceStructure, IsString],
 function( ps, v, str )
  local m;
  m := Position(TypesOfElementsOfIncidenceStructurePlural(ps), str);
  if m = fail then
   Error("No such element type!");
  else
   return ShadowOfElement(ps, v, m);
  fi;
  end);

# CHECKED 19/4/2011 jdb
# moved to geometry.gi and made generic 3/9/14
#############################################################################
#O  ElementsIncidentWithElementOfIncidenceStructure( <el>, <i> )
# returns the elements of type <i> in <el>, relying on ShadowOfElement 
# for particular <el>.
## 
InstallMethod( ElementsIncidentWithElementOfIncidenceStructure, "for IsElementOfLieGeometry",
 [ IsElementOfIncidenceStructure, IsPosInt],
 function( el, i )
  return ShadowOfElement(el!.geo, el, i);
 end );

# added by pc 140813
############################################################################
#O  ShadowOfFlag( <F,j> )
# Completely generic shadow computation
# For a flag of an incidence structure and a type j
# Returns all elements of type j which are incident to the flag F
##
InstallMethod( ShadowOfFlag,
        "for an incidence structure, flag of an incidence structure and a type",
        [IsIncidenceStructure, IsFlagOfIncidenceStructure, IsPosInt],
        function( inc, f, j )
            local iter, shad, x;
            return Objectify( NewType( ElementsCollFamily, IsElementsOfIncidenceStructure and 
                                    IsShadowElementsOfIncidenceStructure),
                rec( geometry := inc,
                     type := j,
                     parentflag := f )
                );
        end );

# CHECKED 18/4/2011 jdb
#############################################################################
#O  ShadowOfFlag( <ps>, <v>, <str> )
# returns the shadow elements of <flag>, i.e. the elements of <ps> of type <j> 
# incident with all elements of <flag>.
# relies on installed method for ShadowOfElement for the particular <ps>
# and <str> is occuring in TypesOfElementsOfIncidenceStructurePlural(<ps>).
##
InstallMethod( ShadowOfFlag,
 "for an incidence structure, a flag, and a string",
 [IsIncidenceStructure, IsFlagOfIncidenceStructure, IsString],
 function( ps, vs, str )
  local m;
  m := Position(TypesOfElementsOfIncidenceStructurePlural(ps), str);
  if m = fail then
   Error("No such element type!");
  else
   return ShadowOfFlag(ps, vs, m);
  fi;
 end);

# CHECKED 27/4/2011 jdb
#############################################################################
#O  ShadowOfFlag( <ps>, <list>, <j> )
# returns the shadow elements of the flag <list>, provided <list> determines
# a flag in <ps>. Relies completely on FlagOfIncidenceStructure for <ps>,
# so this implementation is generic.
##
InstallMethod( ShadowOfFlag,
 "for an incidence structure, a list, and an integer",
 [IsIncidenceStructure, IsList, IsPosInt],
 function( ps, list, j )
  return ShadowOfFlag(ps,FlagOfIncidenceStructure(ps,list),j);
 end);

# CHECKED 27/4/2011 jdb
#############################################################################
#O  ShadowOfFlag( <ps>, <list>, <str> )
# returns the shadow elements of the flag <list>, provided <list> determines
# a flag in <ps>. Relies completely on FlagOfIncidenceStructure for <ps>,
# and on ShadowOfFlag for <ps> <v> and <str>, so this implementation is generic.
##
InstallMethod( ShadowOfFlag,
 "for an incidence structure, a list, and an integer",
 [IsIncidenceStructure, IsList, IsString],
 function( ps, list, str )
  return ShadowOfFlag(ps,FlagOfIncidenceStructure(ps,list),str);
 end);

# added by pc 140901
#############################################################################
#O  Iterator( <vs>) 
# returns an iterator for <vs>, a collection of shadow elemenst of an incidence structure
##
InstallMethod( Iterator, 
 "for shadow elements of an incidence structure",
 [ IsShadowElementsOfIncidenceStructure ],
 function( vs )
        local j, f, shad, x, iter;
        f := vs!.parentflag;
        j := vs!.type;
  if j in Type(f) then
   return IteratorList([f!.els[Position(Type(f),j)]]);
  fi;
        iter:=Iterator(ElementsOfIncidenceStructure(vs!.geometry,j));
        shad:=[];
            for x in iter do
                    if IsIncident(x,f) then Add(shad,x); fi;
            od;
        return IteratorList(shad);
    end );

#############################################################################
# Viewing/Printing/Displaying methods.
#############################################################################
# 5 CHECKED 4/09/11 jdb

InstallMethod( ViewObj, 
 "for IsElementOfIncidenceStructure",
 [ IsElementOfIncidenceStructure and IsElementOfIncidenceStructureRep ],
 function( v )
  Print("<a ",TypesOfElementsOfIncidenceStructure(v!.geo)[v!.type]," in ");
  ViewObj(v!.geo);
  Print(">");
 end );

InstallMethod( ViewObj,
        "for IsFlagOfIncidenceStructure",
        [ IsFlagOfIncidenceStructure and IsFlagOfIncidenceStructureRep ],
        function( v )
                Print("<a flag of ");
                ViewObj(v!.geo);
                Print(">");
        end );

InstallMethod( PrintObj, 
 "for IsElementOfIncidenceStructure",
 [ IsElementOfIncidenceStructure and IsElementOfIncidenceStructureRep ],
 function( v )
  Print( v!.obj );
 end );

InstallMethod( Display, 
 "for IsElementOfIncidenceStructure",
 [ IsElementOfIncidenceStructure and IsElementOfIncidenceStructureRep ],
 function( v )
  Display(v!.obj);
 end );

# JB (31/01/2013): One thing that I would like in GAP is to have Display for vectors just
# like that for matrices. So here is a method which makes this happen
# JDB: I agree, but this causes problems, see remark of Alexander of 8/12/14.
#InstallMethod( Display,
# "for IsVector",
# [ IsVector ],
# function( v )
#  Display( [v] );
# end );

InstallMethod( ViewObj, 
 "for IsAllElementsOfIncidenceStructure",
 [ IsAllElementsOfIncidenceStructure ],
 function( vs )
  Print("<Elements of ");
  ViewObj(vs!.geometry);
  Print(">");
 end );

InstallMethod( PrintObj, 
 "for IsAllElementsOfIncidenceStructure",
 [ IsAllElementsOfIncidenceStructure ],
 function( vs )
  Print("ElementsOfIncidenceStructure( ",vs!.geometry," )");
 end );

# Finally a generic ViewObj method for shadow elements.
#############################################################################
InstallMethod( ViewObj,
 "for shadow elements of a Lie geometry", 
 [ IsShadowElementsOfIncidenceStructure ],
 function( vs )
  Print("<shadow elements of type ", vs!.type," in ");
  ViewObj(vs!.geometry);
  Print(">");
 end );
  
InstallMethod( ViewObj, 
 "for IsElementsOfIncidenceStructure",
 [ IsElementsOfIncidenceStructure ],
 function( vs )
  Print("<Elements of type ", vs!.type," of ");
  ViewObj(vs!.geometry);
  Print(">");
 end );

InstallMethod( PrintObj, 
 "for IsElementsOfIncidenceStructure",
 [ IsElementsOfIncidenceStructure ],
 function( vs )
  Print("ElementsOfIncidenceStructure( ",vs!.geometry," ) of type ",vs!.type);
 end );

#############################################################################
# Display methods:
#############################################################################

InstallMethod( ViewObj,
 "for an incidence structure",
 [ IsIncidenceStructure ],
 function(x)
  Print("Incidence structure of rank ", RankAttr(x));
 end );

InstallMethod( PrintObj,
 "for an incidence structure",
 [ IsIncidenceStructure ],
 function(x)
  Print("Incidence structure of rank ", RankAttr(x)," with elements of type ",x!.typeset);
 end );

InstallMethod( Display,
 "for an incidence structure",
 [ IsIncidenceStructure ],
 function(x)
  Print("Incidence structure of rank ", RankAttr(x)," with elements of type ",x!.typeset);
 end );

#############################################################################
# methods for the two general properties
# We are gratefull to Harald Gropp for pointing out the difference clearly 
# between a configuration and a constellation during the conference 
# Combinatorics 2014.
#############################################################################

InstallMethod( IsConfiguration,
    "for an incidence structure",
    [ IsIncidenceStructure],
    function(x)
    Info(InfoFinInG, 2, "The authors are grateful to Harald Gropp for pointing out clearly the difference between a configuration and a constellation.");
    return true;
    end );
    
InstallMethod( IsConstellation,
    "for an incidence structure",
    [ IsIncidenceStructure],
    function(x)
    Info(InfoFinInG, 2, "The authors are grateful to Harald Gropp for pointing out clearly the difference between a configuration and a constellation.");
    return true;
    end );


[ Dauer der Verarbeitung: 0.43 Sekunden  (vorverarbeitet)  ]