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

Quelle  iterative_methods.gi   Sprache: unbekannt

 
#############################################################################
##
#W  iterative_methods.gi                         Victor Bovdi <vbovdi@gmail.com>
#W                                       Vasyl Laver  <vasyllaver@uzhnu.edu.ua>
##
##
#Y  Copyright (C)  2018,  UAE University, UAE
##
#############################################################################
##
##  This file contains some iterative methods for threshold element training.
##
#############################################################################


######################################################################
##
#F  ThresholdElementTraining(te,step,f)
##
##  Returns the Threshold Element realizing the Boolean function f
##  or [] if the function is not realizable.
##

InstallMethod(ThresholdElementTraining, "threshold element, step, function, max_iter", true, [IsThresholdElementObj, IsPosInt, IsObject, IsPosInt], 4,
function(te,step,f,maxit)
local t, l, i,y,err,j,tup,w,T,st, niter, n;

 if (IsLogicFunction(f)=false) then
  Error("f has to be a logic function.");
 fi;

 n:=f!.numvars;

 if (f!.dimension<>2) then
  Error("f has to be a Boolean function.");
 fi;

 f:=f!.output;

 if step<1 then
  Error("Step has to be a positive integer!\n");
  return [];
 fi;

 if maxit<1 then
  Error("Maximal number of iterations has to be a positive integer!\n");
  return [];
 fi;

 st:=StructureOfThresholdElement(te);
 w:=st[1]; T:=st[2];

 if (Size(w)<>n) then
  Error("Theshold element and f should be of one dimension!\n");
 fi;

 if w=[] then
  for i in [1..LogInt(Size(f),2)+1] do Add(w,1); od;
 fi;
 l:=ShallowCopy(w);
 niter:=maxit;
 return THELMA_INTERNAL_ThrTr(l,T,step,f,niter);
end);


InstallOtherMethod(ThresholdElementTraining, "threshold element, step, function, max_iter", true, [IsThresholdElementObj, IsPosInt, IsFFECollection, IsPosInt], 4,
function(te,step,f,maxit)
local t, l, i,y,err,j,tup,w,T,st, niter, n;

 n:=LogInt(Size(f),2);
 if Size(f)<>2^n then
   Error("Number of elements of the vector must be a power of 2! \n");
   return [];
 fi;

 if step<1 then
  Error("Step has to be a positive integer!\n");
  return [];
 fi;

 if maxit<1 then
  Error("Maximal number of iterations has to be a positive integer!\n");
  return [];
 fi;

 st:=StructureOfThresholdElement(te);
 w:=st[1]; T:=st[2];

 if (Size(w)<>n) then
  Error("Theshold element and f should be of one dimension!\n");
 fi;

 f:=List(f,Order);

 if w=[] then
  for i in [1..LogInt(Size(f),2)+1] do Add(w,1); od;
 fi;
 l:=ShallowCopy(w);
 niter:=maxit;
 return THELMA_INTERNAL_ThrTr(l,T,step,f,niter);
end);

#f - is a polynomial over GF(2)
InstallOtherMethod(ThresholdElementTraining, "threshold element, step, function, max_iter", true, [IsThresholdElementObj, IsPosInt, IsPolynomial, IsPosInt], 4,
function(te,step,f1,maxit)
local t, l, i,y,err,j,tup,w,T,st, niter,f, var, n;
 st:=StructureOfThresholdElement(te);
 w:=st[1]; T:=st[2];
 f:=[];

 n:=Size(w);

 if step<1 then
  Error("Step has to be a positive integer!\n");
  return [];
 fi;

 if maxit<1 then
  Error("Maximal number of iterations has to be a positive integer!\n");
  return [];
 fi;

 f:=THELMA_INTERNAL_PolToOneZero(f1,n);
 if w=[] then
  for i in [1..LogInt(Size(f),2)+1] do Add(w,1); od;
 fi;

 l:=ShallowCopy(w);
 niter:=maxit;

 if (Size(f)<>2^n) then
  Error("Theshold element and f should be of one dimension!\n");
 fi;

 return THELMA_INTERNAL_ThrTr(l,T,step,f,niter);
end);

#f - string
InstallOtherMethod(ThresholdElementTraining, "threshold element, step, function, max_iter", true, [IsThresholdElementObj, IsPosInt, IsString, IsPosInt], 4,
function(te,step,f1,maxit)
local t, l, i,y,err,j,tup,w,T,st, niter,f, n;
 st:=StructureOfThresholdElement(te);
 w:=st[1]; T:=st[2];
 f:=[];

 n:=LogInt(Size(f1),2);
 if Size(f1)<>2^n then
     Error("Number of elements of the vector must be a power of 2");
  return [];
 fi;

 if 2^n<>(Size(Positions(f1,'1'))+Size(Positions(f1,'0'))) then
  Error("Input string should contain only '1' and '0'. \n");
  return [];
 fi;

 if step<1 then
  Error("Step has to be a positive integer!\n");
  return [];
 fi;

 if maxit<1 then
  Error("Maximal number of iterations has to be a positive integer!\n");
  return [];
 fi;

 if (Size(w)<>n) then
   Error("Theshold element and f should be of one dimension!\n");
 fi;

 for i in [1..Size(f1)] do
  if f1[i]='1' then Add(f, 1);
  elif f1[i]='0' then Add(f, 0);
  fi;
 od;

 if w=[] then
  for i in [1..LogInt(Size(f),2)+1] do Add(w,1); od;
 fi;
 l:=ShallowCopy(w);
 niter:=maxit;
 return THELMA_INTERNAL_ThrTr(l,T,step,f,niter);
end);

######################################################################
##
#F  ThresholdElementBatchTraining(te,step,f)
##
##  Returns the Threshold Element realizing the Boolean function f
##  or [] if the function is not realizable.
##

#f - vector over GF(2)
InstallMethod(ThresholdElementBatchTraining, "threshold element, step, function, max_iter", true, [IsThresholdElementObj, IsPosInt, IsObject, IsPosInt], 4,
function(te,step,f, maxit)
local t, l, i, y,err,j,Tc,wc,tup,st,w,T,niter,n;

 st:=StructureOfThresholdElement(te);
 w:=st[1];
 T:=st[2];

 if (IsLogicFunction(f)=false) then
  Error("f has to be a logic function.");
 fi;

 n:=f!.numvars;

 if (f!.dimension<>2) then
  Error("f has to be a Boolean function.");
 fi;

 f:=f!.output;

 if step<1 then
  Error("Step has to be a positive integer!\n");
  return [];
 fi;

 if maxit<1 then
  Error("Maximal number of iterations has to be a positive integer!\n");
  return [];
 fi;

 if w=[] then
  for i in [1..LogInt(Size(f),2)+1] do Add(w,1); od;
 fi;
 l:=ShallowCopy(w);

 if (Size(w)<>n) then
  Error("Theshold element and f should be of one dimension!\n");
 fi;

 niter:=maxit;
 return THELMA_INTERNAL_ThrBatchTr(l,T,step,f,niter);
end);


InstallOtherMethod(ThresholdElementBatchTraining, "threshold element, step, function, max_iter", true, [IsThresholdElementObj, IsPosInt, IsFFECollection, IsPosInt], 4,
function(te,step,f, maxit)
local t, l, i, y,err,j,Tc,wc,tup,st,w,T,niter,n;

 st:=StructureOfThresholdElement(te);
 w:=st[1];
 T:=st[2];
 f:=List(f,Order);
 n:=LogInt(Size(f),2);

 if step<1 then
  Error("Step has to be a positive integer!\n");
  return [];
 fi;

 if maxit<1 then
  Error("Maximal number of iterations has to be a positive integer!\n");
  return [];
 fi;

 if w=[] then
  for i in [1..LogInt(Size(f),2)+1] do Add(w,1); od;
 fi;
 l:=ShallowCopy(w);

 if (Size(w)<>n) then
  Error("Theshold element and f should be of one dimension!\n");
 fi;

 niter:=maxit;
 return THELMA_INTERNAL_ThrBatchTr(l,T,step,f,niter);
end);

# f is a polynomial
InstallOtherMethod(ThresholdElementBatchTraining, "threshold element, step, function, max_iter", true, [IsThresholdElementObj, IsPosInt, IsPolynomial, IsPosInt], 4,
function(te,step,f1,maxit)
local t, l, i, y,err,j,Tc,wc,tup,st,w,T,niter, var, n, f;

 st:=StructureOfThresholdElement(te);
 w:=st[1]; T:=st[2];
 f:=[];

 if step<1 then
  Error("Step has to be a positive integer!\n");
  return [];
 fi;

 if maxit<1 then
  Error("Maximal number of iterations has to be a positive integer!\n");
  return [];
 fi;

 var:=OccuringVariableIndices(f1);
 n:=Size(w);

 f:=THELMA_INTERNAL_PolToOneZero(f1,n);

 if w=[] then
  for i in [1..LogInt(Size(f),2)+1] do Add(w,1); od;
 fi;
 l:=ShallowCopy(w);
 niter:=maxit;

 if (LogInt(Size(f),2)<>n) then
  Error("Theshold element and f should be of one dimension!\n");
 fi;

 return THELMA_INTERNAL_ThrBatchTr(l,T,step,f,niter);
end);

#f is a string
InstallOtherMethod(ThresholdElementBatchTraining, "threshold element, step, function, max_iter", true, [IsThresholdElementObj, IsPosInt, IsString, IsPosInt], 4,
function(te,step,f1, maxit)
local t, l, i, y,err,j,Tc,wc,tup,st,w,T,niter,f,n;

 st:=StructureOfThresholdElement(te);
 w:=st[1]; T:=st[2];
 f:=[];

 n:=LogInt(Size(f1),2);

 if (Size(w)<>n) then
  Error("Theshold element and f should be of one dimension!\n");
 fi;

 if Size(f1)<>2^n then
     Error("Number of elements of the vector must be a power of 2");
  return [];
 fi;

 if 2^n<>(Size(Positions(f1,'1'))+Size(Positions(f1,'0'))) then
  Error("Input string should contain only '1' and '0'. \n");
  return [];
 fi;

 if step<1 then
  Error("Step has to be a positive integer!\n");
  return [];
 fi;

 if maxit<1 then
  Error("Maximal number of iterations has to be a positive integer!\n");
  return [];
 fi;

 for i in [1..Size(f1)] do
  if f1[i]='1' then Add(f, 1);
  elif f1[i]='0' then Add(f, 0);
  fi;
 od;

 if w=[] then
  for i in [1..LogInt(Size(f),2)+1] do Add(w,1); od;
 fi;
 l:=ShallowCopy(w);
 niter:=maxit;
 return THELMA_INTERNAL_ThrBatchTr(l,T,step,f,niter);
end);

######################################################################
##
#F  WinnowAlgorithm(f,step)
##  The algorithm for learing the monotone disjunctions
##

#f - vector over GF(2)
InstallMethod(WinnowAlgorithm, "function, step, maxiter", true, [IsObject, IsPosInt, IsPosInt], 3,
function(f,step,maxit)
local f1,niter;

 if step=1 then
  Error("Step must be integer > 1. \n");
 fi;

 if step<1 then
  Error("Step has to be a positive integer!\n");
  return [];
 fi;

 if maxit<1 then
  Error("Maximal number of iterations has to be a positive integer!\n");
  return [];
 fi;

 if (IsLogicFunction(f)=false) then
  Error("f has to be a logic function.");
 fi;

 if (f!.dimension<>2) then
  Error("f has to be a Boolean function.");
 fi;

 f1:=f!.output;

 niter:=maxit;
 return THELMA_INTERNAL_Winnow(f1,step,niter);
end);


InstallOtherMethod(WinnowAlgorithm, "function, step, maxiter", true, [IsFFECollection, IsPosInt, IsPosInt], 3,
function(f,step,maxit)
local f1,niter;

 if step=1 then
  Error("Step must be integer > 1. \n");
 fi;

 if step<1 then
  Error("Step has to be a positive integer!\n");
  return [];
 fi;

 if maxit<1 then
  Error("Maximal number of iterations has to be a positive integer!\n");
  return [];
 fi;

 f1:=List(f,Order);
 niter:=maxit;
 return THELMA_INTERNAL_Winnow(f1,step,niter);
end);

#f - string
InstallOtherMethod(WinnowAlgorithm, "function, step, maxiter", true, [IsString, IsPosInt, IsPosInt], 3,
function(f,step, maxit)
local f1,niter,n,i;

 f1:=[];

 n:=LogInt(Size(f),2);
 if Size(f)<>2^n then
     Error("Number of elements of the vector must be a power of 2");
  return [];
 fi;

 if 2^n<>(Size(Positions(f,'1'))+Size(Positions(f,'0'))) then
  Error("Input string should contain only '1' and '0'. \n");
  return [];
 fi;

 if step<1 then
  Error("Step has to be a positive integer!\n");
  return [];
 fi;

 if maxit<1 then
  Error("Maximal number of iterations has to be a positive integer!\n");
  return [];
 fi;

 for i in [1..Size(f)] do
  if f[i]='1' then Add(f1, 1);
  elif f[i]='0' then Add(f1, 0);
  fi;
 od;


 if step=1 then
  Error("Step must be integer > 1. \n");
 fi;

 niter:=maxit;
 return THELMA_INTERNAL_Winnow(f1,step,niter);
end);

#f - polynomial
InstallOtherMethod(WinnowAlgorithm, "function, step, maxiter", true, [IsPolynomial, IsPosInt, IsPosInt], 3,
function(f,step,maxit)
local f1,niter,var,n;

 var:=OccuringVariableIndices(f);
 n:=InputFromUser("Enter the number of variables (n>=",Size(var),"):\n");

 f1:=THELMA_INTERNAL_PolToOneZero(f,n);

 if step=1 then
  Error("Step must be integer > 1. \n");
 fi;

 if step<1 then
  Error("Step has to be a positive integer!\n");
  return [];
 fi;

 if maxit<1 then
  Error("Maximal number of iterations has to be a positive integer!\n");
  return [];
 fi;

 niter:=maxit;
 return THELMA_INTERNAL_Winnow(f1,step,niter);
end);

######################################################################
##
#F  Winnow2Algorithm(f,step)
##  The algorithm, which generalizaes Winnow1
##

#f - vector over GF(2)
InstallMethod(Winnow2Algorithm, "function, step, maxiter", true, [IsObject, IsPosInt, IsPosInt], 3,
function(f,step,maxit)
local f1,niter;

 if step=1 then
  Error("Step must be integer > 1. \n");
 fi;

 if step<1 then
  Error("Step has to be a positive integer!\n");
  return [];
 fi;

 if maxit<1 then
  Error("Maximal number of iterations has to be a positive integer!\n");
  return [];
 fi;

 if (IsLogicFunction(f)=false) then
  Error("f has to be a logic function.");
 fi;

 if (f!.dimension<>2) then
  Error("f has to be a Boolean function.");
 fi;

 f1:=f!.output;

 niter:=maxit;
 return THELMA_INTERNAL_Winnow2(f1,step,niter);
end);

InstallOtherMethod(Winnow2Algorithm, "function, step, maxiter", true, [IsFFECollection, IsPosInt, IsPosInt], 3,
function(f,step,maxit)
local f1,niter;

 if step=1 then
  Error("Step must be integer > 1. \n");
 fi;

 if step<1 then
  Error("Step has to be a positive integer!\n");
  return [];
 fi;

 if maxit<1 then
  Error("Maximal number of iterations has to be a positive integer!\n");
  return [];
 fi;

 f1:=List(f,Order);
 niter:=maxit;
 return THELMA_INTERNAL_Winnow2(f1,step,niter);
end);

#f - string
InstallOtherMethod(Winnow2Algorithm, "function, step, maxiter", true, [IsString, IsPosInt, IsPosInt], 3,
function(f,step,maxit)
local f1,niter,n,i;

 f1:=[];

 n:=LogInt(Size(f),2);
 if step<1 then
  Error("Step has to be a positive integer!\n");
  return [];
 fi;

 if maxit<1 then
  Error("Maximal number of iterations has to be a positive integer!\n");
  return [];
 fi;

 if Size(f)<>2^n then
     Error("Number of elements of the vector must be a power of 2");
  return [];
 fi;

 if 2^n<>(Size(Positions(f,'1'))+Size(Positions(f,'0'))) then
  Error("Input string should contain only '1' and '0'. \n");
  return [];
 fi;

 for i in [1..Size(f)] do
  if f[i]='1' then Add(f1, 1);
  elif f[i]='0' then Add(f1, 0);
  fi;
 od;

 if step=1 then
  Error("Step must be integer > 1. \n");
 fi;

 niter:=maxit;
 return THELMA_INTERNAL_Winnow2(f1,step,niter);
end);

#f - polynomial
InstallOtherMethod(Winnow2Algorithm, "function, step, max_iter", true, [IsPolynomial, IsPosInt, IsPosInt], 3,
function(f,step,maxit)
local f1,niter,var,n;

 var:=OccuringVariableIndices(f);
 n:=InputFromUser("Enter the number of variables (n>=",Size(var),"):\n");

 if step<1 then
  Error("Step has to be a positive integer!\n");
  return [];
 fi;

 if maxit<1 then
  Error("Maximal number of iterations has to be a positive integer!\n");
  return [];
 fi;

 f1:=THELMA_INTERNAL_PolToOneZero(f,n);

 if step=1 then
  Error("Step must be integer > 1. \n");
 fi;

 niter:=maxit;
 return THELMA_INTERNAL_Winnow2(f1,step,niter);
end);

######################################################################
##
#F  STESynthesis(f,step)
##  The algorithm, which generalizaes Winnow1
##

#Build threshold element (find w and T). Input - f with values from GF(2), output - structure vector (w;T) in [0,1] base;
#if such vector does not exist - return [].


#f - vector over GF(2)
InstallMethod(STESynthesis, "function", true, [IsObject], 1,
function(f)
 local n,i;

 if (IsLogicFunction(f)=false) then
  Error("f has to be a logic function.");
 fi;

 if (f!.dimension<>2) then
  Error("f has to be a Boolean function.");
 fi;

 f:=List(f!.output,i->Elements(GF(2))[i+1]);

 return THELMA_INTERNAL_STESynthesis(f);
end);

InstallOtherMethod(STESynthesis, "function", true, [IsFFECollection], 1,
function(f)
 local n;
 n:=LogInt(Size(f),2);
 if Size(f)<>2^n then
     Error("Number of elements of the vector must be a power of 2");
  return [];
 fi;

 return THELMA_INTERNAL_STESynthesis(f);
end);

#f - string
InstallOtherMethod(STESynthesis, "function", true, [IsString], 1,
function(f)
 local i,f1,n;

  n:=LogInt(Size(f),2);
  if Size(f)<>2^n then
      Error("Number of elements of the vector must be a power of 2");
   return [];
  fi;

  if 2^n<>(Size(Positions(f,'1'))+Size(Positions(f,'0'))) then
   Error("Input string should contain only '1' and '0'. \n");
   return [];
  fi;
   f1:=[];
   for i in [1..Size(f)] do
     if f[i]='1' then Add(f1, Z(2)^0);
     elif f[i]='0' then Add(f1, 0*Z(2));
     fi;
   od;

  return THELMA_INTERNAL_STESynthesis(f1);
end);

#f - polynomial
InstallOtherMethod(STESynthesis, "function", true, [IsPolynomial], 1,
function(f)
local f1,var,n;

 var:=OccuringVariableIndices(f);
 n:=InputFromUser("Enter the number of variables (n>=",Size(var),"):\n");
 f1:=THELMA_INTERNAL_PolToGF2(f,n);
 return THELMA_INTERNAL_STESynthesis(f1);
end);

[ Dauer der Verarbeitung: 0.31 Sekunden  (vorverarbeitet)  ]