#This GAP code evaluates pi_c(P_n)



LoadPackage("grape");

pi:=function(n,c)
local A,i,j,sz,set_of_sizes, gamma,aut,colors,color,au,size_dist_colrs,little_pi,b,size_colrs,set_of_sizes_for_color,col, col_as_set_of_sets,alpha,  set_of_images_for_color;

if c>n then return 0; 
else


####Construct the Path C_n

A:=NullMat(n,n);
for i in [1..n] do
    for j in [1..n] do
        if (j mod n)=(i+1) mod n or (j mod n)=(i-1) mod n then A[i][j]:=1; fi;
    od;
od;



######################### Functions needed
sz:=cell->Size(cell);
set_of_sizes:= partn->Set(List(partn,sz));



##############################################################



gamma:= Graph( Group(()), [1..n], OnPoints,function(x,y) return A[x][y]=1; end,true );
aut:=AutGroupGraph(gamma);

 
#######################################

colors:=PartitionsSet([1..n],c);



size_colrs:=Size(colors);

little_pi:=[colors[1]];

for i in [2..size_colrs] do
     color:=colors[i];
     b:=true;
     set_of_sizes_for_color:= set_of_sizes(color);
     for col in little_pi do
           if  set_of_sizes(col) =set_of_sizes_for_color  then
                 col_as_set_of_sets:=Set([]);
                 for j in [1..c] do
                     col_as_set_of_sets:=Union(col_as_set_of_sets,[Set(col[j])]);
                 od;
                 for alpha in aut do
                      set_of_images_for_color:=Set([]);
                      for j in [1..c] do
                           set_of_images_for_color:=Union(set_of_images_for_color,[Set(OnSets(color[j],alpha))]);
                      od;
                      if  set_of_images_for_color=col_as_set_of_sets   then b:=false; break; fi;
                 od;
            fi;
      od;
      if b then Add(little_pi,color); fi;
od;

return Size(little_pi);

fi;
end;