session_manager.py 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. """
  2. Session Manager
  3. Tracks and manages analysis session data.
  4. """
  5. from datetime import datetime
  6. from typing import List, Dict, Optional
  7. from dataclasses import dataclass, field
  8. @dataclass
  9. class TestResult:
  10. """Data class for a single test result."""
  11. test_id: int
  12. timestamp: datetime
  13. classification: str
  14. confidence: float # 0-100
  15. probabilities: Dict[str, float] # class_name -> probability
  16. processing_time: float
  17. file_path: Optional[str] = None
  18. class SessionManager:
  19. """
  20. Manager for tracking ripeness testing session data.
  21. Tracks test results, calculates statistics, and manages session state.
  22. """
  23. def __init__(self, max_history: int = 100):
  24. """
  25. Initialize session manager.
  26. Args:
  27. max_history: Maximum number of results to keep in history
  28. """
  29. self.max_history = max_history
  30. self.session_start = datetime.now()
  31. self.results: List[TestResult] = []
  32. self.test_counter = 0
  33. def add_result(self, classification: str, confidence: float,
  34. probabilities: Dict[str, float], processing_time: float,
  35. file_path: Optional[str] = None) -> TestResult:
  36. """
  37. Add a new test result to the session.
  38. Args:
  39. classification: Predicted class name
  40. confidence: Confidence percentage (0-100)
  41. probabilities: Dictionary of class probabilities
  42. processing_time: Processing time in seconds
  43. file_path: Optional path to the processed file
  44. Returns:
  45. TestResult object
  46. """
  47. self.test_counter += 1
  48. result = TestResult(
  49. test_id=self.test_counter,
  50. timestamp=datetime.now(),
  51. classification=classification,
  52. confidence=confidence,
  53. probabilities=probabilities,
  54. processing_time=processing_time,
  55. file_path=file_path
  56. )
  57. self.results.insert(0, result) # Insert at beginning (most recent first)
  58. # Trim history if needed
  59. if len(self.results) > self.max_history:
  60. self.results = self.results[:self.max_history]
  61. return result
  62. def get_total_tests(self) -> int:
  63. """Get total number of tests in session."""
  64. return len(self.results)
  65. def get_average_processing_time(self) -> float:
  66. """Get average processing time across all tests."""
  67. if not self.results:
  68. return 0.0
  69. return sum(r.processing_time for r in self.results) / len(self.results)
  70. def get_classification_counts(self) -> Dict[str, int]:
  71. """
  72. Get counts for each classification type.
  73. Returns:
  74. Dictionary mapping classification names to counts
  75. """
  76. counts = {}
  77. for result in self.results:
  78. classification = result.classification
  79. counts[classification] = counts.get(classification, 0) + 1
  80. return counts
  81. def get_ripe_count(self) -> int:
  82. """Get number of 'Ripe' classifications."""
  83. return sum(1 for r in self.results if r.classification == "Ripe")
  84. def get_session_duration(self) -> Dict[str, int]:
  85. """
  86. Get session duration.
  87. Returns:
  88. Dictionary with 'hours' and 'minutes' keys
  89. """
  90. duration = datetime.now() - self.session_start
  91. hours = duration.seconds // 3600
  92. minutes = (duration.seconds % 3600) // 60
  93. return {"hours": hours, "minutes": minutes}
  94. def get_recent_results(self, count: int = 10) -> List[TestResult]:
  95. """
  96. Get most recent test results.
  97. Args:
  98. count: Number of results to return
  99. Returns:
  100. List of TestResult objects
  101. """
  102. return self.results[:count]
  103. def get_last_result(self) -> Optional[TestResult]:
  104. """Get the most recent test result."""
  105. return self.results[0] if self.results else None
  106. def clear_session(self):
  107. """Clear all session data and reset."""
  108. self.results.clear()
  109. self.test_counter = 0
  110. self.session_start = datetime.now()
  111. def get_statistics_summary(self) -> Dict[str, any]:
  112. """
  113. Get complete statistics summary.
  114. Returns:
  115. Dictionary containing all session statistics
  116. """
  117. counts = self.get_classification_counts()
  118. duration = self.get_session_duration()
  119. return {
  120. "total_tests": self.get_total_tests(),
  121. "avg_processing_time": self.get_average_processing_time(),
  122. "ripe_count": self.get_ripe_count(),
  123. "classification_counts": counts,
  124. "session_duration": duration,
  125. "session_start": self.session_start
  126. }