flightanalysis 0.2.16__tar.gz → 0.2.17__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 (158) hide show
  1. {flightanalysis-0.2.16/flightanalysis.egg-info → flightanalysis-0.2.17}/PKG-INFO +7 -5
  2. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/examples/schedule_construction/create_all.py +3 -3
  3. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/examples/schedule_construction/f3a_a25.py +10 -2
  4. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/examples/schedule_construction/f3a_f25.py +4 -2
  5. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/examples/schedule_construction/f3a_p23.py +13 -6
  6. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/examples/schedule_construction/f3a_p25.py +7 -6
  7. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/examples/schedule_construction/f3auk_clubman.py +11 -6
  8. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/examples/schedule_construction/f3auk_intermediate.py +9 -7
  9. flightanalysis-0.2.17/examples/schedule_construction/make_manoeuvre.py +48 -0
  10. flightanalysis-0.2.17/flightanalysis/__init__.py +21 -0
  11. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis/analysis/el_analysis.py +7 -3
  12. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis/analysis/manoeuvre_analysis/alignment.py +1 -1
  13. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis/analysis/manoeuvre_analysis/complete.py +102 -14
  14. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis/analysis/sch_analysis.py +11 -17
  15. flightanalysis-0.2.17/flightanalysis/base/utils.py +13 -0
  16. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis/data/IMAC_Unlimited2024_schedule.json +124 -124
  17. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis/data/f3a_a25_schedule.json +1039 -386
  18. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis/data/f3a_f25_schedule.json +1514 -550
  19. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis/data/f3a_p23_schedule.json +1390 -512
  20. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis/data/f3a_p25_schedule.json +1591 -578
  21. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis/data/f3auk_clubman_schedule.json +689 -272
  22. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis/data/f3auk_inter_schedule.json +796 -242
  23. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis/definition/builders/elbuilders.py +112 -102
  24. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis/definition/builders/manbuilder.py +20 -17
  25. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis/definition/collectors.py +7 -3
  26. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis/definition/eldef.py +37 -42
  27. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis/definition/mandef.py +6 -3
  28. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis/definition/manparm.py +12 -3
  29. flightanalysis-0.2.17/flightanalysis/definition/operations/__init__.py +1 -0
  30. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis/definition/operations/funopp.py +7 -23
  31. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis/definition/operations/itemopp.py +8 -18
  32. flightanalysis-0.2.17/flightanalysis/definition/operations/mathopp.py +55 -0
  33. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis/definition/operations/operation.py +17 -35
  34. flightanalysis-0.2.17/flightanalysis/definition/operations/sumopp.py +31 -0
  35. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis/elements/autorotation.py +6 -5
  36. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis/elements/element.py +16 -34
  37. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis/elements/line.py +7 -28
  38. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis/elements/loop.py +16 -44
  39. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis/elements/nose_drop.py +8 -29
  40. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis/elements/pitch_break.py +8 -25
  41. flightanalysis-0.2.17/flightanalysis/elements/recovery.py +35 -0
  42. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis/elements/stall_turn.py +7 -22
  43. flightanalysis-0.2.17/flightanalysis/fcjson.py +158 -0
  44. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis/manoeuvre.py +2 -17
  45. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis/scoring/downgrade.py +10 -6
  46. flightanalysis-0.2.17/flightanalysis/scoring/f3a_downgrades.py +48 -0
  47. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis/scoring/measurement.py +58 -15
  48. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis/scoring/results.py +7 -1
  49. flightanalysis-0.2.17/flightanalysis/scripts/collect_scores.py +110 -0
  50. flightanalysis-0.2.17/flightanalysis/scripts/plot_scores.py +22 -0
  51. flightanalysis-0.2.17/flightanalysis/version.py +18 -0
  52. {flightanalysis-0.2.16 → flightanalysis-0.2.17/flightanalysis.egg-info}/PKG-INFO +7 -5
  53. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis.egg-info/SOURCES.txt +9 -2
  54. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis.egg-info/entry_points.txt +0 -1
  55. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis.egg-info/requires.txt +6 -4
  56. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/pyproject.toml +0 -1
  57. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/requirements-dev.txt +4 -3
  58. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/requirements.txt +3 -2
  59. flightanalysis-0.2.17/tests/data/old_json.json +180201 -0
  60. flightanalysis-0.2.17/tests/data/scored_fcj.json +1 -0
  61. flightanalysis-0.2.17/tests/data/unscored_fcj.json +248780 -0
  62. flightanalysis-0.2.17/tests/test_fcjscore.py +95 -0
  63. flightanalysis-0.2.17/tests/test_schedule/test_definition/test_definition_eldef.py +26 -0
  64. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/tests/test_schedule/test_definition/test_definition_manparm.py +6 -7
  65. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/tests/test_schedule/test_definition/test_definition_mpopp.py +3 -3
  66. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/tests/test_schedule/test_definition/test_schedule_definition.py +11 -11
  67. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/tests/test_schedule/test_measurement.py +40 -34
  68. flightanalysis-0.2.16/examples/schedule_construction/make_manoeuvre.py +0 -31
  69. flightanalysis-0.2.16/flightanalysis/__init__.py +0 -10
  70. flightanalysis-0.2.16/flightanalysis/definition/builders/lines.py +0 -0
  71. flightanalysis-0.2.16/flightanalysis/definition/operations/__init__.py +0 -1
  72. flightanalysis-0.2.16/flightanalysis/definition/operations/mathopp.py +0 -72
  73. flightanalysis-0.2.16/flightanalysis/elements/recovery.py +0 -53
  74. flightanalysis-0.2.16/flightanalysis/scripts/batch_analyse.py +0 -56
  75. flightanalysis-0.2.16/flightanalysis/scripts/collect_scores.py +0 -53
  76. flightanalysis-0.2.16/flightanalysis/scripts/plot_scores.py +0 -46
  77. flightanalysis-0.2.16/tests/test_schedule/test_definition/test_definition_eldef.py +0 -46
  78. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/.github/workflows/publish_pypi.yml +0 -0
  79. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/.gitignore +0 -0
  80. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/LICENSE +0 -0
  81. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/MANIFEST.in +0 -0
  82. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/README.md +0 -0
  83. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/examples/__init__.py +0 -0
  84. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/examples/data/__init__.py +0 -0
  85. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/examples/data/manual_F3A_F23_22_04_28_00000231.json +0 -0
  86. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/examples/data/manual_F3A_P23_22_05_31_00000350.json +0 -0
  87. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/examples/data/manual_F3A_P23_23_08_11_00000094.json +0 -0
  88. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/examples/schedule_construction/AMA_Intermediate2024.py +0 -0
  89. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/examples/schedule_construction/__init__.py +0 -0
  90. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/examples/schedule_construction/imac_sport2024.py +0 -0
  91. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/examples/schedule_construction/imac_unlim2024.py +0 -0
  92. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/examples/schedule_construction/nsrca_inter2024.py +0 -0
  93. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/examples/scoring/__init__.py +0 -0
  94. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/examples/scoring/f3a_criteria_maker.py +0 -0
  95. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/examples/scoring/judging.py +0 -0
  96. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/examples/scoring/manoeuvres/__init__.py +0 -0
  97. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/examples/scoring/manoeuvres/inter_analysis.py +0 -0
  98. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/examples/scoring/manoeuvres/intra_analysis.py +0 -0
  99. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/examples/scoring/manoeuvres/mans/__init__.py +0 -0
  100. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/examples/scoring/manoeuvres/mans/extract_mans.py +0 -0
  101. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/examples/scoring/manoeuvres/mans/tHat.json +0 -0
  102. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/examples/scoring/manoeuvres/positioning_analysis.py +0 -0
  103. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/examples/scoring/temp.py +0 -0
  104. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis/analysis/__init__.py +0 -0
  105. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis/analysis/manoeuvre_analysis/__init__.py +0 -0
  106. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis/analysis/manoeuvre_analysis/analysis.py +0 -0
  107. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis/analysis/manoeuvre_analysis/basic.py +0 -0
  108. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis/analysis/manoeuvre_analysis/scored.py +0 -0
  109. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis/data/__init__.py +0 -0
  110. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis/definition/__init__.py +0 -0
  111. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis/definition/builders/__init__.py +0 -0
  112. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis/definition/maninfo.py +0 -0
  113. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis/definition/manoption.py +0 -0
  114. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis/definition/scheddef.py +0 -0
  115. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis/definition/scheduleinfo.py +0 -0
  116. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis/elements/__init__.py +0 -0
  117. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis/schedule.py +0 -0
  118. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis/scoring/__init__.py +0 -0
  119. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis/scoring/criteria/__init__.py +0 -0
  120. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis/scoring/criteria/criteria.py +0 -0
  121. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis/scoring/criteria/exponential.py +0 -0
  122. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis/scoring/criteria/f3a_criteria.py +0 -0
  123. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis/scoring/criteria/inter/__init__.py +0 -0
  124. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis/scoring/criteria/inter/combination.py +0 -0
  125. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis/scoring/criteria/inter/comparison.py +0 -0
  126. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis/scoring/criteria/intra/__init__.py +0 -0
  127. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis/scoring/criteria/intra/bounded.py +0 -0
  128. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis/scoring/criteria/intra/continuous.py +0 -0
  129. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis/scoring/criteria/intra/single.py +0 -0
  130. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis.egg-info/dependency_links.txt +0 -0
  131. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis.egg-info/top_level.txt +0 -0
  132. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/setup.cfg +0 -0
  133. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/tests/EmailedBox.f3a +0 -0
  134. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/tests/__init__.py +0 -0
  135. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/tests/conftest.py +0 -0
  136. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/tests/data/manual_F3A_P23.json +0 -0
  137. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/tests/data/p23.BIN +0 -0
  138. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/tests/data/p23_box.f3a +0 -0
  139. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/tests/data/p23_fc.json +0 -0
  140. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/tests/data/p23_flight.json +0 -0
  141. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/tests/test_criiteria.py +0 -0
  142. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/tests/test_data.py +0 -0
  143. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/tests/test_schedule/__init__.py +0 -0
  144. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/tests/test_schedule/test_definition/__init__.py +0 -0
  145. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/tests/test_schedule/test_definition/test_schedule_definition_maninfo.py +0 -0
  146. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/tests/test_schedule/test_element/__init__.py +0 -0
  147. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/tests/test_schedule/test_element/loop_analysis.json +0 -0
  148. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/tests/test_schedule/test_element/p23_th_e0.csv +0 -0
  149. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/tests/test_schedule/test_element/p23_th_e0.json +0 -0
  150. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/tests/test_schedule/test_element/p23_th_e0_template.csv +0 -0
  151. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/tests/test_schedule/test_element/test_schedule_element.py +0 -0
  152. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/tests/test_schedule/test_element/test_schedule_element_line.py +0 -0
  153. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/tests/test_schedule/test_element/test_schedule_element_loop.py +0 -0
  154. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/tests/test_schedule/test_element/test_schedule_element_nose_drop.py +0 -0
  155. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/tests/test_schedule/test_element/test_schedule_element_pitch_break.py +0 -0
  156. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/tests/test_schedule/test_element/test_schedule_element_recovery.py +0 -0
  157. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/tests/test_schedule/test_element/test_schedule_element_stallturn.py +0 -0
  158. {flightanalysis-0.2.16 → flightanalysis-0.2.17}/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.16
3
+ Version: 0.2.17
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,8 +15,9 @@ 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.7
19
- Requires-Dist: flightdata>=0.2.15
18
+ Requires-Dist: pfc-geometry>=0.2.8
19
+ Requires-Dist: flightdata>=0.2.16
20
+ Requires-Dist: GitPython
20
21
  Provides-Extra: dev
21
22
  Requires-Dist: numpy; extra == "dev"
22
23
  Requires-Dist: pandas; extra == "dev"
@@ -25,10 +26,11 @@ Requires-Dist: fastdtw; extra == "dev"
25
26
  Requires-Dist: simplejson; extra == "dev"
26
27
  Requires-Dist: loguru; extra == "dev"
27
28
  Requires-Dist: joblib; extra == "dev"
28
- Requires-Dist: pfc-geometry>=0.2.7; extra == "dev"
29
- Requires-Dist: flightdata>=0.2.15; extra == "dev"
29
+ Requires-Dist: pfc-geometry>=0.2.8; extra == "dev"
30
+ Requires-Dist: flightdata>=0.2.16; extra == "dev"
30
31
  Requires-Dist: ardupilot_log_reader>=0.3.3; extra == "dev"
31
32
  Requires-Dist: pymavlink; extra == "dev"
33
+ Requires-Dist: GitPython; extra == "dev"
32
34
 
33
35
  # FlightAnalysis
34
36
 
@@ -2,16 +2,16 @@ from f3a_p23 import p23_def
2
2
  from f3a_a25 import a25_def
3
3
  from f3a_p25 import p25_def
4
4
  from f3a_f25 import f25_def
5
- from imac_unlim2024 import sdef as imac_unl2024_def
5
+ #from imac_unlim2024 import sdef as imac_unl2024_def
6
6
  from f3auk_clubman import clubman_def as f3auk_club_def
7
- from f3auk_Intermediate import intermediate_def as f3auk_int_def
7
+ from f3auk_intermediate import intermediate_def as f3auk_int_def
8
8
 
9
9
  sdefs = {
10
10
  'f3a_p23_schedule': p23_def,
11
11
  'f3a_a25_schedule': a25_def,
12
12
  'f3a_p25_schedule': p25_def,
13
13
  'f3a_f25_schedule': f25_def,
14
- 'IMAC_Unlimited2024_schedule': imac_unl2024_def,
14
+ #'IMAC_Unlimited2024_schedule': imac_unl2024_def,
15
15
  'f3auk_clubman_schedule': f3auk_club_def,
16
16
  'f3auk_inter_schedule': f3auk_int_def
17
17
  }
@@ -1,9 +1,13 @@
1
1
  '''Author Vince Beesley 18/11/2023'''
2
2
 
3
- from flightanalysis import *
3
+ from flightanalysis import (
4
+ SchedDef, ManInfo, BoxLocation, Position, Orientation,
5
+ Height, Direction, MBTags, f3amb, centred, r, c45
6
+ )
7
+ from flightanalysis.scoring.f3a_downgrades import DGGrps
8
+
4
9
  import numpy as np
5
10
 
6
- c45 = np.cos(np.radians(45))
7
11
 
8
12
  a25_def = SchedDef([
9
13
  f3amb.create(ManInfo
@@ -233,6 +237,10 @@ a25_def = SchedDef([
233
237
  ]
234
238
  )
235
239
 
240
+ a25_def.stall.eds.e_1.dgs = DGGrps.st_line_decel
241
+ a25_def.stall.eds.e_3_pad1.dgs = DGGrps.st_line_accel
242
+ a25_def.iSpin.eds.e_1.dgs = DGGrps.sp_line_accel
243
+
236
244
 
237
245
  if __name__ == "__main__":
238
246
 
@@ -3,7 +3,7 @@ from flightanalysis import (
3
3
  Height, Direction, MBTags, f3amb, centred, r, ManParm,
4
4
  ManOption, Combination, c45
5
5
  )
6
-
6
+ from flightanalysis.scoring.f3a_downgrades import DGGrps
7
7
  import numpy as np
8
8
 
9
9
 
@@ -253,7 +253,9 @@ f25_def = SchedDef([
253
253
  )
254
254
  ])
255
255
 
256
-
256
+ f25_def.spin.eds.e_1_pad1.dgs = DGGrps.sp_line_accel
257
+ f25_def.stall.eds.e_3_pad2.dgs = DGGrps.st_line_decel
258
+ f25_def.stall.eds.e_5_pad1.dgs = DGGrps.st_line_accel
257
259
 
258
260
  if __name__ == "__main__":
259
261
 
@@ -1,12 +1,12 @@
1
1
  """This file defines a P23 sequence using the ManDef Classes and helper functions."""
2
- from flightanalysis.definition import *
3
- from flightanalysis.elements import *
4
- from flightanalysis.scoring import *
2
+ from flightanalysis import (
3
+ SchedDef, ManInfo, BoxLocation, Position, Orientation,
4
+ Height, Direction, MBTags, f3amb, centred, r, ManParm,
5
+ Combination, c45
6
+ )
7
+ from flightanalysis.scoring.f3a_downgrades import DGGrps
5
8
  import numpy as np
6
9
 
7
- c45 = np.cos(np.radians(45))
8
-
9
-
10
10
 
11
11
  p23_def = SchedDef([
12
12
  f3amb.create(ManInfo(
@@ -222,6 +222,13 @@ p23_def = SchedDef([
222
222
  ))
223
223
  ])
224
224
 
225
+
226
+ p23_def.iSp.eds.e_1.dgs = DGGrps.sp_line_accel
227
+ p23_def.M.eds.e_1_pad2.dgs = DGGrps.st_line_decel
228
+ p23_def.M.eds.e_3.dgs = DGGrps.st_line_accel
229
+ p23_def.M.eds.e_5.dgs = DGGrps.st_line_decel
230
+ p23_def.M.eds.e_7_pad1.dgs = DGGrps.st_line_accel
231
+
225
232
  if __name__ == "__main__":
226
233
 
227
234
  # p23_def.plot().show()
@@ -3,12 +3,9 @@ from flightanalysis import (
3
3
  Height, Direction, MBTags, f3amb, centred, r, ManParm,
4
4
  ManOption, Combination, c45
5
5
  )
6
-
6
+ from flightanalysis.scoring.f3a_downgrades import DGGrps
7
7
  import numpy as np
8
8
 
9
-
10
-
11
-
12
9
  p25_def = SchedDef([
13
10
  f3amb.create(ManInfo(
14
11
  "Triangle", "trgle", k=3, position=Position.CENTRE,
@@ -222,8 +219,8 @@ p25_def = SchedDef([
222
219
  f3amb.loop(r(3/8)),
223
220
  f3amb.loop(r(1/8), rolls="rke_opt[0]"),
224
221
  MBTags.CENTRE,
225
- f3amb.loop("rke_opt[1]", ke=True),
226
- f3amb.loop("rke_opt[2]", ke=True, rolls="rke_opt[3]"),
222
+ f3amb.loop("rke_opt[1]", ke=np.pi/2),
223
+ f3amb.loop("rke_opt[2]", ke=np.pi/2, rolls="rke_opt[3]"),
227
224
  MBTags.CENTRE
228
225
  ],
229
226
  rke_opt=ManParm("rke_opt",
@@ -233,6 +230,10 @@ p25_def = SchedDef([
233
230
  ])), 0)),
234
231
  ])
235
232
 
233
+ p25_def.stall.eds.e_1.dgs = DGGrps.st_line_decel
234
+ p25_def.stall.eds.e_3_pad1.dgs = DGGrps.st_line_accel
235
+ p25_def.iSpin.eds.e_1_pad1.dgs = DGGrps.sp_line_accel
236
+
236
237
 
237
238
  if __name__ == "__main__":
238
239
 
@@ -2,7 +2,12 @@
2
2
  UKF3A Clubman template
3
3
  Author Vince Beesley
4
4
  '''
5
- from flightanalysis import *
5
+ from flightanalysis import (
6
+ SchedDef, ManInfo, BoxLocation, Position, Orientation,
7
+ Height, Direction, MBTags, f3amb, centred, r, ManParm,
8
+ ManOption, Combination, c45
9
+ )
10
+ from flightanalysis.scoring.f3a_downgrades import DGGrps
6
11
  import numpy as np
7
12
 
8
13
  clubman_def = SchedDef([
@@ -106,11 +111,9 @@ clubman_def = SchedDef([
106
111
  ),
107
112
  [
108
113
  f3amb.loop(np.pi/2),
109
- f3amb.line(length=150),
110
- f3amb.line(speed = 3, length = 10),
111
- f3amb.line(speed = 1, length = 5),
114
+ f3amb.line(),
112
115
  f3amb.stallturn(),
113
- f3amb.line(length=165),
116
+ f3amb.line(),
114
117
  f3amb.loop(np.pi/2)
115
118
  ]),
116
119
 
@@ -196,7 +199,9 @@ clubman_def = SchedDef([
196
199
  ]
197
200
  )
198
201
 
199
-
202
+ clubman_def.stall.eds.e_1.dgs = DGGrps.st_line_decel
203
+ clubman_def.stall.eds.e_3.dgs = DGGrps.st_line_accel
204
+ clubman_def.spin.eds.e_1.dgs = DGGrps.sp_line_decel
200
205
 
201
206
  if __name__ == "__main__":
202
207
 
@@ -2,13 +2,15 @@
2
2
  UKF3A Intermediate Template
3
3
  Author Vince Beesley
4
4
  '''
5
- from flightanalysis import *
5
+ from flightanalysis import (
6
+ SchedDef, ManInfo, BoxLocation, Position, Orientation,
7
+ Height, Direction, MBTags, f3amb, centred, r, ManParm,
8
+ ManOption, Combination, c45
9
+ )
10
+ from flightanalysis.scoring.f3a_downgrades import DGGrps
6
11
  import numpy as np
7
12
 
8
13
 
9
-
10
- c45 = np.cos(np.radians(45))
11
-
12
14
  intermediate_def = SchedDef([
13
15
 
14
16
  f3amb.create(ManInfo
@@ -75,12 +77,12 @@ intermediate_def = SchedDef([
75
77
  end=BoxLocation(Height.TOP)
76
78
  ),
77
79
  [
78
- f3amb.loop(-np.pi/2),
79
- f3amb.line(roll=np.pi),
80
+ f3amb.loop(-np.pi/2),
81
+ f3amb.roll(np.pi),
80
82
  f3amb.loop(np.pi/2),
81
83
  centred(f3amb.line()),
82
84
  f3amb.loop(np.pi/2),
83
- f3amb.line(roll=np.pi),
85
+ f3amb.roll(np.pi),
84
86
  f3amb.loop(-np.pi/2),
85
87
  ], line_length = 100
86
88
  ),
@@ -0,0 +1,48 @@
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
+
12
+ mdef: ManDef = f3amb.create(ManInfo(
13
+ "Figure S", "figS", k=5, position=Position.CENTRE,
14
+ start=BoxLocation(Height.BTM, Direction.UPWIND, Orientation.UPRIGHT),
15
+ end=BoxLocation(Height.TOP)
16
+ ),[
17
+ MBTags.CENTRE,
18
+ f3amb.loop(r(3/8)),
19
+ f3amb.loop(r(1/8), rolls="rke_opt[0]"),
20
+ MBTags.CENTRE,
21
+ f3amb.loop("rke_opt[1]", ke=np.pi/2),
22
+ f3amb.loop("rke_opt[2]", ke=np.pi/2, rolls="rke_opt[3]"),
23
+ MBTags.CENTRE
24
+ ],
25
+ rke_opt=ManParm("rke_opt",
26
+ Combination(desired=r([
27
+ [1/4, 3/8, 1/8, 1/4],
28
+ [-1/4, -3/8, -1/8, -1/4]
29
+ ])), 0))
30
+
31
+
32
+ data = mdef.to_dict()
33
+ print(dumps(data, indent=2, cls=NumpyEncoder))
34
+ mdef = ManDef.from_dict(data)
35
+
36
+ it = mdef.info.initial_transform(170, 1)
37
+
38
+ man = mdef.create(it)
39
+
40
+ tp = man.create_template(it)
41
+
42
+ fig = plot_regions(tp, 'element')
43
+ fig = plotsec(tp, fig=fig, nmodels=10, scale=2)
44
+ #fig.add_traces(boxtrace())
45
+ fig.show()
46
+
47
+ fig = go.Figure(data=axis_rate_trace(tp))
48
+ fig.show()
@@ -0,0 +1,21 @@
1
+ from .version import __version__ # noqa: F401
2
+ from .elements import * # noqa: F403
3
+ from .manoeuvre import Manoeuvre # noqa: F401
4
+ from .schedule import Schedule # noqa: F401
5
+ from .definition import * # noqa: F403
6
+ from .scoring import * # noqa: F403
7
+ from .analysis import ScheduleAnalysis, ElementAnalysis # noqa: F401
8
+ from .analysis import manoeuvre_analysis as ma # noqa: F401
9
+ import sys
10
+ from loguru import logger
11
+
12
+ logger.disable('flightanalysis')
13
+
14
+ def enable_logging(level: str = 'INFO'):
15
+ logger.enable('flightanalysis')
16
+ logger.remove()
17
+ logger.add(
18
+ sys.stderr,
19
+ level=level
20
+ )
21
+
@@ -1,8 +1,8 @@
1
-
1
+ 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
-
5
+ import numpy as np
6
6
  from dataclasses import dataclass
7
7
  import geometry as g
8
8
 
@@ -33,4 +33,8 @@ class ElementAnalysis:
33
33
  State.from_dict(data['fl']),
34
34
  State.from_dict(data['tp']),
35
35
  g.Transformation.from_dict(data['ref_frame'])
36
- )
36
+ )
37
+
38
+ def intra_score(self):
39
+ return self.edef.dgs.apply(self.el, self.fl, self.tp)
40
+
@@ -14,7 +14,7 @@ class Alignment(Basic):
14
14
 
15
15
  def __getattr__(self, name) -> ElementAnalysis:
16
16
  return ElementAnalysis(
17
- self.mdef.data[name],
17
+ self.mdef.eds.data[name],
18
18
  self.mdef.mps,
19
19
  self.manoeuvre.elements.data[name],
20
20
  self.flown.get_element(name),
@@ -2,14 +2,19 @@ from __future__ import annotations
2
2
  from dataclasses import dataclass
3
3
  from ..el_analysis import ElementAnalysis
4
4
  from flightdata import State
5
- from flightanalysis.definition import ManDef, ScheduleInfo
5
+ from flightanalysis.definition import ManDef, ElDef
6
6
  from flightanalysis.manoeuvre import Manoeuvre
7
- from flightanalysis.scoring import Results, ManoeuvreResults, Measurement
7
+ from flightanalysis.scoring import Results, ManoeuvreResults, Measurement, ElementsResults
8
8
  from flightanalysis.scoring.criteria.f3a_criteria import F3A
9
+ from flightanalysis.scoring.f3a_downgrades import DGGrps
9
10
  from flightanalysis.definition.maninfo import Position
11
+ from flightanalysis.elements import Line, Element
12
+ import geometry as g
10
13
  import numpy as np
14
+ from .basic import Basic
11
15
  from .alignment import Alignment
12
16
  from loguru import logger
17
+ from typing import Union
13
18
 
14
19
 
15
20
  @dataclass
@@ -46,22 +51,33 @@ class Complete(Alignment):
46
51
  return list(self.mdef.eds.data.keys())
47
52
 
48
53
  def __iter__(self):
49
- for elname in self.manoeuvre.all_elements().data.keys():
50
- yield self.get_ea(self.mdef.eds[elname])
54
+ for edn in ['entry_line'] + list(self.mdef.eds.data.keys()):
55
+ yield self.get_ea(edn)
51
56
 
52
57
  def __getitem__(self, i):
53
- return self.get_ea(['entry_line'] + self.mdef.eds[i] + ['exit_line'])
58
+ return self.get_ea('entry_line' if i == 0 else self.mdef.eds[i+1].name)
54
59
 
55
60
  def __getattr__(self, name):
56
- if name in self.mdef.eds.data.keys():
57
- return self.get_ea(self.mdef.eds[name])
61
+ if name in self.mdef.eds.data.keys() or name == 'entry_line':
62
+ return self.get_ea(name)
58
63
  raise AttributeError(f'Attribute {name} not found in {self.__class__.__name__}')
59
64
 
60
- def get_ea(self, edef):
61
- el = getattr(self.manoeuvre.all_elements(), edef.name)
65
+ def get_edef(self, name):
66
+ if name == 'entry_line':
67
+ el = getattr(self.manoeuvre.all_elements(), name)
68
+ return ElDef('entry_line', Line,
69
+ dict(speed=el.speed,length=el.length,roll=0),
70
+ DGGrps.exits
71
+ )
72
+ else:
73
+ return self.mdef.eds[name]
74
+
75
+ def get_ea(self, name):
76
+ el = getattr(self.manoeuvre.all_elements(), name)
62
77
  st = el.get_data(self.flown)
63
78
  tp = el.get_data(self.template).relocate(st.pos[0])
64
- return ElementAnalysis(edef, self.mdef.mps, el, st, tp, el.ref_frame(tp))
79
+
80
+ return ElementAnalysis(self.get_edef(name), self.mdef.mps, el, st, tp, el.ref_frame(tp))
65
81
 
66
82
 
67
83
  def update_templates(self):
@@ -73,14 +89,86 @@ class Complete(Alignment):
73
89
  return Complete(
74
90
  self.id, mdef, self.flown, self.direction,
75
91
  manoeuvre, template, correction,
76
- correction.create_template(template[0])
92
+ correction.create_template(template[0], self.flown)
77
93
  )
78
94
  else:
79
95
  return self
80
96
 
97
+ def get_score(self, eln: str, itrans: g.Transformation, fl: State) -> tuple[Results, g.Transformation]:
98
+ ed: ElDef = self.get_edef(eln)
99
+ el: Element = self.manoeuvre.all_elements()[eln].match_intention(itrans, fl)
100
+ tp = el.create_template(State.from_transform(itrans), fl.time)
101
+
102
+ return ed.dgs.apply(el, fl, tp, False), tp[-1].att
103
+
104
+ def optimise_split(self, itrans: g.Transformation, eln1: str, eln2: str, fl: State) -> int:
105
+
106
+ def score_split(steps: int) -> float:
107
+ new_fl = fl.shift_label(steps, 2, manoeuvre=self.name, element=eln1)
108
+ res1, new_iatt = self.get_score(eln1, itrans, new_fl.get_element(eln1))
109
+
110
+ el2fl = new_fl.get_element(eln2)
111
+ res2 = self.get_score(
112
+ eln2,
113
+ g.Transformation(new_iatt, el2fl[0].pos ),
114
+ el2fl
115
+ )[0]
116
+ logger.debug(f'split {steps} {res1.total + res2.total:.2f}')
117
+
118
+ return res1.total + res2.total
119
+
120
+ dgs = {0: score_split(0)}
121
+
122
+ steps=int(len(fl.get_element(eln1)) > len(fl.get_element(eln2))) * 2 - 1
123
+
124
+ new_dg = score_split(steps)
125
+ if new_dg > dgs[0]:
126
+ steps=-steps
127
+ else:
128
+ steps+=np.sign(steps)
129
+ dgs[steps] = new_dg
130
+
131
+ while True:
132
+ if (steps>0 and len(fl.get_element(eln2))<=steps+3) or (steps<0 and len(fl.get_element(eln1)) <=-steps+3):
133
+ break
134
+ new_dg = score_split(steps)
135
+ if new_dg < list(dgs.values())[-1]:
136
+ dgs[steps] = new_dg
137
+ steps+=np.sign(steps)
138
+ else:
139
+ break
140
+ min_dg_step = np.argmin(np.array(list(dgs.values())))
141
+ out_steps = list(dgs.keys())[min_dg_step]
142
+ return out_steps
143
+
81
144
  def optimise_alignment(self):
82
- self.flown = self.manoeuvre.optimise_alignment(self.template, self.flown)
83
- return self.update_templates()
145
+ fl = self.flown.copy()
146
+ elns = ['entry_line'] + list(self.mdef.eds.data.keys())
147
+
148
+ padjusted = set(elns)
149
+ count=0
150
+ while len(padjusted) > 0 and count < 2:
151
+ adjusted = set()
152
+ for eln1, eln2 in zip(elns[:-1], elns[1:]):
153
+ if (eln1 in padjusted) or (eln2 in padjusted):
154
+ itrans = g.Transformation(
155
+ self.template.get_element(eln1)[0].att,
156
+ fl.get_element(eln1)[0].pos
157
+ )
158
+ steps = self.optimise_split(itrans, eln1, eln2, fl)
159
+
160
+ if not steps == 0:
161
+ logger.debug(f'Adjusting split between {eln1} and {eln2} by {steps} steps')
162
+
163
+ fl = fl.shift_label(steps, 2, manoeuvre=self.name, element=eln1)
164
+
165
+ adjusted.update([eln1, eln2])
166
+
167
+ padjusted = adjusted
168
+ count+=1
169
+ logger.debug(f'pass {count}, {len(padjusted)} elements adjusted:\n{padjusted}')
170
+
171
+ return Basic(self.id, self.mdef, fl, self.direction).proceed()
84
172
 
85
173
  def side_box(self):
86
174
  return F3A.intra.box(
@@ -130,7 +218,7 @@ class Complete(Alignment):
130
218
  )
131
219
 
132
220
  def intra(self):
133
- return self.manoeuvre.analyse(self.flown, self.template)
221
+ return ElementsResults([ea.intra_score() for ea in self])
134
222
 
135
223
  def inter(self):
136
224
  return self.mdef.mps.collect(self.manoeuvre, self.template)
@@ -3,14 +3,12 @@ from typing import Self, Union
3
3
  from json import load, dump
4
4
  from flightdata import Flight, State, Origin, Collection, NumpyEncoder
5
5
  from flightanalysis.definition import SchedDef, ScheduleInfo
6
+ from flightanalysis import __version__
6
7
  from . import manoeuvre_analysis as analysis
7
8
  from loguru import logger
8
9
  from joblib import Parallel, delayed
9
10
  import os
10
11
  import pandas as pd
11
- from importlib.metadata import version
12
- from packaging import version as pkgversion
13
- from pathlib import Path
14
12
 
15
13
  class ScheduleAnalysis(Collection):
16
14
  VType=analysis.Analysis
@@ -21,7 +19,7 @@ class ScheduleAnalysis(Collection):
21
19
  self.sinfo = sinfo
22
20
 
23
21
  @staticmethod
24
- def from_fcj(file: Union[Union[str, bytes, os.PathLike], dict], info: ScheduleInfo=None) -> ScheduleAnalysis:
22
+ def from_fcj(file: Union[str | bytes, dict], info: ScheduleInfo=None, proceed=True) -> ScheduleAnalysis:
25
23
  data = file if isinstance(file, dict) else load(open(file, 'r'))
26
24
 
27
25
  flight = Flight.from_fc_json(data)
@@ -30,12 +28,12 @@ class ScheduleAnalysis(Collection):
30
28
  info = ScheduleInfo.from_str(data["parameters"]["schedule"][1])
31
29
 
32
30
  sdef = SchedDef.load(info)
33
- box = Origin.from_fcjson_parmameters(data["parameters"])
31
+ box = Origin.from_fcjson_parameters(data["parameters"])
34
32
  state = State.from_flight(flight, box).splitter_labels(data["mans"],sdef.uids)
35
33
  direction = -state.get_manoeuvre(1)[0].direction()[0]
36
34
 
37
- if 'fcs_scores' in data:
38
- versions = [pkgversion.parse(res['fa_version']) for res in data['fcs_scores']]
35
+ if 'fcs_scores' in data and len(data['fcs_scores']) > 0:
36
+ versions = [res['fa_version'] for res in data['fcs_scores']]
39
37
  ilatest = versions.index(max(versions))
40
38
 
41
39
  mas = []
@@ -46,7 +44,10 @@ class ScheduleAnalysis(Collection):
46
44
  df = pd.DataFrame(data['fcs_scores'][ilatest]['manresults'][i+1]['els'])
47
45
  st = st.splitter_labels(df.to_dict('records'), target_col='element')
48
46
 
49
- mas.append(analysis.Basic(i, mdef, st, direction).proceed())
47
+ nma = analysis.Basic(i, mdef, st, direction)
48
+ if proceed:
49
+ nma = nma.proceed()
50
+ mas.append(nma)
50
51
 
51
52
  return ScheduleAnalysis(mas,info)
52
53
 
@@ -54,7 +55,7 @@ class ScheduleAnalysis(Collection):
54
55
  data = file if isinstance(file, dict) else load(open(file, 'r'))
55
56
 
56
57
  new_results = dict(
57
- fa_version = version('flightanalysis'),
58
+ fa_version = __version__,
58
59
  manresults = [None] + \
59
60
  [man.fcj_results() if hasattr(man, 'fcj_results') else None for man in self]
60
61
  )
@@ -70,17 +71,10 @@ class ScheduleAnalysis(Collection):
70
71
  data['fcs_scores'].append(new_results)
71
72
 
72
73
  if ofile:
73
- if ofile=='same':
74
- ofile = file
75
- dump(data, open(ofile, 'w'), cls=NumpyEncoder, indent=2)
74
+ dump(data, open(file if ofile=='same' else ofile, 'w'), cls=NumpyEncoder, indent=2)
76
75
 
77
76
  return data
78
77
 
79
- # def export_fcj_and_internals(self, file: Union[str, dict]):
80
- # data = load(open(file, 'r')) if isinstance(file, str) else file
81
- # fcj = self.append_scores_to_fcj(data)
82
-
83
-
84
78
  def run_all(self) -> Self:
85
79
  def parse_analyse_serialise(pad):
86
80
  try:
@@ -0,0 +1,13 @@
1
+
2
+
3
+
4
+
5
+ def combine_args(names: list[str], *args, **kwargs) -> dict:
6
+ """Combine the args and kwargs into a dict with the names as keys"""
7
+ _kwargs = {}
8
+ for i, n in enumerate(names):
9
+ if i < len(args):
10
+ _kwargs[n] = args[i]
11
+ if n in kwargs:
12
+ _kwargs[n] = kwargs[n]
13
+ return _kwargs