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.
- {flightanalysis-0.2.16/flightanalysis.egg-info → flightanalysis-0.2.17}/PKG-INFO +7 -5
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/examples/schedule_construction/create_all.py +3 -3
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/examples/schedule_construction/f3a_a25.py +10 -2
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/examples/schedule_construction/f3a_f25.py +4 -2
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/examples/schedule_construction/f3a_p23.py +13 -6
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/examples/schedule_construction/f3a_p25.py +7 -6
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/examples/schedule_construction/f3auk_clubman.py +11 -6
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/examples/schedule_construction/f3auk_intermediate.py +9 -7
- flightanalysis-0.2.17/examples/schedule_construction/make_manoeuvre.py +48 -0
- flightanalysis-0.2.17/flightanalysis/__init__.py +21 -0
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis/analysis/el_analysis.py +7 -3
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis/analysis/manoeuvre_analysis/alignment.py +1 -1
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis/analysis/manoeuvre_analysis/complete.py +102 -14
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis/analysis/sch_analysis.py +11 -17
- flightanalysis-0.2.17/flightanalysis/base/utils.py +13 -0
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis/data/IMAC_Unlimited2024_schedule.json +124 -124
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis/data/f3a_a25_schedule.json +1039 -386
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis/data/f3a_f25_schedule.json +1514 -550
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis/data/f3a_p23_schedule.json +1390 -512
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis/data/f3a_p25_schedule.json +1591 -578
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis/data/f3auk_clubman_schedule.json +689 -272
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis/data/f3auk_inter_schedule.json +796 -242
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis/definition/builders/elbuilders.py +112 -102
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis/definition/builders/manbuilder.py +20 -17
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis/definition/collectors.py +7 -3
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis/definition/eldef.py +37 -42
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis/definition/mandef.py +6 -3
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis/definition/manparm.py +12 -3
- flightanalysis-0.2.17/flightanalysis/definition/operations/__init__.py +1 -0
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis/definition/operations/funopp.py +7 -23
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis/definition/operations/itemopp.py +8 -18
- flightanalysis-0.2.17/flightanalysis/definition/operations/mathopp.py +55 -0
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis/definition/operations/operation.py +17 -35
- flightanalysis-0.2.17/flightanalysis/definition/operations/sumopp.py +31 -0
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis/elements/autorotation.py +6 -5
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis/elements/element.py +16 -34
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis/elements/line.py +7 -28
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis/elements/loop.py +16 -44
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis/elements/nose_drop.py +8 -29
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis/elements/pitch_break.py +8 -25
- flightanalysis-0.2.17/flightanalysis/elements/recovery.py +35 -0
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis/elements/stall_turn.py +7 -22
- flightanalysis-0.2.17/flightanalysis/fcjson.py +158 -0
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis/manoeuvre.py +2 -17
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis/scoring/downgrade.py +10 -6
- flightanalysis-0.2.17/flightanalysis/scoring/f3a_downgrades.py +48 -0
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis/scoring/measurement.py +58 -15
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis/scoring/results.py +7 -1
- flightanalysis-0.2.17/flightanalysis/scripts/collect_scores.py +110 -0
- flightanalysis-0.2.17/flightanalysis/scripts/plot_scores.py +22 -0
- flightanalysis-0.2.17/flightanalysis/version.py +18 -0
- {flightanalysis-0.2.16 → flightanalysis-0.2.17/flightanalysis.egg-info}/PKG-INFO +7 -5
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis.egg-info/SOURCES.txt +9 -2
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis.egg-info/entry_points.txt +0 -1
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis.egg-info/requires.txt +6 -4
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/pyproject.toml +0 -1
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/requirements-dev.txt +4 -3
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/requirements.txt +3 -2
- flightanalysis-0.2.17/tests/data/old_json.json +180201 -0
- flightanalysis-0.2.17/tests/data/scored_fcj.json +1 -0
- flightanalysis-0.2.17/tests/data/unscored_fcj.json +248780 -0
- flightanalysis-0.2.17/tests/test_fcjscore.py +95 -0
- flightanalysis-0.2.17/tests/test_schedule/test_definition/test_definition_eldef.py +26 -0
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/tests/test_schedule/test_definition/test_definition_manparm.py +6 -7
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/tests/test_schedule/test_definition/test_definition_mpopp.py +3 -3
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/tests/test_schedule/test_definition/test_schedule_definition.py +11 -11
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/tests/test_schedule/test_measurement.py +40 -34
- flightanalysis-0.2.16/examples/schedule_construction/make_manoeuvre.py +0 -31
- flightanalysis-0.2.16/flightanalysis/__init__.py +0 -10
- flightanalysis-0.2.16/flightanalysis/definition/builders/lines.py +0 -0
- flightanalysis-0.2.16/flightanalysis/definition/operations/__init__.py +0 -1
- flightanalysis-0.2.16/flightanalysis/definition/operations/mathopp.py +0 -72
- flightanalysis-0.2.16/flightanalysis/elements/recovery.py +0 -53
- flightanalysis-0.2.16/flightanalysis/scripts/batch_analyse.py +0 -56
- flightanalysis-0.2.16/flightanalysis/scripts/collect_scores.py +0 -53
- flightanalysis-0.2.16/flightanalysis/scripts/plot_scores.py +0 -46
- flightanalysis-0.2.16/tests/test_schedule/test_definition/test_definition_eldef.py +0 -46
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/.github/workflows/publish_pypi.yml +0 -0
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/.gitignore +0 -0
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/LICENSE +0 -0
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/MANIFEST.in +0 -0
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/README.md +0 -0
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/examples/__init__.py +0 -0
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/examples/data/__init__.py +0 -0
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/examples/data/manual_F3A_F23_22_04_28_00000231.json +0 -0
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/examples/data/manual_F3A_P23_22_05_31_00000350.json +0 -0
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/examples/data/manual_F3A_P23_23_08_11_00000094.json +0 -0
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/examples/schedule_construction/AMA_Intermediate2024.py +0 -0
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/examples/schedule_construction/__init__.py +0 -0
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/examples/schedule_construction/imac_sport2024.py +0 -0
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/examples/schedule_construction/imac_unlim2024.py +0 -0
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/examples/schedule_construction/nsrca_inter2024.py +0 -0
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/examples/scoring/__init__.py +0 -0
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/examples/scoring/f3a_criteria_maker.py +0 -0
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/examples/scoring/judging.py +0 -0
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/examples/scoring/manoeuvres/__init__.py +0 -0
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/examples/scoring/manoeuvres/inter_analysis.py +0 -0
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/examples/scoring/manoeuvres/intra_analysis.py +0 -0
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/examples/scoring/manoeuvres/mans/__init__.py +0 -0
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/examples/scoring/manoeuvres/mans/extract_mans.py +0 -0
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/examples/scoring/manoeuvres/mans/tHat.json +0 -0
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/examples/scoring/manoeuvres/positioning_analysis.py +0 -0
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/examples/scoring/temp.py +0 -0
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis/analysis/__init__.py +0 -0
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis/analysis/manoeuvre_analysis/__init__.py +0 -0
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis/analysis/manoeuvre_analysis/analysis.py +0 -0
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis/analysis/manoeuvre_analysis/basic.py +0 -0
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis/analysis/manoeuvre_analysis/scored.py +0 -0
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis/data/__init__.py +0 -0
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis/definition/__init__.py +0 -0
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis/definition/builders/__init__.py +0 -0
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis/definition/maninfo.py +0 -0
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis/definition/manoption.py +0 -0
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis/definition/scheddef.py +0 -0
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis/definition/scheduleinfo.py +0 -0
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis/elements/__init__.py +0 -0
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis/schedule.py +0 -0
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis/scoring/__init__.py +0 -0
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis/scoring/criteria/__init__.py +0 -0
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis/scoring/criteria/criteria.py +0 -0
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis/scoring/criteria/exponential.py +0 -0
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis/scoring/criteria/f3a_criteria.py +0 -0
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis/scoring/criteria/inter/__init__.py +0 -0
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis/scoring/criteria/inter/combination.py +0 -0
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis/scoring/criteria/inter/comparison.py +0 -0
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis/scoring/criteria/intra/__init__.py +0 -0
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis/scoring/criteria/intra/bounded.py +0 -0
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis/scoring/criteria/intra/continuous.py +0 -0
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis/scoring/criteria/intra/single.py +0 -0
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis.egg-info/dependency_links.txt +0 -0
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/flightanalysis.egg-info/top_level.txt +0 -0
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/setup.cfg +0 -0
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/tests/EmailedBox.f3a +0 -0
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/tests/__init__.py +0 -0
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/tests/conftest.py +0 -0
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/tests/data/manual_F3A_P23.json +0 -0
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/tests/data/p23.BIN +0 -0
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/tests/data/p23_box.f3a +0 -0
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/tests/data/p23_fc.json +0 -0
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/tests/data/p23_flight.json +0 -0
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/tests/test_criiteria.py +0 -0
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/tests/test_data.py +0 -0
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/tests/test_schedule/__init__.py +0 -0
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/tests/test_schedule/test_definition/__init__.py +0 -0
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/tests/test_schedule/test_definition/test_schedule_definition_maninfo.py +0 -0
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/tests/test_schedule/test_element/__init__.py +0 -0
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/tests/test_schedule/test_element/loop_analysis.json +0 -0
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/tests/test_schedule/test_element/p23_th_e0.csv +0 -0
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/tests/test_schedule/test_element/p23_th_e0.json +0 -0
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/tests/test_schedule/test_element/p23_th_e0_template.csv +0 -0
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/tests/test_schedule/test_element/test_schedule_element.py +0 -0
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/tests/test_schedule/test_element/test_schedule_element_line.py +0 -0
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/tests/test_schedule/test_element/test_schedule_element_loop.py +0 -0
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/tests/test_schedule/test_element/test_schedule_element_nose_drop.py +0 -0
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/tests/test_schedule/test_element/test_schedule_element_pitch_break.py +0 -0
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/tests/test_schedule/test_element/test_schedule_element_recovery.py +0 -0
- {flightanalysis-0.2.16 → flightanalysis-0.2.17}/tests/test_schedule/test_element/test_schedule_element_stallturn.py +0 -0
- {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.
|
|
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.
|
|
19
|
-
Requires-Dist: flightdata>=0.2.
|
|
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.
|
|
29
|
-
Requires-Dist: flightdata>=0.2.
|
|
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
|
|
{flightanalysis-0.2.16 → flightanalysis-0.2.17}/examples/schedule_construction/create_all.py
RENAMED
|
@@ -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
|
|
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
|
|
3
|
-
|
|
4
|
-
|
|
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=
|
|
226
|
-
f3amb.loop("rke_opt[2]", ke=
|
|
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
|
|
{flightanalysis-0.2.16 → flightanalysis-0.2.17}/examples/schedule_construction/f3auk_clubman.py
RENAMED
|
@@ -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(
|
|
110
|
-
f3amb.line(speed = 3, length = 10),
|
|
111
|
-
f3amb.line(speed = 1, length = 5),
|
|
114
|
+
f3amb.line(),
|
|
112
115
|
f3amb.stallturn(),
|
|
113
|
-
f3amb.line(
|
|
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
|
|
{flightanalysis-0.2.16 → flightanalysis-0.2.17}/examples/schedule_construction/f3auk_intermediate.py
RENAMED
|
@@ -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.
|
|
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.
|
|
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
|
+
|
|
@@ -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,
|
|
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
|
|
50
|
-
yield self.get_ea(
|
|
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(
|
|
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(
|
|
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
|
|
61
|
-
|
|
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
|
-
|
|
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
|
-
|
|
83
|
-
|
|
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
|
|
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[
|
|
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.
|
|
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 = [
|
|
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
|
-
|
|
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 =
|
|
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
|