Wideband autonomous SDR analysis engine forked from sdr-visual-suite
Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

140 строки
3.3KB

  1. package pipeline
  2. import "strings"
  3. func WantsClass(values []string, class string) bool {
  4. if len(values) == 0 || class == "" {
  5. return false
  6. }
  7. for _, v := range values {
  8. if strings.EqualFold(strings.TrimSpace(v), class) {
  9. return true
  10. }
  11. }
  12. return false
  13. }
  14. func CandidatePriorityBoost(policy Policy, hint string) float64 {
  15. boost := hintMatchBoost(policy.SignalPriorities, hint, 3.0)
  16. boost += hintMatchBoost(policy.AutoRecordClasses, hint, 1.5)
  17. boost += hintMatchBoost(policy.AutoDecodeClasses, hint, 1.0)
  18. boost += intentHintBoost(policy.Intent, hint, 2.0)
  19. return boost
  20. }
  21. func DecisionPriorityBoost(policy Policy, hint string, class string, queue string) float64 {
  22. tag := strings.TrimSpace(hint)
  23. if tag == "" {
  24. tag = strings.TrimSpace(class)
  25. }
  26. boost := CandidatePriorityBoost(policy, tag)
  27. switch strings.ToLower(strings.TrimSpace(queue)) {
  28. case "record":
  29. boost += hintMatchBoost(policy.AutoRecordClasses, tag, 3.0)
  30. case "decode":
  31. boost += hintMatchBoost(policy.AutoDecodeClasses, tag, 3.0)
  32. }
  33. boost += intentQueueBoost(policy.Intent, queue)
  34. return boost
  35. }
  36. func hintMatchBoost(values []string, hint string, weight float64) float64 {
  37. h := strings.ToLower(strings.TrimSpace(hint))
  38. if h == "" || len(values) == 0 {
  39. return 0
  40. }
  41. for i, want := range values {
  42. w := strings.ToLower(strings.TrimSpace(want))
  43. if w == "" {
  44. continue
  45. }
  46. if strings.Contains(h, w) || strings.Contains(w, h) {
  47. return float64(len(values)-i) * weight
  48. }
  49. }
  50. return 0
  51. }
  52. func intentHintBoost(intent string, hint string, weight float64) float64 {
  53. tokens := intentTokens(intent)
  54. if len(tokens) == 0 {
  55. return 0
  56. }
  57. return hintMatchBoost(tokens, hint, weight)
  58. }
  59. func intentQueueBoost(intent string, queue string) float64 {
  60. if intent == "" {
  61. return 0
  62. }
  63. intent = strings.ToLower(intent)
  64. queue = strings.ToLower(strings.TrimSpace(queue))
  65. boost := 0.0
  66. switch queue {
  67. case "record":
  68. if strings.Contains(intent, "archive") || strings.Contains(intent, "record") {
  69. boost += 2.0
  70. }
  71. if strings.Contains(intent, "triage") {
  72. boost += 1.0
  73. }
  74. case "decode":
  75. if strings.Contains(intent, "triage") {
  76. boost += 1.5
  77. }
  78. if strings.Contains(intent, "decode") || strings.Contains(intent, "analysis") || strings.Contains(intent, "classif") {
  79. boost += 1.0
  80. }
  81. }
  82. return boost
  83. }
  84. func refinementIntentWeights(intent string) (float64, float64, float64) {
  85. if intent == "" {
  86. return 1.0, 1.0, 1.0
  87. }
  88. intent = strings.ToLower(intent)
  89. snrWeight := 1.0
  90. bwWeight := 1.0
  91. peakWeight := 1.0
  92. if strings.Contains(intent, "wideband") {
  93. bwWeight = 1.25
  94. }
  95. if strings.Contains(intent, "high-density") || strings.Contains(intent, "highdensity") {
  96. bwWeight = 1.4
  97. peakWeight = 1.1
  98. }
  99. if strings.Contains(intent, "archive") || strings.Contains(intent, "triage") {
  100. snrWeight = 1.15
  101. peakWeight = 1.1
  102. }
  103. return snrWeight, bwWeight, peakWeight
  104. }
  105. func intentTokens(intent string) []string {
  106. if intent == "" {
  107. return nil
  108. }
  109. fields := strings.FieldsFunc(intent, func(r rune) bool {
  110. if r >= 'a' && r <= 'z' {
  111. return false
  112. }
  113. if r >= 'A' && r <= 'Z' {
  114. return false
  115. }
  116. if r >= '0' && r <= '9' {
  117. return false
  118. }
  119. return true
  120. })
  121. tokens := make([]string, 0, len(fields))
  122. for _, f := range fields {
  123. t := strings.ToLower(strings.TrimSpace(f))
  124. if len(t) < 2 {
  125. continue
  126. }
  127. tokens = append(tokens, t)
  128. }
  129. return tokens
  130. }