frequencer.go 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. // package Частотник -- ищет минимально частотную архивную пару
  2. package frequencer
  3. import (
  4. "log"
  5. mKh "gitp78su.ipnodns.ru/svi/kern/v3/kc/helpers"
  6. "gitp78su.ipnodns.ru/svi/packer/lev0/alias"
  7. "gitp78su.ipnodns.ru/svi/packer/lev0/types"
  8. "gitp78su.ipnodns.ru/svi/packer/lev1/archive_combo"
  9. "gitp78su.ipnodns.ru/svi/packer/lev1/archive_stat_combo"
  10. "gitp78su.ipnodns.ru/svi/packer/lev1/dict_keys"
  11. "gitp78su.ipnodns.ru/svi/packer/lev2/belt"
  12. )
  13. // Частотник -- ищет максимально частотную архивную пару
  14. type Частотник struct {
  15. лента *belt.Лента // Лента бинарных данных
  16. словКлючи *dict_keys.СловКлючи // Словарь задействованных ключей
  17. ap *archive_combo.ArchiveCombo // Частотная архивная пара
  18. archStatVal *archive_stat_combo.ArchiveStatCombo // Статистика частот архивных значений
  19. ключ alias.ArchKey // Текущий ключ для перебора
  20. }
  21. // НовЧастотник -- возвращает новый искатель максимальной архивной пары
  22. func НовЧастотник() *Частотник {
  23. сам := &Частотник{
  24. словКлючи: dict_keys.СловКлючиПолуч(),
  25. лента: belt.ЛентаПолуч(),
  26. ap: archive_combo.NewArchiveCombo(0, 0),
  27. }
  28. _ = types.ИЧастотник(сам)
  29. return сам
  30. }
  31. // Пуск -- запускает вычисление частотной архивной пары
  32. //
  33. // Считается успехом, если нашёл 5 замен архивных пар
  34. func (sf *Частотник) Пуск() {
  35. sf.ключНайти()
  36. binData := sf.лента.Вых()
  37. sf.archStatVal = archive_stat_combo.NewArchiveStatVal(binData)
  38. sf.ap = sf.archStatVal.Max()
  39. еслиНайдено := sf.ap != nil
  40. mKh.Hassert(еслиНайдено, "Частотник.Пуск(): not find keys for change, checked=%v", sf.archStatVal.Len())
  41. log.Printf("Частотник.Пуск(): архивПара=%v, checked=%v\n", sf.ap, sf.archStatVal)
  42. }
  43. // Ключи -- возвращает найденные ключи
  44. func (sf *Частотник) АрхивПара() types.ИАрхивПара {
  45. return sf.ap
  46. }
  47. // Вычисляет свободный ключ словаря подстановки (его нет в бинарном архивном списке)
  48. func (sf *Частотник) ключНайти() {
  49. binData := sf.лента.Вых()
  50. ключВозможно := sf.словКлючи.ВозможноКлюч()
  51. fnIsStop := func() bool {
  52. for _, binVal := range binData {
  53. if ключВозможно == alias.ArchKey(binVal) {
  54. ключВозможно = sf.словКлючи.ВозможноКлюч()
  55. return false
  56. }
  57. }
  58. return true
  59. }
  60. for fnIsStop() {
  61. }
  62. sf.ключ = ключВозможно
  63. }