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

112 строки
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. maxBudget := budgetQueueLimit(queue)
  40. effective := queue.EffectiveMax
  41. preference := queue.Preference
  42. if effective <= 0 && maxBudget > 0 {
  43. if preference <= 0 {
  44. preference = 1.0
  45. }
  46. effective = float64(maxBudget) * preference
  47. }
  48. pressure := 0.0
  49. level := ""
  50. switch {
  51. case demand == 0:
  52. level = "idle"
  53. case maxBudget <= 0:
  54. level = "blocked"
  55. case effective > 0:
  56. pressure = float64(demand) / effective
  57. level = pressureLevel(pressure)
  58. }
  59. return BudgetPressure{
  60. Max: maxBudget,
  61. Effective: roundFloat(pressureEffectiveMax(effective)),
  62. Preference: preference,
  63. Demand: demand,
  64. Queued: queued,
  65. Selected: selected,
  66. Active: active,
  67. Pressure: roundFloat(pressure),
  68. Level: level,
  69. }
  70. }
  71. func pressureLevel(pressure float64) string {
  72. switch {
  73. case pressure >= 1.5:
  74. return "critical"
  75. case pressure >= 1.15:
  76. return "high"
  77. case pressure >= 0.85:
  78. return "elevated"
  79. default:
  80. return "steady"
  81. }
  82. }
  83. func pressureReasonTag(pressure BudgetPressure) string {
  84. if pressure.Level == "" || pressure.Level == "idle" {
  85. return ""
  86. }
  87. return "pressure:" + pressure.Level
  88. }
  89. func pressureEffectiveMax(value float64) float64 {
  90. if value < 0 {
  91. return 0
  92. }
  93. return value
  94. }
  95. func roundFloat(value float64) float64 {
  96. if value == 0 {
  97. return 0
  98. }
  99. return math.Round(value*100) / 100
  100. }