From 98fe38141b02cf3e5fc6a3b1a737476887c6a7bf Mon Sep 17 00:00:00 2001 From: Mikhalkovich Stanislav Date: Mon, 16 Feb 2026 15:46:15 +0300 Subject: [PATCH] =?UTF-8?q?TipPainterTools=20-=20=D0=B8=D1=81=D0=BF=D1=80?= =?UTF-8?q?=D0=B0=D0=B2=D0=B8=D0=BB=20=D0=B2=D0=BE=D0=B7=D0=BC=D0=BE=D0=B6?= =?UTF-8?q?=D0=BD=D0=BE=D0=B5=20=D0=BF=D0=B0=D0=B4=D0=B5=D0=BD=D0=B8=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit operator* в Matrix сделал extension --- Configuration/GlobalAssemblyInfo.cs | 2 +- Configuration/Version.defs | 2 +- Release/pabcversion.txt | 2 +- ReleaseGenerators/PascalABCNET_version.nsh | 2 +- .../CodeCompletionVisual/TipPainterTools.cs | 221 +++++++++++++++--- .../CodeCompletionVisual/TipPainterTools.cs | 215 ++++++++++++++--- bin/Lib/LinearAlgebraML.pas | 28 ++- bin/Lib/MLModelsABC.pas | 6 +- 8 files changed, 408 insertions(+), 70 deletions(-) diff --git a/Configuration/GlobalAssemblyInfo.cs b/Configuration/GlobalAssemblyInfo.cs index f5cb60675..09b6e1cf0 100644 --- a/Configuration/GlobalAssemblyInfo.cs +++ b/Configuration/GlobalAssemblyInfo.cs @@ -15,7 +15,7 @@ internal static class RevisionClass public const string Major = "3"; public const string Minor = "11"; public const string Build = "1"; - public const string Revision = "3751"; + public const string Revision = "3753"; public const string MainVersion = Major + "." + Minor; public const string FullVersion = Major + "." + Minor + "." + Build + "." + Revision; diff --git a/Configuration/Version.defs b/Configuration/Version.defs index 6d465f1a2..4936afea7 100644 --- a/Configuration/Version.defs +++ b/Configuration/Version.defs @@ -1,4 +1,4 @@ %MINOR%=11 -%REVISION%=3751 +%REVISION%=3753 %COREVERSION%=1 %MAJOR%=3 diff --git a/Release/pabcversion.txt b/Release/pabcversion.txt index 6d60b906d..968c42b1c 100644 --- a/Release/pabcversion.txt +++ b/Release/pabcversion.txt @@ -1 +1 @@ -3.11.1.3751 +3.11.1.3753 diff --git a/ReleaseGenerators/PascalABCNET_version.nsh b/ReleaseGenerators/PascalABCNET_version.nsh index ef46e1b11..747eb5cbe 100644 --- a/ReleaseGenerators/PascalABCNET_version.nsh +++ b/ReleaseGenerators/PascalABCNET_version.nsh @@ -1 +1 @@ -!define VERSION '3.11.1.3751' +!define VERSION '3.11.1.3753' diff --git a/VisualPascalABCNET/DS/CodeCompletionVisual/TipPainterTools.cs b/VisualPascalABCNET/DS/CodeCompletionVisual/TipPainterTools.cs index 7eea30340..a4b32b4c6 100644 --- a/VisualPascalABCNET/DS/CodeCompletionVisual/TipPainterTools.cs +++ b/VisualPascalABCNET/DS/CodeCompletionVisual/TipPainterTools.cs @@ -69,22 +69,41 @@ namespace ICSharpCode.TextEditor.Util var languageIntellisenseSupport = CodeCompletion.CodeCompletionController.CurrentLanguage.LanguageIntellisenseSupport; - int startIndex = basicDescription.IndexOf("(", basicDescription.IndexOf("(" + PascalABCCompiler.StringResources.Get("CODE_COMPLETION_EXTENSION")) + 1) + 1; + // ИЗМЕНЕНО НАЧАЛО + int extensionIndex = basicDescription.IndexOf("(" + PascalABCCompiler.StringResources.Get("CODE_COMPLETION_EXTENSION")); + if (extensionIndex == -1) + return; - int paranthesisIndex = languageIntellisenseSupport.FindClosingParenthesis(basicDescription.Substring(startIndex), ')'); + int startIndex = basicDescription.IndexOf("(", extensionIndex + 1); + if (startIndex == -1) + return; + + startIndex++; + + if (startIndex >= basicDescription.Length) + return; + + string substringFromStart = basicDescription.Substring(startIndex); + int paranthesisIndex = languageIntellisenseSupport.FindClosingParenthesis(substringFromStart, ')'); if (paranthesisIndex == -1) return; int end_sk = paranthesisIndex + startIndex; + if (end_sk > basicDescription.Length) + return; + // ИЗМЕНЕНО КОНЕЦ + if (param_num == 1) { + // ИЗМЕНЕНО НАЧАЛО bold_beg = startIndex; - if (bold_beg != 0) + if (bold_beg != 0 && bold_beg < basicDescription.Length) { - int paramDelimIndex = languageIntellisenseSupport.FindParamDelim(basicDescription.Substring(bold_beg), 1); + string remainingText = basicDescription.Substring(bold_beg); + int paramDelimIndex = languageIntellisenseSupport.FindParamDelim(remainingText, 1); if (paramDelimIndex == -1) { @@ -94,25 +113,34 @@ namespace ICSharpCode.TextEditor.Util { bold_len = paramDelimIndex; } + + if (bold_len < 0) + bold_len = 0; } + // ИЗМЕНЕНО КОНЕЦ } else { - // Здесь учтется случай последнего параметра типа params EVA if (param_num > paramsCount) { if (paramsCount == 1) { - string paramDescription = basicDescription.Substring(startIndex, paranthesisIndex); - - if (languageIntellisenseSupport.IsParams(paramDescription)) + // ИЗМЕНЕНО НАЧАЛО + if (startIndex < basicDescription.Length && paranthesisIndex > 0) { - bold_beg = startIndex; - bold_len = paranthesisIndex; + string paramDescription = basicDescription.Substring(startIndex, paranthesisIndex); + + if (languageIntellisenseSupport.IsParams(paramDescription)) + { + bold_beg = startIndex; + bold_len = paranthesisIndex; + } } + // ИЗМЕНЕНО КОНЕЦ } else { + // ИЗМЕНЕНО НАЧАЛО string descriptionAfterBracket = basicDescription.Substring(startIndex); int paramDelimIndex = languageIntellisenseSupport.FindParamDelim(descriptionAfterBracket, paramsCount - 1); @@ -121,46 +149,181 @@ namespace ICSharpCode.TextEditor.Util { int paramDelimLength = languageIntellisenseSupport.ParameterDelimiter.Length; - // Проверка на всякий случай, чтобы не возникало ошибки с отрицательным length в Substring EVA - if (paranthesisIndex - paramDelimLength < paramDelimLength) - return; + int length = paranthesisIndex - paramDelimIndex - paramDelimLength; - string paramDescription = descriptionAfterBracket.Substring(paramDelimIndex + paramDelimLength, paranthesisIndex - paramDelimIndex - paramDelimLength); - - if (languageIntellisenseSupport.IsParams(paramDescription)) + if (paramDelimIndex + paramDelimLength <= descriptionAfterBracket.Length && + length >= 0 && + paramDelimIndex + paramDelimLength + length <= descriptionAfterBracket.Length) { - bold_beg = paramDelimIndex + startIndex + paramDelimLength; - bold_len = end_sk - bold_beg; + string paramDescription = descriptionAfterBracket.Substring( + paramDelimIndex + paramDelimLength, + length); + + if (languageIntellisenseSupport.IsParams(paramDescription)) + { + bold_beg = paramDelimIndex + startIndex + paramDelimLength; + bold_len = end_sk - bold_beg; + + if (bold_len < 0) + bold_len = 0; + } } } + // ИЗМЕНЕНО КОНЕЦ } } else { + // ИЗМЕНЕНО НАЧАЛО int paramDelimIndex = languageIntellisenseSupport.FindParamDelim(basicDescription.Substring(startIndex), param_num - 1); if (paramDelimIndex != -1) { - bold_beg = paramDelimIndex + startIndex + languageIntellisenseSupport.ParameterDelimiter.Length; - int secondParamDelimIndex = languageIntellisenseSupport.FindParamDelim(basicDescription.Substring(startIndex), param_num); + int paramDelimLength = languageIntellisenseSupport.ParameterDelimiter.Length; + bold_beg = paramDelimIndex + startIndex + paramDelimLength; - if (secondParamDelimIndex == -1) + if (bold_beg < basicDescription.Length) { - bold_len = end_sk - bold_beg; - } - else - { - bold_len = secondParamDelimIndex + startIndex - bold_beg; + int secondParamDelimIndex = languageIntellisenseSupport.FindParamDelim(basicDescription.Substring(startIndex), param_num); + + if (secondParamDelimIndex == -1) + { + bold_len = end_sk - bold_beg; + } + else + { + bold_len = secondParamDelimIndex + startIndex - bold_beg; + } + + if (bold_len < 0) + bold_len = 0; } } + // ИЗМЕНЕНО КОНЕЦ } } } } } - - // btw. I know it's ugly. - public static Rectangle DrawingRectangle1; + + /* private static void GetToolipParts(string description, int param_num, int paramsCount, out string basicDescription, out string documentation, out int bold_beg, out int bold_len) + { + basicDescription = null; + documentation = null; + bold_beg = 0; + bold_len = 0; + if (IsVisibleText(description)) + { + string[] splitDescription = description.Split(new char[] { '\n' }, 2); + + if (splitDescription.Length > 0) + { + if (splitDescription.Length > 1) + { + documentation = splitDescription[1].Trim(); + } + + basicDescription = splitDescription[0]; + + if (param_num == -1) + return; + + var languageIntellisenseSupport = CodeCompletion.CodeCompletionController.CurrentLanguage.LanguageIntellisenseSupport; + + int startIndex = basicDescription.IndexOf("(", basicDescription.IndexOf("(" + PascalABCCompiler.StringResources.Get("CODE_COMPLETION_EXTENSION")) + 1) + 1; + + int paranthesisIndex = languageIntellisenseSupport.FindClosingParenthesis(basicDescription.Substring(startIndex), ')'); + + if (paranthesisIndex == -1) + return; + + int end_sk = paranthesisIndex + startIndex; + + if (param_num == 1) + { + bold_beg = startIndex; + + if (bold_beg != 0) + { + int paramDelimIndex = languageIntellisenseSupport.FindParamDelim(basicDescription.Substring(bold_beg), 1); + + if (paramDelimIndex == -1) + { + bold_len = end_sk - bold_beg; + } + else + { + bold_len = paramDelimIndex; + } + } + } + else + { + // Здесь учтется случай последнего параметра типа params EVA + if (param_num > paramsCount) + { + if (paramsCount == 1) + { + string paramDescription = basicDescription.Substring(startIndex, paranthesisIndex); + + if (languageIntellisenseSupport.IsParams(paramDescription)) + { + bold_beg = startIndex; + bold_len = paranthesisIndex; + } + } + else + { + string descriptionAfterBracket = basicDescription.Substring(startIndex); + + int paramDelimIndex = languageIntellisenseSupport.FindParamDelim(descriptionAfterBracket, paramsCount - 1); + + if (paramDelimIndex != -1) + { + int paramDelimLength = languageIntellisenseSupport.ParameterDelimiter.Length; + + // Проверка на всякий случай, чтобы не возникало ошибки с отрицательным length в Substring EVA + if (paranthesisIndex - paramDelimLength < paramDelimLength) + return; + + string paramDescription = descriptionAfterBracket.Substring(paramDelimIndex + paramDelimLength, paranthesisIndex - paramDelimIndex - paramDelimLength); + + if (languageIntellisenseSupport.IsParams(paramDescription)) + { + bold_beg = paramDelimIndex + startIndex + paramDelimLength; + bold_len = end_sk - bold_beg; + } + } + } + } + else + { + int paramDelimIndex = languageIntellisenseSupport.FindParamDelim(basicDescription.Substring(startIndex), param_num - 1); + + if (paramDelimIndex != -1) + { + bold_beg = paramDelimIndex + startIndex + languageIntellisenseSupport.ParameterDelimiter.Length; + int secondParamDelimIndex = languageIntellisenseSupport.FindParamDelim(basicDescription.Substring(startIndex), param_num); + + if (secondParamDelimIndex == -1) + { + bold_len = end_sk - bold_beg; + } + else + { + bold_len = secondParamDelimIndex + startIndex - bold_beg; + } + } + } + } + } + } + }*/ + + + + // btw. I know it's ugly. + public static Rectangle DrawingRectangle1; public static Rectangle DrawingRectangle2; public static Size GetDrawingSizeDrawHelpTip(Control control, diff --git a/VisualPascalABCNETLinux/DS/CodeCompletionVisual/TipPainterTools.cs b/VisualPascalABCNETLinux/DS/CodeCompletionVisual/TipPainterTools.cs index 377e916be..c79130fe4 100644 --- a/VisualPascalABCNETLinux/DS/CodeCompletionVisual/TipPainterTools.cs +++ b/VisualPascalABCNETLinux/DS/CodeCompletionVisual/TipPainterTools.cs @@ -68,22 +68,41 @@ namespace ICSharpCode.TextEditor.Util var languageIntellisenseSupport = CodeCompletion.CodeCompletionController.CurrentLanguage.LanguageIntellisenseSupport; - int startIndex = basicDescription.IndexOf("(", basicDescription.IndexOf("(" + PascalABCCompiler.StringResources.Get("CODE_COMPLETION_EXTENSION")) + 1) + 1; + // ИЗМЕНЕНО НАЧАЛО + int extensionIndex = basicDescription.IndexOf("(" + PascalABCCompiler.StringResources.Get("CODE_COMPLETION_EXTENSION")); + if (extensionIndex == -1) + return; - int paranthesisIndex = languageIntellisenseSupport.FindClosingParenthesis(basicDescription.Substring(startIndex), ')'); + int startIndex = basicDescription.IndexOf("(", extensionIndex + 1); + if (startIndex == -1) + return; + + startIndex++; + + if (startIndex >= basicDescription.Length) + return; + + string substringFromStart = basicDescription.Substring(startIndex); + int paranthesisIndex = languageIntellisenseSupport.FindClosingParenthesis(substringFromStart, ')'); if (paranthesisIndex == -1) return; int end_sk = paranthesisIndex + startIndex; + if (end_sk > basicDescription.Length) + return; + // ИЗМЕНЕНО КОНЕЦ + if (param_num == 1) { + // ИЗМЕНЕНО НАЧАЛО bold_beg = startIndex; - if (bold_beg != 0) + if (bold_beg != 0 && bold_beg < basicDescription.Length) { - int paramDelimIndex = languageIntellisenseSupport.FindParamDelim(basicDescription.Substring(bold_beg), 1); + string remainingText = basicDescription.Substring(bold_beg); + int paramDelimIndex = languageIntellisenseSupport.FindParamDelim(remainingText, 1); if (paramDelimIndex == -1) { @@ -93,25 +112,34 @@ namespace ICSharpCode.TextEditor.Util { bold_len = paramDelimIndex; } + + if (bold_len < 0) + bold_len = 0; } + // ИЗМЕНЕНО КОНЕЦ } else { - // Здесь учтется случай последнего параметра типа params EVA if (param_num > paramsCount) { if (paramsCount == 1) { - string paramDescription = basicDescription.Substring(startIndex, paranthesisIndex); - - if (languageIntellisenseSupport.IsParams(paramDescription)) + // ИЗМЕНЕНО НАЧАЛО + if (startIndex < basicDescription.Length && paranthesisIndex > 0) { - bold_beg = startIndex; - bold_len = paranthesisIndex; + string paramDescription = basicDescription.Substring(startIndex, paranthesisIndex); + + if (languageIntellisenseSupport.IsParams(paramDescription)) + { + bold_beg = startIndex; + bold_len = paranthesisIndex; + } } + // ИЗМЕНЕНО КОНЕЦ } else { + // ИЗМЕНЕНО НАЧАЛО string descriptionAfterBracket = basicDescription.Substring(startIndex); int paramDelimIndex = languageIntellisenseSupport.FindParamDelim(descriptionAfterBracket, paramsCount - 1); @@ -120,44 +148,179 @@ namespace ICSharpCode.TextEditor.Util { int paramDelimLength = languageIntellisenseSupport.ParameterDelimiter.Length; - // Проверка на всякий случай, чтобы не возникало ошибки с отрицательным length в Substring EVA - if (paranthesisIndex - paramDelimLength < paramDelimLength) - return; + int length = paranthesisIndex - paramDelimIndex - paramDelimLength; - string paramDescription = descriptionAfterBracket.Substring(paramDelimIndex + paramDelimLength, paranthesisIndex - paramDelimIndex - paramDelimLength); - - if (languageIntellisenseSupport.IsParams(paramDescription)) + if (paramDelimIndex + paramDelimLength <= descriptionAfterBracket.Length && + length >= 0 && + paramDelimIndex + paramDelimLength + length <= descriptionAfterBracket.Length) { - bold_beg = paramDelimIndex + startIndex + paramDelimLength; - bold_len = end_sk - bold_beg; + string paramDescription = descriptionAfterBracket.Substring( + paramDelimIndex + paramDelimLength, + length); + + if (languageIntellisenseSupport.IsParams(paramDescription)) + { + bold_beg = paramDelimIndex + startIndex + paramDelimLength; + bold_len = end_sk - bold_beg; + + if (bold_len < 0) + bold_len = 0; + } } } + // ИЗМЕНЕНО КОНЕЦ } } else { + // ИЗМЕНЕНО НАЧАЛО int paramDelimIndex = languageIntellisenseSupport.FindParamDelim(basicDescription.Substring(startIndex), param_num - 1); if (paramDelimIndex != -1) { - bold_beg = paramDelimIndex + startIndex + languageIntellisenseSupport.ParameterDelimiter.Length; - int secondParamDelimIndex = languageIntellisenseSupport.FindParamDelim(basicDescription.Substring(startIndex), param_num); + int paramDelimLength = languageIntellisenseSupport.ParameterDelimiter.Length; + bold_beg = paramDelimIndex + startIndex + paramDelimLength; - if (secondParamDelimIndex == -1) + if (bold_beg < basicDescription.Length) { - bold_len = end_sk - bold_beg; - } - else - { - bold_len = secondParamDelimIndex + startIndex - bold_beg; + int secondParamDelimIndex = languageIntellisenseSupport.FindParamDelim(basicDescription.Substring(startIndex), param_num); + + if (secondParamDelimIndex == -1) + { + bold_len = end_sk - bold_beg; + } + else + { + bold_len = secondParamDelimIndex + startIndex - bold_beg; + } + + if (bold_len < 0) + bold_len = 0; } } + // ИЗМЕНЕНО КОНЕЦ } } } } } + /* private static void GetToolipParts(string description, int param_num, int paramsCount, out string basicDescription, out string documentation, out int bold_beg, out int bold_len) + { + basicDescription = null; + documentation = null; + bold_beg = 0; + bold_len = 0; + if (IsVisibleText(description)) + { + string[] splitDescription = description.Split(new char[] { '\n' }, 2); + + if (splitDescription.Length > 0) + { + if (splitDescription.Length > 1) + { + documentation = splitDescription[1].Trim(); + } + + basicDescription = splitDescription[0]; + + if (param_num == -1) + return; + + var languageIntellisenseSupport = CodeCompletion.CodeCompletionController.CurrentLanguage.LanguageIntellisenseSupport; + + int startIndex = basicDescription.IndexOf("(", basicDescription.IndexOf("(" + PascalABCCompiler.StringResources.Get("CODE_COMPLETION_EXTENSION")) + 1) + 1; + + int paranthesisIndex = languageIntellisenseSupport.FindClosingParenthesis(basicDescription.Substring(startIndex), ')'); + + if (paranthesisIndex == -1) + return; + + int end_sk = paranthesisIndex + startIndex; + + if (param_num == 1) + { + bold_beg = startIndex; + + if (bold_beg != 0) + { + int paramDelimIndex = languageIntellisenseSupport.FindParamDelim(basicDescription.Substring(bold_beg), 1); + + if (paramDelimIndex == -1) + { + bold_len = end_sk - bold_beg; + } + else + { + bold_len = paramDelimIndex; + } + } + } + else + { + // Здесь учтется случай последнего параметра типа params EVA + if (param_num > paramsCount) + { + if (paramsCount == 1) + { + string paramDescription = basicDescription.Substring(startIndex, paranthesisIndex); + + if (languageIntellisenseSupport.IsParams(paramDescription)) + { + bold_beg = startIndex; + bold_len = paranthesisIndex; + } + } + else + { + string descriptionAfterBracket = basicDescription.Substring(startIndex); + + int paramDelimIndex = languageIntellisenseSupport.FindParamDelim(descriptionAfterBracket, paramsCount - 1); + + if (paramDelimIndex != -1) + { + int paramDelimLength = languageIntellisenseSupport.ParameterDelimiter.Length; + + // Проверка на всякий случай, чтобы не возникало ошибки с отрицательным length в Substring EVA + if (paranthesisIndex - paramDelimLength < paramDelimLength) + return; + + string paramDescription = descriptionAfterBracket.Substring(paramDelimIndex + paramDelimLength, paranthesisIndex - paramDelimIndex - paramDelimLength); + + if (languageIntellisenseSupport.IsParams(paramDescription)) + { + bold_beg = paramDelimIndex + startIndex + paramDelimLength; + bold_len = end_sk - bold_beg; + } + } + } + } + else + { + int paramDelimIndex = languageIntellisenseSupport.FindParamDelim(basicDescription.Substring(startIndex), param_num - 1); + + if (paramDelimIndex != -1) + { + bold_beg = paramDelimIndex + startIndex + languageIntellisenseSupport.ParameterDelimiter.Length; + int secondParamDelimIndex = languageIntellisenseSupport.FindParamDelim(basicDescription.Substring(startIndex), param_num); + + if (secondParamDelimIndex == -1) + { + bold_len = end_sk - bold_beg; + } + else + { + bold_len = secondParamDelimIndex + startIndex - bold_beg; + } + } + } + } + } + } + }*/ + + + // btw. I know it's ugly. public static Rectangle DrawingRectangle1; public static Rectangle DrawingRectangle2; diff --git a/bin/Lib/LinearAlgebraML.pas b/bin/Lib/LinearAlgebraML.pas index f4ea39c78..d8f90a14c 100644 --- a/bin/Lib/LinearAlgebraML.pas +++ b/bin/Lib/LinearAlgebraML.pas @@ -127,8 +127,8 @@ type static function operator *(A: Matrix; x: Vector): Vector; static function operator *(A, B: Matrix): Matrix; - static function operator *(alpha: real; A: Matrix): Matrix; - static function operator *(A: Matrix; alpha: real): Matrix; + //static function operator *(alpha: real; A: Matrix): Matrix; + //static function operator *(A: Matrix; alpha: real): Matrix; // ---------- in-place operators ---------- static function operator +=(A, B: Matrix): Matrix; @@ -784,12 +784,7 @@ begin Result.data[i, j] := A.data[i, j] - B.data[i, j]; end; -static function Matrix.operator *(alpha: real; A: Matrix): Matrix; -begin - Result := A * alpha; -end; - -static function Matrix.operator *(A: Matrix; alpha: real): Matrix; +function operator *(A: Matrix; alpha: real): Matrix; extensionmethod; begin Result := new Matrix(A.Rows, A.Cols); for var i := 0 to A.Rows - 1 do @@ -797,6 +792,23 @@ begin Result.data[i, j] := alpha * A.data[i, j]; end; +function operator *(alpha: real; A: Matrix): Matrix; extensionmethod; +begin + Result := A * alpha; +end; + +function operator *(A: Matrix; alpha: integer): Matrix; extensionmethod; +begin + Result := A * real(alpha); +end; + +function operator *(alpha: integer; A: Matrix): Matrix; extensionmethod; +begin + Result := real(alpha) * A; +end; + + + static function Matrix.operator *(A: Matrix; x: Vector): Vector; begin CheckVecSize(A, x); diff --git a/bin/Lib/MLModelsABC.pas b/bin/Lib/MLModelsABC.pas index b5bf6c37b..66469c287 100644 --- a/bin/Lib/MLModelsABC.pas +++ b/bin/Lib/MLModelsABC.pas @@ -330,9 +330,9 @@ type {$endregion Pipeline} {$region Transformers} - /// Стандартизирует признаки: вычитает среднее - /// и делит на стандартное отклонение по каждому столбцу. - /// Используется для приведения признаков к сопоставимому масштабу. +/// Стандартизирует признаки: вычитает среднее +/// и делит на стандартное отклонение по каждому столбцу. +/// Используется для приведения признаков к сопоставимому масштабу. StandardScaler = class(ITransformer) private fMean: Vector;