flightanalysis 0.2.18__tar.gz → 0.2.20__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 (183) hide show
  1. {flightanalysis-0.2.18 → flightanalysis-0.2.20}/PKG-INFO +7 -5
  2. flightanalysis-0.2.20/create_schedules.py +24 -0
  3. flightanalysis-0.2.20/examples/make_manoeuvre.py +40 -0
  4. {flightanalysis-0.2.18 → flightanalysis-0.2.20}/flightanalysis/analysis/el_analysis.py +2 -3
  5. {flightanalysis-0.2.18 → flightanalysis-0.2.20}/flightanalysis/analysis/manoeuvre_analysis/alignment.py +44 -36
  6. {flightanalysis-0.2.18 → flightanalysis-0.2.20}/flightanalysis/analysis/manoeuvre_analysis/basic.py +58 -41
  7. flightanalysis-0.2.20/flightanalysis/analysis/manoeuvre_analysis/complete.py +317 -0
  8. flightanalysis-0.2.20/flightanalysis/analysis/sch_analysis.py +151 -0
  9. flightanalysis-0.2.20/flightanalysis/base/ref_funcs.py +65 -0
  10. flightanalysis-0.2.20/flightanalysis/data/__init__.py +15 -0
  11. {flightanalysis-0.2.18 → flightanalysis-0.2.20}/flightanalysis/data/f3a_a25_schedule.json +1168 -672
  12. {flightanalysis-0.2.18 → flightanalysis-0.2.20}/flightanalysis/data/f3a_f25_schedule.json +1540 -1285
  13. {flightanalysis-0.2.18 → flightanalysis-0.2.20}/flightanalysis/data/f3a_p23_schedule.json +1394 -1074
  14. {flightanalysis-0.2.18 → flightanalysis-0.2.20}/flightanalysis/data/f3a_p25_schedule.json +1587 -1263
  15. {flightanalysis-0.2.18 → flightanalysis-0.2.20}/flightanalysis/data/f3auk_clubman_schedule.json +882 -477
  16. {flightanalysis-0.2.18 → flightanalysis-0.2.20}/flightanalysis/data/f3auk_inter_schedule.json +843 -459
  17. {flightanalysis-0.2.18 → flightanalysis-0.2.20}/flightanalysis/definition/__init__.py +0 -1
  18. {flightanalysis-0.2.18 → flightanalysis-0.2.20}/flightanalysis/definition/builders/elbuilders.py +34 -77
  19. flightanalysis-0.2.20/flightanalysis/definition/builders/manbuilder.py +322 -0
  20. {flightanalysis-0.2.18/examples/schedule_construction → flightanalysis-0.2.20/flightanalysis/definition/builders/schedules}/AMA_Intermediate2024.py +7 -4
  21. {flightanalysis-0.2.18/examples/schedule_construction → flightanalysis-0.2.20/flightanalysis/definition/builders/schedules}/f3a_a25.py +7 -6
  22. {flightanalysis-0.2.18/examples/schedule_construction → flightanalysis-0.2.20/flightanalysis/definition/builders/schedules}/f3a_f25.py +19 -13
  23. {flightanalysis-0.2.18/examples/schedule_construction → flightanalysis-0.2.20/flightanalysis/definition/builders/schedules}/f3a_p23.py +13 -11
  24. {flightanalysis-0.2.18/examples/schedule_construction → flightanalysis-0.2.20/flightanalysis/definition/builders/schedules}/f3a_p25.py +12 -8
  25. {flightanalysis-0.2.18/examples/schedule_construction → flightanalysis-0.2.20/flightanalysis/definition/builders/schedules}/f3auk_clubman.py +9 -7
  26. {flightanalysis-0.2.18/examples/schedule_construction → flightanalysis-0.2.20/flightanalysis/definition/builders/schedules}/f3auk_intermediate.py +3 -2
  27. {flightanalysis-0.2.18/examples/schedule_construction → flightanalysis-0.2.20/flightanalysis/definition/builders/schedules}/imac_sport2024.py +7 -1
  28. {flightanalysis-0.2.18/examples/schedule_construction → flightanalysis-0.2.20/flightanalysis/definition/builders/schedules}/imac_unlim2024.py +9 -3
  29. {flightanalysis-0.2.18/examples/schedule_construction → flightanalysis-0.2.20/flightanalysis/definition/builders/schedules}/nsrca_inter2024.py +7 -5
  30. {flightanalysis-0.2.18 → flightanalysis-0.2.20}/flightanalysis/definition/collectors.py +1 -1
  31. {flightanalysis-0.2.18 → flightanalysis-0.2.20}/flightanalysis/definition/eldef.py +48 -47
  32. {flightanalysis-0.2.18 → flightanalysis-0.2.20}/flightanalysis/definition/mandef.py +81 -65
  33. {flightanalysis-0.2.18 → flightanalysis-0.2.20}/flightanalysis/definition/manparm.py +113 -59
  34. {flightanalysis-0.2.18 → flightanalysis-0.2.20}/flightanalysis/definition/operations/funopp.py +0 -1
  35. {flightanalysis-0.2.18 → flightanalysis-0.2.20}/flightanalysis/definition/operations/operation.py +4 -2
  36. {flightanalysis-0.2.18 → flightanalysis-0.2.20}/flightanalysis/definition/operations/sumopp.py +2 -2
  37. {flightanalysis-0.2.18 → flightanalysis-0.2.20}/flightanalysis/definition/scheddef.py +2 -1
  38. flightanalysis-0.2.20/flightanalysis/elements/__init__.py +6 -0
  39. {flightanalysis-0.2.18 → flightanalysis-0.2.20}/flightanalysis/elements/element.py +9 -47
  40. {flightanalysis-0.2.18 → flightanalysis-0.2.20}/flightanalysis/elements/line.py +2 -5
  41. {flightanalysis-0.2.18 → flightanalysis-0.2.20}/flightanalysis/elements/loop.py +31 -33
  42. flightanalysis-0.2.20/flightanalysis/elements/snap.py +116 -0
  43. flightanalysis-0.2.20/flightanalysis/elements/spin.py +128 -0
  44. {flightanalysis-0.2.18 → flightanalysis-0.2.20}/flightanalysis/fcjson.py +29 -18
  45. flightanalysis-0.2.20/flightanalysis/manoeuvre.py +129 -0
  46. flightanalysis-0.2.20/flightanalysis/scoring/criteria/__init__.py +10 -0
  47. {flightanalysis-0.2.18 → flightanalysis-0.2.20}/flightanalysis/scoring/criteria/criteria.py +10 -6
  48. flightanalysis-0.2.20/flightanalysis/scoring/criteria/exponential.py +41 -0
  49. flightanalysis-0.2.20/flightanalysis/scoring/criteria/f3a_criteria.py +84 -0
  50. flightanalysis-0.2.20/flightanalysis/scoring/criteria/inter/comparison.py +17 -0
  51. flightanalysis-0.2.20/flightanalysis/scoring/criteria/intra/bounded.py +69 -0
  52. flightanalysis-0.2.20/flightanalysis/scoring/criteria/intra/continuous.py +74 -0
  53. flightanalysis-0.2.20/flightanalysis/scoring/criteria/intra/peak.py +38 -0
  54. flightanalysis-0.2.20/flightanalysis/scoring/criteria/intra/single.py +37 -0
  55. flightanalysis-0.2.20/flightanalysis/scoring/downgrade.py +98 -0
  56. flightanalysis-0.2.20/flightanalysis/scoring/f3a_downgrades.py +79 -0
  57. flightanalysis-0.2.20/flightanalysis/scoring/measurement.py +468 -0
  58. flightanalysis-0.2.20/flightanalysis/scoring/results.py +379 -0
  59. flightanalysis-0.2.20/flightanalysis/scoring/selectors.py +107 -0
  60. flightanalysis-0.2.20/flightanalysis/scoring/smoothing.py +73 -0
  61. flightanalysis-0.2.20/flightanalysis/scoring/visibility.py +21 -0
  62. {flightanalysis-0.2.18 → flightanalysis-0.2.20}/flightanalysis/scripts/collect_scores.py +47 -38
  63. flightanalysis-0.2.20/flightanalysis/scripts/plot_scores.py +51 -0
  64. {flightanalysis-0.2.18 → flightanalysis-0.2.20}/flightanalysis.egg-info/PKG-INFO +7 -5
  65. {flightanalysis-0.2.18 → flightanalysis-0.2.20}/flightanalysis.egg-info/SOURCES.txt +23 -22
  66. {flightanalysis-0.2.18 → flightanalysis-0.2.20}/flightanalysis.egg-info/requires.txt +6 -4
  67. {flightanalysis-0.2.18 → flightanalysis-0.2.20}/requirements-dev.txt +4 -3
  68. flightanalysis-0.2.20/requirements.txt +11 -0
  69. flightanalysis-0.2.20/tests/data/scored_fcj.json +250110 -0
  70. {flightanalysis-0.2.18 → flightanalysis-0.2.20}/tests/data/unscored_fcj.json +0 -2279
  71. flightanalysis-0.2.20/tests/test_criiteria.py +194 -0
  72. flightanalysis-0.2.20/tests/test_data.py +8 -0
  73. {flightanalysis-0.2.18 → flightanalysis-0.2.20}/tests/test_fcjscore.py +15 -6
  74. flightanalysis-0.2.20/tests/test_rfuncs.py +24 -0
  75. {flightanalysis-0.2.18 → flightanalysis-0.2.20}/tests/test_schedule/test_definition/test_definition_eldef.py +2 -1
  76. {flightanalysis-0.2.18 → flightanalysis-0.2.20}/tests/test_schedule/test_definition/test_schedule_definition.py +2 -1
  77. flightanalysis-0.2.20/tests/test_schedule/test_element/test_schedule_element_line.py +47 -0
  78. {flightanalysis-0.2.18 → flightanalysis-0.2.20}/tests/test_schedule/test_element/test_schedule_element_loop.py +16 -12
  79. flightanalysis-0.2.20/tests/test_schedule/test_element/test_schedule_element_snap.py +41 -0
  80. flightanalysis-0.2.20/tests/test_schedule/test_element/test_schedule_element_spin.py +41 -0
  81. {flightanalysis-0.2.18 → flightanalysis-0.2.20}/tests/test_schedule/test_measurement.py +2 -20
  82. flightanalysis-0.2.18/examples/schedule_construction/create_all.py +0 -21
  83. flightanalysis-0.2.18/examples/schedule_construction/make_manoeuvre.py +0 -48
  84. flightanalysis-0.2.18/examples/scoring/f3a_criteria_maker.py +0 -69
  85. flightanalysis-0.2.18/examples/scoring/temp.py +0 -24
  86. flightanalysis-0.2.18/flightanalysis/analysis/manoeuvre_analysis/complete.py +0 -248
  87. flightanalysis-0.2.18/flightanalysis/analysis/sch_analysis.py +0 -117
  88. flightanalysis-0.2.18/flightanalysis/data/__init__.py +0 -14
  89. flightanalysis-0.2.18/flightanalysis/definition/builders/manbuilder.py +0 -310
  90. flightanalysis-0.2.18/flightanalysis/elements/__init__.py +0 -8
  91. flightanalysis-0.2.18/flightanalysis/elements/autorotation.py +0 -65
  92. flightanalysis-0.2.18/flightanalysis/elements/nose_drop.py +0 -51
  93. flightanalysis-0.2.18/flightanalysis/elements/pitch_break.py +0 -48
  94. flightanalysis-0.2.18/flightanalysis/elements/recovery.py +0 -35
  95. flightanalysis-0.2.18/flightanalysis/manoeuvre.py +0 -169
  96. flightanalysis-0.2.18/flightanalysis/scoring/criteria/__init__.py +0 -9
  97. flightanalysis-0.2.18/flightanalysis/scoring/criteria/exponential.py +0 -33
  98. flightanalysis-0.2.18/flightanalysis/scoring/criteria/f3a_criteria.py +0 -41
  99. flightanalysis-0.2.18/flightanalysis/scoring/criteria/inter/comparison.py +0 -20
  100. flightanalysis-0.2.18/flightanalysis/scoring/criteria/intra/bounded.py +0 -81
  101. flightanalysis-0.2.18/flightanalysis/scoring/criteria/intra/continuous.py +0 -116
  102. flightanalysis-0.2.18/flightanalysis/scoring/criteria/intra/single.py +0 -34
  103. flightanalysis-0.2.18/flightanalysis/scoring/downgrade.py +0 -45
  104. flightanalysis-0.2.18/flightanalysis/scoring/f3a_downgrades.py +0 -48
  105. flightanalysis-0.2.18/flightanalysis/scoring/measurement.py +0 -401
  106. flightanalysis-0.2.18/flightanalysis/scoring/results.py +0 -253
  107. flightanalysis-0.2.18/flightanalysis/scripts/plot_scores.py +0 -22
  108. flightanalysis-0.2.18/requirements.txt +0 -10
  109. flightanalysis-0.2.18/tests/data/scored_fcj.json +0 -1
  110. flightanalysis-0.2.18/tests/test_criiteria.py +0 -227
  111. flightanalysis-0.2.18/tests/test_data.py +0 -8
  112. flightanalysis-0.2.18/tests/test_schedule/test_element/test_schedule_element_line.py +0 -50
  113. flightanalysis-0.2.18/tests/test_schedule/test_element/test_schedule_element_nose_drop.py +0 -37
  114. flightanalysis-0.2.18/tests/test_schedule/test_element/test_schedule_element_pitch_break.py +0 -46
  115. flightanalysis-0.2.18/tests/test_schedule/test_element/test_schedule_element_recovery.py +0 -38
  116. {flightanalysis-0.2.18 → flightanalysis-0.2.20}/.github/workflows/publish_pypi.yml +0 -0
  117. {flightanalysis-0.2.18 → flightanalysis-0.2.20}/.gitignore +0 -0
  118. {flightanalysis-0.2.18 → flightanalysis-0.2.20}/LICENSE +0 -0
  119. {flightanalysis-0.2.18 → flightanalysis-0.2.20}/MANIFEST.in +0 -0
  120. {flightanalysis-0.2.18 → flightanalysis-0.2.20}/README.md +0 -0
  121. {flightanalysis-0.2.18 → flightanalysis-0.2.20}/examples/__init__.py +0 -0
  122. {flightanalysis-0.2.18 → flightanalysis-0.2.20}/examples/data/__init__.py +0 -0
  123. {flightanalysis-0.2.18 → flightanalysis-0.2.20}/examples/data/manual_F3A_F23_22_04_28_00000231.json +0 -0
  124. {flightanalysis-0.2.18 → flightanalysis-0.2.20}/examples/data/manual_F3A_P23_22_05_31_00000350.json +0 -0
  125. {flightanalysis-0.2.18 → flightanalysis-0.2.20}/examples/data/manual_F3A_P23_23_08_11_00000094.json +0 -0
  126. {flightanalysis-0.2.18 → flightanalysis-0.2.20}/examples/scoring/__init__.py +0 -0
  127. {flightanalysis-0.2.18 → flightanalysis-0.2.20}/examples/scoring/judging.py +0 -0
  128. {flightanalysis-0.2.18/examples/schedule_construction → flightanalysis-0.2.20/examples/scoring/manoeuvres}/__init__.py +0 -0
  129. {flightanalysis-0.2.18 → flightanalysis-0.2.20}/examples/scoring/manoeuvres/inter_analysis.py +0 -0
  130. {flightanalysis-0.2.18 → flightanalysis-0.2.20}/examples/scoring/manoeuvres/intra_analysis.py +0 -0
  131. {flightanalysis-0.2.18/examples/scoring/manoeuvres → flightanalysis-0.2.20/examples/scoring/manoeuvres/mans}/__init__.py +0 -0
  132. {flightanalysis-0.2.18 → flightanalysis-0.2.20}/examples/scoring/manoeuvres/mans/extract_mans.py +0 -0
  133. {flightanalysis-0.2.18 → flightanalysis-0.2.20}/examples/scoring/manoeuvres/mans/tHat.json +0 -0
  134. {flightanalysis-0.2.18 → flightanalysis-0.2.20}/examples/scoring/manoeuvres/positioning_analysis.py +0 -0
  135. {flightanalysis-0.2.18 → flightanalysis-0.2.20}/flightanalysis/__init__.py +0 -0
  136. {flightanalysis-0.2.18 → flightanalysis-0.2.20}/flightanalysis/analysis/__init__.py +0 -0
  137. {flightanalysis-0.2.18 → flightanalysis-0.2.20}/flightanalysis/analysis/manoeuvre_analysis/__init__.py +0 -0
  138. {flightanalysis-0.2.18 → flightanalysis-0.2.20}/flightanalysis/analysis/manoeuvre_analysis/analysis.py +0 -0
  139. {flightanalysis-0.2.18 → flightanalysis-0.2.20}/flightanalysis/analysis/manoeuvre_analysis/scored.py +0 -0
  140. {flightanalysis-0.2.18 → flightanalysis-0.2.20}/flightanalysis/base/utils.py +0 -0
  141. {flightanalysis-0.2.18 → flightanalysis-0.2.20}/flightanalysis/data/IMAC_Unlimited2024_schedule.json +0 -0
  142. {flightanalysis-0.2.18/examples/scoring/manoeuvres/mans → flightanalysis-0.2.20/flightanalysis/definition/builders}/__init__.py +0 -0
  143. {flightanalysis-0.2.18/flightanalysis/definition/builders → flightanalysis-0.2.20/flightanalysis/definition/builders/schedules}/__init__.py +0 -0
  144. {flightanalysis-0.2.18 → flightanalysis-0.2.20}/flightanalysis/definition/maninfo.py +0 -0
  145. {flightanalysis-0.2.18 → flightanalysis-0.2.20}/flightanalysis/definition/manoption.py +0 -0
  146. {flightanalysis-0.2.18 → flightanalysis-0.2.20}/flightanalysis/definition/operations/__init__.py +0 -0
  147. {flightanalysis-0.2.18 → flightanalysis-0.2.20}/flightanalysis/definition/operations/itemopp.py +0 -0
  148. {flightanalysis-0.2.18 → flightanalysis-0.2.20}/flightanalysis/definition/operations/mathopp.py +0 -0
  149. {flightanalysis-0.2.18 → flightanalysis-0.2.20}/flightanalysis/definition/scheduleinfo.py +0 -0
  150. {flightanalysis-0.2.18 → flightanalysis-0.2.20}/flightanalysis/elements/stall_turn.py +0 -0
  151. {flightanalysis-0.2.18 → flightanalysis-0.2.20}/flightanalysis/schedule.py +0 -0
  152. {flightanalysis-0.2.18 → flightanalysis-0.2.20}/flightanalysis/scoring/__init__.py +0 -0
  153. {flightanalysis-0.2.18 → flightanalysis-0.2.20}/flightanalysis/scoring/criteria/inter/__init__.py +0 -0
  154. {flightanalysis-0.2.18 → flightanalysis-0.2.20}/flightanalysis/scoring/criteria/inter/combination.py +0 -0
  155. {flightanalysis-0.2.18 → flightanalysis-0.2.20}/flightanalysis/scoring/criteria/intra/__init__.py +0 -0
  156. {flightanalysis-0.2.18 → flightanalysis-0.2.20}/flightanalysis/version.py +0 -0
  157. {flightanalysis-0.2.18 → flightanalysis-0.2.20}/flightanalysis.egg-info/dependency_links.txt +0 -0
  158. {flightanalysis-0.2.18 → flightanalysis-0.2.20}/flightanalysis.egg-info/entry_points.txt +0 -0
  159. {flightanalysis-0.2.18 → flightanalysis-0.2.20}/flightanalysis.egg-info/top_level.txt +0 -0
  160. {flightanalysis-0.2.18 → flightanalysis-0.2.20}/pyproject.toml +0 -0
  161. {flightanalysis-0.2.18 → flightanalysis-0.2.20}/setup.cfg +0 -0
  162. {flightanalysis-0.2.18 → flightanalysis-0.2.20}/tests/EmailedBox.f3a +0 -0
  163. {flightanalysis-0.2.18 → flightanalysis-0.2.20}/tests/__init__.py +0 -0
  164. {flightanalysis-0.2.18 → flightanalysis-0.2.20}/tests/conftest.py +0 -0
  165. {flightanalysis-0.2.18 → flightanalysis-0.2.20}/tests/data/manual_F3A_P23.json +0 -0
  166. {flightanalysis-0.2.18 → flightanalysis-0.2.20}/tests/data/old_json.json +0 -0
  167. {flightanalysis-0.2.18 → flightanalysis-0.2.20}/tests/data/p23.BIN +0 -0
  168. {flightanalysis-0.2.18 → flightanalysis-0.2.20}/tests/data/p23_box.f3a +0 -0
  169. {flightanalysis-0.2.18 → flightanalysis-0.2.20}/tests/data/p23_fc.json +0 -0
  170. {flightanalysis-0.2.18 → flightanalysis-0.2.20}/tests/data/p23_flight.json +0 -0
  171. {flightanalysis-0.2.18 → flightanalysis-0.2.20}/tests/test_schedule/__init__.py +0 -0
  172. {flightanalysis-0.2.18 → flightanalysis-0.2.20}/tests/test_schedule/test_definition/__init__.py +0 -0
  173. {flightanalysis-0.2.18 → flightanalysis-0.2.20}/tests/test_schedule/test_definition/test_definition_manparm.py +0 -0
  174. {flightanalysis-0.2.18 → flightanalysis-0.2.20}/tests/test_schedule/test_definition/test_definition_mpopp.py +0 -0
  175. {flightanalysis-0.2.18 → flightanalysis-0.2.20}/tests/test_schedule/test_definition/test_schedule_definition_maninfo.py +0 -0
  176. {flightanalysis-0.2.18 → flightanalysis-0.2.20}/tests/test_schedule/test_element/__init__.py +0 -0
  177. {flightanalysis-0.2.18 → flightanalysis-0.2.20}/tests/test_schedule/test_element/loop_analysis.json +0 -0
  178. {flightanalysis-0.2.18 → flightanalysis-0.2.20}/tests/test_schedule/test_element/p23_th_e0.csv +0 -0
  179. {flightanalysis-0.2.18 → flightanalysis-0.2.20}/tests/test_schedule/test_element/p23_th_e0.json +0 -0
  180. {flightanalysis-0.2.18 → flightanalysis-0.2.20}/tests/test_schedule/test_element/p23_th_e0_template.csv +0 -0
  181. {flightanalysis-0.2.18 → flightanalysis-0.2.20}/tests/test_schedule/test_element/test_schedule_element.py +0 -0
  182. {flightanalysis-0.2.18 → flightanalysis-0.2.20}/tests/test_schedule/test_element/test_schedule_element_stallturn.py +0 -0
  183. {flightanalysis-0.2.18 → flightanalysis-0.2.20}/tests/test_schedule/test_schedule_manoeuvre.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: flightanalysis
3
- Version: 0.2.18
3
+ Version: 0.2.20
4
4
  Summary: A package for analysing flight data
5
5
  Author-email: Thomas David <thomasdavid0@gmail.com>
6
6
  License: GNU GPL v3
@@ -15,9 +15,10 @@ Requires-Dist: fastdtw
15
15
  Requires-Dist: simplejson
16
16
  Requires-Dist: loguru
17
17
  Requires-Dist: joblib
18
- Requires-Dist: pfc-geometry>=0.2.8
19
- Requires-Dist: flightdata>=0.2.16
18
+ Requires-Dist: pfc-geometry>=0.2.10
19
+ Requires-Dist: flightdata>=0.2.18
20
20
  Requires-Dist: GitPython
21
+ Requires-Dist: pyperclip
21
22
  Provides-Extra: dev
22
23
  Requires-Dist: numpy; extra == "dev"
23
24
  Requires-Dist: pandas; extra == "dev"
@@ -26,11 +27,12 @@ Requires-Dist: fastdtw; extra == "dev"
26
27
  Requires-Dist: simplejson; extra == "dev"
27
28
  Requires-Dist: loguru; extra == "dev"
28
29
  Requires-Dist: joblib; extra == "dev"
29
- Requires-Dist: pfc-geometry>=0.2.8; extra == "dev"
30
- Requires-Dist: flightdata>=0.2.16; extra == "dev"
30
+ Requires-Dist: pfc-geometry>=0.2.10; extra == "dev"
31
+ Requires-Dist: flightdata>=0.2.18; extra == "dev"
31
32
  Requires-Dist: ardupilot_log_reader>=0.3.3; extra == "dev"
32
33
  Requires-Dist: pymavlink; extra == "dev"
33
34
  Requires-Dist: GitPython; extra == "dev"
35
+ Requires-Dist: pyperclip; extra == "dev"
34
36
 
35
37
  # FlightAnalysis
36
38
 
@@ -0,0 +1,24 @@
1
+ from flightanalysis.definition.builders.schedules.f3a_p23 import p23_def
2
+ from flightanalysis.definition.builders.schedules.f3a_a25 import a25_def
3
+ from flightanalysis.definition.builders.schedules.f3a_p25 import p25_def
4
+ from flightanalysis.definition.builders.schedules.f3a_f25 import f25_def
5
+ #from imac_unlim2024 import sdef as imac_unl2024_def
6
+ from flightanalysis.definition.builders.schedules.f3auk_clubman import clubman_def as f3auk_club_def
7
+ from flightanalysis.definition.builders.schedules.f3auk_intermediate import intermediate_def as f3auk_int_def
8
+
9
+ sdefs = {
10
+ 'f3a_p23_schedule': p23_def,
11
+ 'f3a_a25_schedule': a25_def,
12
+ 'f3a_p25_schedule': p25_def,
13
+ 'f3a_f25_schedule': f25_def,
14
+ #'IMAC_Unlimited2024_schedule': imac_unl2024_def,
15
+ 'f3auk_clubman_schedule': f3auk_club_def,
16
+ 'f3auk_inter_schedule': f3auk_int_def
17
+ }
18
+
19
+ def create_all():
20
+ for k, sdef in sdefs.items():
21
+ sdef.to_json(f"flightanalysis/data/{k}.json")
22
+
23
+ if __name__ == '__main__':
24
+ create_all()
@@ -0,0 +1,40 @@
1
+ from flightplotting import plotsec, plot_regions
2
+ from flightplotting.traces import axis_rate_trace
3
+ from flightanalysis import (
4
+ ManDef, BoxLocation, Position, Height, Direction,
5
+ Orientation, ManInfo, r, MBTags, c45, centred, ManParm, Combination)
6
+ import numpy as np
7
+ from flightanalysis.definition import f3amb
8
+ from flightdata import NumpyEncoder
9
+ import plotly.graph_objects as go
10
+ from json import dumps
11
+ import geometry as g
12
+
13
+ mdef: ManDef = f3amb.create(ManInfo(
14
+ "Spin", "iSpin", k=3, position=Position.CENTRE,
15
+ start=BoxLocation(Height.TOP, Direction.UPWIND, Orientation.INVERTED),
16
+ end=BoxLocation(Height.BTM),
17
+ ),[
18
+ MBTags.CENTRE,
19
+ f3amb.spin(r(2)),
20
+ f3amb.roll(r(0.5), line_length=165),
21
+ f3amb.loop(np.pi/2),
22
+ ])
23
+
24
+ data = mdef.to_dict()
25
+ print(dumps(data, indent=2, cls=NumpyEncoder))
26
+ mdef = ManDef.from_dict(data)
27
+
28
+ it = g.Transformation(g.Point(-20,150,50), mdef.info.initial_transform(150, 1).rotation)
29
+
30
+ man = mdef.create()
31
+
32
+ tp = man.create_template(it)
33
+
34
+ fig = plot_regions(tp, 'element', span=5)
35
+ fig = plotsec(tp, fig=fig, nmodels=10, scale=5)
36
+ #fig.add_traces(boxtrace())
37
+ fig.show()
38
+
39
+ fig = go.Figure(data=axis_rate_trace(tp))
40
+ fig.show()
@@ -2,7 +2,6 @@ from __future__ import annotations
2
2
  from flightdata import State
3
3
  from typing import Self
4
4
  from flightanalysis import ElDef, Element, ManParms
5
- import numpy as np
6
5
  from dataclasses import dataclass
7
6
  import geometry as g
8
7
 
@@ -18,7 +17,7 @@ class ElementAnalysis:
18
17
 
19
18
  def plot_3d(self, **kwargs):
20
19
  from flightplotting import plotsec
21
- return plotsec([self.fl, self.tp], **kwargs)
20
+ return plotsec(dict(fl=self.fl, tp=self.tp), **kwargs)
22
21
 
23
22
  def to_dict(self):
24
23
  return {k: v.to_dict() for k, v in self.__dict__.items()}
@@ -36,5 +35,5 @@ class ElementAnalysis:
36
35
  )
37
36
 
38
37
  def intra_score(self):
39
- return self.edef.dgs.apply(self.el, self.fl, self.tp)
38
+ return self.edef.dgs.apply(self.el.uid, self.fl, self.tp) #[dg.apply(self.el.uid + (f'_{k}' if len(k) > 0 else ''), self.fl, self.tp) for k, dg in self.edef.dgs.items()]
40
39
 
@@ -2,64 +2,73 @@ from __future__ import annotations
2
2
  from dataclasses import dataclass
3
3
  from flightdata import State
4
4
  from flightanalysis.manoeuvre import Manoeuvre
5
+ from flightanalysis.elements import Element
5
6
  from loguru import logger
6
7
  from .basic import Basic
7
8
  from flightanalysis.definition import ManDef, ScheduleInfo
8
9
  from ..el_analysis import ElementAnalysis
9
10
 
11
+
10
12
  @dataclass
11
13
  class Alignment(Basic):
12
14
  manoeuvre: Manoeuvre | None
13
15
  template: State | None
14
16
 
15
17
  def __getattr__(self, name) -> ElementAnalysis:
18
+ el: Element = self.manoeuvre.elements.data[name]
16
19
  return ElementAnalysis(
17
20
  self.mdef.eds.data[name],
18
21
  self.mdef.mps,
19
- self.manoeuvre.elements.data[name],
20
- self.flown.get_element(name),
21
- self.template.get_element(name),
22
- self.template.get_element(name)[0].transform
22
+ el,
23
+ el.get_data(self.flown),
24
+ el.get_data(self.template),
25
+ el.get_data(self.template)[0].transform,
23
26
  )
24
27
 
25
- def run_all(self, optimise_aligment=True, force=False) -> Alignment | Complete | Scored:
26
- if self.__class__.__name__ == 'Scored' and force:
28
+ def run_all(
29
+ self, optimise_aligment=True, force=False
30
+ ) -> Alignment | Complete | Scored:
31
+ if self.__class__.__name__ == "Scored" and force:
27
32
  self = self.downgrade()
28
33
  new = self
29
- while self.__class__.__name__ != 'Scored':
30
- new = self.run(optimise_aligment) if isinstance(self, Complete) else self.run()
34
+ while self.__class__.__name__ != "Scored":
35
+ new = (
36
+ self.run(optimise_aligment)
37
+ if isinstance(self, Complete)
38
+ else self.run()
39
+ )
31
40
  if new.__class__.__name__ == self.__class__.__name__:
32
41
  break
33
42
  self = new
34
43
  return new
35
-
44
+
36
45
  @staticmethod
37
46
  def from_dict(data: dict, fallback=True):
38
47
  ia = Basic.from_dict(data)
39
- try:
48
+ try:
40
49
  ia = Alignment(
41
- manoeuvre=Manoeuvre.from_dict(data['manoeuvre']),
42
- template=State.from_dict(data['template']),
43
- **ia.__dict__
50
+ manoeuvre=Manoeuvre.from_dict(data["manoeuvre"]),
51
+ template=State.from_dict(data["template"]),
52
+ **ia.__dict__,
44
53
  )
45
54
  except Exception as e:
46
55
  if fallback:
47
- logger.debug(f'Failed to parse Alignment {repr(e)}')
56
+ logger.debug(f"Failed to parse Alignment {repr(e)}")
48
57
  else:
49
58
  raise e
50
59
  return ia
51
60
 
52
61
  def run(self) -> Alignment | Complete:
53
- if 'element' not in self.flown.data.columns:
62
+ if "element" not in self.flown.data.columns:
54
63
  try:
55
64
  self = self._run(True)[1]
56
65
  except Exception as e:
57
- logger.error(f'Failed to run alignment stage 1: {repr(e)}')
66
+ logger.error(f"Failed to run alignment stage 1: {repr(e)}")
58
67
  return self
59
68
  try:
60
69
  return self._run(False)[1].proceed()
61
70
  except Exception as e:
62
- logger.error(f'Failed to run alignment stage 2: {repr(e)}')
71
+ logger.error(f"Failed to run alignment stage 2: {repr(e)}")
63
72
  return self
64
73
 
65
74
  def _run(self, mirror=False, radius=10) -> Alignment:
@@ -72,33 +81,32 @@ class Alignment(Basic):
72
81
  return Alignment(self.id, mdef, aligned, self.direction, man, tp)
73
82
 
74
83
  def _proceed(self) -> Complete:
75
- if 'element' in self.flown.data.columns:
76
- correction = self.mdef.create(self.template[0].transform)
84
+ if "element" in self.flown.data.columns:
85
+ correction = self.mdef.create()
77
86
  return Complete(
78
- self.id, self.mdef, self.flown, self.direction,
79
- self.manoeuvre, self.template, correction,
80
- correction.create_template(self.template[0], self.flown)
87
+ self.id,
88
+ self.mdef,
89
+ self.flown,
90
+ self.direction,
91
+ self.manoeuvre,
92
+ self.template,
93
+ correction,
94
+ correction.create_template(self.template[0], self.flown),
81
95
  )
82
96
  else:
83
97
  return self
84
98
 
85
- def to_mindict(self, sinfo: ScheduleInfo=None, full=False):
86
- data = dict(
87
- els = self.flown.label_ranges('element').to_dict('records')
88
- )
99
+ def to_mindict(self, sinfo: ScheduleInfo = None, full=False):
100
+ data = dict(els=self.flown.label_ranges("element").to_dict("records"))
89
101
  if full:
90
- data = dict(
91
- **super().to_mindict(sinfo),
92
- **data
93
- )
102
+ data = dict(**super().to_mindict(sinfo), **data)
94
103
  return data
95
104
 
96
105
  def fcj_results(self):
97
- df = self.flown.label_ranges('element').iloc[:,:3]
98
- df.columns = ['name', 'start', 'stop']
99
- return dict(
100
- els=df.to_dict('records')
101
- )
106
+ df = self.flown.label_ranges("element").iloc[:, :3]
107
+ df.columns = ["name", "start", "stop"]
108
+ return dict(els=df.to_dict("records"))
109
+
102
110
 
103
111
  from .complete import Complete # noqa: E402
104
- from .scored import Scored # noqa: E402
112
+ from .scored import Scored # noqa: E402
@@ -23,54 +23,64 @@ class Basic(Analysis):
23
23
  def run_all(self, optimise_aligment=True, force=False) -> Scored:
24
24
  """Run the analysis to the final stage, for the case where the elements have not been labelled"""
25
25
  drs = [r._run(True) for r in self.run()]
26
-
26
+
27
27
  dr = drs[np.argmin([dr[0] for dr in drs])]
28
28
 
29
29
  return dr[1].run_all(optimise_aligment, force)
30
30
 
31
31
  def proceed(self) -> Complete:
32
32
  """Proceed the analysis to the final stage for the case where the elements have already been labelled"""
33
- if 'element' not in self.flown.data.columns:
33
+ if "element" not in self.flown.data.columns:
34
34
  return self
35
35
  mopt = ManOption([self.mdef]) if isinstance(self.mdef, ManDef) else self.mdef
36
- elnames = self.flown.data.element.unique()
36
+ elnames = self.flown.data.element.unique().astype(str)
37
37
  for md in mopt:
38
- if np.all(elnames[1:-1] == list( md.eds.data.keys())):
38
+ if np.all(
39
+ [np.any(np.char.startswith(elnames, k)) for k in md.eds.data.keys()]
40
+ ):
39
41
  mdef = md
40
42
  break
41
43
  else:
42
- raise ValueError(f"{self.mdef.info.short_name} element sequence doesn't agree with {self.flown.data.element.unique()}")
44
+ raise ValueError(
45
+ f"{self.mdef.info.short_name} element sequence doesn't agree with {self.flown.data.element.unique()}"
46
+ )
43
47
 
44
48
  itrans = self.create_itrans()
45
- man, tp = mdef.create(itrans).add_lines().match_intention(
46
- State.from_transform(itrans),
47
- self.flown
49
+ man, tp = (
50
+ mdef.create()
51
+ .add_lines()
52
+ .match_intention(State.from_transform(itrans), self.flown)
48
53
  )
49
54
  mdef = ManDef(mdef.info, mdef.mps.update_defaults(man), mdef.eds)
50
- corr = mdef.create(itrans).add_lines()
55
+ corr = mdef.create().add_lines()
51
56
  return Complete(
52
- self.id, mdef, self.flown, self.direction,
53
- man, tp, corr, corr.create_template(itrans, self.flown)
57
+ self.id,
58
+ mdef,
59
+ self.flown,
60
+ self.direction,
61
+ man,
62
+ tp,
63
+ corr,
64
+ corr.create_template(itrans, self.flown),
54
65
  )
55
66
 
56
67
  @classmethod
57
- def from_dict(Cls, data:dict) -> Basic:
68
+ def from_dict(Cls, data: dict) -> Basic:
58
69
  return Basic(
59
70
  -1,
60
71
  ManDef.from_dict(data["mdef"]),
61
72
  State.from_dict(data["flown"]),
62
- data['direction']
73
+ data["direction"],
63
74
  )
64
75
 
65
76
  def create_itrans(self) -> g.Transformation:
66
- return g.Transformation(
67
- self.flown[0].pos,
68
- self.mdef.info.start.initial_rotation(self.direction)
77
+ return g.Transformation(
78
+ self.flown[0].pos, self.mdef.info.start.initial_rotation(self.direction)
69
79
  )
70
80
 
71
81
  @staticmethod
72
82
  def from_fcj(file: str, mid: int):
73
- with open(file, 'r') as f:
83
+ with open(file, "r") as f:
74
84
  data = load(f)
75
85
  flight = Flight.from_fc_json(data)
76
86
  box = Origin.from_fcjson_parmameters(data["parameters"])
@@ -78,23 +88,28 @@ class Basic(Analysis):
78
88
  sdef = SchedDef.load(data["parameters"]["schedule"][1])
79
89
 
80
90
  state = State.from_flight(flight, box).splitter_labels(
81
- data["mans"],
82
- [m.info.short_name for m in sdef]
91
+ data["mans"], [m.info.short_name for m in sdef]
83
92
  )
84
- mdef= sdef[mid]
93
+ mdef = sdef[mid]
85
94
  return Basic(mid, mdef, state.get_manoeuvre(mdef.uid))
86
95
 
87
96
  def run(self) -> list[Alignment]:
88
97
  itrans = self.create_itrans()
89
98
  mopt = ManOption([self.mdef]) if isinstance(self.mdef, ManDef) else self.mdef
90
99
 
91
- als = []
100
+ als = []
92
101
  for mdef in mopt:
93
- man = mdef.create(itrans).add_lines()
94
- als.append(Alignment(
95
- self.id, mdef, self.flown, self.direction,
96
- man, man.create_template(itrans)
97
- ))
102
+ man = mdef.create().add_lines()
103
+ als.append(
104
+ Alignment(
105
+ self.id,
106
+ mdef,
107
+ self.flown,
108
+ self.direction,
109
+ man,
110
+ man.create_template(itrans),
111
+ )
112
+ )
98
113
  return als
99
114
 
100
115
  def to_mindict(self, sinfo: ScheduleInfo):
@@ -102,30 +117,32 @@ class Basic(Analysis):
102
117
  **super().to_mindict(sinfo),
103
118
  name=self.name,
104
119
  id=self.id,
105
- data=self.flown._create_json_data().to_dict('records'),
120
+ data=self.flown._create_json_data().to_dict("records"),
106
121
  direction=self.direction,
107
- )
122
+ )
108
123
  return data
109
124
 
110
125
  @staticmethod
111
126
  def from_mindict(data: dict):
112
127
  info = ScheduleInfo.from_str(data["parameters"]["schedule"][1])
113
-
128
+
114
129
  st = State.from_flight(
115
- Flight.from_fc_json(data),
116
- Origin.from_fcjson_parmameters(data["parameters"])
130
+ Flight.from_fc_json(data),
131
+ Origin.from_fcjson_parmameters(data["parameters"]),
117
132
  )
118
-
119
- mdef = SchedDef.load(info)[data['id']]
120
-
121
- if 'els' in data:
122
- df = pd.DataFrame(data['els'])
123
- df.columns = ['name', 'start', 'stop', 'length']
124
- st = st.splitter_labels(df.to_dict('records'), target_col='element').label(manoeuvre=data['name'])
125
133
 
126
- return Basic(data['id'], mdef, st, data['direction'])
127
-
134
+ mdef = SchedDef.load(info)[data["id"]]
135
+
136
+ if "els" in data:
137
+ df = pd.DataFrame(data["els"])
138
+ df.columns = ["name", "start", "stop", "length"]
139
+ st = st.splitter_labels(df.to_dict("records"), target_col="element").label(
140
+ manoeuvre=data["name"]
141
+ )
142
+
143
+ return Basic(data["id"], mdef, st, data["direction"])
144
+
128
145
 
129
146
  from .alignment import Alignment # noqa: E402
130
147
  from .complete import Complete # noqa: E402
131
- from .scored import Scored # noqa: E402
148
+ from .scored import Scored # noqa: E402