nrl-tracker 1.0.1__tar.gz → 1.1.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (200) hide show
  1. {nrl_tracker-1.0.1/nrl_tracker.egg-info → nrl_tracker-1.1.0}/PKG-INFO +3 -1
  2. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0/nrl_tracker.egg-info}/PKG-INFO +3 -1
  3. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/nrl_tracker.egg-info/SOURCES.txt +1 -0
  4. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/nrl_tracker.egg-info/requires.txt +3 -0
  5. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pyproject.toml +7 -1
  6. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/__init__.py +1 -1
  7. nrl_tracker-1.1.0/pytcl/logging_config.py +328 -0
  8. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/CONTRIBUTING.md +0 -0
  9. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/LICENSE +0 -0
  10. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/MANIFEST.in +0 -0
  11. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/README.md +0 -0
  12. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/nrl_tracker.egg-info/dependency_links.txt +0 -0
  13. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/nrl_tracker.egg-info/top_level.txt +0 -0
  14. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/assignment_algorithms/__init__.py +0 -0
  15. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/assignment_algorithms/data_association.py +0 -0
  16. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/assignment_algorithms/gating.py +0 -0
  17. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/assignment_algorithms/jpda.py +0 -0
  18. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/assignment_algorithms/three_dimensional/__init__.py +0 -0
  19. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/assignment_algorithms/three_dimensional/assignment.py +0 -0
  20. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/assignment_algorithms/two_dimensional/__init__.py +0 -0
  21. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/assignment_algorithms/two_dimensional/assignment.py +0 -0
  22. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/assignment_algorithms/two_dimensional/kbest.py +0 -0
  23. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/astronomical/__init__.py +0 -0
  24. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/astronomical/ephemerides.py +0 -0
  25. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/astronomical/lambert.py +0 -0
  26. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/astronomical/orbital_mechanics.py +0 -0
  27. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/astronomical/reference_frames.py +0 -0
  28. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/astronomical/relativity.py +0 -0
  29. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/astronomical/time_systems.py +0 -0
  30. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/atmosphere/__init__.py +0 -0
  31. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/atmosphere/models.py +0 -0
  32. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/clustering/__init__.py +0 -0
  33. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/clustering/dbscan.py +0 -0
  34. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/clustering/gaussian_mixture.py +0 -0
  35. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/clustering/hierarchical.py +0 -0
  36. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/clustering/kmeans.py +0 -0
  37. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/containers/__init__.py +0 -0
  38. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/containers/cluster_set.py +0 -0
  39. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/containers/covertree.py +0 -0
  40. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/containers/kd_tree.py +0 -0
  41. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/containers/measurement_set.py +0 -0
  42. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/containers/rtree.py +0 -0
  43. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/containers/track_list.py +0 -0
  44. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/containers/vptree.py +0 -0
  45. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/coordinate_systems/__init__.py +0 -0
  46. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/coordinate_systems/conversions/__init__.py +0 -0
  47. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/coordinate_systems/conversions/geodetic.py +0 -0
  48. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/coordinate_systems/conversions/spherical.py +0 -0
  49. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/coordinate_systems/jacobians/__init__.py +0 -0
  50. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/coordinate_systems/jacobians/jacobians.py +0 -0
  51. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/coordinate_systems/projections/__init__.py +0 -0
  52. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/coordinate_systems/projections/projections.py +0 -0
  53. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/coordinate_systems/rotations/__init__.py +0 -0
  54. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/coordinate_systems/rotations/rotations.py +0 -0
  55. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/core/__init__.py +0 -0
  56. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/core/array_utils.py +0 -0
  57. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/core/constants.py +0 -0
  58. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/core/validation.py +0 -0
  59. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/dynamic_estimation/__init__.py +0 -0
  60. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/dynamic_estimation/batch_estimation/__init__.py +0 -0
  61. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/dynamic_estimation/imm.py +0 -0
  62. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/dynamic_estimation/information_filter.py +0 -0
  63. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/dynamic_estimation/kalman/__init__.py +0 -0
  64. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/dynamic_estimation/kalman/extended.py +0 -0
  65. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/dynamic_estimation/kalman/linear.py +0 -0
  66. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/dynamic_estimation/kalman/square_root.py +0 -0
  67. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/dynamic_estimation/kalman/unscented.py +0 -0
  68. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/dynamic_estimation/measurement_update/__init__.py +0 -0
  69. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/dynamic_estimation/particle_filters/__init__.py +0 -0
  70. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/dynamic_estimation/particle_filters/bootstrap.py +0 -0
  71. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/dynamic_estimation/smoothers.py +0 -0
  72. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/dynamic_models/__init__.py +0 -0
  73. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/dynamic_models/continuous_time/__init__.py +0 -0
  74. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/dynamic_models/continuous_time/dynamics.py +0 -0
  75. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/dynamic_models/discrete_time/__init__.py +0 -0
  76. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/dynamic_models/discrete_time/coordinated_turn.py +0 -0
  77. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/dynamic_models/discrete_time/polynomial.py +0 -0
  78. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/dynamic_models/discrete_time/singer.py +0 -0
  79. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/dynamic_models/process_noise/__init__.py +0 -0
  80. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/dynamic_models/process_noise/coordinated_turn.py +0 -0
  81. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/dynamic_models/process_noise/polynomial.py +0 -0
  82. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/dynamic_models/process_noise/singer.py +0 -0
  83. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/gravity/__init__.py +0 -0
  84. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/gravity/clenshaw.py +0 -0
  85. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/gravity/egm.py +0 -0
  86. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/gravity/models.py +0 -0
  87. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/gravity/spherical_harmonics.py +0 -0
  88. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/gravity/tides.py +0 -0
  89. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/magnetism/__init__.py +0 -0
  90. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/magnetism/emm.py +0 -0
  91. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/magnetism/igrf.py +0 -0
  92. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/magnetism/wmm.py +0 -0
  93. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/mathematical_functions/__init__.py +0 -0
  94. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/mathematical_functions/basic_matrix/__init__.py +0 -0
  95. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/mathematical_functions/basic_matrix/decompositions.py +0 -0
  96. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/mathematical_functions/basic_matrix/special_matrices.py +0 -0
  97. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/mathematical_functions/combinatorics/__init__.py +0 -0
  98. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/mathematical_functions/combinatorics/combinatorics.py +0 -0
  99. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/mathematical_functions/continuous_optimization/__init__.py +0 -0
  100. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/mathematical_functions/geometry/__init__.py +0 -0
  101. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/mathematical_functions/geometry/geometry.py +0 -0
  102. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/mathematical_functions/interpolation/__init__.py +0 -0
  103. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/mathematical_functions/interpolation/interpolation.py +0 -0
  104. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/mathematical_functions/numerical_integration/__init__.py +0 -0
  105. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/mathematical_functions/numerical_integration/quadrature.py +0 -0
  106. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/mathematical_functions/polynomials/__init__.py +0 -0
  107. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/mathematical_functions/signal_processing/__init__.py +0 -0
  108. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/mathematical_functions/signal_processing/detection.py +0 -0
  109. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/mathematical_functions/signal_processing/filters.py +0 -0
  110. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/mathematical_functions/signal_processing/matched_filter.py +0 -0
  111. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/mathematical_functions/special_functions/__init__.py +0 -0
  112. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/mathematical_functions/special_functions/bessel.py +0 -0
  113. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/mathematical_functions/special_functions/debye.py +0 -0
  114. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/mathematical_functions/special_functions/elliptic.py +0 -0
  115. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/mathematical_functions/special_functions/error_functions.py +0 -0
  116. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/mathematical_functions/special_functions/gamma_functions.py +0 -0
  117. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/mathematical_functions/special_functions/hypergeometric.py +0 -0
  118. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/mathematical_functions/special_functions/lambert_w.py +0 -0
  119. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/mathematical_functions/special_functions/marcum_q.py +0 -0
  120. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/mathematical_functions/statistics/__init__.py +0 -0
  121. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/mathematical_functions/statistics/distributions.py +0 -0
  122. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/mathematical_functions/statistics/estimators.py +0 -0
  123. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/mathematical_functions/transforms/__init__.py +0 -0
  124. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/mathematical_functions/transforms/fourier.py +0 -0
  125. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/mathematical_functions/transforms/stft.py +0 -0
  126. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/mathematical_functions/transforms/wavelets.py +0 -0
  127. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/misc/__init__.py +0 -0
  128. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/navigation/__init__.py +0 -0
  129. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/navigation/geodesy.py +0 -0
  130. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/navigation/great_circle.py +0 -0
  131. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/navigation/ins.py +0 -0
  132. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/navigation/ins_gnss.py +0 -0
  133. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/navigation/rhumb.py +0 -0
  134. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/performance_evaluation/__init__.py +0 -0
  135. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/performance_evaluation/estimation_metrics.py +0 -0
  136. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/performance_evaluation/track_metrics.py +0 -0
  137. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/physical_values/__init__.py +0 -0
  138. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/plotting/__init__.py +0 -0
  139. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/plotting/coordinates.py +0 -0
  140. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/plotting/ellipses.py +0 -0
  141. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/plotting/metrics.py +0 -0
  142. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/plotting/tracks.py +0 -0
  143. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/scheduling/__init__.py +0 -0
  144. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/static_estimation/__init__.py +0 -0
  145. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/static_estimation/least_squares.py +0 -0
  146. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/static_estimation/maximum_likelihood.py +0 -0
  147. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/static_estimation/robust.py +0 -0
  148. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/terrain/__init__.py +0 -0
  149. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/terrain/dem.py +0 -0
  150. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/terrain/loaders.py +0 -0
  151. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/terrain/visibility.py +0 -0
  152. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/trackers/__init__.py +0 -0
  153. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/trackers/hypothesis.py +0 -0
  154. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/trackers/mht.py +0 -0
  155. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/trackers/multi_target.py +0 -0
  156. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/trackers/single_target.py +0 -0
  157. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/pytcl/transponders/__init__.py +0 -0
  158. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/setup.cfg +0 -0
  159. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/tests/__init__.py +0 -0
  160. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/tests/conftest.py +0 -0
  161. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/tests/test_additional_trees.py +0 -0
  162. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/tests/test_assignment_algorithms.py +0 -0
  163. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/tests/test_astronomical.py +0 -0
  164. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/tests/test_clustering.py +0 -0
  165. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/tests/test_coordinate_systems.py +0 -0
  166. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/tests/test_coverage_boost.py +0 -0
  167. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/tests/test_coverage_boost_2.py +0 -0
  168. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/tests/test_dynamic_models.py +0 -0
  169. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/tests/test_egm.py +0 -0
  170. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/tests/test_emm.py +0 -0
  171. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/tests/test_ephemerides.py +0 -0
  172. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/tests/test_gaussian_mixtures.py +0 -0
  173. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/tests/test_geophysical.py +0 -0
  174. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/tests/test_great_circle.py +0 -0
  175. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/tests/test_ins.py +0 -0
  176. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/tests/test_ins_gnss.py +0 -0
  177. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/tests/test_kalman_filters.py +0 -0
  178. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/tests/test_mathematical_functions.py +0 -0
  179. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/tests/test_maximum_likelihood.py +0 -0
  180. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/tests/test_mht.py +0 -0
  181. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/tests/test_performance_evaluation.py +0 -0
  182. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/tests/test_phase6_specialized.py +0 -0
  183. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/tests/test_plotting.py +0 -0
  184. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/tests/test_projections.py +0 -0
  185. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/tests/test_relativity.py +0 -0
  186. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/tests/test_rhumb.py +0 -0
  187. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/tests/test_signal_processing.py +0 -0
  188. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/tests/test_smoothers.py +0 -0
  189. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/tests/test_spatial_structures.py +0 -0
  190. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/tests/test_special_functions_phase12.py +0 -0
  191. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/tests/test_static_estimation.py +0 -0
  192. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/tests/test_terrain.py +0 -0
  193. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/tests/test_terrain_loaders.py +0 -0
  194. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/tests/test_tides.py +0 -0
  195. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/tests/test_trackers.py +0 -0
  196. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/tests/test_tracking_containers.py +0 -0
  197. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/tests/test_transforms.py +0 -0
  198. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/tests/test_v030_comprehensive.py +0 -0
  199. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/tests/test_v030_features.py +0 -0
  200. {nrl_tracker-1.0.1 → nrl_tracker-1.1.0}/tests/unit/test_core.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: nrl-tracker
3
- Version: 1.0.1
3
+ Version: 1.1.0
4
4
  Summary: Python port of the U.S. Naval Research Laboratory's Tracker Component Library for target tracking algorithms
5
5
  Author: Original: David F. Crouse, Naval Research Laboratory
6
6
  Maintainer: Python Port Contributors
@@ -55,6 +55,8 @@ Requires-Dist: sphinx>=6.0.0; extra == "dev"
55
55
  Requires-Dist: sphinx-rtd-theme>=1.2.0; extra == "dev"
56
56
  Requires-Dist: myst-parser>=1.0.0; extra == "dev"
57
57
  Requires-Dist: nbsphinx>=0.9.0; extra == "dev"
58
+ Provides-Extra: benchmark
59
+ Requires-Dist: pytest-benchmark>=4.0.0; extra == "benchmark"
58
60
  Provides-Extra: all
59
61
  Requires-Dist: nrl-tracker[astronomy,dev,geodesy,optimization,signal,visualization]; extra == "all"
60
62
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: nrl-tracker
3
- Version: 1.0.1
3
+ Version: 1.1.0
4
4
  Summary: Python port of the U.S. Naval Research Laboratory's Tracker Component Library for target tracking algorithms
5
5
  Author: Original: David F. Crouse, Naval Research Laboratory
6
6
  Maintainer: Python Port Contributors
@@ -55,6 +55,8 @@ Requires-Dist: sphinx>=6.0.0; extra == "dev"
55
55
  Requires-Dist: sphinx-rtd-theme>=1.2.0; extra == "dev"
56
56
  Requires-Dist: myst-parser>=1.0.0; extra == "dev"
57
57
  Requires-Dist: nbsphinx>=0.9.0; extra == "dev"
58
+ Provides-Extra: benchmark
59
+ Requires-Dist: pytest-benchmark>=4.0.0; extra == "benchmark"
58
60
  Provides-Extra: all
59
61
  Requires-Dist: nrl-tracker[astronomy,dev,geodesy,optimization,signal,visualization]; extra == "all"
60
62
 
@@ -9,6 +9,7 @@ nrl_tracker.egg-info/dependency_links.txt
9
9
  nrl_tracker.egg-info/requires.txt
10
10
  nrl_tracker.egg-info/top_level.txt
11
11
  pytcl/__init__.py
12
+ pytcl/logging_config.py
12
13
  pytcl/assignment_algorithms/__init__.py
13
14
  pytcl/assignment_algorithms/data_association.py
14
15
  pytcl/assignment_algorithms/gating.py
@@ -9,6 +9,9 @@ nrl-tracker[astronomy,dev,geodesy,optimization,signal,visualization]
9
9
  astropy>=5.0
10
10
  jplephem>=2.18
11
11
 
12
+ [benchmark]
13
+ pytest-benchmark>=4.0.0
14
+
12
15
  [dev]
13
16
  pytest>=7.0.0
14
17
  pytest-cov>=4.0.0
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "nrl-tracker"
7
- version = "1.0.1"
7
+ version = "1.1.0"
8
8
  description = "Python port of the U.S. Naval Research Laboratory's Tracker Component Library for target tracking algorithms"
9
9
  readme = "README.md"
10
10
  authors = [
@@ -78,6 +78,9 @@ dev = [
78
78
  "myst-parser>=1.0.0",
79
79
  "nbsphinx>=0.9.0",
80
80
  ]
81
+ benchmark = [
82
+ "pytest-benchmark>=4.0.0",
83
+ ]
81
84
  all = [
82
85
  "nrl-tracker[astronomy,geodesy,visualization,optimization,signal,dev]",
83
86
  ]
@@ -100,6 +103,9 @@ testpaths = ["tests"]
100
103
  markers = [
101
104
  "slow: marks tests as slow (deselect with '-m \"not slow\"')",
102
105
  "matlab_validated: tests validated against MATLAB reference output",
106
+ "benchmark: marks tests as benchmarks",
107
+ "light: marks benchmark as part of light (PR) suite",
108
+ "full: marks benchmark as part of full (main) suite",
103
109
  ]
104
110
  filterwarnings = [
105
111
  "ignore::DeprecationWarning",
@@ -20,7 +20,7 @@ References
20
20
  no. 5, pp. 18-27, May 2017.
21
21
  """
22
22
 
23
- __version__ = "1.0.1"
23
+ __version__ = "1.1.0"
24
24
  __author__ = "Python Port Contributors"
25
25
  __original_author__ = "David F. Crouse, Naval Research Laboratory"
26
26
 
@@ -0,0 +1,328 @@
1
+ """
2
+ Hierarchical logging configuration for pyTCL.
3
+
4
+ Provides:
5
+ - Hierarchical loggers (pytcl.estimation, pytcl.assignment, etc.)
6
+ - Performance instrumentation decorators
7
+ - Context managers for timing critical sections
8
+ - Configurable output formats and levels
9
+
10
+ Usage
11
+ -----
12
+ >>> from pytcl.logging_config import get_logger, timed, TimingContext
13
+ >>> logger = get_logger(__name__)
14
+ >>> logger.debug("Processing measurement batch")
15
+
16
+ >>> @timed(logger, "kf_predict")
17
+ ... def kf_predict(x, P, F, Q):
18
+ ... ...
19
+
20
+ >>> with TimingContext(logger, "update_loop"):
21
+ ... for _ in range(100):
22
+ ... do_update()
23
+ """
24
+
25
+ import functools
26
+ import logging
27
+ import time
28
+ from contextlib import contextmanager
29
+ from typing import Any, Callable, Optional, TypeVar
30
+
31
+ # Type variable for decorated functions
32
+ F = TypeVar("F", bound=Callable[..., Any])
33
+
34
+
35
+ # =============================================================================
36
+ # Logger Configuration
37
+ # =============================================================================
38
+
39
+ # Root logger for pytcl namespace
40
+ PYTCL_LOGGER = "pytcl"
41
+
42
+ # Sub-loggers for major components
43
+ LOGGER_HIERARCHY = {
44
+ "pytcl.estimation": "Dynamic estimation algorithms (Kalman, IMM, particle)",
45
+ "pytcl.assignment": "Assignment and data association (gating, JPDA, MHT)",
46
+ "pytcl.signal": "Signal processing functions (CFAR, matched filter)",
47
+ "pytcl.coordinate": "Coordinate system operations (rotations, conversions)",
48
+ "pytcl.containers": "Data containers and structures (TrackList, KDTree)",
49
+ "pytcl.math": "Mathematical functions (special functions, transforms)",
50
+ "pytcl.perf": "Performance instrumentation and timing",
51
+ }
52
+
53
+ # Default format strings
54
+ FORMATS = {
55
+ "detailed": (
56
+ "%(asctime)s - %(name)s - %(levelname)s - "
57
+ "%(funcName)s:%(lineno)d - %(message)s"
58
+ ),
59
+ "simple": "%(name)s - %(levelname)s - %(message)s",
60
+ "performance": "%(asctime)s - PERF - %(name)s - %(message)s",
61
+ "minimal": "%(levelname)s: %(message)s",
62
+ }
63
+
64
+
65
+ def configure_logging(
66
+ level: int = logging.WARNING,
67
+ format_style: str = "simple",
68
+ handler: Optional[logging.Handler] = None,
69
+ ) -> logging.Logger:
70
+ """
71
+ Configure the pytcl logging hierarchy.
72
+
73
+ Parameters
74
+ ----------
75
+ level : int
76
+ Logging level (e.g., logging.DEBUG, logging.INFO).
77
+ format_style : str
78
+ One of 'detailed', 'simple', 'performance', 'minimal'.
79
+ handler : logging.Handler, optional
80
+ Custom handler. If None, uses StreamHandler.
81
+
82
+ Returns
83
+ -------
84
+ logging.Logger
85
+ The root pytcl logger.
86
+
87
+ Examples
88
+ --------
89
+ >>> import logging
90
+ >>> from pytcl.logging_config import configure_logging
91
+ >>> configure_logging(level=logging.DEBUG, format_style="detailed")
92
+ """
93
+ root = logging.getLogger(PYTCL_LOGGER)
94
+ root.setLevel(level)
95
+
96
+ # Clear existing handlers
97
+ root.handlers.clear()
98
+
99
+ # Create handler if not provided
100
+ if handler is None:
101
+ handler = logging.StreamHandler()
102
+
103
+ # Set format
104
+ fmt = FORMATS.get(format_style, FORMATS["simple"])
105
+ formatter = logging.Formatter(fmt)
106
+ handler.setFormatter(formatter)
107
+ handler.setLevel(level)
108
+
109
+ root.addHandler(handler)
110
+
111
+ return root
112
+
113
+
114
+ def get_logger(name: str) -> logging.Logger:
115
+ """
116
+ Get a logger in the pytcl hierarchy.
117
+
118
+ Parameters
119
+ ----------
120
+ name : str
121
+ Logger name. If starts with 'pytcl.', used as-is.
122
+ Otherwise, 'pytcl.' is prepended.
123
+
124
+ Returns
125
+ -------
126
+ logging.Logger
127
+ Logger instance.
128
+
129
+ Examples
130
+ --------
131
+ >>> logger = get_logger("dynamic_estimation.kalman")
132
+ >>> logger.name
133
+ 'pytcl.dynamic_estimation.kalman'
134
+ """
135
+ if not name.startswith(PYTCL_LOGGER):
136
+ name = f"{PYTCL_LOGGER}.{name}"
137
+ return logging.getLogger(name)
138
+
139
+
140
+ # =============================================================================
141
+ # Performance Instrumentation
142
+ # =============================================================================
143
+
144
+ # Performance logger
145
+ _perf_logger = logging.getLogger(f"{PYTCL_LOGGER}.perf")
146
+
147
+
148
+ def timed(
149
+ logger: Optional[logging.Logger] = None,
150
+ name: Optional[str] = None,
151
+ level: int = logging.DEBUG,
152
+ ) -> Callable[[F], F]:
153
+ """
154
+ Decorator to time function execution.
155
+
156
+ Parameters
157
+ ----------
158
+ logger : logging.Logger, optional
159
+ Logger to use. Defaults to pytcl.perf.
160
+ name : str, optional
161
+ Name to use in log message. Defaults to function name.
162
+ level : int
163
+ Logging level. Default is DEBUG.
164
+
165
+ Returns
166
+ -------
167
+ callable
168
+ Decorated function.
169
+
170
+ Examples
171
+ --------
172
+ >>> @timed(logger, "kf_predict")
173
+ ... def kf_predict(x, P, F, Q):
174
+ ... return do_prediction(x, P, F, Q)
175
+ """
176
+
177
+ def decorator(func: F) -> F:
178
+ log = logger or _perf_logger
179
+ func_name = name or func.__name__
180
+
181
+ @functools.wraps(func)
182
+ def wrapper(*args: Any, **kwargs: Any) -> Any:
183
+ start = time.perf_counter()
184
+ try:
185
+ result = func(*args, **kwargs)
186
+ elapsed = (time.perf_counter() - start) * 1000
187
+ log.log(level, "%s completed in %.3fms", func_name, elapsed)
188
+ return result
189
+ except Exception as e:
190
+ elapsed = (time.perf_counter() - start) * 1000
191
+ log.log(level, "%s failed after %.3fms: %s", func_name, elapsed, e)
192
+ raise
193
+
194
+ return wrapper # type: ignore
195
+
196
+ return decorator
197
+
198
+
199
+ @contextmanager
200
+ def TimingContext(
201
+ logger: Optional[logging.Logger] = None,
202
+ name: str = "operation",
203
+ level: int = logging.DEBUG,
204
+ ):
205
+ """
206
+ Context manager for timing code blocks.
207
+
208
+ Parameters
209
+ ----------
210
+ logger : logging.Logger, optional
211
+ Logger to use. Defaults to pytcl.perf.
212
+ name : str
213
+ Name for the operation being timed.
214
+ level : int
215
+ Logging level.
216
+
217
+ Yields
218
+ ------
219
+ dict
220
+ Dictionary that will contain 'elapsed_ms' after context exits.
221
+
222
+ Examples
223
+ --------
224
+ >>> with TimingContext(logger, "update_loop") as timing:
225
+ ... for _ in range(100):
226
+ ... do_update()
227
+ >>> print(f"Elapsed: {timing['elapsed_ms']:.2f}ms")
228
+ """
229
+ log = logger or _perf_logger
230
+ timing: dict[str, float] = {"elapsed_ms": 0.0}
231
+ start = time.perf_counter()
232
+ try:
233
+ yield timing
234
+ finally:
235
+ timing["elapsed_ms"] = (time.perf_counter() - start) * 1000
236
+ log.log(level, "%s completed in %.3fms", name, timing["elapsed_ms"])
237
+
238
+
239
+ class PerformanceTracker:
240
+ """
241
+ Track cumulative performance statistics.
242
+
243
+ Useful for tracking performance across many iterations without
244
+ logging each one individually.
245
+
246
+ Parameters
247
+ ----------
248
+ name : str
249
+ Name for the tracked operation.
250
+ logger : logging.Logger, optional
251
+ Logger to use. Defaults to pytcl.perf.
252
+
253
+ Examples
254
+ --------
255
+ >>> tracker = PerformanceTracker("filter_cycles")
256
+ >>> for _ in range(1000):
257
+ ... with tracker.track():
258
+ ... do_filter_step()
259
+ >>> tracker.log_summary()
260
+ """
261
+
262
+ def __init__(self, name: str, logger: Optional[logging.Logger] = None):
263
+ self.name = name
264
+ self.logger = logger or _perf_logger
265
+ self.count = 0
266
+ self.total_ms = 0.0
267
+ self.min_ms = float("inf")
268
+ self.max_ms = 0.0
269
+
270
+ @contextmanager
271
+ def track(self):
272
+ """Track a single operation."""
273
+ start = time.perf_counter()
274
+ try:
275
+ yield
276
+ finally:
277
+ elapsed = (time.perf_counter() - start) * 1000
278
+ self.count += 1
279
+ self.total_ms += elapsed
280
+ self.min_ms = min(self.min_ms, elapsed)
281
+ self.max_ms = max(self.max_ms, elapsed)
282
+
283
+ @property
284
+ def mean_ms(self) -> float:
285
+ """Get mean execution time."""
286
+ return self.total_ms / self.count if self.count > 0 else 0.0
287
+
288
+ def log_summary(self, level: int = logging.INFO) -> None:
289
+ """Log performance summary."""
290
+ if self.count == 0:
291
+ self.logger.log(level, "%s: no data", self.name)
292
+ return
293
+
294
+ self.logger.log(
295
+ level,
296
+ "%s: count=%d, mean=%.3fms, min=%.3fms, max=%.3fms, total=%.1fms",
297
+ self.name,
298
+ self.count,
299
+ self.mean_ms,
300
+ self.min_ms,
301
+ self.max_ms,
302
+ self.total_ms,
303
+ )
304
+
305
+ def reset(self) -> None:
306
+ """Reset statistics."""
307
+ self.count = 0
308
+ self.total_ms = 0.0
309
+ self.min_ms = float("inf")
310
+ self.max_ms = 0.0
311
+
312
+ def __repr__(self) -> str:
313
+ return (
314
+ f"PerformanceTracker(name={self.name!r}, count={self.count}, "
315
+ f"mean_ms={self.mean_ms:.3f})"
316
+ )
317
+
318
+
319
+ __all__ = [
320
+ "configure_logging",
321
+ "get_logger",
322
+ "timed",
323
+ "TimingContext",
324
+ "PerformanceTracker",
325
+ "PYTCL_LOGGER",
326
+ "LOGGER_HIERARCHY",
327
+ "FORMATS",
328
+ ]
File without changes
File without changes
File without changes
File without changes
File without changes