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

111 строки
2.9KB

  1. package pipeline
  2. import "math"
  3. type BudgetPressure struct {
  4. Max int `json:"max"`
  5. Effective float64 `json:"effective,omitempty"`
  6. Preference float64 `json:"preference,omitempty"`
  7. Demand int `json:"demand"`
  8. Queued int `json:"queued,omitempty"`
  9. Selected int `json:"selected,omitempty"`
  10. Active int `json:"active,omitempty"`
  11. Pressure float64 `json:"pressure,omitempty"`
  12. Level string `json:"level,omitempty"`
  13. }
  14. type BudgetPressureSummary struct {
  15. Refinement BudgetPressure `json:"refinement"`
  16. Record BudgetPressure `json:"record"`
  17. Decode BudgetPressure `json:"decode"`
  18. }
  19. func BuildBudgetPressureSummary(budget BudgetModel, admission RefinementAdmission, queue DecisionQueueStats) BudgetPressureSummary {
  20. return BudgetPressureSummary{
  21. Refinement: buildRefinementPressure(budget, admission),
  22. Record: buildQueuePressure(budget.Record, queue.RecordQueued, queue.RecordSelected, queue.RecordActive),
  23. Decode: buildQueuePressure(budget.Decode, queue.DecodeQueued, queue.DecodeSelected, queue.DecodeActive),
  24. }
  25. }
  26. func buildRefinementPressure(budget BudgetModel, admission RefinementAdmission) BudgetPressure {
  27. demand := admission.Planned
  28. selected := admission.Admitted
  29. return buildPressure(budget.Refinement, demand, 0, selected, 0)
  30. }
  31. func buildQueuePressure(queue BudgetQueue, queued, selected, active int) BudgetPressure {
  32. demand := queued
  33. if demand < selected {
  34. demand = selected
  35. }
  36. return buildPressure(queue, demand, queued, selected, active)
  37. }
  38. func buildPressure(queue BudgetQueue, demand int, queued int, selected int, active int) BudgetPressure {
  39. effective := queue.EffectiveMax
  40. preference := queue.Preference
  41. if effective <= 0 && queue.Max > 0 {
  42. if preference <= 0 {
  43. preference = 1.0
  44. }
  45. effective = float64(queue.Max) * preference
  46. }
  47. pressure := 0.0
  48. level := ""
  49. switch {
  50. case demand == 0:
  51. level = "idle"
  52. case queue.Max <= 0:
  53. level = "blocked"
  54. case effective > 0:
  55. pressure = float64(demand) / effective
  56. level = pressureLevel(pressure)
  57. }
  58. return BudgetPressure{
  59. Max: queue.Max,
  60. Effective: roundFloat(pressureEffectiveMax(effective)),
  61. Preference: preference,
  62. Demand: demand,
  63. Queued: queued,
  64. Selected: selected,
  65. Active: active,
  66. Pressure: roundFloat(pressure),
  67. Level: level,
  68. }
  69. }
  70. func pressureLevel(pressure float64) string {
  71. switch {
  72. case pressure >= 1.5:
  73. return "critical"
  74. case pressure >= 1.15:
  75. return "high"
  76. case pressure >= 0.85:
  77. return "elevated"
  78. default:
  79. return "steady"
  80. }
  81. }
  82. func pressureReasonTag(pressure BudgetPressure) string {
  83. if pressure.Level == "" || pressure.Level == "idle" {
  84. return ""
  85. }
  86. return "pressure:" + pressure.Level
  87. }
  88. func pressureEffectiveMax(value float64) float64 {
  89. if value < 0 {
  90. return 0
  91. }
  92. return value
  93. }
  94. func roundFloat(value float64) float64 {
  95. if value == 0 {
  96. return 0
  97. }
  98. return math.Round(value*100) / 100
  99. }