with Standard_Integer_Vectors; use Standard_Integer_Vectors;
with Standard_Integer_VecVecs; use Standard_Integer_VecVecs;
with Permute_Operations; use Permute_Operations;
package body Permutations_of_Faces is
function Invariant ( f : Face; p : Permutation ) return boolean is
fp : Face := Permute(f,p);
res : boolean := Is_Equal(f,fp);
begin
Deep_Clear(fp);
return res;
end Invariant;
function Invariant_Lifted ( f : Face; p : Permutation ) return boolean is
fp : Face := Permute_Lifted(f,p);
res : boolean := Is_Equal(f,fp);
begin
Deep_Clear(fp);
return res;
end Invariant_Lifted;
function Permute ( f : Face; p : Permutation ) return Face is
res : Face := new VecVec(f'range);
begin
for i in f'range loop
res(i) := new Vector'(p*f(i).all);
end loop;
return res;
end Permute;
function Permute_Lifted ( f : Face; p : Permutation ) return Face is
res : Face := new VecVec(f'range);
begin
for i in f'range loop
declare
pt : constant Vector := f(i)(f(i)'first..f(i)'last-1);
begin
res(i) := new Vector(f(i)'range);
res(i)(pt'range) := p*pt;
res(i)(res(i)'last) := f(i)(f(i)'last);
end;
end loop;
return res;
end Permute_Lifted;
function Permutable ( f1,f2 : Face ) return boolean is
res : boolean;
begin
for i in f1'range loop
res := false;
for j in f2'range loop
res := Permutable(f1(i).all,f2(j).all);
exit when res;
end loop;
exit when not res;
end loop;
return res;
end Permutable;
function Permutable_Lifted ( f1,f2 : Face ) return boolean is
res : boolean;
begin
for i in f1'range loop
res := false;
for j in f2'range loop
if f1(i)(f1(i)'last) = f2(j)(f2(j)'last) -- same lifting
then res := Permutable(f1(i)(f1(i)'first..f1(i)'last-1),
f2(j)(f2(j)'first..f2(j)'last-1));
end if;
exit when res;
end loop;
exit when not res;
end loop;
return res;
end Permutable_Lifted;
function Permutable ( f1 : Face; f2 : Faces ) return boolean is
tmp : Faces := f2;
begin
while not Is_Null(tmp) loop
if Permutable(f1,Head_Of(tmp))
then return true;
else tmp := Tail_Of(tmp);
end if;
end loop;
end Permutable;
function Permutable_Lifted ( f1 : Face; f2 : Faces ) return boolean is
tmp : Faces := f2;
begin
while not Is_Null(tmp) loop
if Permutable_Lifted(f1,Head_Of(tmp))
then return true;
else tmp := Tail_Of(tmp);
end if;
end loop;
return false;
end Permutable_Lifted;
end Permutations_of_Faces;