namespace Deal.Ml.Model;
///
/// Пороги и константы наивно-байесовской модели по терминам (Ruling 4; 1:1
/// mlservice/model.py L20–31, L42–55, L178–181). Именованные константы вместо магических
/// чисел (код-стайл этапа); значения НЕ входят в .proto-контракт (README src/contracts L164–166).
///
public static class ModelConstants
{
///
/// Суммарно примеров по всем классам, чтобы модель «включилась» (MIN_TOTAL).
///
public const double MinTotalExamples = 20.0;
///
/// Минимум примеров у класса-победителя (не-спам; MIN_WINNER).
///
public const double MinWinnerExamples = 6.0;
///
/// Минимум примеров у класса-победителя «spam» (MIN_WINNER_SPAM).
///
public const double MinWinnerSpamExamples = 4.0;
///
/// Минимум различных терминов, встреченных у победителя (MIN_HITS).
///
public const int MinHits = 2;
///
/// Минимум примеров класса типа t:*, чтобы ML выдавал тип (MIN_TYPE_WINNER).
///
public const double MinTypeWinnerExamples = 4.0;
///
/// Метка класса «спам» (специальная роль — порог 4 и «корзина» карточки).
///
public const string SpamLabel = "spam";
///
/// Префикс внутренних классов типа заявки (t:hire/t:order отсекаются из колонок).
///
public const string TypeLabelPrefix = "t:";
///
/// Внутренний класс типа заявки «найм» (в UI — hire).
///
public const string TypeClassHire = "t:hire";
///
/// Внутренний класс типа заявки «разовая сделка» (в UI — order).
///
public const string TypeClassOrder = "t:order";
///
/// Множитель prior при ранжировании классов: score + 3·prior (predict L226–256).
///
public const double PriorWeight = 3.0;
///
/// ln-отрыв от второго класса на старте (MARGIN; адаптив 0.35/0.5/0.7 — см. ниже).
///
public const double InitialMargin = 0.9;
///
/// Суммарно примеров, после которых порог отрыва — 0.7.
///
public const double TotalExamplesForMargin0_7 = 60.0;
///
/// Суммарно примеров, после которых порог отрыва — 0.5.
///
public const double TotalExamplesForMargin0_5 = 150.0;
///
/// Суммарно примеров, после которых порог отрыва — 0.35.
///
public const double TotalExamplesForMargin0_35 = 400.0;
///
/// Адаптивный отрыв после 60 примеров.
///
public const double MarginAfter60Examples = 0.7;
///
/// Адаптивный отрыв после 150 примеров.
///
public const double MarginAfter150Examples = 0.5;
///
/// Адаптивный отрыв после 400 примеров.
///
public const double MarginAfter400Examples = 0.35;
///
/// Окно самооценки, которое отдаётся в /status (EVAL_WINDOW).
///
public const int EvalWindowSize = 50;
///
/// Сколько последних решений самооценки хранится в БД модели (EVAL_KEEP).
///
public const int EvalKeepCount = 200;
///
/// Сколько лучших весов классов отдаётся в predict (scores ≤ 5).
///
public const int MaxScoresInReply = 5;
///
/// Сколько узнанных терминов отдаётся в predict (terms ≤ 8).
///
public const int MaxMatchedTerms = 8;
///
/// Точность округления весов в scores (python round(…, 3)).
///
public const int ScoresPrecision = 3;
///
/// Точность округления весов классов в status (python round(…, 2)).
///
public const int ClassesPrecision = 2;
///
/// Точность округления отступа margin (python round(…, 2)).
///
public const int MarginPrecision = 2;
///
/// Точность округления доли верных в eval (python round(…, 3)).
///
public const int AccuracyPrecision = 3;
///
/// Минимальная длина токена, попадающего в модель (L83–86).
///
public const int MinTokenLength = 3;
///
/// Длина токена, при которой добавляется «хвостовой» префикс-термин.
///
public const int MinTokenLengthForPrefix = 6;
///
/// Длина префикса хвостового токена (w[:4]).
///
public const int PrefixLength = 4;
///
/// Префикс хвостового токена («~pyth» для «python») — не участвует в terms-подсказках.
///
public const string TokenPrefixMarker = "~";
}