diff --git a/models/Application_examples/Missile_Defense b/models/Application_examples/Missile_Defense new file mode 100644 index 0000000000000000000000000000000000000000..5f8ffca52ecbaf2ae3cb6ead7c42ee22eaa9fb45 --- /dev/null +++ b/models/Application_examples/Missile_Defense @@ -0,0 +1,299 @@ +/*┬────────────────────────────────────────────────────────┠+│*│ ┌─[ Title and Authors ]──────────────────────────────┠│ +│*│ │ Model of a Ballistic Missile Defense System │ │ +│*│ │ Created by Alexander Nguyen on the 12th of │ │ +│*│ │ September, 2022. │ │ +│*│ │ Edited by Kristin Giammarco in Sept and Oct, 2022.│ │ +│*│ └────────────────────────────────────────────────────┘ │ +│*│ │ +│*│ ┌─[ Purpose ]────────────────────────────────────────┠│ +│*│ │ To introduce beginners to the MP behavior modeling │ │ +│*│ │ language and tool. │ │ +│*│ └────────────────────────────────────────────────────┘ │ +│*│ │ +│*│ ┌─[ Description ]────────────────────────────────────┠│ +│*│ │ This model provides an orientation for those just │ │ +│*│ │ getting started using MP-Firebird. All events and │ │ +│*│ │ event attributes in this model are notional for the│ │ +│*│ │ sole purpose of demonstrate the computational │ │ +│*│ │ modeling capabilities of MP. The text editor pane │ │ +│*│ │ allows one to compose and edit code in the high- | │ +│*│ │ level MP language. Press the Run button to generate│ │ +│*│ │ event traces from the code, then inspect the │ │ +│*│ │ results in the center pane. Use the far right pane │ │ +│*│ │ to navigate the resulting traces and the Global │ │ +│*│ │ View at the top of the trace thumbnails. Use the │ │ +│*│ │ scope slider bar next to the Run button to control│ │ +│*│ │ the number of loop iterations. │ │ +│*│ │ │ │ +│*│ │ ROOT A: B C; A is a root event that includes │ │ +│*│ │ events B followed by C │ │ +│*│ │ ( B | C ) Alternative events B or C (but not │ │ +│*│ │ both together in the same trace) │ │ +│*│ │ (* B *) iterate B zero or more times │ │ +│*│ │ [ B ] B is optional │ │ +│*│ └────────────────────────────────────────────────────┘ │ +│*│ │ +│*│ ┌─[ References ]─────────────────────────────────────┠│ +│*│ │ Aegis BMD Stellar Minotaur (FTM-18) Flight Mission │ │ +│*│ │ Success Quicklook. https://youtu.be/tpX0EwO5SkE │ │ +│*│ └────────────────────────────────────────────────────┘ │ +│*│ │ +│*│ ┌─[ Search Terms ]───────────────────────────────────┠│ +│*│ │ behavior, missile defense; analysis, schedule; │ │ +│*│ │ probability, Type 1; SAY statement; report, global;│ │ +│*│ │ table, global; graph, activity diagram; graph, │ │ +│*│ │ Gantt chart │ │ +│*│ └────────────────────────────────────────────────────┘ │ +│*│ │ +│*│ ┌─[ Instructions ]───────────────────────────────────┠│ +│*│ │ Run for Scopes 1 and up. You may also make changes │ │ +│*│ │ to this model and run it with your changes. Save │ │ +│*│ │ your model using the EXPORT button. │ │ +│*│ ├─[ Run Statistics ]─────────────────────────────────┤ │ +│*│ │ Scope 1: 3 traces in less than 1 sec. │ │ +│*│ │ Scope 2: 18 traces in approx. 17 sec. │ │ +│*│ │ Scope 3: 117 traces in approx. 55 min. │ │ +│*│ └────────────────────────────────────────────────────┘ │ +└*┴───────────────────────────────────────────────────────*/ + + +SCHEMA Ballistic_Missile_Defense + +ROOT Target: (+ Take_off [ ( Hit | Missed ) ] +) +; + +ROOT Radar: (+ Detect_target +) +; + +COORDINATE $a: Take_off, $b: Detect_target + DO ADD $a PRECEDES $b; OD; + + +ROOT Combat_System: (+ Establish_target_track + Develop_firing_control_solution + [ Provide_updated_target_information + ( Verify_successful_missile_interception | + Verify_unsuccessful_missile_interception ) + ] + +) +; + +ROOT Crew: (+ Request_launch_authorization + ( Initialize_launch | Scrub_launch ) + [ Command_missile_launch ] + +) +; + + +COORDINATE $a: Detect_target, $b: Establish_target_track + DO ADD $a PRECEDES $b; OD; + +COORDINATE $a: Develop_firing_control_solution, $b: Request_launch_authorization + DO ADD $a PRECEDES $b; OD; + +/* Probability is made up for demonstration purposes. */ +ROOT Captain: (+ ( <<0.96>> Authorize_missile_launch | Deny_missile_launch ) +) +; + + +COORDINATE $a: Request_launch_authorization, $b: ( Authorize_missile_launch | Deny_missile_launch ) + DO ADD $a PRECEDES $b; OD; + +COORDINATE $a: Authorize_missile_launch, $b: Initialize_launch + DO ADD $a PRECEDES $b; OD; + +COORDINATE $a: Deny_missile_launch, $b: Scrub_launch + DO ADD $a PRECEDES $b; OD; + + +ROOT Missile_Launching_System: (* Prepare_for_launch *) +; + +COORDINATE $a: Initialize_launch, $b: Prepare_for_launch + DO ADD $a PRECEDES $b; OD; + +COORDINATE $a: Prepare_for_launch, $b: Command_missile_launch + DO ADD $a PRECEDES $b; OD; + +ROOT Missile: (* Launch + Maneuver_to_target + /* Probability is made up for demonstration purposes. */ + ( <<0.99>> Intercept_target | Miss_target ) *) +; + +COORDINATE $a: Launch, $b: Provide_updated_target_information + DO ADD $a PRECEDES $b; OD; + +COORDINATE $a: Launch, $b: Command_missile_launch + DO ADD $b PRECEDES $a; OD; + +COORDINATE $a: Provide_updated_target_information, $b: Maneuver_to_target + DO ADD $a PRECEDES $b; OD; + +COORDINATE $a: Intercept_target, $b: Hit + DO ADD $a PRECEDES $b; OD; + +COORDINATE $a: Miss_target, $b: Missed + DO ADD $a PRECEDES $b; OD; + +COORDINATE $a: Hit, $b: Verify_successful_missile_interception + DO ADD $a PRECEDES $b; OD; + +COORDINATE $a: Missed, $b: Verify_unsuccessful_missile_interception + DO ADD $a PRECEDES $b; OD; + + + + +/* event durations (minutes) */ + +COORDINATE $a: Detect_target DO SET $a.duration AT LEAST 1; OD; + +COORDINATE $a: Establish_target_track DO SET $a.duration AT LEAST 1; OD; +COORDINATE $a: Develop_firing_control_solution DO SET $a.duration AT LEAST 1; OD; +COORDINATE $a: Provide_updated_target_information DO SET $a.duration AT LEAST 1; OD; +COORDINATE $a: Request_launch_authorization DO SET $a.duration AT LEAST 1; OD; +COORDINATE $a: Initialize_launch DO SET $a.duration AT LEAST 1; OD; + +COORDINATE $a: Command_missile_launch DO SET $a.duration AT LEAST 1; OD; + +COORDINATE $a: Authorize_missile_launch DO SET $a.duration AT LEAST 1; OD; + +COORDINATE $a: Deny_missile_launch DO SET $a.duration AT LEAST 1; OD; +COORDINATE $a: Prepare_for_launch DO SET $a.duration AT LEAST 1; OD; + +COORDINATE $a: Launch DO SET $a.duration AT LEAST 1; OD; +COORDINATE $a: Maneuver_to_target DO SET $a.duration AT LEAST 1; OD; + +/* --------- Build Gantt Charts on traces --------- */ + +TABLE Gantt_Table{ + TABS string event_name, + number start_time, + number duration_time; +}; + CLEAR Gantt_Table; + +BAR CHART Gantt_Chart { TITLE("Process Timeline (hours)"); + FROM Gantt_Table; + X_AXIS event_name; + ROTATE; +}; + +COORDINATE $e: $$EVENT + DO + IF $e.duration.largest > 0 THEN + Gantt_Table <| + event_name: SAY($e), + start_time: $e.start.smallest, + duration_time: $e.duration.largest; + FI; + OD; + +SHOW Gantt_Chart; + +SAY("Trace " trace_id " Total Time: " THIS.duration " minutes"); + +/* ---- Accumulate data from traces for global reports ---- */ + +ATTRIBUTES {number accumulated_max_duration, + accumulated_min_duration, + accumulated_durations, + shortest_trace_id, + longest_trace_id, + trace_unique_id, + trace_duration, + weighted_duration, + count; + bool d_max, d_min; + }; + +/* Find the longest trace */ +IF GLOBAL.accumulated_max_duration < THIS.duration.largest THEN + GLOBAL.accumulated_max_duration := THIS.duration.largest; + GLOBAL.longest_trace_id := trace_id; +FI; + +/* Find the shortest trace */ +IF GLOBAL.accumulated_min_duration >= THIS.duration.smallest OR + GLOBAL.accumulated_min_duration == 0 THEN + GLOBAL.accumulated_min_duration := THIS.duration.smallest; + GLOBAL.shortest_trace_id := trace_id; +FI; + +/* Find the total of all trace durations for the denominator of + the average duration calculation */ +GLOBAL.accumulated_durations +:= THIS.duration.smallest; + +/* Store trace duration data in a graph container for later + accessing by GLOBAL section */ +GRAPH trace_data { }; +WITHIN trace_data{ + Node$x: NEW(THIS.duration.smallest); + Node$x.trace_unique_id := trace_id; + Node$x.trace_duration := THIS.duration.smallest; + }; + +/* Create and print global reports */ +GLOBAL + +/* Create table summarizing trace data */ + +TABLE trace_data_summary { +TABS string Trace_Number, + string Trace_Probability, + string Trace_Duration_minutes, + number Weighted_Duration, + string Maximum_Duration, + string Minimum_Duration; }; + +WITHIN trace_data{ + FOR Node$x + DO + weighted_duration +:= + Node$x.trace_duration * #$$TP(Node$x.trace_unique_id); + IF Node$x.trace_duration == accumulated_max_duration + THEN d_max:= true; + ELSE d_max:= false; FI; + IF Node$x.trace_duration == accumulated_min_duration + THEN d_min:= true; + ELSE d_min:= false; FI; + + trace_data_summary <| + Trace_Number: SAY( Node$x.trace_unique_id ), + Trace_Probability: SAY( #$$TP(Node$x.trace_unique_id) ), + Trace_Duration_minutes: SAY( Node$x ), + Weighted_Duration: weighted_duration, + Maximum_Duration: SAY( d_max ), + Minimum_Duration: SAY( d_min ); + OD; +}; + +/* This table shows that there are 2 maximums and 1 minimum. */ +SHOW trace_data_summary; + + +/* Create summary report */ + +REPORT Duration_Statistics_Report { + TITLE ("Scope "$$scope" Duration Statistics"); }; + +SAY("There are " #$$TRACE " traces total." ) + => Duration_Statistics_Report; + +SAY ("Expected duration based on assigned trace probabilities is: " + weighted_duration" minutes." ) + => Duration_Statistics_Report; + +SAY("Trace "longest_trace_id " has a max duration of " + accumulated_max_duration" minutes." ) + => Duration_Statistics_Report; + +SAY("Trace "shortest_trace_id " has a min duration of " + accumulated_min_duration" minutes." ) + => Duration_Statistics_Report; + +SHOW Duration_Statistics_Report; + +SHOW ACTIVITY DIAGRAM Combat_System, Crew, Missile;