mirror of
				https://github.com/KevinMidboe/linguist.git
				synced 2025-10-29 17:50:22 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			503 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			503 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
operator+(a, b: TVector)res: TVector;
 | 
						|
var
 | 
						|
  i, an, bn, rn: Integer;
 | 
						|
begin
 | 
						|
  an := Length(a);
 | 
						|
  bn := Length(b);
 | 
						|
  rn := math.max(an, bn);
 | 
						|
  SetLength(res, rn);
 | 
						|
  for i := 0 to rn - 1 do res[i] := a[i mod an] + b[i mod bn];
 | 
						|
end;
 | 
						|
 | 
						|
operator+(a: TVector; b: Double)res: TVector;
 | 
						|
var
 | 
						|
  i, n: Integer;
 | 
						|
begin
 | 
						|
  n := Length(a);
 | 
						|
  SetLength(res, n);
 | 
						|
  for i := 0 to n - 1 do res[i] := a[i] + b;
 | 
						|
end;
 | 
						|
 | 
						|
operator+(a: Double; b: TVector)res: TVector;
 | 
						|
var
 | 
						|
  i, n: Integer;
 | 
						|
begin
 | 
						|
  n := Length(b);
 | 
						|
  SetLength(res, n);
 | 
						|
  for i := 0 to n - 1 do res[i] := a + b[i];
 | 
						|
end;
 | 
						|
 | 
						|
operator-(a: TVector)res: TVector;
 | 
						|
var
 | 
						|
  i, n: Integer;
 | 
						|
begin
 | 
						|
  n := Length(a);
 | 
						|
  SetLength(res, n);
 | 
						|
  for i := 0 to n - 1 do res[i] := -a[i];
 | 
						|
end;
 | 
						|
 | 
						|
operator-(a, b: TVector)res: TVector;
 | 
						|
var
 | 
						|
  i, an, bn, rn: Integer;
 | 
						|
begin
 | 
						|
  an := Length(a);
 | 
						|
  bn := Length(b);
 | 
						|
  rn := math.max(an, bn);
 | 
						|
  SetLength(res, rn);
 | 
						|
  for i := 0 to rn - 1 do res[i] := a[i mod an] - b[i mod bn];
 | 
						|
end;
 | 
						|
 | 
						|
operator-(a: TVector; b: Double)res: TVector;
 | 
						|
var
 | 
						|
  i, n: Integer;
 | 
						|
begin
 | 
						|
  n := Length(a);
 | 
						|
  SetLength(res, n);
 | 
						|
  for i := 0 to n - 1 do res[i] := a[i] - b;
 | 
						|
end;
 | 
						|
 | 
						|
operator-(a: Double; b: TVector)res: TVector;
 | 
						|
var
 | 
						|
  i, n: Integer;
 | 
						|
begin
 | 
						|
  n := Length(b);
 | 
						|
  SetLength(res, n);
 | 
						|
  for i := 0 to n - 1 do res[i] := a - b[i];
 | 
						|
end;
 | 
						|
 | 
						|
operator*(a, b: TVector)res: TVector;
 | 
						|
var
 | 
						|
  i, an, bn, rn: Integer;
 | 
						|
begin
 | 
						|
  an := Length(a);
 | 
						|
  bn := Length(b);
 | 
						|
  rn := math.max(an, bn);
 | 
						|
  SetLength(res, rn);
 | 
						|
  for i := 0 to rn - 1 do res[i] := a[i mod an] * b[i mod bn];
 | 
						|
end;
 | 
						|
 | 
						|
operator*(a: TVector; b: Double)res: TVector;
 | 
						|
var
 | 
						|
  i, n: Integer;
 | 
						|
begin
 | 
						|
  n := Length(a);
 | 
						|
  SetLength(res, n);
 | 
						|
  for i := 0 to n - 1 do res[i] := a[i] * b;
 | 
						|
end;
 | 
						|
 | 
						|
operator*(a: Double; b: TVector)res: TVector;
 | 
						|
var
 | 
						|
  i, n: Integer;
 | 
						|
begin
 | 
						|
  n := Length(b);
 | 
						|
  SetLength(res, n);
 | 
						|
  for i := 0 to n - 1 do res[i] := a * b[i];
 | 
						|
end;
 | 
						|
 | 
						|
operator/(a, b: TVector)res: TVector;
 | 
						|
var
 | 
						|
  i, an, bn, rn: Integer;
 | 
						|
begin
 | 
						|
  an := Length(a);
 | 
						|
  bn := Length(b);
 | 
						|
  rn := math.max(an, bn);
 | 
						|
  SetLength(res, rn);
 | 
						|
  for i := 0 to rn - 1 do res[i] := a[i mod an] / b[i mod bn];
 | 
						|
end;
 | 
						|
 | 
						|
operator/(a: TVector; b: Double)res: TVector;
 | 
						|
var
 | 
						|
  i, n: Integer;
 | 
						|
begin
 | 
						|
  n := Length(a);
 | 
						|
  SetLength(res, n);
 | 
						|
  for i := 0 to n - 1 do res[i] := a[i] / b;
 | 
						|
end;
 | 
						|
 | 
						|
operator/(a: Double; b: TVector)res: TVector;
 | 
						|
var
 | 
						|
  i, n: Integer;
 | 
						|
begin
 | 
						|
  n := Length(b);
 | 
						|
  SetLength(res, n);
 | 
						|
  for i := 0 to n - 1 do res[i] := a / b[i];
 | 
						|
end;
 | 
						|
 | 
						|
operator**(a, b: Double)res: Double;
 | 
						|
begin
 | 
						|
  if IsNan(a) or IsNan(b) then res := NaN
 | 
						|
  else if b = Infinity then begin
 | 
						|
    if a = NegInfinity then res := NaN
 | 
						|
    else case sign(a) of
 | 
						|
      1: res := Infinity;
 | 
						|
      0: res := 0;
 | 
						|
      -1: res := NegInfinity;
 | 
						|
    end;
 | 
						|
  end else if b = NegInfinity then begin
 | 
						|
    if a = NegInfinity then res := NaN
 | 
						|
    else case sign(a) of
 | 
						|
      1: res := 0;
 | 
						|
      0: res := Infinity;
 | 
						|
      -1: res := 0;
 | 
						|
    end;
 | 
						|
  end else res := power(a, b);
 | 
						|
end;
 | 
						|
 | 
						|
operator**(a, b: TVector)res: TVector;
 | 
						|
var
 | 
						|
  i, an, bn, rn: Integer;
 | 
						|
begin
 | 
						|
  an := Length(a);
 | 
						|
  bn := Length(b);
 | 
						|
  rn := math.max(an, bn);
 | 
						|
  SetLength(res, rn);
 | 
						|
  for i := 0 to rn - 1 do res[i] := a[i mod an] ** b[i mod bn];
 | 
						|
end;
 | 
						|
 | 
						|
operator**(a: TVector; b: Double)res: TVector;
 | 
						|
var
 | 
						|
  i, n: Integer;
 | 
						|
begin
 | 
						|
  n := Length(a);
 | 
						|
  SetLength(res, n);
 | 
						|
  for i := 0 to n - 1 do res[i] := a[i] ** b;
 | 
						|
end;
 | 
						|
 | 
						|
operator**(a: Double; b: TVector)res: TVector;
 | 
						|
var
 | 
						|
  i, n: Integer;
 | 
						|
begin
 | 
						|
  n := Length(b);
 | 
						|
  SetLength(res, n);
 | 
						|
  for i := 0 to n - 1 do res[i] := a ** b[i];
 | 
						|
end;
 | 
						|
 | 
						|
operator><(a: TVector; b: TVector)res: TMatrix;
 | 
						|
var
 | 
						|
  i, an, bn, rn: Integer;
 | 
						|
begin
 | 
						|
  an := Length(a);
 | 
						|
  bn := Length(b);
 | 
						|
  if an * bn = 0 then Exit(nil);
 | 
						|
  rn := math.max(an, bn);
 | 
						|
  SetLength(res, 1);
 | 
						|
  SetLength(res[0], 1);
 | 
						|
  res[0][0] := 0;
 | 
						|
  for i := 0 to rn - 1 do res[0][0] := res[0][0] + a[i mod an] * b[i mod bn];
 | 
						|
end;
 | 
						|
 | 
						|
operator+(a: TMatrix; b: TMatrix)res: TMatrix;
 | 
						|
var
 | 
						|
  i, an: Integer;
 | 
						|
begin
 | 
						|
  an := Length(a);
 | 
						|
  SetLength(res, an);
 | 
						|
  for i := 0 to an - 1 do res[i] := a[i] + b[i];
 | 
						|
end;
 | 
						|
 | 
						|
operator+(a: TMatrix; b: Double)res: TMatrix;
 | 
						|
var
 | 
						|
  i, n: Integer;
 | 
						|
begin
 | 
						|
  n := Length(a);
 | 
						|
  SetLength(res, n);
 | 
						|
  for i := 0 to n - 1 do res[i] := a[i] + b;
 | 
						|
end;
 | 
						|
 | 
						|
operator+(a: Double; b: TMatrix)res: TMatrix;
 | 
						|
var
 | 
						|
  i, n: Integer;
 | 
						|
begin
 | 
						|
  n := Length(b);
 | 
						|
  SetLength(res, n);
 | 
						|
  for i := 0 to n - 1 do res[i] := a + b[i];
 | 
						|
end;
 | 
						|
 | 
						|
operator+(a: TMatrix; b: TVector)res: TMatrix;
 | 
						|
begin
 | 
						|
  res := a + matrix(b, Length(a), Length(a[0]));
 | 
						|
end;
 | 
						|
 | 
						|
operator+(a: TVector; b: TMatrix)res: TMatrix;
 | 
						|
begin
 | 
						|
  res := b + matrix(a, Length(b), Length(b[0]));
 | 
						|
end;
 | 
						|
 | 
						|
operator-(a: TMatrix)res: TMatrix;
 | 
						|
var
 | 
						|
  i, n: Integer;
 | 
						|
begin
 | 
						|
  n := Length(a);
 | 
						|
  SetLength(res, n);
 | 
						|
  for i := 0 to n - 1 do res[i] := -a[i];
 | 
						|
end;
 | 
						|
 | 
						|
operator-(a: TMatrix; b: TMatrix)res: TMatrix;
 | 
						|
var
 | 
						|
  i, an: Integer;
 | 
						|
begin
 | 
						|
  an := Length(a);
 | 
						|
  SetLength(res, an);
 | 
						|
  for i := 0 to an - 1 do res[i] := a[i] - b[i];
 | 
						|
end;
 | 
						|
 | 
						|
operator-(a: TMatrix; b: Double)res: TMatrix;
 | 
						|
var
 | 
						|
  i, n: Integer;
 | 
						|
begin
 | 
						|
  n := Length(a);
 | 
						|
  SetLength(res, n);
 | 
						|
  for i := 0 to n - 1 do res[i] := a[i] - b;
 | 
						|
end;
 | 
						|
 | 
						|
operator-(a: Double; b: TMatrix)res: TMatrix;
 | 
						|
var
 | 
						|
  i, n: Integer;
 | 
						|
begin
 | 
						|
  n := Length(b);
 | 
						|
  SetLength(res, n);
 | 
						|
  for i := 0 to n - 1 do res[i] := a - b[i];
 | 
						|
end;
 | 
						|
 | 
						|
operator-(a: TMatrix; b: TVector)res: TMatrix;
 | 
						|
begin
 | 
						|
  res := a - matrix(b, Length(a), Length(a[0]));
 | 
						|
end;
 | 
						|
 | 
						|
operator-(a: TVector; b: TMatrix)res: TMatrix;
 | 
						|
begin
 | 
						|
  res := b - matrix(a, Length(b), Length(b[0]));
 | 
						|
end;
 | 
						|
 | 
						|
operator*(a: TMatrix; b: TMatrix)res: TMatrix;
 | 
						|
var
 | 
						|
  i, an: Integer;
 | 
						|
begin
 | 
						|
  an := Length(a);
 | 
						|
  SetLength(res, an);
 | 
						|
  for i := 0 to an - 1 do res[i] := a[i] * b[i];
 | 
						|
end;
 | 
						|
 | 
						|
operator*(a: TMatrix; b: Double)res: TMatrix;
 | 
						|
var
 | 
						|
  i, n: Integer;
 | 
						|
begin
 | 
						|
  n := Length(a);
 | 
						|
  SetLength(res, n);
 | 
						|
  for i := 0 to n - 1 do res[i] := a[i] * b;
 | 
						|
end;
 | 
						|
 | 
						|
operator*(a: Double; b: TMatrix)res: TMatrix;
 | 
						|
var
 | 
						|
  i, n: Integer;
 | 
						|
begin
 | 
						|
  n := Length(b);
 | 
						|
  SetLength(res, n);
 | 
						|
  for i := 0 to n - 1 do res[i] := a * b[i];
 | 
						|
end;
 | 
						|
 | 
						|
operator*(a: TMatrix; b: TVector)res: TMatrix;
 | 
						|
begin
 | 
						|
  res := a * matrix(b, Length(a), Length(a[0]));
 | 
						|
end;
 | 
						|
 | 
						|
operator*(a: TVector; b: TMatrix)res: TMatrix;
 | 
						|
begin
 | 
						|
  res := b * matrix(a, Length(b), Length(b[0]));
 | 
						|
end;
 | 
						|
 | 
						|
operator/(a: TMatrix; b: TMatrix)res: TMatrix;
 | 
						|
var
 | 
						|
  i, an: Integer;
 | 
						|
begin
 | 
						|
  an := Length(a);
 | 
						|
  SetLength(res, an);
 | 
						|
  for i := 0 to an - 1 do res[i] := a[i] / b[i];
 | 
						|
end;
 | 
						|
 | 
						|
operator/(a: TMatrix; b: Double)res: TMatrix;
 | 
						|
var
 | 
						|
  i, n: Integer;
 | 
						|
begin
 | 
						|
  n := Length(a);
 | 
						|
  SetLength(res, n);
 | 
						|
  for i := 0 to n - 1 do res[i] := a[i] / b;
 | 
						|
end;
 | 
						|
 | 
						|
operator/(a: Double; b: TMatrix)res: TMatrix;
 | 
						|
var
 | 
						|
  i, n: Integer;
 | 
						|
begin
 | 
						|
  n := Length(b);
 | 
						|
  SetLength(res, n);
 | 
						|
  for i := 0 to n - 1 do res[i] := a / b[i];
 | 
						|
end;
 | 
						|
 | 
						|
operator/(a: TMatrix; b: TVector)res: TMatrix;
 | 
						|
begin
 | 
						|
  res := a / matrix(b, Length(a), Length(a[0]));
 | 
						|
end;
 | 
						|
 | 
						|
operator/(a: TVector; b: TMatrix)res: TMatrix;
 | 
						|
begin
 | 
						|
  res := b / matrix(a, Length(b), Length(b[0]));
 | 
						|
end;
 | 
						|
 | 
						|
operator**(a: TMatrix; b: TMatrix)res: TMatrix;
 | 
						|
var
 | 
						|
  i, an: Integer;
 | 
						|
begin
 | 
						|
  an := Length(a);
 | 
						|
  SetLength(res, an);
 | 
						|
  for i := 0 to an - 1 do res[i] := a[i] ** b[i];
 | 
						|
end;
 | 
						|
 | 
						|
operator**(a: TMatrix; b: Double)res: TMatrix;
 | 
						|
var
 | 
						|
  i, n: Integer;
 | 
						|
begin
 | 
						|
  n := Length(a);
 | 
						|
  SetLength(res, n);
 | 
						|
  for i := 0 to n - 1 do res[i] := a[i] ** b;
 | 
						|
end;
 | 
						|
 | 
						|
operator**(a: Double; b: TMatrix)res: TMatrix;
 | 
						|
var
 | 
						|
  i, n: Integer;
 | 
						|
begin
 | 
						|
  n := Length(b);
 | 
						|
  SetLength(res, n);
 | 
						|
  for i := 0 to n - 1 do res[i] := a ** b[i];
 | 
						|
end;
 | 
						|
 | 
						|
operator**(a: TMatrix; b: TVector)res: TMatrix;
 | 
						|
begin
 | 
						|
  res := a ** matrix(b, Length(a), Length(a[0]));
 | 
						|
end;
 | 
						|
 | 
						|
operator**(a: TVector; b: TMatrix)res: TMatrix;
 | 
						|
begin
 | 
						|
  res := b ** matrix(a, Length(b), Length(b[0]));
 | 
						|
end;
 | 
						|
 | 
						|
operator><(a: TMatrix; b: TMatrix)res: TMatrix;
 | 
						|
var
 | 
						|
  i, j, n, m: Integer;
 | 
						|
begin
 | 
						|
  n := Length(a);
 | 
						|
  m := Length(b);
 | 
						|
  if (n = 1) and (m = 1) then Exit(vector(a) >< vector(b));
 | 
						|
  SetLength(res, n);
 | 
						|
  for i := 0 to n - 1 do begin
 | 
						|
    j := 0;
 | 
						|
    res[i] := a[i][j] * b[j];
 | 
						|
    for j := 1 to m - 1 do res[i] := res[i] + a[i][j] * b[j];
 | 
						|
  end;
 | 
						|
end;
 | 
						|
 | 
						|
operator><(a: TMatrix; b: TVector)res: TMatrix;
 | 
						|
begin
 | 
						|
  res := a >< matrix(b, 1, Length(b));
 | 
						|
end;
 | 
						|
 | 
						|
operator><(a: TVector; b: TMatrix)res: TMatrix;
 | 
						|
begin
 | 
						|
  res := matrix(a, 1, Length(a)) >< b;
 | 
						|
end;
 | 
						|
 | 
						|
function vector(a: array of const): TVector;
 | 
						|
var
 | 
						|
  i, n: Integer;
 | 
						|
begin
 | 
						|
  n := Length(a);
 | 
						|
  SetLength(Result, n);
 | 
						|
  for i := 0 to n - 1 do case a[i].VType of
 | 
						|
    vtInteger:  Result[i] := a[i].VInteger;
 | 
						|
    vtExtended: Result[i] := a[i].VExtended^;
 | 
						|
    vtCurrency: Result[i] := a[i].VCurrency^;
 | 
						|
    vtInt64:    Result[i] := a[i].VInt64^;
 | 
						|
  end;
 | 
						|
end;
 | 
						|
 | 
						|
function vector(a: TMatrix): TVector; inline;
 | 
						|
var
 | 
						|
  i, j, n, m : Integer;
 | 
						|
begin
 | 
						|
  n := Length(a);
 | 
						|
  if n = 0 then Exit(nil);
 | 
						|
  m := Length(a[0]);
 | 
						|
  if m = 0 then Exit(nil);
 | 
						|
  SetLength(Result, m * n);
 | 
						|
  for i := 0 to m - 1 do
 | 
						|
    for j := 0 to n - 1 do
 | 
						|
      Result[i * n + j] := a[j][i];
 | 
						|
end;
 | 
						|
 | 
						|
function matrix(data: TVector; nrow, ncol: Integer; byrow: Boolean): TMatrix;
 | 
						|
var
 | 
						|
  i, j, n, c: Integer;
 | 
						|
begin
 | 
						|
  n := Length(data);
 | 
						|
  if n = 0 then Exit(nil);
 | 
						|
  if (nrow = 0) and (ncol = 0) then ncol := 1;
 | 
						|
  if nrow = 0 then nrow := (n div ncol) + sign(n mod ncol);
 | 
						|
  if ncol = 0 then ncol := (n div nrow) + sign(n mod nrow);
 | 
						|
  SetLength(Result, nrow);
 | 
						|
  for i := 0 to nrow - 1 do begin
 | 
						|
    SetLength(Result[i], ncol);
 | 
						|
    for j := 0 to ncol - 1 do begin
 | 
						|
      if byrow then c := i * ncol + j else c := j * nrow + i;
 | 
						|
      Result[i][j] := data[c mod n];
 | 
						|
    end;
 | 
						|
  end;
 | 
						|
end;
 | 
						|
 | 
						|
function matrix(data: TMatrix; nrow, ncol: Integer; byrow: Boolean): TMatrix;
 | 
						|
begin
 | 
						|
  Result := matrix(vector(data), nrow, ncol, byrow);
 | 
						|
end;
 | 
						|
 | 
						|
function rep(data: TVector; times: TVector): TVector;
 | 
						|
var
 | 
						|
  i, j, n, m, s, c: Integer;
 | 
						|
begin
 | 
						|
  Result := nil;
 | 
						|
  n := Length(data);
 | 
						|
  m := Length(times);
 | 
						|
  if n * m = 0 then Exit;
 | 
						|
  s := 0;
 | 
						|
  for i := 0 to n - 1 do begin
 | 
						|
    c := trunc(times[i mod m]);
 | 
						|
    if c > 0 then s += c;
 | 
						|
  end;
 | 
						|
  SetLength(Result, s);
 | 
						|
  c := 0;
 | 
						|
  for i := 0 to n - 1 do begin
 | 
						|
    s := trunc(times[i mod m]);
 | 
						|
    for j := 1 to s do begin
 | 
						|
      Result[c] := data[i];
 | 
						|
      Inc(c);
 | 
						|
    end;
 | 
						|
  end;
 | 
						|
end;
 | 
						|
 | 
						|
function rep(data: TVector; len: Integer): TVector;
 | 
						|
var
 | 
						|
  i, j, n: Integer;
 | 
						|
begin
 | 
						|
  n := Length(data);
 | 
						|
  SetLength(Result, n * len);
 | 
						|
  if n = 0 then Exit;
 | 
						|
  for i := 0 to len - 1 do
 | 
						|
    for j := 0 to n - 1 do
 | 
						|
      Result[i * n + j] := data[j];
 | 
						|
end;
 | 
						|
 | 
						|
function rep(data: Double; len: Integer): TVector;
 | 
						|
var
 | 
						|
  i: Integer;
 | 
						|
begin
 | 
						|
  SetLength(Result, len);
 | 
						|
  for i := 0 to len - 1 do Result[i] := data;
 | 
						|
end;
 |