Wideband autonomous SDR analysis engine forked from sdr-visual-suite
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

99 line
2.2KB

  1. package pipeline
  2. import (
  3. "strings"
  4. )
  5. const (
  6. PriorityTierCritical = "critical"
  7. PriorityTierHigh = "high"
  8. PriorityTierMedium = "medium"
  9. PriorityTierLow = "low"
  10. PriorityTierBackground = "background"
  11. )
  12. const (
  13. AdmissionClassPlanned = "plan"
  14. AdmissionClassAdmit = "admit"
  15. AdmissionClassHold = "hold"
  16. AdmissionClassDefer = "defer"
  17. AdmissionClassDisplace = "displace"
  18. AdmissionClassDrop = "drop"
  19. )
  20. type PriorityAdmission struct {
  21. Tier string `json:"tier,omitempty"`
  22. Class string `json:"class,omitempty"`
  23. Score float64 `json:"score,omitempty"`
  24. Cutoff float64 `json:"cutoff,omitempty"`
  25. Basis string `json:"basis,omitempty"`
  26. Reason string `json:"reason,omitempty"`
  27. }
  28. func PriorityTierFromRange(score, min, max float64) string {
  29. if max <= min {
  30. return PriorityTierHigh
  31. }
  32. norm := (score - min) / (max - min)
  33. switch {
  34. case norm >= 0.85:
  35. return PriorityTierCritical
  36. case norm >= 0.65:
  37. return PriorityTierHigh
  38. case norm >= 0.45:
  39. return PriorityTierMedium
  40. case norm >= 0.25:
  41. return PriorityTierLow
  42. default:
  43. return PriorityTierBackground
  44. }
  45. }
  46. func admissionReason(base string, policy Policy, holdPolicy HoldPolicy, extras ...string) string {
  47. tags := uniqueReasonTags(policy, holdPolicy, extras...)
  48. if len(tags) == 0 {
  49. return base
  50. }
  51. return base + ":" + strings.Join(tags, ":")
  52. }
  53. func uniqueReasonTags(policy Policy, holdPolicy HoldPolicy, extras ...string) []string {
  54. seen := map[string]struct{}{}
  55. tags := make([]string, 0, 6)
  56. add := func(tag string) {
  57. if tag == "" {
  58. return
  59. }
  60. if _, ok := seen[tag]; ok {
  61. return
  62. }
  63. seen[tag] = struct{}{}
  64. tags = append(tags, tag)
  65. }
  66. if policy.Profile != "" {
  67. add("profile:" + slugToken(policy.Profile))
  68. }
  69. if policy.Intent != "" {
  70. add("intent:" + slugToken(policy.Intent))
  71. }
  72. if policy.RefinementStrategy != "" {
  73. add("strategy:" + slugToken(policy.RefinementStrategy))
  74. }
  75. for _, reason := range holdPolicy.Reasons {
  76. add(reason)
  77. }
  78. for _, extra := range extras {
  79. add(extra)
  80. }
  81. return tags
  82. }
  83. func slugToken(input string) string {
  84. input = strings.TrimSpace(strings.ToLower(input))
  85. if input == "" {
  86. return ""
  87. }
  88. parts := strings.Fields(input)
  89. return strings.Join(parts, "-")
  90. }