From 689a068bca41fca24d036616e9e260ed66cb668f Mon Sep 17 00:00:00 2001 From: rrtucci Date: Sun, 29 Nov 2015 03:42:27 -0500 Subject: [PATCH] initial commit --- LICENSE.md | 16 + Legacy/Help/QFogLibOfEssays.pdf | Bin 0 -> 723731 bytes Legacy/Help/QFogManual/data/QFog.css | 29 ++ Legacy/Help/QFogManual/data/amps_filter.gif | Bin 0 -> 9779 bytes Legacy/Help/QFogManual/data/bi_nd_list.html | 44 +++ Legacy/Help/QFogManual/data/bi_nd_probs.html | 37 +++ Legacy/Help/QFogManual/data/choose_color.html | 24 ++ Legacy/Help/QFogManual/data/color_picker.jpeg | Bin 0 -> 22627 bytes Legacy/Help/QFogManual/data/command_key.gif | Bin 0 -> 953 bytes .../Help/QFogManual/data/cu_co_pa_de_se.html | 82 ++++++ Legacy/Help/QFogManual/data/det_wind_cnot.gif | Bin 0 -> 9829 bytes .../Help/QFogManual/data/det_wind_cnot.html | 92 ++++++ .../Help/QFogManual/data/det_wind_margie.gif | Bin 0 -> 8770 bytes .../Help/QFogManual/data/det_wind_margie.html | 63 ++++ .../QFogManual/data/det_wind_pshifter.gif | Bin 0 -> 8847 bytes .../QFogManual/data/det_wind_pshifter.html | 45 +++ .../QFogManual/data/dlog_for_spec_nd.html | 55 ++++ Legacy/Help/QFogManual/data/do_one.html | 23 ++ Legacy/Help/QFogManual/data/drum.gif | Bin 0 -> 1085 bytes .../QFogManual/data/example,amps_file.gif | Bin 0 -> 8394 bytes .../QFogManual/data/example,e_cases_file.gif | Bin 0 -> 6876 bytes .../QFogManual/data/example,nd_sts_file.gif | Bin 0 -> 5536 bytes Legacy/Help/QFogManual/data/export.html | 35 +++ Legacy/Help/QFogManual/data/filter_amps.html | 44 +++ .../Help/QFogManual/data/gen_state_names.gif | Bin 0 -> 7760 bytes .../Help/QFogManual/data/gen_state_names.html | 76 +++++ Legacy/Help/QFogManual/data/ggate.gif | Bin 0 -> 51306 bytes Legacy/Help/QFogManual/data/go_forward.html | 57 ++++ .../data/how_to_write_amps_file.html | 111 +++++++ .../data/how_to_write_ecases_file.html | 66 +++++ .../data/how_to_write_nd_sts_file.html | 61 ++++ Legacy/Help/QFogManual/data/illustrate.html | 46 +++ Legacy/Help/QFogManual/data/import.html | 32 ++ .../Help/QFogManual/data/initial_run_st.html | 16 + Legacy/Help/QFogManual/data/introduction.html | 44 +++ Legacy/Help/QFogManual/data/main_wind.html | 19 ++ Legacy/Help/QFogManual/data/memory.html | 35 +++ .../QFogManual/data/menu,active_project.gif | Bin 0 -> 13942 bytes .../QFogManual/data/menu,change_run_state.gif | Bin 0 -> 4814 bytes Legacy/Help/QFogManual/data/menu,edit.gif | Bin 0 -> 10452 bytes Legacy/Help/QFogManual/data/menu,export.gif | Bin 0 -> 12287 bytes Legacy/Help/QFogManual/data/menu,file.gif | Bin 0 -> 6984 bytes Legacy/Help/QFogManual/data/menu,import.gif | Bin 0 -> 11802 bytes .../Help/QFogManual/data/menu,run_preps.gif | Bin 0 -> 6723 bytes Legacy/Help/QFogManual/data/menu,windows.gif | Bin 0 -> 9185 bytes Legacy/Help/QFogManual/data/my_Ecases.txt | 9 + Legacy/Help/QFogManual/data/my_amps.txt | 22 ++ .../Help/QFogManual/data/my_node_states.txt | 12 + Legacy/Help/QFogManual/data/nd_pi.html | 205 +++++++++++++ Legacy/Help/QFogManual/data/nd_probs.html | 37 +++ .../QFogManual/data/net_terminology-abc.html | 116 ++++++++ .../Help/QFogManual/data/net_terminology.html | 275 ++++++++++++++++++ Legacy/Help/QFogManual/data/num_of_rows.gif | Bin 0 -> 5582 bytes Legacy/Help/QFogManual/data/num_of_rows.html | 30 ++ Legacy/Help/QFogManual/data/pal.html | 265 +++++++++++++++++ Legacy/Help/QFogManual/data/params_SG_mag.gif | Bin 0 -> 10974 bytes .../Help/QFogManual/data/params_SG_mag.html | 76 +++++ .../Help/QFogManual/data/params_beam_spl.gif | Bin 0 -> 8406 bytes .../Help/QFogManual/data/params_beam_spl.html | 84 ++++++ .../Help/QFogManual/data/params_det_nd.html | 30 ++ .../Help/QFogManual/data/params_pol_rot.gif | Bin 0 -> 6248 bytes .../Help/QFogManual/data/params_pol_rot.html | 38 +++ .../Help/QFogManual/data/params_polarizer.gif | Bin 0 -> 6219 bytes .../QFogManual/data/params_polarizer.html | 42 +++ .../Help/QFogManual/data/params_qbit_rot.gif | Bin 0 -> 7858 bytes .../Help/QFogManual/data/params_qbit_rot.html | 42 +++ Legacy/Help/QFogManual/data/preview.gif | Bin 0 -> 6572 bytes Legacy/Help/QFogManual/data/preview.html | 22 ++ Legacy/Help/QFogManual/data/refs.html | 36 +++ Legacy/Help/QFogManual/data/reorder_icon.gif | Bin 0 -> 918 bytes Legacy/Help/QFogManual/data/reorder_nds.gif | Bin 0 -> 6448 bytes Legacy/Help/QFogManual/data/reordering.html | 56 ++++ Legacy/Help/QFogManual/data/run_def.html | 89 ++++++ Legacy/Help/QFogManual/data/stories.html | 29 ++ Legacy/Help/QFogManual/data/support.html | 33 +++ .../QFogManual/data/table_of_contents.html | 226 ++++++++++++++ .../Help/QFogManual/data/text_files_used.gif | Bin 0 -> 10729 bytes .../Help/QFogManual/data/text_files_used.html | 87 ++++++ Legacy/Help/QFogManual/data/tour_draw.html | 65 +++++ Legacy/Help/QFogManual/data/tour_ecases.gif | Bin 0 -> 5729 bytes Legacy/Help/QFogManual/data/tour_intro.html | 21 ++ Legacy/Help/QFogManual/data/tour_net.gif | Bin 0 -> 3175 bytes .../Help/QFogManual/data/tour_run_with.html | 100 +++++++ .../QFogManual/data/tour_run_without.html | 60 ++++ .../QFogManual/data/tour_spec_act_sts.html | 20 ++ .../QFogManual/data/tour_spec_bi_nds.html | 36 +++ .../QFogManual/data/tour_spec_nd_mat.html | 151 ++++++++++ .../QFogManual/data/tour_spec_st_names.html | 59 ++++ Legacy/Help/QFogManual/data/undo.html | 32 ++ .../Help/QFogManual/data/wind,bi_nd_list.gif | Bin 0 -> 4830 bytes .../Help/QFogManual/data/wind,bi_nd_probs.gif | Bin 0 -> 8672 bytes Legacy/Help/QFogManual/data/wind,nd_pi.gif | Bin 0 -> 17488 bytes Legacy/Help/QFogManual/data/wind,nd_probs.gif | Bin 0 -> 7333 bytes Legacy/Help/QFogManual/data/wind,pal.gif | Bin 0 -> 8236 bytes Legacy/Help/QFogManual/data/wind,stories.gif | Bin 0 -> 7427 bytes Legacy/Help/QFogManual/data/windows.html | 61 ++++ Legacy/Help/QFogManual/start_here.html | 24 ++ .../QFogSource/Ansi_General/.DS_Store | Bin 0 -> 12292 bytes .../QFogSource/Ansi_General/L_LIST.cp | 1 + .../QFogSource/Ansi_General/L_LIST.h | 1 + .../QFogSource/Ansi_General/L_LIST_INST.cpp | 1 + .../QFogSource/Ansi_General/MATRIX.cp | 1 + .../QFogSource/Ansi_General/MATRIX.h | 1 + .../QFogSource/Ansi_General/MATRIX_INST.cpp | 1 + .../QFogSource/Ansi_General/SET.cpp | 1 + .../QFog2-MachO/QFogSource/Ansi_General/SET.h | 1 + .../QFogSource/Ansi_General/STRINGY.cpp | 1 + .../QFogSource/Ansi_General/STRINGY.h | 1 + .../QFogSource/Ansi_General/VECTOR.cp | 1 + .../QFogSource/Ansi_General/VECTOR.h | 1 + .../QFogSource/Ansi_General/VECTOR_FRIENDS.h | 1 + .../QFogSource/Ansi_General/VECTOR_INST.cpp | 1 + .../QFogSource/Ansi_Nodes/.DS_Store | Bin 0 -> 12292 bytes .../QFogSource/Ansi_Nodes/BEAM_SPL.cpp | 1 + .../QFogSource/Ansi_Nodes/BEAM_SPL.h | 1 + .../QFogSource/Ansi_Nodes/CUSTOM_ND.cpp | 1 + .../QFogSource/Ansi_Nodes/CUSTOM_ND.h | 1 + .../QFogSource/Ansi_Nodes/DET_ND.cpp | 1 + .../QFogSource/Ansi_Nodes/DET_ND.h | 1 + .../QFogSource/Ansi_Nodes/NODE.cpp | 1 + .../QFog2-MachO/QFogSource/Ansi_Nodes/NODE.h | 1 + .../QFogSource/Ansi_Nodes/POLARIZER.cpp | 1 + .../QFogSource/Ansi_Nodes/POLARIZER.h | 1 + .../QFogSource/Ansi_Nodes/POL_ROTATOR.cpp | 1 + .../QFogSource/Ansi_Nodes/POL_ROTATOR.h | 1 + .../QFogSource/Ansi_Nodes/QBIT_ROT.cpp | 1 + .../QFogSource/Ansi_Nodes/QBIT_ROT.h | 1 + .../QFogSource/Ansi_Nodes/SG_MAGNET.cpp | 1 + .../QFogSource/Ansi_Nodes/SG_MAGNET.h | 1 + .../QFogSource/Ansi_Other/.DS_Store | Bin 0 -> 12292 bytes .../QFogSource/Ansi_Other/ANSI_UDebugging.h | 1 + .../QFogSource/Ansi_Other/ANSI_UException.h | 1 + .../QFogSource/Ansi_Other/BI_NODE.cpp | 1 + .../QFogSource/Ansi_Other/BI_NODE.h | 1 + .../QFogSource/Ansi_Other/DICTIONARY.cpp | 1 + .../QFogSource/Ansi_Other/DICTIONARY.h | 1 + .../QFogSource/Ansi_Other/EXCEPTIONS.cpp | 1 + .../QFogSource/Ansi_Other/EXCEPTIONS.h | 1 + .../QFogSource/Ansi_Other/GLOBAL_FUN.cpp | 1 + .../QFogSource/Ansi_Other/GLOBAL_FUN.h | 1 + .../QFogSource/Ansi_Other/MY_FSTREAMS.cpp | 1 + .../QFogSource/Ansi_Other/MY_FSTREAMS.h | 1 + .../QFogSource/Ansi_Other/New(Extra).cp | 1 + .../QFogSource/Ansi_Other/STRETCH_OR_FOLD.cpp | 1 + .../QFogSource/Ansi_Other/STRETCH_OR_FOLD.h | 1 + .../QFogSource/Ansi_Other/TRANS_MAT.cpp | 1 + .../QFogSource/Ansi_Other/TRANS_MAT.h | 1 + .../QFogSource/Ansi_Other/UI_MAP.cpp | 1 + .../QFogSource/Ansi_Other/UI_MAP.h | 1 + .../QFogSource/Ansi_QBNet/.DS_Store | Bin 0 -> 6148 bytes .../QFogSource/Ansi_QBNet/QB_NET(go).cpp | 1 + .../QFogSource/Ansi_QBNet/QB_NET.cpp | 1 + .../QFogSource/Ansi_QBNet/QB_NET.h | 1 + .../QFog2-MachO/QFogSource/Headers/.DS_Store | Bin 0 -> 12292 bytes .../QFogSource/Headers/ANSI_QFogDeb-prefix.h | 1 + .../QFogSource/Headers/CommonMach-OPrefix.h | 201 +++++++++++++ .../QFogSource/Headers/QFog_constants.h | 1 + .../QFogSource/Headers/my_notation.h | 1 + .../QFogSource/Mac_AmpGens/.DS_Store | Bin 0 -> 6148 bytes .../QFogSource/Mac_AmpGens/C_AMP_GEN.cpp | 1 + .../QFogSource/Mac_AmpGens/C_AMP_GEN.h | 1 + .../Mac_AmpGens/C_BEAM_SPL_AMP_GEN.cpp | 1 + .../Mac_AmpGens/C_BEAM_SPL_AMP_GEN.h | 1 + .../Mac_AmpGens/C_DET_ND_AMP_GEN.cpp | 1 + .../QFogSource/Mac_AmpGens/C_DET_ND_AMP_GEN.h | 1 + .../Mac_AmpGens/C_PHASOR_YZER_AMP_GEN.cpp | 1 + .../Mac_AmpGens/C_PHASOR_YZER_AMP_GEN.h | 1 + .../Mac_AmpGens/C_QBIT_ROT_AMP_GEN.cpp | 1 + .../Mac_AmpGens/C_QBIT_ROT_AMP_GEN.h | 1 + .../Mac_AmpGens/C_SG_MAGNET_AMP_GEN.cpp | 1 + .../Mac_AmpGens/C_SG_MAGNET_AMP_GEN.h | 1 + .../Mac_AmpGens/C_SG_MAGNET_TABLE.cpp | 1 + .../Mac_AmpGens/C_SG_MAGNET_TABLE.h | 1 + .../QFogSource/Mac_AmpGens/TWO_MODE_FUN.cpp | 1 + .../QFogSource/Mac_AmpGens/TWO_MODE_FUN.h | 1 + .../QFogSource/Mac_BiNdProbs/.DS_Store | Bin 0 -> 6148 bytes .../Mac_BiNdProbs/C_BI_ND_PROBS_MARGIN.cpp | 1 + .../Mac_BiNdProbs/C_BI_ND_PROBS_MARGIN.h | 1 + .../Mac_BiNdProbs/C_BI_ND_PROBS_TABLE.cpp | 1 + .../Mac_BiNdProbs/C_BI_ND_PROBS_TABLE.h | 1 + .../Mac_BiNdProbs/C_BI_ND_PROBS_WIND.cpp | 1 + .../Mac_BiNdProbs/C_BI_ND_PROBS_WIND.h | 1 + .../Mac_BiNdProbs/C_MARGINED_SCROLLER.cpp | 1 + .../Mac_BiNdProbs/C_MARGINED_SCROLLER.h | 1 + .../QFogSource/Mac_BiNds/.DS_Store | Bin 0 -> 6148 bytes .../QFogSource/Mac_BiNds/C_BI_ND_LBOX.cpp | 1 + .../QFogSource/Mac_BiNds/C_BI_ND_LBOX.h | 1 + .../QFogSource/Mac_BiNds/C_BI_ND_WIND.cpp | 1 + .../QFogSource/Mac_BiNds/C_BI_ND_WIND.h | 1 + .../QFogSource/Mac_MainView/.DS_Store | Bin 0 -> 6148 bytes .../QFogSource/Mac_MainView/C_ARROW.cpp | 1 + .../QFogSource/Mac_MainView/C_ARROW.h | 1 + .../Mac_MainView/C_ARROW_DRAWER.cpp | 1 + .../QFogSource/Mac_MainView/C_ARROW_DRAWER.h | 1 + .../Mac_MainView/C_EFIELD_PASTE_ATMENT.cpp | 1 + .../Mac_MainView/C_EFIELD_PASTE_ATMENT.h | 1 + .../QFogSource/Mac_MainView/C_MAIN_VIEW.cpp | 1 + .../QFogSource/Mac_MainView/C_MAIN_VIEW.h | 1 + .../Mac_MainView/C_MVIEW_ACTIONS.cpp | 1 + .../QFogSource/Mac_MainView/C_MVIEW_ACTIONS.h | 1 + .../QFogSource/Mac_MainView/C_ND_EFIELD.cpp | 1 + .../QFogSource/Mac_MainView/C_ND_EFIELD.h | 1 + .../Mac_MainView/C_PORT_RELATED.cpp | 1 + .../QFogSource/Mac_MainView/C_PORT_RELATED.h | 1 + .../QFogSource/Mac_NdProbs/.DS_Store | Bin 0 -> 6148 bytes .../Mac_NdProbs/C_ND_PROBS_TABLE.cpp | 1 + .../QFogSource/Mac_NdProbs/C_ND_PROBS_TABLE.h | 1 + .../Mac_NdProbs/C_ND_PROBS_WIND.cpp | 1 + .../QFogSource/Mac_NdProbs/C_ND_PROBS_WIND.h | 1 + .../QFogSource/Mac_Other/.DS_Store | Bin 0 -> 6148 bytes .../QFogSource/Mac_Other/C_ACTION_FLAGS.cpp | 1 + .../QFogSource/Mac_Other/C_ACTION_FLAGS.h | 1 + .../QFogSource/Mac_Other/C_HOST_VIEW.cpp | 1 + .../QFogSource/Mac_Other/C_HOST_VIEW.h | 1 + .../QFogSource/Mac_Other/C_KEYS.cpp | 1 + .../QFog2-MachO/QFogSource/Mac_Other/C_KEYS.h | 1 + .../QFogSource/Mac_Other/C_PROJECT_MENU.cpp | 1 + .../QFogSource/Mac_Other/C_PROJECT_MENU.h | 1 + .../QFogSource/Mac_Other/C_WIND_BDS_RECO.cpp | 1 + .../QFogSource/Mac_Other/C_WIND_BDS_RECO.h | 1 + .../Mac_Other/Mac_EditTable/.DS_Store | Bin 0 -> 12292 bytes .../Mac_Other/Mac_EditTable/C_CELL_EDITOR.cpp | 1 + .../Mac_Other/Mac_EditTable/C_CELL_EDITOR.h | 1 + .../Mac_EditTable/C_CELL_EDITOR_UNDOER.cpp | 1 + .../Mac_EditTable/C_CELL_EDITOR_UNDOER.h | 1 + .../Mac_Other/Mac_EditTable/C_EDIT_TABLE.cpp | 1 + .../Mac_Other/Mac_EditTable/C_EDIT_TABLE.h | 1 + .../Mac_EditTable/C_ETABLE_ACTIONS.cpp | 1 + .../Mac_EditTable/C_ETABLE_ACTIONS.h | 1 + .../Mac_EditTable/C_ETABLE_MULTI_SEL.cpp | 1 + .../Mac_EditTable/C_ETABLE_MULTI_SEL.h | 1 + .../Mac_EditTable/C_SPEED_LIM_SCROLLER.cpp | 1 + .../Mac_EditTable/C_SPEED_LIM_SCROLLER.h | 1 + .../Mac_Other/Mac_EditTable/C_SUB_MATRIX.cpp | 1 + .../Mac_Other/Mac_EditTable/C_SUB_MATRIX.h | 1 + .../QFogSource/Mac_Other/StCPTstate.cpp | 1 + .../QFogSource/Mac_Other/StCPTstate.h | 1 + .../QFogSource/Mac_Other/UModalDialogsPlus.cp | 1 + .../QFogSource/Mac_Other/UModalDialogsPlus.h | 1 + .../QFogSource/Mac_Other/UTextMenus.cpp | 1 + .../QFogSource/Mac_Other/UTextMenus.h | 1 + .../QFogSource/Mac_Palette/.DS_Store | Bin 0 -> 6148 bytes .../QFogSource/Mac_Palette/C_COLORS.cpp | 1 + .../QFogSource/Mac_Palette/C_COLORS.h | 1 + .../QFogSource/Mac_Palette/C_COLOR_SWATCH.cpp | 1 + .../QFogSource/Mac_Palette/C_COLOR_SWATCH.h | 1 + .../QFogSource/Mac_Palette/C_ICON_TABLE.cpp | 1 + .../QFogSource/Mac_Palette/C_ICON_TABLE.h | 1 + .../QFogSource/Mac_Palette/C_PALETTE.cpp | 1 + .../QFogSource/Mac_Palette/C_PALETTE.h | 1 + .../QFogSource/Mac_PiWind/.DS_Store | Bin 0 -> 6148 bytes .../QFogSource/Mac_PiWind/C_PI_AMPS_TABLE.cpp | 1 + .../QFogSource/Mac_PiWind/C_PI_AMPS_TABLE.h | 1 + .../QFogSource/Mac_PiWind/C_PI_ND_EFIELD.cpp | 1 + .../QFogSource/Mac_PiWind/C_PI_ND_EFIELD.h | 1 + .../QFogSource/Mac_PiWind/C_PI_ND_POPUP.cpp | 1 + .../QFogSource/Mac_PiWind/C_PI_ND_POPUP.h | 1 + .../Mac_PiWind/C_PI_PARENTS_TABLE.cpp | 1 + .../Mac_PiWind/C_PI_PARENTS_TABLE.h | 1 + .../Mac_PiWind/C_PI_PA_ST_POPUP.cpp | 1 + .../QFogSource/Mac_PiWind/C_PI_PA_ST_POPUP.h | 1 + .../QFogSource/Mac_PiWind/C_PI_WIND.cpp | 1 + .../QFogSource/Mac_PiWind/C_PI_WIND.h | 1 + .../QFogSource/Mac_QBNetAndNode/.DS_Store | Bin 0 -> 6148 bytes .../QFogSource/Mac_QBNetAndNode/NODE(mac).cpp | 1 + .../Mac_QBNetAndNode/QB_NET(mac).cpp | 1 + .../QFogSource/Mac_Reorder/.DS_Store | Bin 0 -> 6148 bytes .../QFogSource/Mac_Reorder/C_NET_QTABLE.cpp | 1 + .../QFogSource/Mac_Reorder/C_NET_QTABLE.h | 1 + .../QFogSource/Mac_Reorder/C_QTABLE.cpp | 1 + .../QFogSource/Mac_Reorder/C_QTABLE.h | 1 + .../QFogSource/Mac_Stories/.DS_Store | Bin 0 -> 6148 bytes .../Mac_Stories/C_ANTHOLOGY_ITEM.cpp | 1 + .../QFogSource/Mac_Stories/C_ANTHOLOGY_ITEM.h | 1 + .../QFogSource/Mac_Stories/C_STORIES_WIND.cpp | 1 + .../QFogSource/Mac_Stories/C_STORIES_WIND.h | 1 + .../QFog2-MachO/QFogSource/Mac_Top/.DS_Store | Bin 0 -> 6148 bytes .../QFog2-MachO/QFogSource/Mac_Top/C_APP.cpp | 1 + Legacy/QFog2-MachO/QFogSource/Mac_Top/C_APP.h | 1 + .../QFog2-MachO/QFogSource/Mac_Top/C_DOC.cpp | 1 + Legacy/QFog2-MachO/QFogSource/Mac_Top/C_DOC.h | 1 + .../QFogSource/Mac_Top/C_TOP_PTRS.cpp | 1 + .../QFogSource/Mac_Top/C_TOP_PTRS.h | 1 + .../QFogSource/Resources/AppPropertyList.plc | 51 ++++ .../Resources/PP Debug Support.rsrc | 0 .../QFogSource/Resources/PP DebugAlerts.rsrc | 0 .../QFogSource/Resources/QFog.icns | Bin 0 -> 53555 bytes .../QFogSource/Resources/QNet.icns | Bin 0 -> 43253 bytes .../QFogSource/Resources/Quantum_Fog.rsrc | 0 .../Resources/StandardInfoPlistKeys.h | 1 + .../QFogSource/Resources/drawings.cwk | Bin 0 -> 30883 bytes .../QFogSource/Resources/qbit rot icon(mdraw) | Bin 0 -> 19968 bytes Legacy/QFog2-MachO/QFogSource/main.cpp | 1 + QFog-legacy-history.md | 20 ++ README.md | 26 ++ 295 files changed, 4109 insertions(+) create mode 100644 LICENSE.md create mode 100644 Legacy/Help/QFogLibOfEssays.pdf create mode 100644 Legacy/Help/QFogManual/data/QFog.css create mode 100644 Legacy/Help/QFogManual/data/amps_filter.gif create mode 100644 Legacy/Help/QFogManual/data/bi_nd_list.html create mode 100644 Legacy/Help/QFogManual/data/bi_nd_probs.html create mode 100644 Legacy/Help/QFogManual/data/choose_color.html create mode 100644 Legacy/Help/QFogManual/data/color_picker.jpeg create mode 100644 Legacy/Help/QFogManual/data/command_key.gif create mode 100644 Legacy/Help/QFogManual/data/cu_co_pa_de_se.html create mode 100644 Legacy/Help/QFogManual/data/det_wind_cnot.gif create mode 100644 Legacy/Help/QFogManual/data/det_wind_cnot.html create mode 100644 Legacy/Help/QFogManual/data/det_wind_margie.gif create mode 100644 Legacy/Help/QFogManual/data/det_wind_margie.html create mode 100644 Legacy/Help/QFogManual/data/det_wind_pshifter.gif create mode 100644 Legacy/Help/QFogManual/data/det_wind_pshifter.html create mode 100644 Legacy/Help/QFogManual/data/dlog_for_spec_nd.html create mode 100644 Legacy/Help/QFogManual/data/do_one.html create mode 100644 Legacy/Help/QFogManual/data/drum.gif create mode 100644 Legacy/Help/QFogManual/data/example,amps_file.gif create mode 100644 Legacy/Help/QFogManual/data/example,e_cases_file.gif create mode 100644 Legacy/Help/QFogManual/data/example,nd_sts_file.gif create mode 100644 Legacy/Help/QFogManual/data/export.html create mode 100644 Legacy/Help/QFogManual/data/filter_amps.html create mode 100644 Legacy/Help/QFogManual/data/gen_state_names.gif create mode 100644 Legacy/Help/QFogManual/data/gen_state_names.html create mode 100644 Legacy/Help/QFogManual/data/ggate.gif create mode 100644 Legacy/Help/QFogManual/data/go_forward.html create mode 100644 Legacy/Help/QFogManual/data/how_to_write_amps_file.html create mode 100644 Legacy/Help/QFogManual/data/how_to_write_ecases_file.html create mode 100644 Legacy/Help/QFogManual/data/how_to_write_nd_sts_file.html create mode 100644 Legacy/Help/QFogManual/data/illustrate.html create mode 100644 Legacy/Help/QFogManual/data/import.html create mode 100644 Legacy/Help/QFogManual/data/initial_run_st.html create mode 100644 Legacy/Help/QFogManual/data/introduction.html create mode 100644 Legacy/Help/QFogManual/data/main_wind.html create mode 100644 Legacy/Help/QFogManual/data/memory.html create mode 100644 Legacy/Help/QFogManual/data/menu,active_project.gif create mode 100644 Legacy/Help/QFogManual/data/menu,change_run_state.gif create mode 100644 Legacy/Help/QFogManual/data/menu,edit.gif create mode 100644 Legacy/Help/QFogManual/data/menu,export.gif create mode 100644 Legacy/Help/QFogManual/data/menu,file.gif create mode 100644 Legacy/Help/QFogManual/data/menu,import.gif create mode 100644 Legacy/Help/QFogManual/data/menu,run_preps.gif create mode 100644 Legacy/Help/QFogManual/data/menu,windows.gif create mode 100644 Legacy/Help/QFogManual/data/my_Ecases.txt create mode 100644 Legacy/Help/QFogManual/data/my_amps.txt create mode 100644 Legacy/Help/QFogManual/data/my_node_states.txt create mode 100644 Legacy/Help/QFogManual/data/nd_pi.html create mode 100644 Legacy/Help/QFogManual/data/nd_probs.html create mode 100644 Legacy/Help/QFogManual/data/net_terminology-abc.html create mode 100644 Legacy/Help/QFogManual/data/net_terminology.html create mode 100644 Legacy/Help/QFogManual/data/num_of_rows.gif create mode 100644 Legacy/Help/QFogManual/data/num_of_rows.html create mode 100644 Legacy/Help/QFogManual/data/pal.html create mode 100644 Legacy/Help/QFogManual/data/params_SG_mag.gif create mode 100644 Legacy/Help/QFogManual/data/params_SG_mag.html create mode 100644 Legacy/Help/QFogManual/data/params_beam_spl.gif create mode 100644 Legacy/Help/QFogManual/data/params_beam_spl.html create mode 100644 Legacy/Help/QFogManual/data/params_det_nd.html create mode 100644 Legacy/Help/QFogManual/data/params_pol_rot.gif create mode 100644 Legacy/Help/QFogManual/data/params_pol_rot.html create mode 100644 Legacy/Help/QFogManual/data/params_polarizer.gif create mode 100644 Legacy/Help/QFogManual/data/params_polarizer.html create mode 100644 Legacy/Help/QFogManual/data/params_qbit_rot.gif create mode 100644 Legacy/Help/QFogManual/data/params_qbit_rot.html create mode 100644 Legacy/Help/QFogManual/data/preview.gif create mode 100644 Legacy/Help/QFogManual/data/preview.html create mode 100644 Legacy/Help/QFogManual/data/refs.html create mode 100644 Legacy/Help/QFogManual/data/reorder_icon.gif create mode 100644 Legacy/Help/QFogManual/data/reorder_nds.gif create mode 100644 Legacy/Help/QFogManual/data/reordering.html create mode 100644 Legacy/Help/QFogManual/data/run_def.html create mode 100644 Legacy/Help/QFogManual/data/stories.html create mode 100644 Legacy/Help/QFogManual/data/support.html create mode 100644 Legacy/Help/QFogManual/data/table_of_contents.html create mode 100644 Legacy/Help/QFogManual/data/text_files_used.gif create mode 100644 Legacy/Help/QFogManual/data/text_files_used.html create mode 100644 Legacy/Help/QFogManual/data/tour_draw.html create mode 100644 Legacy/Help/QFogManual/data/tour_ecases.gif create mode 100644 Legacy/Help/QFogManual/data/tour_intro.html create mode 100644 Legacy/Help/QFogManual/data/tour_net.gif create mode 100644 Legacy/Help/QFogManual/data/tour_run_with.html create mode 100644 Legacy/Help/QFogManual/data/tour_run_without.html create mode 100644 Legacy/Help/QFogManual/data/tour_spec_act_sts.html create mode 100644 Legacy/Help/QFogManual/data/tour_spec_bi_nds.html create mode 100644 Legacy/Help/QFogManual/data/tour_spec_nd_mat.html create mode 100644 Legacy/Help/QFogManual/data/tour_spec_st_names.html create mode 100644 Legacy/Help/QFogManual/data/undo.html create mode 100644 Legacy/Help/QFogManual/data/wind,bi_nd_list.gif create mode 100644 Legacy/Help/QFogManual/data/wind,bi_nd_probs.gif create mode 100644 Legacy/Help/QFogManual/data/wind,nd_pi.gif create mode 100644 Legacy/Help/QFogManual/data/wind,nd_probs.gif create mode 100644 Legacy/Help/QFogManual/data/wind,pal.gif create mode 100644 Legacy/Help/QFogManual/data/wind,stories.gif create mode 100644 Legacy/Help/QFogManual/data/windows.html create mode 100644 Legacy/Help/QFogManual/start_here.html create mode 100644 Legacy/QFog2-MachO/QFogSource/Ansi_General/.DS_Store create mode 100644 Legacy/QFog2-MachO/QFogSource/Ansi_General/L_LIST.cp create mode 100644 Legacy/QFog2-MachO/QFogSource/Ansi_General/L_LIST.h create mode 100644 Legacy/QFog2-MachO/QFogSource/Ansi_General/L_LIST_INST.cpp create mode 100644 Legacy/QFog2-MachO/QFogSource/Ansi_General/MATRIX.cp create mode 100644 Legacy/QFog2-MachO/QFogSource/Ansi_General/MATRIX.h create mode 100644 Legacy/QFog2-MachO/QFogSource/Ansi_General/MATRIX_INST.cpp create mode 100644 Legacy/QFog2-MachO/QFogSource/Ansi_General/SET.cpp create mode 100644 Legacy/QFog2-MachO/QFogSource/Ansi_General/SET.h create mode 100644 Legacy/QFog2-MachO/QFogSource/Ansi_General/STRINGY.cpp create mode 100644 Legacy/QFog2-MachO/QFogSource/Ansi_General/STRINGY.h create mode 100644 Legacy/QFog2-MachO/QFogSource/Ansi_General/VECTOR.cp create mode 100644 Legacy/QFog2-MachO/QFogSource/Ansi_General/VECTOR.h create mode 100644 Legacy/QFog2-MachO/QFogSource/Ansi_General/VECTOR_FRIENDS.h create mode 100644 Legacy/QFog2-MachO/QFogSource/Ansi_General/VECTOR_INST.cpp create mode 100644 Legacy/QFog2-MachO/QFogSource/Ansi_Nodes/.DS_Store create mode 100644 Legacy/QFog2-MachO/QFogSource/Ansi_Nodes/BEAM_SPL.cpp create mode 100644 Legacy/QFog2-MachO/QFogSource/Ansi_Nodes/BEAM_SPL.h create mode 100644 Legacy/QFog2-MachO/QFogSource/Ansi_Nodes/CUSTOM_ND.cpp create mode 100644 Legacy/QFog2-MachO/QFogSource/Ansi_Nodes/CUSTOM_ND.h create mode 100644 Legacy/QFog2-MachO/QFogSource/Ansi_Nodes/DET_ND.cpp create mode 100644 Legacy/QFog2-MachO/QFogSource/Ansi_Nodes/DET_ND.h create mode 100644 Legacy/QFog2-MachO/QFogSource/Ansi_Nodes/NODE.cpp create mode 100644 Legacy/QFog2-MachO/QFogSource/Ansi_Nodes/NODE.h create mode 100644 Legacy/QFog2-MachO/QFogSource/Ansi_Nodes/POLARIZER.cpp create mode 100644 Legacy/QFog2-MachO/QFogSource/Ansi_Nodes/POLARIZER.h create mode 100644 Legacy/QFog2-MachO/QFogSource/Ansi_Nodes/POL_ROTATOR.cpp create mode 100644 Legacy/QFog2-MachO/QFogSource/Ansi_Nodes/POL_ROTATOR.h create mode 100644 Legacy/QFog2-MachO/QFogSource/Ansi_Nodes/QBIT_ROT.cpp create mode 100644 Legacy/QFog2-MachO/QFogSource/Ansi_Nodes/QBIT_ROT.h create mode 100644 Legacy/QFog2-MachO/QFogSource/Ansi_Nodes/SG_MAGNET.cpp create mode 100644 Legacy/QFog2-MachO/QFogSource/Ansi_Nodes/SG_MAGNET.h create mode 100644 Legacy/QFog2-MachO/QFogSource/Ansi_Other/.DS_Store create mode 100644 Legacy/QFog2-MachO/QFogSource/Ansi_Other/ANSI_UDebugging.h create mode 100644 Legacy/QFog2-MachO/QFogSource/Ansi_Other/ANSI_UException.h create mode 100644 Legacy/QFog2-MachO/QFogSource/Ansi_Other/BI_NODE.cpp create mode 100644 Legacy/QFog2-MachO/QFogSource/Ansi_Other/BI_NODE.h create mode 100644 Legacy/QFog2-MachO/QFogSource/Ansi_Other/DICTIONARY.cpp create mode 100644 Legacy/QFog2-MachO/QFogSource/Ansi_Other/DICTIONARY.h create mode 100644 Legacy/QFog2-MachO/QFogSource/Ansi_Other/EXCEPTIONS.cpp create mode 100644 Legacy/QFog2-MachO/QFogSource/Ansi_Other/EXCEPTIONS.h create mode 100644 Legacy/QFog2-MachO/QFogSource/Ansi_Other/GLOBAL_FUN.cpp create mode 100644 Legacy/QFog2-MachO/QFogSource/Ansi_Other/GLOBAL_FUN.h create mode 100644 Legacy/QFog2-MachO/QFogSource/Ansi_Other/MY_FSTREAMS.cpp create mode 100644 Legacy/QFog2-MachO/QFogSource/Ansi_Other/MY_FSTREAMS.h create mode 100644 Legacy/QFog2-MachO/QFogSource/Ansi_Other/New(Extra).cp create mode 100644 Legacy/QFog2-MachO/QFogSource/Ansi_Other/STRETCH_OR_FOLD.cpp create mode 100644 Legacy/QFog2-MachO/QFogSource/Ansi_Other/STRETCH_OR_FOLD.h create mode 100644 Legacy/QFog2-MachO/QFogSource/Ansi_Other/TRANS_MAT.cpp create mode 100644 Legacy/QFog2-MachO/QFogSource/Ansi_Other/TRANS_MAT.h create mode 100644 Legacy/QFog2-MachO/QFogSource/Ansi_Other/UI_MAP.cpp create mode 100644 Legacy/QFog2-MachO/QFogSource/Ansi_Other/UI_MAP.h create mode 100644 Legacy/QFog2-MachO/QFogSource/Ansi_QBNet/.DS_Store create mode 100644 Legacy/QFog2-MachO/QFogSource/Ansi_QBNet/QB_NET(go).cpp create mode 100644 Legacy/QFog2-MachO/QFogSource/Ansi_QBNet/QB_NET.cpp create mode 100644 Legacy/QFog2-MachO/QFogSource/Ansi_QBNet/QB_NET.h create mode 100644 Legacy/QFog2-MachO/QFogSource/Headers/.DS_Store create mode 100644 Legacy/QFog2-MachO/QFogSource/Headers/ANSI_QFogDeb-prefix.h create mode 100644 Legacy/QFog2-MachO/QFogSource/Headers/CommonMach-OPrefix.h create mode 100644 Legacy/QFog2-MachO/QFogSource/Headers/QFog_constants.h create mode 100644 Legacy/QFog2-MachO/QFogSource/Headers/my_notation.h create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_AmpGens/.DS_Store create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_AmpGens/C_AMP_GEN.cpp create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_AmpGens/C_AMP_GEN.h create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_AmpGens/C_BEAM_SPL_AMP_GEN.cpp create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_AmpGens/C_BEAM_SPL_AMP_GEN.h create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_AmpGens/C_DET_ND_AMP_GEN.cpp create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_AmpGens/C_DET_ND_AMP_GEN.h create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_AmpGens/C_PHASOR_YZER_AMP_GEN.cpp create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_AmpGens/C_PHASOR_YZER_AMP_GEN.h create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_AmpGens/C_QBIT_ROT_AMP_GEN.cpp create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_AmpGens/C_QBIT_ROT_AMP_GEN.h create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_AmpGens/C_SG_MAGNET_AMP_GEN.cpp create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_AmpGens/C_SG_MAGNET_AMP_GEN.h create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_AmpGens/C_SG_MAGNET_TABLE.cpp create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_AmpGens/C_SG_MAGNET_TABLE.h create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_AmpGens/TWO_MODE_FUN.cpp create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_AmpGens/TWO_MODE_FUN.h create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_BiNdProbs/.DS_Store create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_BiNdProbs/C_BI_ND_PROBS_MARGIN.cpp create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_BiNdProbs/C_BI_ND_PROBS_MARGIN.h create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_BiNdProbs/C_BI_ND_PROBS_TABLE.cpp create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_BiNdProbs/C_BI_ND_PROBS_TABLE.h create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_BiNdProbs/C_BI_ND_PROBS_WIND.cpp create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_BiNdProbs/C_BI_ND_PROBS_WIND.h create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_BiNdProbs/C_MARGINED_SCROLLER.cpp create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_BiNdProbs/C_MARGINED_SCROLLER.h create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_BiNds/.DS_Store create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_BiNds/C_BI_ND_LBOX.cpp create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_BiNds/C_BI_ND_LBOX.h create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_BiNds/C_BI_ND_WIND.cpp create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_BiNds/C_BI_ND_WIND.h create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_MainView/.DS_Store create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_MainView/C_ARROW.cpp create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_MainView/C_ARROW.h create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_MainView/C_ARROW_DRAWER.cpp create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_MainView/C_ARROW_DRAWER.h create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_MainView/C_EFIELD_PASTE_ATMENT.cpp create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_MainView/C_EFIELD_PASTE_ATMENT.h create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_MainView/C_MAIN_VIEW.cpp create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_MainView/C_MAIN_VIEW.h create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_MainView/C_MVIEW_ACTIONS.cpp create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_MainView/C_MVIEW_ACTIONS.h create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_MainView/C_ND_EFIELD.cpp create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_MainView/C_ND_EFIELD.h create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_MainView/C_PORT_RELATED.cpp create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_MainView/C_PORT_RELATED.h create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_NdProbs/.DS_Store create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_NdProbs/C_ND_PROBS_TABLE.cpp create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_NdProbs/C_ND_PROBS_TABLE.h create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_NdProbs/C_ND_PROBS_WIND.cpp create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_NdProbs/C_ND_PROBS_WIND.h create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_Other/.DS_Store create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_Other/C_ACTION_FLAGS.cpp create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_Other/C_ACTION_FLAGS.h create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_Other/C_HOST_VIEW.cpp create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_Other/C_HOST_VIEW.h create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_Other/C_KEYS.cpp create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_Other/C_KEYS.h create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_Other/C_PROJECT_MENU.cpp create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_Other/C_PROJECT_MENU.h create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_Other/C_WIND_BDS_RECO.cpp create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_Other/C_WIND_BDS_RECO.h create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_Other/Mac_EditTable/.DS_Store create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_Other/Mac_EditTable/C_CELL_EDITOR.cpp create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_Other/Mac_EditTable/C_CELL_EDITOR.h create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_Other/Mac_EditTable/C_CELL_EDITOR_UNDOER.cpp create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_Other/Mac_EditTable/C_CELL_EDITOR_UNDOER.h create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_Other/Mac_EditTable/C_EDIT_TABLE.cpp create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_Other/Mac_EditTable/C_EDIT_TABLE.h create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_Other/Mac_EditTable/C_ETABLE_ACTIONS.cpp create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_Other/Mac_EditTable/C_ETABLE_ACTIONS.h create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_Other/Mac_EditTable/C_ETABLE_MULTI_SEL.cpp create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_Other/Mac_EditTable/C_ETABLE_MULTI_SEL.h create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_Other/Mac_EditTable/C_SPEED_LIM_SCROLLER.cpp create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_Other/Mac_EditTable/C_SPEED_LIM_SCROLLER.h create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_Other/Mac_EditTable/C_SUB_MATRIX.cpp create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_Other/Mac_EditTable/C_SUB_MATRIX.h create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_Other/StCPTstate.cpp create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_Other/StCPTstate.h create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_Other/UModalDialogsPlus.cp create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_Other/UModalDialogsPlus.h create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_Other/UTextMenus.cpp create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_Other/UTextMenus.h create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_Palette/.DS_Store create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_Palette/C_COLORS.cpp create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_Palette/C_COLORS.h create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_Palette/C_COLOR_SWATCH.cpp create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_Palette/C_COLOR_SWATCH.h create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_Palette/C_ICON_TABLE.cpp create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_Palette/C_ICON_TABLE.h create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_Palette/C_PALETTE.cpp create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_Palette/C_PALETTE.h create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_PiWind/.DS_Store create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_PiWind/C_PI_AMPS_TABLE.cpp create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_PiWind/C_PI_AMPS_TABLE.h create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_PiWind/C_PI_ND_EFIELD.cpp create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_PiWind/C_PI_ND_EFIELD.h create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_PiWind/C_PI_ND_POPUP.cpp create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_PiWind/C_PI_ND_POPUP.h create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_PiWind/C_PI_PARENTS_TABLE.cpp create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_PiWind/C_PI_PARENTS_TABLE.h create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_PiWind/C_PI_PA_ST_POPUP.cpp create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_PiWind/C_PI_PA_ST_POPUP.h create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_PiWind/C_PI_WIND.cpp create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_PiWind/C_PI_WIND.h create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_QBNetAndNode/.DS_Store create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_QBNetAndNode/NODE(mac).cpp create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_QBNetAndNode/QB_NET(mac).cpp create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_Reorder/.DS_Store create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_Reorder/C_NET_QTABLE.cpp create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_Reorder/C_NET_QTABLE.h create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_Reorder/C_QTABLE.cpp create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_Reorder/C_QTABLE.h create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_Stories/.DS_Store create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_Stories/C_ANTHOLOGY_ITEM.cpp create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_Stories/C_ANTHOLOGY_ITEM.h create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_Stories/C_STORIES_WIND.cpp create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_Stories/C_STORIES_WIND.h create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_Top/.DS_Store create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_Top/C_APP.cpp create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_Top/C_APP.h create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_Top/C_DOC.cpp create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_Top/C_DOC.h create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_Top/C_TOP_PTRS.cpp create mode 100644 Legacy/QFog2-MachO/QFogSource/Mac_Top/C_TOP_PTRS.h create mode 100644 Legacy/QFog2-MachO/QFogSource/Resources/AppPropertyList.plc create mode 100644 Legacy/QFog2-MachO/QFogSource/Resources/PP Debug Support.rsrc create mode 100644 Legacy/QFog2-MachO/QFogSource/Resources/PP DebugAlerts.rsrc create mode 100644 Legacy/QFog2-MachO/QFogSource/Resources/QFog.icns create mode 100644 Legacy/QFog2-MachO/QFogSource/Resources/QNet.icns create mode 100644 Legacy/QFog2-MachO/QFogSource/Resources/Quantum_Fog.rsrc create mode 100644 Legacy/QFog2-MachO/QFogSource/Resources/StandardInfoPlistKeys.h create mode 100644 Legacy/QFog2-MachO/QFogSource/Resources/drawings.cwk create mode 100644 Legacy/QFog2-MachO/QFogSource/Resources/qbit rot icon(mdraw) create mode 100644 Legacy/QFog2-MachO/QFogSource/main.cpp create mode 100644 QFog-legacy-history.md create mode 100644 README.md diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 0000000..3dbd2a2 --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,16 @@ +Copyright (c) 2015, Quantum Fog Contributors. +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +Additional IP Rights Grant (Patents) + +Subject to the terms and conditions of this license, each contributor to this work hereby grants to you a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer this work, where such license applies only to those patent claims licensable by such contributor that are necessarily infringed by their contribution(s) alone or by combination of their contribution(s) with the work to which such contribution(s) was submitted. diff --git a/Legacy/Help/QFogLibOfEssays.pdf b/Legacy/Help/QFogLibOfEssays.pdf new file mode 100644 index 0000000000000000000000000000000000000000..ee622807cc8d2dc0ecd852ce8c0854d54cd24089 GIT binary patch literal 723731 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

r%Vyki5elYBK{S%8M@0I0`MwCtN!Guk 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%0AGw5 z?DK=%%h)Gwl4Ca0&Er7W6nDDhNUL`(;3&^3{I=Y6dM{N6ttaJb<9m5{fz4ZWRXR_n ztov=3A%hlgR6l}Yu9+ijB9l!{3RSFd^nG~!1!H_!wzR%sj4+$nO-UP<$q)n#>q4b{ z$#ia#O5IHni0p%;#?_VsIVY)0?>-Y;Y&u>FR@VMdGdvxo1~Lrz+*7Vsh&4^R-6ebl)zON5XmwQU~_%)Z5PL$wPRh{EM*G z$@JE1Fau^J?KMUG>K)><8RvOvh<`9&do?s(ML5qlGDFi?*APds%2avQ7f4vJNVt{n z81~Is$yrCW^4d$3Ey3V#O_v)scWj8G$yrO{`a#*7*M`15zJT=|j$$PgS*ti?V^LMR zxD%ki0vRD%E-P`4e9FV>#mxj3S!&`i`C?>xY`U`Rw3>o2CrLVrIFTSt>Fo?ny2QMi z8r!ZI_7X#)m)*h#bsM{Ob#|~c5t7lwiWT=^o;^7qoXF16+1M~BsJ3bpy8ZI5P*o(% z0gWUOQs76{&m57BQ!Z+L-~f-0A2Dai(Hm9d8H%H~%|MX}!U_ZW4D$4G!w@)%ke6Cvp#b<;XbO#GQfNx(l(N=<%Yyn_@Ovj$ zeIm_}M-Dn4xx+VNGc(f_4!LqgHIk0tTH|I*yDIOWcT#&fYTW(&GbMQGRf({*m?*=2 zb0f1NY~KgkA^WtVt;CDiV-kL{oJiA^kB*kH3oUtzF6Gp$6E($ib9_G_ zcch!Jzh}jgH1IzFPXzR=e%JAOuhj6&Q z&PW?7eCG*rYT^kZhsWyKN-XUi^ufBVqDUHblXVvUf+??ZM+mKCT#LWpRjZ^xfaMyG zbn__TlgeYGAa7g4?!1n^s=D~P9_?Yzd15y^^Nzn$JM^w#?gWMfz!j@?&s>X56IXic zuH}o&uw&dTZ(*nE=y;5J%(&^}=j6HzO;ymZ$90Z+qqJqBm6T4ph+%!2B-;3jLt4%P z#zNpt!ju>)DhSMGQ^lHP*>j~`KNqQneXv4+)uYDkc1%_(P{iJq2Ml?Q!OVcCfMzHb zs}{shVQ>)A**BA$jUN=H79AL>)1gdioQrs4k_)~@LxAB^0L zDZo3JY-bQ1g_}Vm8nh9OAxzpNuYzYQap@jmg7GG|QA??>wU2dT@z7TPdbQts08nOK7*d)1-!;GAA;8516jF zlCUyo{FH7eO}3!!4s>R!{i*$gND2!$n?o?T6g|V7 zS>|U9_uD+9$ML+B@@!5=f*eM-4o|$JprJEZ3B8{=Yl1l+#=j&%r>U_i^b^oL>@d;> zr$IX@4lE?>GF*M3AE!!LLmfK>ym-hTlYzkU7>r}Qxb*th@8@i+M47pDE66Qu!OAphsM z{}cT1duZnGpa3%q!@mPa10<=@E5iVu=pkNEJM||3Dqxhb+RTnihP=Cv0~`^Y`7v5p z$1rSKa(3Lki`S(rjco+P+ONAN#Mo`2LoU;kEqnFzq-k04^;~~RzZaLv4ITIKcVfzH zQ%V^{w#;*~aJAc;vE8=`InP#JIa5jn%FJ=}1i2|W2h)6^ihL< zh$}Hj<2GI@$xRG)n>I~;2?prJsMPl({lA4vUriP2&YZh76cI5l91&_>-5=n5CR!V( z)U1p1Uc92yI7#fY#O>(iQLos2CDyvTtcZnok(RokYX$W3#3dU+un6Bc1zvG2U6i+D z;CnB1#v49lI!t}7hs6csu32*Op(_6F$P?v!^R&&>!51q}VvEkRkxPi$5j z4dkZ%rVS+JD=s`ynX^6N!27r?p=x7dty4Y0

C*fIRAvNm5UNOq`msUJeJW*73Q` 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%0AX~m&=%1 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≦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�i3V@u%6$} zu|^ioCUioM1}?Tv&L$SNl(6(F9`+^#^n$jwcFwT$$}Wb^zrB{Ru(g7vS28hjCeUI5 z=r&k57y%^#=z^_7fj>aaA1X@2&)B^GcvLKRRhER$GYP8b2C7R!}%Yan*no9ZL!$_J$Wzv`SM?g#=kX_ zEDPYT4ZPPRpo~Aw6Uc;6)m@h|;anV)d+jzeb#)0s0TV?u9@K#gVK$q>oa=#snAX$y zuwv-WY%ex^3?1ORQ7hT*Aj;HKEzH=7kCELtxD{|z^Hw`}Zm581BclT|8~}gnt)Wq{ zR$soDiU(f=eOlMp^fAMimKr{Q{kgdlIbqDhMYbPolI>JA&EGS1KH|frxuIx`qQzom zqXsSGHvPS!BWF%SQ^jIL$m7R`ACB*ilGVI%Ud1%PN9Qy*7Me(igwG5SWf$0-q9sP8 zg!ogI4Eo1RBHXpGNJdS9V|B(tdlcDMHd>?lj^-*nesEAyr|IqBjnzrHKME%-?_^tg%CBEb`;^|Dc*+G_KuW)l*A$9^U7PjINfO^=L@WYd|63%R!)e&A zbcG_kF5>7cjhQDLgVhqdBWuap&q zYU{zeRTn0{qd*Lzev}A`kZGl<900raIS+k)?KfEz9$)c&s8h`p)zU7kO&3lmy2iKs zLPw<9etZZmDviYCU8wRGnMH_I>6r(y)ZT;&CPF0h9XXgGYr>*^!XOn0sL?VsA*sRw zP=*Bk;LkI5L`%sN>gc$VBLSIVZ}Q|uJ|zNda`*X|il?6{ML{=($D#!rX-v?8#x^ek zgCkC9eN=t~m8+0bRi7BS=RcFpQ|=k2TG9=$F8T{NZ#a@`L_V6y;S_ngqjWk(pX_IS z59BZr-oitRm@*#YH&*7>pxzwN*h;XzPlBb$7(&QCyOe&Cdr)>{tADpBOkS0CQ~n6~=~Wl_35HIZWBTqaWEU7Xe? z=*|za@~u@;$2&nBr*{RUp4*%@bjBq%TL)Z1aAjmFL+@Mky(%|7dNvv0I%CsBBD#u@ z5TDOwiao+h`=;Ct#5Y8u* z&CL73U981g=f;g7;-0hj*?a#avicss*Y4JtAD%WHX1X$7YMjhrt+h8o);loCB^R}9 zJCWN?B3}>}zZHO#3)%%g7$w_l!u0jtqgt<024UkzxQZ55UNvyOJF)RqtF-*dFj*t~ z37A}0e?zq}qoJ5j(3waS2=P5eA^myY1=&tVu0Wi5dsP{KUR;+yh%Lr|Cltz;Dv%an zUP&G75y_;in3bUmYP+o19=7T1b!8+f`RG%DWZfnCQSw*Mtgi6~|J0Yq3%mzoh6xXD z6Bm9L!f}K@EpGEjfF>wc;MCob+vki1dMSU=c^~#5j13BjQ#~rHtNTk zATH00am)AOgSeJ=@@GddXaH1QtP~A)-^NV}YlW*5fcA6ufPr+5)V&W(+mGk?^NE*O z2R@>sNKYypTeL&-b~!Qbm-6176|2qB+Fd_1YBt5M_jvA4`#E8q7 zR%~%c(E-c;!k=9!4B8$C1@W1UtiC~K0>$BjEc;H&C(?xygGV$QfjvKEdRbZ2Tg;## z!6vttpV1#Jwn>l6-cEI!GWfPBZ-fq~onE%5xr&ii@f37Ph`DV>pviD>XciWBTsXS& zyq;J-?g|acx~R3V1mBG|l;4&HqEC{S)(VMj=xj{YQ-K=+7GtJsY8u{m8M?z{;ni|X zYih=zM=5Ssx+k5VXtMcto~_J8?wh^lx_lTqGSXBP)s46bs=}H(2sq+{WPavWUe6fV z1T!I@fpOZjrCMAB!T9p#Ce(7rz?^bx5&G97$J>v($Ozi^sn5|Sl7W@OUI;kUQF9K| zroOSWAWRYl@LO6_ZR5BRcbI6SZN_Kd*pdw4`y1$cbfseF1obKLAj7eiDhO+t;eIRS zA?jhuEX6S=h~dCBfe$|wY^u_)G>n0NxAQd=~F`mTH8R3c_OOw&1BN!kP|-o zYeXs%KKW}vcArE2;BL(t!mT(%R_BSsvx6C{S2ype4A!#kWU>mVb?mHb$MDTGKob4@PCv9>fF%R}7345Zp6i>H5lp z23MZjMlABv+pqEj#oa-IDmhA@l^K6tin;C)3W(+$s4?nX(b@l8rf@l1FwDp?GjRq- z^`Id)SriEZ_h}nF6{048oQK^Y6gc0RwCKr=ToGGeI!8P6YB-DBeKd0>T%-t!I&>Kt z44elTJuy*XnuK_lmVVArghG)lUyu~B8!FE*kUtDaRZFsRW!MalSH=P{hm6F6U~6+y zkWHs;f&^!=&zqAU~4%Ij<;JFUQ^V{ci`(?)0 zVY}GfQc0XLW@%E&)vYgm+bMDxeue*>iqOG3f#ni_r z0Xq|Uc`a{_Zzk8(nEkI6dK4JaTF%IYqJ~>n7w&oXHcfThjh1^l7o9F#kB_dojhDr_ zRSn^FZ9Mzb^$l!pm}snprunqPhy3`I{HoxnXzLp$+s=*nUeJ39e6O<+grWp&m)EoJ zH+YWA-lHM2jLyirBMof|kRbp&P-+QqBks0`504F(jqyv*rqk*VFJol|8Rmiafpa&M zKqJmTDjE5{(lkX!qUxncqjwr9%WPZ9Hl@%Xl9W_t>JE<0)^2Q5916 zsGA}0o90)Jia6wFQOc@Lw!?cJ9QYu!vMDI}f;FXnnW+#K0^a5>bBv6U$gc)aKojHBvd- zkMV|w2#YFUZ?2?_4p7Q$D9)2T+2Lux1u7x)m~%YXKxKj)wPa9-QSn>ciF63QxGJ`$ z+x2n5ksQZ3Z>ZJCyCz3Yq#Qir=3E?72L2qj+oW|P;NW00d79sjoK!~w*@yfL2UDIu z6imFcja^RV{oQ-aY%n24Nk2XVBm6SGawlUx*-kNN1^xL~s{EHSW$|P*l$$}f+pJUL5&q(qNEJs)i4^OV^BPjeD}(Jf++XT1;Ocv)ZGT%T(Ptui$bS06g8 z;@9hrL-3cJD|xqeHO770Hf|lIR~5T^a(?-C=+GmG_J+T+RK@}O*1dnzS@zjKAhF=E zH>|^sqMnTBUmyQe;NbW9hs|bh7Tn$Z7F^TW_ttANO<+{JNOnHO#_1$dx365m;|KO# z*oXFTFU0rocR=C>5K>2_C0)K;KeCkHXgr-bO5b1lxe4O;EsovXTS+>v&#x*^{Ye}8 z=z!ZdZ769cA3ys{qB!ljd~gH+YYi3Wca=|i<|Ps`AvO&QfZ^9~@xQ*AaW|3Ez`nS& zXzHY3@ycMoTq{c4O>-&**t2~lB7o%V-BBa^1+i1I22PLgS*+?Ezl_m75d>0F0|QJF zZVT`7oFkLt&9QB==6L~rvX&V``+Cz>5+;faUtJ&ijUY_6x_e{VDk2?b<)vF=`yJR! zRhpX&uNVxg4c*QuGYAgPjNErG5KIa4lp_S+n$R)c{*l|vRfhQo3qCjlfdC^4f#+0{ zVYP)&b9z5RRfU-{d@7{1@TA4rtDB-mWpnKE=1lVGvja4<`JhNF8XmkUl2MqE7zuNk zpS${uG%?3F61=84fc{7N{J5vNb9LHa00enu)^{=R>0ni-?IG+0zTgf2TrIQ+jEz9Y zItY)2R752(MUQHlARN&R?dM=FTe3jj^_cMhC5ks(A;}i&R>{?wWvG@R{P>te0v&}n zNjs}1eQzi51F&)Q2X6hd`l#F<9y#*oF0iZvcEmt3lG;YHrE0gZXHy8~-nc+}=NoMBGSk{Une zu#zmkZI^F#pEWzI7DBr1-F)y-2xFxR!UBE*=Vl;KKT1lTs zgZp#>Lz$-5TJm=HB(w3 zO}RSqD0?wJs4L~YY3)MK;}-^;%li+h8|P_->3awNUwZ~+0`P39GbJpOJa9STr!Z4&t^6c5 zxih_akBuwY*fYcO-&sE>dVta=FO&Xi1o%A^_y2AL_`{~aU&4|ATOoi7=Knqwi}TN@ z9OrK!;s0DU1`s&?sVVl(Vq^hjT0|CqT{hn-~aSq(jL1TZ8^5HXe|b z^`BP;=$-%$Lw~XX0$2|HO$)^F57iheBfw$kFH~b(zbE?t0V8s;{@XC3I3RTU4RmWZ z(0$dX8*60Ta0&X64Xj?E6EU6>A+3l~IN$sEl}}|ucrr@Vv62%>;K5l<&1FOG&B){7 zrOFkyOZ|KItfuJ|CXAm;+5)j9nS-ZW(OB=UpIVLIy9&d*d#7cR@)%umi&}T2+*!3n z6AGftnds6lw`V)X$KaYcra)P`uw z@RZJL>OQW6A3^54zt&4SBQ|yqr*q_WsEC~}xuo!`>X6y261vi$pudf-YzUR=;EGWC=_khsRSnI-f>GE#pnj= zh*7sJjvw2oH)`S>cq{0XsVjHeHin9VVlU&|D!*-V7=P1dcYO|Y6$`V8H$W_vDJVO-l!iq@U!5DzP;*#Na7ISBCRlpD-%u_Ig) z{1OSY$`->OQ8`z3#N3(PgY=!c%~hiocF08n%na3Ej8bGWTb( z0#fuKfian9RE)`;aD~K+oPH-gPs@H28z44(PRUmC zIQesq>MxLX3uz7Hw*rEvrNK8<<@C65`1-~6pE~u6dCu*kP_l=tG*(%6iA})%Xnjr= z6~@lw4@sxnaZe*;wj}Iv;B}kv;>~l(@l|8O6O)UAXRvo_OVJO?o>k%&{6SjmM6wm) z(GNbTqr>DL4of>+^W^eEIb$Ska_U8?)*JQ@`*tykg9t^X%AblUD}MNMNToKDyVvcg z=Ei;Dan^|!i^vGm${r5oF~(P5l~LpBzU%faru7?m zWPU4KDednh&?7%msC|$HQqt~qlw!()KxsFaQ~H7wpDPwK0tJC9C{Oh#A4rpIW^Hxp z&&)}s>iTN1ab8$$BNQy1LBSDkf;Ghq+rHfhjo+ITp}PFk|8jw6%sEYy=DZlRY*=U+ z6Z(F%PBTM2J@3;z8>~S#TuP|)@{%^C%7ZsG!oDiK?5Uq0S?`iO3U6#TSqB+}>sS&~ zX!UmHN>J7s$+1W2E=El4h#(&BSJ#6ZYc07|SkHiEkUb`dz6Iy<9ggysMGX`2(b&&!cr3DGe(flG8MCU9i+fYPL74s|`a)sQ4K*SkQKCW

i(GnqMZhMS)j?R421!&+V*Sz~Qdve&O01gE@i8L74CT(3E_hqO;UAkqd_^NE zA8}x#U(l*n3Gk(T&A3k}1$D(E3J{QL8B`5L^9wK(nw@E7dH2fSl$uNA0v$ zwM_H<3kZ6qgQBnT0F zQeXI${n^2O1SW#xhIwo49cu{}eY#|W5{wCaz`(e{@UUFG7LD-fVmk@a!syd_ zsIv=V&v$naIvL1XJw-1ZJp!1xC2x@A=$@#_#J64_rS?Spgz@0xcFVVz-@UHV2Nc2= z$AD;?;5dEo6ZOZy+iq$@mbd$EI=!Sa7Q8R>oRgQ=+&QsL({Mh==i4~yb?Z9XXBti^ z*fcm0Nc^CLzkwSFcea@G8OHeqane6v;Gs%e+p~1uv#q{Yn4(R$EabVT!Nb}i0Uu82 zR?bG21cd&}ig?W0sdyXzHj91JGJnml?^jXhxL;b!)y=3rk{}yiFe$`a2x}l7m>lG+ zi3FKGs4z~B(;p&D&<_L%3=3N`kj_ z{EU=8fqxrxqST`b_p6&FR*CqQIcH(7%IA(x@9pb%%N35M4{eYe}B+-CwW4XF%Nx49=D-LeFVjznl_;fBlb0q|n2&b#CO*5?!c9 z5<8u5ppNDv;!^7NSl4@bgGj;4czUw+Ii0qBaU>%r~3t1O#^Xa1UKFG)eViiXPE zWFfr>7La**9D)V_66_{lknNt$V&uuV`+2L?O%Zo~37+m|xi#BaThaM)O zKxpC3`T0|_pfr&*(_VbbcX$-1!6c`mtoh~n44XGJhs4&qMkMz#C z!#Qr#8VyQxt|(TNQRrYs$N$%C$yRa32%+ZGQ7sPU4~R0i(9~R+ufejVj~Ubn z(vTp>?=HgW_n)DnjkS#;Ez2YkZ(w!fLKJ!gvQ=5+rHe4BjOKkO4`WlbVmWsS-}tiU z4xQfVEZW~1JztEutLa-Gdb`O6<2vL$Y^y={qSP|XRa-eC1u>w6 zDi%>h7So)0m!Qfe>-uenv$7-%(&~V=UVP0f_$)oZ?k{V1&^@iWaSvv4#>}(H5GE&R z*P{m8nk+STIH`eeJ|T5ethq85q54x<-*pG1yq?dHSQAM%&2`_4Z`~6FCh&MEFG1#1 z!gO{6na*ch8fkfs7YeZtXKs((Hd15Yr^KRH!NK0AXgikH(ygT_1;s^QP z-Ts*ueLG%YXSOL1y6;=mg4{Jwx!U;D?I6R_XuGJ-`4_=;*fF1Ld~7mV zgfZTJIygY^YD~qk5G+S8aR?74WvbHM zVVeLN3)33+6&><5Kohgj=&?s%!y7Au$7s?Nx%JsOOo^B=i7pIb^=tGzZ48^c1p}eCL$6!F)o?0x(Lx@!S ztj)ks>m2%U5WT^w8jA_}S;y7XmWNu*Q<tkS?l6?Tk36Gk!CXk(kLDShK~$bug8P975h zS1gb7Fm_JHE5^iip$1}xEcfGV&3ou=Rp5?xeiL_ae!8=r(7n=wuRRepIVV#`j<~&q zZXm&6yNa>Vb)!6AiLWlRRMp<@*BTpoTH0yR@aUq!6ZEkGR5rU7ptB*%HDxDf@B`d; zT3qB9OBJ>4&w4w;^a#{o?n6k5b-kMRuJTg6w`GJb507B|YrJu{E?maogPc>e7Uwz1 z!k1&p%{;zNb9V6sxr;h(hqgn-ta0!A-jI8EyI5^9ylqd4Z`tpfc>t+Iq?mR~S(8M& zYM&zh>NP3X%xSnww=|R{F7YWeUc3G|gWsdTn!84BSfj*|&+7*@5q~7k%IV$E;;lZH zTSLf_hzNY88dUH0;UpYYk_XD|XkZwyt?1AD+g@hDL&Gl}Yxpw)>VI377dhk=gRDIS zXLSMOtpxerNPS8vd^MYm6T6dGYn{_8!?u_6r%Z>n5i-iFopI4h(1xB}p1Vk%kXqr49#VivP^Q_$A< z2O#KyFYsAweYY8iaO`rnH_h?N${j^s&WuFcykPDRQ+=47U0mSM7pX^y`A8rl#Kx)& z8Xc&CN|o(^M>s4w1}=_;)!{J%l*qUIaJA*HhHQUjfOrmG?)AP1ByIKSv=JD{nG7Q{ zsuBo_m{?avUXa*qVRqX+*?l>cFUajlP2;@+kR=j^&a!&l;(($yYQu*cn=d5AR<{`D zSMe`}Y}xP#df5-A%3V+yGtFm$@;`I1)J??-IQs;pp6&~T@K>vf5WU?vMlsMqP$KDL zoYOgg#w$0eCY%{Tb2yMWKpDrO+@@wTwYe|p=iCLN8`I~*XlH%MC&@Ud*I zO*O~;_(&>?8{Kq)E3_8k4w>Y7!eOUHRhue6qCC=?K`%^Z@qKmdo2R6Mm zR|smJKN9#aiY%b5VA{cSTeOdQilVwE)f1;~W^2A`2oZgI{yH+|)GGg0>nz>!wbQZU zUw#Fo+6t1mXi^M%tkgM%wna7(gf@M!r{6e_gCWUl2RcafLqUuRJ_D@S3qmu$Ewuf` zpi(D#r}FBLd0G%BhlLSaVGPHW;vS$R-cgnXL!mg5weUJzsXpiNGY##_C%FELXkB<* zZFbAiIz#prB*%#D^tZmzohxEEyIieGX9!NeCX#~GBHJZ0KEOJ>fv_0@3M@kwLMhuf z2(QJ;Byud-ty!Q-<`iK5T|dWDyQG*9U8-uQYDFKg=b6YK5=4aZp;))e>l?v;op!-H zJoH~hk%oVcb_|9G1GZGMBlLa9AYLx(zVehZyO6Vt$ycuITE6(i)K}A?R*H?xxb2^0 z&EQ1&w|7WaHx|H5bfqzh^58lmqI-1l3wYmwmUK$)0tGzYWCGufi7o za-7Ib6|OV(37_<769GagqS+sQ9v#}nNn!u2K5<{H={TEd{;U_DOVIO_AwgyQno^Oa0u-UpcDV4$;k5;kLhU6z=)+o2Hugck{cKkG&`_L~KB- zqrO7kuzI-F79sK%+>xMVUPaiB+SHWBM3MBOTJ@jPj@xO}w@}%ZBywY6brXDts&KmRbbHM6}N6*%5Jj{9zedzeQO!MR5*t6CX^*P>P2xLg*+D9Xe)- za@$lc601VU@Zz>;8Rt=bQr>=~Uth{j+yrf(($BVoI;nc-KyBbWs)dZgo-rMe%T{Z| z6A0Hf6|n@)Z~W#D-N)CsT1KPn{pZ03?DYBDHP+BTMxuP&XZ?$YS0wLL=d{U=MINs8RM}BF z|DKXAz0mgC-V6@CKe~nsr|Wmd1rEv500WJeqbL)K#kmUMk-M=AM-~{F;P%C{lZS;G zwmUmT6^0O!X!9P9b8Aofs~WqJ!Jpg{+F^e3!uVHpDQ-@)SPP~Kw@zJncQ(PE_FF?c zbqoBl&kS-k0F^WU3_yojL%C`6bZ^h2eJ1_sZSpa}##I7+Y`%xk)^woVX|qSAwau=M zJijVV=FcaWm|) zydd9|7e)?A%+C*vi62KL{%2fVOwa+*A^0eW-_MSW0bZ_53tFcv)u#3047GD{US=~J zXM6qq0Ncexwy(vdW2U9^@tfx{`_w!4)pO@`J;WMwCcDBaRH{v+R6vQnCLz$M0$u1V z5jx^(?eH_jv%ltU^_67Mg%b3xoZzEK&MSQ)3@Ipo$4E%iGZ4uaD{!m(6|7I;Xv?%B zi>}@mo1-(E8=_na48|W`gb3ku(fJhvl9EPdrCQ8G?*SA>z8*Qh7ZcsOiLGhH3+ z(qXN|I$a;ir0}_YQ;6mekN4xp&l;I1XqQ$)akf_tQ6a#8J+3#7hS5ATQ1{?QO3O>- zB8C4|a6}7H3JN&GRn)+fEiEsDq%_2;4LdM}s~eEf3XW?j*Uptt zXtnZb7sD&kD@$Q#0RC`;>i|~Xn$B2FPt8;#=B=~~+lk9hR^NEUesZeZnsr$@@uU8I zYOEZCPfv6|B2HFI2{%r{;c-ZMd4uK~EyNeNa|tpEssZ@f4njxtge}48mWn7}atKdT zKTdGh*ch8jFZ|{zLpw_pB(cT)y#~HJDE)PUr}TKbIMa*#@i^ra2W$xBcMwz{^M6Pi25p-2_J6Kfv z(8tDb)^X%&+58AR4H)tM(SY5~WkmdnF%sehh|Y%C)5iDTtijwet;51Od9*o^6FBQO zx>$Bzia9!Wz4;z(DRLz8b-B>cPGvxX2z(CIZR?232dKqQ->905{5`4dk)li`wjCA1 z*;94pCN{J}-O7;;D;{0xD+<=hd2$)q(YkU!`gw5U?!rKLidP80&m z02^@c$=d2l_@Y!&E80_%qvJ1+JVip!C#s)}48BxXG9H#NYZQBsK`o$Ib`M%hlV>Y3 zO+f6-i=d($!#M!Q3+kVd$GYfoM|G0|3=4UkzgED+T@xNj8Qx9vY_TFeC$fVh?r&3z zRF%vNtm5v6IC_KlZFU5#E8_@|b`cWXccW5H6UjKs2;!=ceK93K4%CqN4)7p3UdW$3 z6&WbPlKjw0lGxmrI0sb5DE(tl59#C;q-j!@q^}K=;)2yEzcNO5s*Gcrjk*hZmn=Ji zLoODEBUaTqs_Og|oh(@?V}2m>_}nsJ8v?zR{v?FNKO2k1Xz{!iEu>YjSdsQcy0vj+ zw@N1G zk@t=a60RpbT!ja!l2Gi3JP*jKzG2~vxlzvSHD?QHpoU^)Nh>(cpDNO)$~m)BfP?1o z$O#rmt+49MPxXV%fU9qC_$~!g6g?W!*iz#h86A$?Nle7-9v9oI+iGUWKCdQFo9d=9 znR#|%7k#Ga0ld)r+Uh2=fJ@(cIyuZPH|rPABwlUSd$%dU@}zc4S-A}vW><~55Faf} zFk60K1z3kzdSy;6B7t*TBa4$B|F8P}l)A+Lk58OLT__0Jk$EZe9T;FVEC^*1LcGa^mpo9^f0=bHq` zxJE=;+Nq8LA7*TJV)$uztYB_DkPiiUX+JDb(1TzF&P};0sJ^m>c0LW~VpNkO6->^U z>j)&OcP%Qg`-muTrV`c;s(nY7mi#<;pLiX#bCbv3caC>gzn{1YOpq@P^Y+vC{ncZZ z>zxxpYe^x?>48ZqVo)GyaYWlVt!NgF!nLmmW=qH6A@I4vQ^!;fma=***r25$flx=I zOM+!7WV0%>z|C9`sh})rm>$wa9C{FGhYl}R6>U%UNIH=~D~p_QGXKZrefYRIF#r{Z5|nA?iKR6Zl4`#GRrrL}%JR1o!6 zbFjYgFZ&`E9M9a%5gz8-!`82TkN|7rdbXyj zHPma-#SO4`4~H^)k~i?qb--3?W>dB%{2NjO_{kuSmi8o2@$>KUm8u)`p^JO`U}&DB zO*%nt*k&;nQ>dOGRwQ0);+mR2pMS(aB>Ob#SZyR-Op3&h*UA`oXMbw7X#b2hVY9Zj zx-xSTR91I-?|t?hYrmI{cmxXDM%2#eO*GirgPZ#KONA8=|DdbNHZ$fb67v%cAX&HX z+QXcN2=daE)F$H8%vA6;6@(}bCZ9F@PJ6bGusY}JXE94(ptji9)1)|-IF?jcEueNt zn}sP?bE;Lw5IA5MMQvpd?GclTAHE@OhTpCl;(cblvAbA#d5K?XNgVLg$}9v)+RV}7 zB+(W^ZSv(kbycll(Y!6x95{dm#w~i(DK}sr=Sj(_EOt;+g7cmR$#Da4LYS|Y+B&&rW64PPJXMpG-3|#{ zvXrQX-ksf<3vrA-%<7G%bT2bK(EVt&f}pZx)oP%^b)e@<%5q!Q^)QY27Sv65F*Lyb zs^DR9O1H6oz-7jh{i=uY<(2LWv!#xR{V;2BcxT7$Kp7Sy@;&*61bfBxgDxYFM4pb1 zB-G$K&UecCMBJsov+DVa{1m^LcQb>Z6q$6FvnEqsa2NC`6Y$zvb33wOL4Lm2H&h-7< z)u|ywaaNGv2}@;^sj@!j3a2z-D9-%(5+%e`t}luv6ilL`c^%3%#sP@;fKls*Ol%1& zNVA@UGK)sPm!d9JfKFF=7F=;X+^ikE`rKHF!<`|1_f2VIf-fLmgNyYH@}G<;jdF*< zn!xyfq=~8P4F@IfzKV0| zeH8NyxL-_@U0WXxP6-#d7c0NkCu{daI}r{JPYWyV0A%n}WQw;R_d1>rv&AS@Csj*v zYZPjgmsrv5{yoYKrfWXYVmGSp(vlK=Rm95(yO;Mw;xU8GsgJ2bU!xb1NrzjYU%)?% zvQR?R&oIVyEn6(r0yu5pj{Sj7zSJdGD`mqQ4ZBhiXtz6`AVy^Kvy5^vi-&|^Fvlk^sp<7jdM<^uxxcNb!iIl2yv7^|>eJd%+9E!{!upVoeWLPX(aNLNV^}2e19rzx zz(l&s5r)p^kS{NXjo+9O;rL;h6Y zLKz@Sbuh3pV_r&5R$9PeD>#!UbqxfLMo7o48f@7*imln2t%WS9hv^Xw5a{;TIPon`WH@f<9Bn8l(|@yaO8 z%r0h{Q)=k6qoKs~{;uQujKchQG?#{%efkLZSa5?MXBK@G13 ziyxF|rx1rkG>&KRDtH`+Z<_}FD08Ycb z;{TIL@&E7d`A_3xEc-t?a>qx&|LY5l=`4UG_g5p%E3z2yE>5l-Sk(-(z^hrGk zG=U!?!X2^_ycaR~GoZ%o#ypn1Q*ptT z&!>OiA~63S;d6CMR#KX5?`Y#f04$hwbU0R(J}~zNhMvcVwi7woWJxNa&K<$o@AU^i zq=C2W4S(bq?RJ9zhlA>A2*wV)6U%^NEHE2lsoGW@1VnjfA9x z2CamWxa7%JF-a12g=dv?!HN?;31U3T)-mIY3O8{L@o-|(mcJz9@#RLxo5sSn=*3hh z#wZr*?ZlGm#8h;kc{{*M&Vj+0X6ODNI%YfoFukE8fpHulSf6?Ac&s=f)1rGf0&5P? z9&mue^yECS-ZK2ViG2=`8Q6I%5H3*wgXVI+U}hrzH&AnSsB1I++ouATpn5pKCH8Yp z2x)Wzlc{=SK^_3r0GRkjL3N<~wgAZRAN+cNb0GXQAYiyC0GI$y@M{2TF#J>iDgbYb zqySR@8US|yd58eBdU5~&p!_fZ33B-0dME(7z8`dt z9zRZY@^^u8(gfE8vf(U2F;DoHf~z4pn(*~`w*7qN(M$B*{r?hQ%l!)(&1#b0ad4Q1FanInkc+HITbmJ-A6JL&EKcQAc#bEW+&%9%OA}Rzu@XHKvd3#vtkqg9)8n7- zJ&*18!qEdeb80>(mxSKpc4&u8AlqM5~1|*2z3!8&SVa~ zUguz^Zj<-wz}9?>YOh1B8ZXh@T(d*U2`ZaPDm*r5JTM5DFJNFi3U(%(6l!Rz7AMv+ zU{DR2u6L$#`r?*uV8zqD#EV)DJmkgl=(RORnhVV7>-GQbZp|Hj%W4b78>EZ)IQ z4?AeK2@>xU%Hu5HW73EyOk592?@_1^##B4a&}~A3%qjn>i-rOHE1d==_y>oiF$Q4(+U!7DzhdXM**o%I>`^hF^5x5CmUY zTXyU4j$PYe9A{3bg177(F{5#6tPwVxLFKAT6}Z9NLh)-Zm=>fkc^i6C?-r?At}$&Y z+JxFn8Ev{Wvkonvr6)`=s6uK!Sm3rXk(%(nK>y3+UaL;&x$?W};AE>}o=gRwYu|(Y z9(zBVPT+9HVR%)Vt>1P1YBE`nn=1TO#tx%bQ}>#6S3#xShni<=SJ^ziCCJQhlFb@X z$v+w_7Ly-#JJG&m<6|r#-+fn%R>FLq%$M z0T3J%+4gm@^yV67yi1%Xy{zk2pnx>iX>78X7uj%-#M=Svh5VByKA7`_xCMO&8QQ5a%yhhU2r;}wqwXUzM6R;Pgr z32ATe3p~;-p0uROXfEh~P+GE!GfA>)(9D%)q1{-sEOyIq!?3<|;9^`jB_@WI`n%6_ zA#t*M3I2Rg_Z#Rg!ff6?@93lD<+JsY%6njRh*KJDVQIzU3je}clA#eC)Bj`t(hF-?D4*76EYjYFyjbb<5Q2FhqYZZbd1PU=E4G^d57&LzI%4A` zia!eyYUAm6GH1V2;Qzm@BwhyOb*vr5?uZFzrZMWz7LS5BeC{7i!grN)KjPc$|D&OKOC;|kl9E-eD3tXW&VBV)y(;aq2G zb~{#XASxnWqjS%|(sm47l5y14K4vfz8Y4y3Hr=f@O10*h$RUK=@yYhy_p}2w3VX$@MloG8VF4;{T)tkI&yJ9bGw_e+NE&bZDhm&K zMv)nL*)Hsr3-7)u(*nbg99o|6F{`{8CJR>%2L9m@tNV3*ECzdc@H6b5EFx@gtj{Hl zRxRTcqamXZtZZ*U*v1$Rrb;+Mf+S49ZsieI9KA5tKw-Ja-^jcjYop#QkRp;zcTGS1KyF7HvUB_X;waRi;C$F*kWhCa*rp=UJ?5C4-vZ=!cmSzl+@O!#Cw zN#hgnKSt2onM)GBO>;FW#+Zk-Vw13+r;{J9j9F{4qU4^UbJ?ry*>eJ28gaf z8J`Xa{Kz8PAC%nEGzDMRP*aGU5j3j>!p+7FY|m2mJ4sdQ1S^c{osB!B=et9>XSYX7 zsV~Wl(5g2tJo@d*-dl7$Y2ATSOnoto0rB}L1LZco_lqdP3(VA0rBItyvnvex>}`yz zj+gqvyy#dnIs{K0pN=ai6jQ~Usp)yBvv$~lFYaoK%xH3Tt#Yp$u?1?`2#& zwi%A__YGQY>Nj?4Hz}c9A2>5t-f0_txb5A^M8vL*e26uRX&%x-!-C&iCTg|oc-Q*% z1;Sxajh&j+%rP%sEIn7lO|1_`?=alFwv%N69s~Ko+mOboZA)g(ry2-Q&{_rLr_u?e z1v8mf&Ns_=(%h+4w{o`Vet|4ps3WEhbG>H;W>P`?blcotMH{rcqI$KHwC=J}Z=K5vu@ zERh`*&I~OjA(Coaoq>SLIc$7fub5UzwMT=b+|t2B|PMYrDfq4A>vlZd3bK&uxnDLZ9Zikf^sr~aC zCv-@|c+`lIr5SW-_TnIOqf_8Zwx#wL;}6^lOYIcpT)?BU4m+dB+UMDxz-oWe$z!+z zh=j#Y{yuqNV%u;7-&;+%PufrEZ994#{W3 zlL*ycaAOoEr5oF8q+awT$T6WB7q4PwiDH-68K=HV_)Y-*cnu058@9;-N1K0xCFc;_ zstaEmXbqtFqmGzF5A%+`u@4v!8%FZ_xL;q@d~ZuuujoKPBNJ4(baOItl5g!qZF52e zTXexmc`H|4Rz32bLt7>}+8f-QP%TUn_0`Ekrs#nsC3ug5a!L^(S8!V6ACMxy!L3;2TV7JNah@5H<2PUO- zaGm|HT1N)>@pFSjKuRhNAV{7@X#Yk~mvjdJu zotHrQ=DM}XZOM?cZ$^h3HDyq%KYyF1Nm{E?z8&w4?E0^&8KSQ=37lOcG-0woSL&g* z{+5Et-^-f$vv975V(nmY#bO)KOBCx z4M0INw2`x{`8y@oZ2K{4Osq=UXqCD^sBX3L8=o*qs+Jpb-U!rF6ta+$6BCn{vJ{q; zH8+oGlqaw41DgIoOYKJsVo%YJhCg&X5_>Qxs|d+aODq3VN`6qCnAty~y7PN(7B?np zM`6rl?{K<8GW_-yT~5YpVWv+fiW{c32Q1SgH_g;zyEgU=3;|*#up3cXMHrtw0!0Xn zEvz?*yqr%tX-BMYS9s8v9MKq!pelK`1bKL zYh&Pt3>{`6-RvrqtQUx(rvAAq(lFn2FLJ%=0LiA&zt70kc@U6++8+f#bK1th7L{pM8};l86+dxjV8MK}^O}FN)rvQ~r|;9@FR?YvnqNyYEkYZayiW-S zZZo&}d~bv-I!*Qw3M4R)VaYXlU-xe8-}-z`O3ZcTL@g}N^sctd8*`3>P)*&ZY9-O3cie46hXPTawQ>fL)qI2IU zG)qkp!6cN4SWxduDr37D$f7+C_%LnOB1{ivt4)?KT(Xu*o9X)Ds#{Y4_i(xoLHpmNV*AMp1tpG8NgG|D*(B~ zy@oGt3=OoClbcz+(ip?G31SJuSTQt=hU3^*!0@VM7H9$_LHAYN|xqFgbEh)`CGr|_R@*Izlkf$vwT+T3ODFO zBrNw@oRpkS!6_kSi%nE0B#g7r!aN)0+43gk9`;#GMW{H0A0ffRgGG4bQts8CPK64Y zDZLJ`o);x4%(4UXBw<4uX7mV$x8!mhfs}!Q>{1#G&z zkr4}*hZ`gZ2=?mN>@oo=|LP?jC6E}xm7%-3QZQ}_l96=B-%VPs7^J6joL^z-sl~qt zHpkkoOS>sR{a70ZM(1c^9O)2Mdg{H@1<7^(m5&mHRwf#>qqG zd#1?p7WH}FD{}!xc%%NRUrbWcQMa~s5>YRJwlcJC=o@!hoYtgsz3`vWgPpMJR7(hV zL&?IQyyR5U)&!#RaysXMc2x0P4|dh3h(z!Mxm4T^8wRl!F}&uq_hT0gU{mFnKR{@w zX(wbN=HM_ojbIL(^}2e$-nAUsx>4eM>*~7b$9X;Uw}r5Cd#!%95|qxb+Ep_*Y&$$I z=4zgD$2ee!nGr~ndQ&zcC)=Vp8gOr-(J477!cZsImL%KH2eSIb&cBO@8t1X;P*BP% zRg&H275EY_$PpkgR6xuek>gB@1~y<%)rVV{kD^_g&b}Jt#(8vm(~m0v9aLk$bUj{i zO(5mc30ya3%@PGKs0L9CKBTlN&q-+jn=R^`(mFoN2y<}HW2A8AmRP2b)U%peAFhsJ zM71(_GS_gg9*Jp=$fk8wBt!uQ`LGi7QaPlg{pEWil)$U&JG=weOkJ0`HO8D_IZ=M_ zXk8D!P%L}Zn&2|tAW8?knezc30|_M&0e$#N3%YEN+6kwcV3n)K360W+b{%Xn(PsBd zbwpI)%uS)h>L_}vSXa7g1lO%_ zE600rIb~~EVt4{(Jm}2q{J{VvO`DYa9RK=^zQFuL9~G=Ke>aN$0JeQ^>-83lj1?@n z++S6s)@=s5T*3M0bEw3rT)RtE$`|ZI zQCWV4GF5VA5oun>bWVQA_8*;YhM``R@q0-kv#(?EhGl@10CON2GO=Hl&aEqV)Q?Y4 za~GPtH@_-Vc5EmeMMh6c$;&i%yT&Yi-r+^wNxGwmucqu;a2lEk6CKehh|z{C*P##$h~Ll&eGvYdmaUr_=xG zIFOgmQpFBTJ5nh4(^-Bu>6yC=YA#e29+%zc_{=S4y6tjDY@_W^1B_&c_l2 zU^G(~>PImoWZy?prSX%L*{q31`6oLrz1vnMC;J7?b!sC$_eI)4%y%Q;l&z1;t52Ge zMYLM3yvz%V6q(&gRx76FUnc6=nnola?79}fWOl(uuk3N7IJ7l86-`t+(DK<~kGx#6 zy{?^Jc5K~mP8`rYhTL+FY8tj}{LqVXx*pvUf-yvH2++pKA*^u ztNKJEAz%GzBf_cFVY|&VFDI@*3whel;<_IO1-Vp+*FDi9dHI+GB&}cs;r;OmI-niB zW^&V~{RsP{=gthq(}K(OG1ADZ|EmDF0Cr*BMuj_lH9A39D=fvG^2V#WVcqrjdhN=x zXutilDlSieGxj}&a7k{E{9K&l{*f@UL6C1iZ7#Mzm6PzgG0uXRb;e{yDuMjFUGwgs zL(g~&@MLdJ9+=Ib9J*-HOfT2=HubS)dXc0`g?hS*K#kKrP-hTG!Z?pEjqsvq4uJfF zv%Th>`b`8c*90$t7r=+0olI3?HEX><-{5^xG`RoaBth99e)DMmzFRwqhR+TrZ#Fdm zLy8aSSRu=;ANMIUUuy)N>i~Ogo=f?F(c*_QK$dZ;`Z@c)qYnmpg(o`-U*sYM9E2Fg>Vci-iIKj<`(v~|9CMd zlW)VAhkRp2o+5hE%kY<&JF83?s88#zp^_z>@V4&m{NSIaFWQ8baFH@|?`6t~$HW9Z zWL%%?glX_tpB!J_rl|hG7^&1>SgyX@6S@u$4}sStPqC(< zHJl$bbeHB+hYWp*tA!Zxp`4joPc4E&NQI?2-z)}c8QufVEAO1FV`=eX->c8~v~}ij zP_df~O7VK!<`y6~dMk-d5?*y(5SdXaXL2#tx`Ck4X$`(5oM-J~h#(M%HD{ab-%$&_ zmRA{(-0;iuoSc**J*Cj>REHr-y}n%#snKu_4wqA?5n@9}J1h=XT2U~%H;GF)QlCIz z6umeGA71MM=UBpaiQ6zrV2`o5jHpx_=hUqFtXoNvIn*I`;f1bspo5s-h?ikjhGka- zAr?R}&4+pg{^Dfa(@!2C&99PDs**7|-BLLxSb0!LXc)xjIb}ge^NP#jqOk0s{vdwj zOp{|?I6A)ME*6$Q-2Y>^6D(TWDJ&QSqUX{0l}%v)B}v1%sqo<3`=%Z6@?F->YM0|m zkPTP<*wNMWsC0I*UMLP0$6bm^{;e=WrrGYN<0EnzPC(J^8P8V4$YRHv!Suv>7}6hE zyMjk_k+$lrQ56U*`Ijukwxk~p4^B^>54Wi%FF}GN3;lYyj0ank<8yQB@xJm-@8Jyc z6&vY97R|PEHfV^)8W}eAn0bd4muiTu)R-orDJ)lur<6*!7&u_ck164e+@1?X0w{!?Um?5Bykn@OHUPKX(sFyDFs1 zi(jmWP-Lddcs~`OoK`;sNY*Ul_cgVGWK_E}=TmUzlORY1Nc&QTAnO=YdH5k&>_hIU zS`-+LjvK=$-;f1Hjdu#Z|B#yfoHwFceFp=71IM_B3L%IXVh<@-rkg3(vN#$tH*%t1c^o(8~;UfxO0?}Zr*yY{Gnzr44S+p zHQV&s8`%Su)kL=)ABRF#Vm8Ons9?4j9;rq^pRNs)M7K6sa7q>Ma-<9wsmr2+Iz9hU zciBGUL8LFzFweHM-6eD|ZMS~xzPm7EHwUW!5Ip+839bHW1#!54yIPCm*MG_+S-0YK zeH?Zxeb%9VWLQVB5N{M@h+5hJdm3DXyADP+u@J2Q?wov9qC73K-Y1-|eS?{V2CLNV zzMwGD+9y3D`!W_cUxlJzjVyVu_)<5MAaAf=wzdkna(7y?Lc4S@r>GFu}k$mlu~v2dr}Q zJpfa~O>K0N_4+MQS^ui8g!a4L6sb8G>{E&@+ao=tO{H_=^E9cxm!FDN_3MHxx1n1J z%qzn^Z6#h?^NO~PY!3Gd=MfE#d<);dFrU%TO>EeUejRx5h|Ab|bmGU*ntKOL-iik5 z*~7uBtq#twU^$6w1Cs`50vDMUvg%!Q$%?poSN%|KL_?#dUHYuhN248q`(+yzpHaV; zHJ@;6k%DF+@-fqcul!Dlf_#o?x&-^fXc2Ceu2RRnE)hs;!${21RVC?Ne<%wf`OwgQ zUn)RCcy(iYJ-yVJA^j9%y=CA-!uoK7KE4B`KSZQu!-^=DQs$NNM9f!1F@+zO(5pg@ zGP8K^I~{kIS9e^tG!)Zp8-WL?YqDoSUo%B37_a;Y!@N?0nrRq0elmp9s+O6t_-JaF?N@Lj zm;^xJw1q#f{OVA5QwXyu)#DW%%*0&Wky=rZPvt=lIx)O^<2nt=>vIhh7kw8YcG9or zdBQZrml4#GqeH46pN%NDNK_jlA=5)!5A@!qt>>@PYA)0Qa5=2~6y_f;l?pce{r+TI zUnw2fCav{`9g0%c5r>^z5?B-Z1Cd4|=ug~1iNNv=}UZGn}M5lBEMuoMH~?J$|JK8TBHZI;*h>EyXPN1G_%oM+*TKjR5* zMoB`5XYI#R$gmI)xKX!ia+u|&tqrv0dK2%foB|@0#hLEw$;1v@RH?bu6~p_75f)l4n(*OTn2Lb5`xo;q>`~zi zUA^D%-A&`^k5m_|Vw!53SoKQqto`y%kY7=Gz0(r)+3g@!?z zghJd8JoY%Y!_DT|>)dhxFrC>S3UYozlx_m7+>N(fKHgZ_vGs!!$l8jknwv&qG*M%w zjxQ2MdNeJUA3#Ua2+RgOV3KJ5gbv$xjMiimY`Xg|p%?KfNBD+qm_znhbMp2{*B zFOvB{uI0~)Uq32dYhq%d6pD91NZ{5whzAB@X|t<%3{W;@UyQc`~@aB)L2%s!RD$TnDo*xi+;|hkKC&ORBb_nuFgQF8MoP!5A#P zIiu{?jrc3fkxiH+()9={QHo-DBTJwV|Lmw`(GUbhN$}L#00iiYUYm&Oa!mSStazJK zaAeU)kC->zg!Cusz|bonNC%bJ8c6iua8?rtita33Qu}W8=6lE)eUT&miO5cb#|>wV zCV}b9V8C8iJR99^b9r=wZFa9kH+jfpx&EE`6C~P0owJDogW1uaPk-z<<=%w0#f=wK zmY?oo*8HB#5NSzstE5IxLssN!N7$Nt#Y<)me9c1tyQ1$(NDfXMgcZE#=Y458%}Y6$ zzEO>J(A55?x>ZEUE_)1GKUeC~O=00N{OsUq;|->b;PESXJx4Q#o=4lNJx0~Z?}I4F zgq_y9tQQtE*>}1uw)ocUCc^pybI!m!#8{XukRW7#5KYYei|2)r+a1XvFP~r<>1kY! z%IGjTkBt0^s3>7F&5uZ_axXXbY=Z~j3;O1Zivd!oLhi8~Q&$>QCp+;*_bu?&6% z?c?g z$N906$mzD_ z3tY%+W*cTs`0FEML$`C_56H?-m*y`a_va3(YWI_@dMkGGpqYozUI6nTIFE8;j2DNbMZ=^XgO>m|V<5wVt-~3}A%Iq3T`jPP;xUOE9Tc$;tyH zOKLw-+pAtaTU$jv$%wJ}{#|DiOA?Vpl|c+ed9Of+`)g2df+CeMizixqLBh3t2QmEFU< zmYtD{nh-uCqJ&Puw6shtOm^jm8aN=II;e!9eE{sJqInQ-yl*=nXF2X{Nw1S}uj<~V zbvYa|m^?;Huwok4npo(PyKp+1N5j&N+Q+#4=lXs+biTLk)ai6CJB>wMLXky+rF<#P z{kqKZVDaK*cCTQ0=|SuLtjG5;xgF#t0WWXllLqiJ&jS?*<FsO&)25)*~CYpc?vc}02l4(Rn zT7{_T`iFg9@-Q?UFDk+u80@SU%kqF5 z3k^LxsYcnZVR`v;{36Yg;pGG%c9&3O?D)+r8s`I`fdt1iVm0dFym&f|;JI-bow!>H zDjb|NrUIUUVpG@{g@&+wXw7B}#IP;C6*pQjcBSl&f`ywj>Ri4J#GOL5S}5T<3+fh} z{sdF|eQI4sK>a#4Mrmtg70c*5Cyz*x6x@6H4-@C$+qk04ass{{ZrPp0FMgkr+g)uX zScQ-DT4)v?ZZH(JYJ5b!40okc7q=FvTNv}>LKceWkCe012=i0OJsV0{t?YXNa8pJ%vOV9+9rL-|98WK5`L$dz7 zuWV8X29Bn)Y$XEjQ{1cns@Hsd%DNme;m&C)W$WekW9r3wOZE!Qvfca%Z(B{X1M7=>Z#^rES?whK zP|@cex(uu>E{l&IZm`_r;eFJ?wIANPAFa8f4uE$~pO4!PK71DomnW1)k8^45Lotbz zY{7{?Bb7sG!?Um1T4LZd|b!_5-g|?ma_N26(6PiwF~$~X{2nav0Xmx@3Y0uD00J_ zZk`1X9bUbHuq^SEuNzDCN7_19CVt(2Iv_ETs@M5GnHE-~A9a|xjY#06x8(uu6W_C#IE zx-(XZ*ZjC}p4gXD-n3k@TE?oAM%Ji1D1&U!Ae|*7?3g?j66?q+r5_)IuSzVhcs?y{ zIA~_w;iY#J%1xdvL9d2%uNyTaMwyPk?>D#$!i=(5@MVX@&-H@KMvSUO8`3%v_AEJ3 zM(z^Q6g}>dH{n%qMO)NsEvuy-5X95ta}8``gkGnuOA)Ddx5jR14Nej+vTkh;`)BT| z0WK3TBEzTKR^NWM@*Y=MQm`$PW!1^Smeob-Yc{B7cg)|MeOLT#boP8j zl(5&BUUX1>+#gLYKX7f>8Ty{ogo<{>fj5C?#EQZ>Dm93 z1sh|2h4w>}-rrDMHeb4NQXefPgzeDC_p{I`*RI50Og{pY@anEdwl z58waz@RyZ;UFt+@=U{8(Z0Pj2#ebRnd#x7CKjOAFH~M?)KkfeQ=I_}5lcWE-`Y&Vu zb|8P-{kL%cKAXQ^|GI?lCI24hKb-wN`S(TqtFeDy`JZ`=>?rD`z!WlWbtY<99 zcRv=w8D3!yt6>RyE>(#o_UDhxf96B@19={fg{qdUuMfa4=a-eH4G$m73a(aUW+;;n zatieOM$T}^P%~wu=X!8a8CYlZR2wWnwL%JbJp z8kmizOFn)%fs;2*!kY=5^yc)jUdXc{66X0C`+J`%fOmtVrO_M`%F$&tobNi0=k5i5 z_Dfx1T|WhD?U#+LI9TvB{Xq;gYcJFYlfzc(9M0)n069anhuUjH)M)X0fwuun{6X|6 z)L@zcx#|3<^uP{sG1tMq0AUqdRq!xu=+2}vY1sRbamyHwn;j9f1Pr94*h*p|k_Iw= z;#TcRy_Vu&n=(xxXjiiE<6#-kz!X297Jxc7z5*8ztTXf;MgqNf8+j`!>B`_y`Fq|_ z0R^9aYfZ~!ppU`S23x^^zm*RkHwpgcE`h5KxegIG9{24@fr4|=7i07a;RkEZRt(n5 z*Kv92FZN3Hkq2g-9EdgPoF|)NI|7oG?O`h@vXy20zJ+Ttl`jm%ENNimY~)r+N|(8o z=lGyGY_T{beCnKe0Q4I%fWKieDK1yNLUJZ;lEeBd@nvWT9f>_l90|Q-ACqy_szAu*?v;{wRX(CuL!gcPC#L)pokW)UO zQIHosUUCqWUP!B4cw|2yKHxV#j8XtFe%M+=MePI$J;z#jDj>^28b9PAPRL(DIs}x_ z6dcGK3$h6Cnt;q~RRuaa3-#PN zXUFMFtwj%>?b5`P)6hfZ#X4}484G+u#+L-EB%7(&Qr!`^`XX;Ge_YFjAmYZSAX}aB zoj5=jyXH0{FjP=AFvv#BlXJs2(;Ldn??486&JSV=KupB&? zHll;d8qS?r3ABk;kuR#;8bnKXRUt@s>IZfk$pq;AEW!x_R`LS&jmdWO)!GHuXA z1rfE1AaOOh@q)BQc8W*$n%bh>66I8 zm1SDfOa}Rs(&#OUYJdA#q4kvfVp&QH#U|@Bn)~LWj8-#a6iApxwMf7xItzv~aRpt(RKI<>;ReZ+$q% z4lN%mg_t7)7WmS>mlEPmHu*M7{mwIZ-DAm@uFh4_Xwp`c(fJ531R4P*Gcvk_I{R2F z5pD(KETy{qevCYUmU2wQD@e~LU>T^G1}LoQ0HcdZ zYEt5}HU|ZuX7iK81}?`Pk`ktMGly7+oo&prWN@FVvpG|eg^6N#>$maBI+Em|R0Uu( z*I7qy<6KedZWcaGS-w){H>KKtn~`l-~x=xzzyRUuYtgrj;*W2Ts9H#Y)MfjSt!QuYa97927snk}vD z{SH!0_Jq6lSc*bt6LVnNc6V)CukkiDZyXv*(D1uq_m2nM(JwpmocnSU5^I0& zX`jWmjhkQzjxfR3J{iln*YitH3Raed5}nP}bK%83Gb$?;dUC)cHy_*T^l6lM*FOq^ zSFomOcfZOfp$RgsSjlr*RlBP^9i|y5pBjE(?!3(sJa^ZJ=+Ai0m;BNEL(HNk!6lhH z7R;-y^pr`~ZO#EfR%eQl2rtz;CfZyn$IB@j3D01oJWC+(>DczU_IB&K(Z3y{`Gcv2 zJg@C)PS%1SzyTVxF_+k@l}af&h#?vu5+tyXcu6=O85Bro9WjUTndC*$wyQX>N^07P zQcBI+f=Dw%&CrH9&Qn4L1B<&{sP5EPZ@RuB;Pj}u&`VY$BIu9oy~}=p!v|x`GeT#R z>6Z8qBF7rqh|y&j^PQJy?&;PGGmG+eLH%4d&l*Z)Hh|}Vz2~l!reu#X9CE z!OE~I^XG@!T#A+BUYg^su|ntAR=c>MY`*66zzJ+~>%Q3C0cpKc&V)prUc+Hs=O`3K z(Egfr#-&bS(Th-o9l<_RhMHydik9r5sm-%@r)YhWtPGk%xWoL2B0+Q0t@doQb>W1fj`kyg(6=mFX!oZ zEj_9q8^i6zC7w4%FL<2B%QCexsS6uhM9fw065i6D+S(o1Vs9ycdfJO{^Vy_#%*u@s z7p~FJ6L(vPJ*KtI0E~huN^gt!$ZZFr2W{h{!`1q<$hF610w+vRQD@RV#)U;RCmGMBqCTMRtb{LCxxr`}O<=syk zktq2%tMLGq)#V65XU~q&UF97PpYNA#j=88G?Dg9tufO$@dXmF`r>$}S@-cQzdcPX5 zTDibczy0Mx$n?HEKBdZ&BYo(4;N{W=g8Svp=4yYjyU7(60v75H00{j993gkCBXm9 zBox^Ge|QAzw>7nY<1I{#f6wI|wzS5yhUN~2 z&ekSY-%#21d(=+f!Pw?6L`-W!>p-hd>*Q+t&#`}?Us^|6Co>0QV_GL#V|!IcgBkxj4*qNC|Ad2C8NX|S|5qHWq-?H)Y>HZy ze{93IUgA_qs2mlKfC6(m28@ja5~YVs7HY2#2)Rr}{d?8-JQo}Wk13Q2P=Hl(j*1#E zpNhKF47&xvbkJDJX&yc-EFGP>X7mWVgw0|qE$6CJ^~v)o+toHMun2@dzVPC7LFa5^ z1GVyY^_W3t8toi>hg)Hr3OF0lL<2JOA`-sx!`jX&26(-sH+rnr_Ef(EV!8wYF+OqS zeSyr*+n3VLw0Bo{s)Dcp(Xd}YV8LNT`EEZ#Tbnn&qYRl|pC16hq2`BksQ^kYYJ^>z ztdU%*Kvt{RB`Pk>7Tc$ArB?x=3IbBiw|>HCxtOw2rUnAhQ}}vWXc&H|lxDacF&g|- z@-I^Duo#G6guMd%xFydCV_+I4x zC@+W%gwd^H-Lk{+yqc{V*u}|mn3BT`+Jtdlq+#(~36w=g#!yCYRqK`QRqSU{8SX6d zEJwNtes`K=UCpho5BLmGzvseEBi(0|-|8b2mlMw`_r1AbJszyB7Pj;jkw%(ULfD{8E!(kn^DbE30R6U7>&B;{nN%?JL*&tEz3MK(-*Xz3uo~<__QMf{rm{5im z7V=gh?d2m*eula2rAEb_WBRotNQebl-q&EHB&D?4w$N5=4DOoyKoKdvz&~k?P)}-H z9;u%W6QsucgTB|V^rHPolG3Kz6UWjnx*`xAsif;@5RA(9Gp8M)(^yBto z9#bFr?!x(#J9YZct`nY(%X_*K$=jj55u%3lM!wWZ3q>mfOOnmx@0eYGK-LkCItleX z^Z93#uW}{SN^#d+fg}a%CGYuxM=ri}noVR%$JxY|J6pfYURm1g)KNuRz7HS}>)L?o zaxRnd^4fO0$MtPNP}0e+pb~?%gDFWb&IZbR>LeVpmOLk$))R>Vh)2)6+nB@FnqC$+ z!kCgBjQD%#M63bu&PIrD9dQNe{!QzXj;hB?O}}{cPLWrYwnP2g+`W_<==}#%_~%Uj zk89uVjVo>}S#6w7_c@7;GPzGN!K^Z6?UtXE3>2d$X=q~li%$i-8`_?C9~z&{H|sM? zlS>iPQ*pF+Itc5rR%U+|SemZNLnn?vV>V`08iF%Cad@J@#iS3FcTU$~*i}029uJG? z%SevlpJez`%@N;)A!;^qg+^){VR1syXvvuq29|U{#1m%@2_aK&AWBd{kfrUCxix*6 zp4<{N9>a<&vwGfUjc7F~#Ew-FwWvHrrBjXHP3}wm&V8VRV#v3*dG9xNcZiPKJ`eq> zBPy#^ku*l$jt&Ej>B`#+Ur&qcqkGfk96? zVGqrhrl&EzYu_uJRzrM=JvYRIR334xIw!Tk6{icq&LI>fDdn6)%jYB-| zl`@2BhP;m6%C`>NZHHxq7Xo{s?7;eQi8UfXkX=461QJDRB*rnwXotf-FZnr&p!oH+CTRz25CzOvKk@48`? zIuA1L+Hb3)o>wDYFZt=5-()Bc`K4=VE>US_j8ncpLb@y0Uaxab9O+stp@=vr)3xj_ zDE!^DSR>Jrp;1we`w=6`)KCNsDj~a{SX4V}|F=>xf&r#<0VvUmHyEJ}Y>S*f6!eU2 z=4+Prx=WSv2@=dOrnaH?cwQ@Eb>0UPrO9;W%E@@hL??50x-3y;GG%;c(qss)s4mXs z35Ui6ML2Z0P4m6Zj-U^nR{|9s2|Ew^L$du((BqftKm3}_Eooo&`rw%n!zf$ZD{>)*We&$BdS>`1oGp-utqPpHMq^A(OR*A3r`fmYN@cOvfFTUzjr9I8`oV$ z4G?RzMVE5@$1SS6%4D|&vd^JaPo4$kQSvS$F{@x-;_u*I7^KHOsY~-1(`9S;UziO- z<6E>u7&LSDI?_?=t$_uGBI=RPPe!@fPn}51N&C!ZR9SVe&2&Ovf>IF`-CrF=Q$ZiC z^%Qlog9p#2Cg$yK)Z-?O>UAV1x4~hTWZ_aW1;VV~ua5aa?daow6UlK2K}6`YYIoo* zL_K#Sf6yCu17-W0;~$2X&b|Gr`Z=FiY`kxBF>!Dd;#Dec^zm`uMX9q8LBq`W0*bj$ z@^reUUQ09hc=~=rrh?@;bWAKAYf0Q^@;q`yevM!J2whzS~Lam+TdR;roi&KU5#p(i^|7BixPp?;JC*mW`-l2HZ z_`s)`D(U#)+YJ7rYP%Cw3Wtx_;Kp(1X&~Q~A^P29KIUPpBDq5ggK0}rku1xnC z^O~))+x$m146D!Dk3Pfcc(@81!xn@OXMTjDh6oariqagHC@n5(0@W-sSvM3vzOC zttN9L%k_r!N#JGkaJ%ecmOa4$)hbz|&F-w?iVBJ9&hsGMlhj!%K6``P9Jlc|D75`1 z^A@!)2=?5=6+=a8&zoO-&tdvj`j)rDayxXq(>({7Nffmi*_PEm%pKExZpq#Gs%gqz?1em;m#)<}Qb=tGcg6fS}!nOIV_pEsgW3 z4Ua8po$4MgV}Gp}lr`7iWtEo88yRF5abKT7Sv6LDvTqG1f49KBlM>iGTu`Vntg1^Yj;3Z{QS!vE`&iT?+y_^Wl!KUu{$L--e3@sB4I zf6)qh`u|QV1f`|L{|lj@re~u0i=zCqKM(8o?7y=Lrf*j9m*v0P^RO`gcVPe5(EkP4 z)3Y!$F#JD|eWsG9l41zP7f&EKs&G}Eo#9oK8cLOd9Hl~)@{9(j?%e75$y9R$Fd_u8 zG>t5YAFzM}9svOa{Qier9eH=1LLCQd$DEC0vjZ2mX~}o1dK}9Z$MbeidOBAim$jZX zyr<0d_iufrH}9GVcnpBh($Ups>xt9r8YOdDFH-n>e z!OIai5o`H^F-Fm~U0k#&4i;NZRxF(aB45CKehA{p5aC!*j97?_9qDI^cR&Yxyzo9i zs%tqg0JFevQ3;yk03UQ;M>~+}0hni?b$`xlb}suDd#3U=4pFh1H@}uQ_}y7H3Hf%c5D*ph+|W2y|=4j3-|S6`MtD$?45uGEV#f zU$;udQ%Z~{+dBa{Ci5C#hSFOaF@sHx3A@~T#7&LR6QXG*=PXH6HBbD{vD-(@7EfS; zNHDX8jZCB(S27Lt?lBu)dSmwOX1zHIR8%WhrqQK1o!^?;H+HD%9i|J@|Cqa2I0pkt z<60L=M@BCm9XmLhcgag$F`Y3b6rR^6)#fM_(9l|~mr8m=7L7L*UV=}MotGp}P_gTu z#)O9<4)CA{U@PQw$QPKJW$pC%S^*(}PC{FcmqZPV>*Y_D#A|W?J|?4_f{1`J7qN-^ zsb(2mz*!dz&JUD0dZJ+oC`X&)|UlgBI-F_=zw{1#w?~% z@8Yjfy-G*-^+*}6q(`xIAXTBAkkg|wU?P2B5sV&I0+&MpScFxR3%ke~b=?WFxxdft zK?@MAJs@w!8HnaN=ZF@S+3poT$LTdJx$c@{^8%I49GW}2K6mGG1pouPnHBDQ=V8+B zuMj+b{}H1rVuQY+I`c*VT5WL0Z1ut1{M`>y2=^K=7i#z8k)x0B=9u0AvBP z0l9$OaIXos;kQG4Y4`wUz?OlpThK#+Qem&TdZm6qUVHcA`VIoW|G0+KqsE6)15<;G zP5a?cEz%3xJK&pzk4L=RZ_19cy3MmFN|jyD?O;(zMyXA2XmLItcML>dM*lGvUtBkR z9u=g<@%ZXAabIJ~G$cHo$=YCxN?&2MIC{R(aK)p^L1sOLmsI4)c;xeyN$n%yW%}L~ zI0ONPC`0TeNkxKgpoUVxP&Vk!d^enPMWRbmqu5aza?17~J0G$@bcZ&@o7Ku=Z^ZxU zFG_oiW}|!GpWj34lUgYK>M+KeqSE!e7?Ee(qd`i|n{e(;!AU}T;B}gg;;2Ge*_oq~ z>auqbM9ZtyWPy^A9q;4l{CK)$l4#=f0NFxn{u|9Qt!cL6mqyCVYV||I;*oXemL0vL z=;1}>g*vYl)pDcPT)+}gMvKkoaa5A6nC7GP$>!`6aLdIC80B&^fNIA0+GG>RPj*Ll zjOi4`t9ET?7~pC5v-B|x*y0_PV7ww<+Q3<73rv^n3~XfWd|BE z`QHs$`(}ChMRAt2lM3eZE|yE8cU$KzmVu&da%AzjtF&FQAat9SbPne^ z$7Z-euI%4Bg?cZ`np@9R$WF+qB^=>*x*H)sI=_{IHZr8OzK-KvkiYpDc@}I((`vQ% zn%T6o2%b@!AWiX9N{tEMd@F*TN6!L_|TFYKNr7sHr0xQ|UuV=bcrr=g@sNZBT?rp4~iQq|ZYQkYAx zEU&^n6%k3$j-OurX3qztzfl$)V_9#H)Jj?^v1%w^tR^LyFDaG!g=;Pk0)r*1auLSXP7ye^X_yRdKtnfmCPBTWT{o)!<23YTotS47?N=~f#UBZB>vazEK zQA}WIFfdID^c8H=adtDMIl`e(cH4xB^qR{NvH=gqGxh4l{bo|spSJDb`@y(4%z zF^5zKAx>4Aw(mL%KioYKDe02=;!woV@`vi>KYO7X?*6*j*$2)4c=>!7=9cP>JK6f2 zHM%QwpDR6WpHkDwlhcaBTEWs$eTp~(f9YGG7tHOMxyH~O}i4UgXUiM z$_H!u1(&~z`(43#wWf7je4{O??Nsuv;rj_0!Xqfh)`_?@*4DpqrdAtK^4=E4k^m#3 zn^{5Ezsm(OA{5I#wqLssq!+eCE^dmH> zYF!b@0KwB?TyL7o6FGku?*_*?W9bc!c15B5RUzNlm z;E_96Y)}1;^ocTJXS=nW6aGlc9KoEh1ATbZl#ii)e%3->6y_>X>|70}%m4!->E13- zd(qb>2ge{Y7L5D;ng@!lWe@=PQ9+1@`FZ} z+%aXRFy?Jzlz~p0G$(r>%akY@(mg0?_np;u6|O)OKp56X18cN|b#Cdh4g-&&++d0x zq2yc%3weiz_Lnrz9${$Dn#1g~xb22c--g!*RsRgX)~&Eq=*JX7AUQf(Ir*K81)pl% zpJJBhatwW144ZJj8v&GzEaa}GtJl$4(RY)tGCv^vi^=Uxe{NJ2Y8lC_&V`oVix6&J zA~qlbNNZpLaQD4{iFbrHArUGI+7*(fKx*)1v!OtPP@B3B?Y)6d?gm4&E`(p8Xp=oD zYrVbT{99hu`y`HlpgmQ4@+|PuLD4lVcYPYBw&+))b(4Z-_%<;u$(4K*_`&7Z!e ziG#a8mE&fO`xDVT@T0YIG3uXUmiPm~b8b)J^`7yOs7d-}lzzHI*H!Yk8SuiG4fm&a zalu-&)K`TJ_d@w@A&Cf9f!27~ach>Q?jGHV#_LBb$P`c5y0mE3#l9^=FDNcMp;WaY zF2mq&OW-m!>6R>=OMF+PPPv^@33ouaubE;+4KRB^yn~?Uhw^zd<1>f<8NNGEwKKS4 zg!DYWH3jI4rti~XxG@}wc;}PZY`uO`9J;s*71C>O!cThHqJmsMzh{4eW*d&>ZoydK za+dcVoMi4*OY4BvOab1}$Y?INIX@s;g*qnKAM3kN%1i-{M+ccB-o7Oz z)B!#sNz1f#T$*3vh(?9ue7gzCEz|{RjdJBa+8m_;X3uZM=pVKp>0a^&oTYqHv4P|2pSG7?} zTflZpwa zY+$^*Ee%SO`aF$VOqGv>?S^XoG>jh6NpA-rp}F zkzoFL@bT-40M5X#2P zHowcq>fe$l0&-qhXt}Jyhw9t*Od$JS2U|;M>N6CNo~E{ z2J!M5hZOTSeO5R-yDQo>s+uF|tBv75)T?^y}@0(YO8+U0)XREt0GaJl21W~HEPhBKN^lU~8GzSibAea%_sexWt2 zi=Ex9)f`xV)mFGvToCApE+_&;d?@6Ym=t_?n3EM8Od4z-2PKGngTC0&08&_ zdwSVr*@auq=b-CqvIp|F@9No;bkE_SSI*aipYP0A-7Dnehy=@vM!mNzAMsY$d>KTZ`yLp@y{;uTIvAb4roz``tHZ4pHX zUggu$D-QwY#UX)W6%z?_pnOS(|Ika09Xv2 zH&RBYO!~IEboidoF zH=U0sgoa0M?Ml|uQ<(;~`cfMW>1J665#@wxQjv?JPUnX8Nm45LT1tAP$RtZL(|w_L z0m%u4%EE=^N!i&+eCc!p=cjfJqKFbXGFR#Xqi&TBq2e^8WW7=~Lr25|TT9bJ98)%3 z!PB9{D=rUY8O^+;c~h74%?S-Cy8&hT@ZP`PiD9W@S>*nirGGG_laDNoAgcm0l~R-M zeGBCO618TOB|!;HvE$}?qh8}gf^weLC5e;Bp!%L8EG)FAQP$9zT0V?dP4e`@*ZyKALeVA@;|2CpO|9SavDVjiutQJiYP3HSqH#`dl#aekQcEHb65p?^5Hasur<@g$ohRb;Hd(aKU6O=#DMJ8MYpPt4~Ad~{$G zSuZ7Ng$jc*=DvV7q1zM=6R18|zZ+)da2g$b6od_3u$V!s&5*%)NJWCM(rC%QjRwQA z0Z*Qtgr*y>o6#pUsd;8sW8 zI4Bma*E1e`OONsg;}e`5!}e&7sX{9x!dpd{euEqNP$w%oVS!Gpo;-t-05ibi{p+!6 zY3bPp@flzKkngt_ETofyZC_s}k?+H9$&&rCXS$L|pvf~ff1%}~vBk%<$xp%87qbA@ zccqPdUeTqA*eg=EG*f~<19L%~m1#dJy0BueIw3no_X{u;K76?k?33t9hmCV<#^Qn0 z`+u8{lhw2V?v!s48Z=2X7%BM5;o=n_^lt%2&N10Gz;A-|G%$#(5RSVRC zM3F=Id%;_u%$B-uqRly^$<=&471peA7|X|&jD`wVv8x^3cuPC$I`PlsUjb{zeQ&vK zrvfaY{5eynRB^c+#4fXPtjHBl$tgzM%L6hTwF-T5de%LtzA_wv7|U_+$H9nnGa<0( zc4~<+tf)!VA6vX_E9DhvMjM%Fp!peb^EahE+g$?!1Mot!?vJdRyhe%rZe*tC>O7Cm}Oi3-4IxdySG#-7TkqCbqehV}6(HI zXB>P*O4O9T_Gjp4t6v4o&W5LG&=_woTEBBBM^Z>eXnxpC$%_5FcDs0d#M2&rIF^;A zP{)|p84>ANH_xi z=kuCvr|yEpf~65TD$eX~L+Eie1~j2tIUw=*D?q6L-DgfT8i)T{*j+G%) zDwaz}4cZuF@Kkj*7x(iPkH!O`L9f|Ln}u&+XCxipq|Xpuu28Wq=!WiB z?6M()D_K@<7F{>%qBTsTPw@DkbeVKrt3sq-Wn9VD_e%52yWj5{uQ}UaTtSLw!}v6)1e-H7T8`=1XHB`4y^=N1aa8hq1_Tlyz2Fl& z)=6KEx>t&_Iu==20h(VLmDh`n%sJSVx>p^dHk9YC+M<{%R6TX(QBwZ5@nKz(?n#)? z5Id3O6Yuq>BGV>%%FyB`x7$vBNVeX-r2o_0b9!H^oxMs z!HNucq5Z1rNu$dmJ{^9zxpLuDvB!n%j4eyHxIKSfrN=n^A}Z|C%g?cQG6*8ng2kVz zL+px`_nj?bNpY#y#;4&5>e|<>|DL~#{n>5(7@Q4b)fvENXu7`q&3Ji<8T4d(FXU!) ziP8jQXrA2!Q&w#4+?W;-WN-&`ve`&M_YUgZIDNS1@En>`rvjvjJqSgnGT*7qRuw)h z;#gb}Nx=&I^O1&PXc+rI3;Udd|;qJU{j+Mgx3TEGyVH8G|NO}U;lG1lj0e*Y5$aR z9}-e6tS1tUgP{*Un4n8at-6YYYRWMw5T;6GfA<`sZ!wW>*18b%T>;meE|FQLIUGHH zEO4+ip78zMPeRC!Xkdc#4xi^9pIrf%*&gd|4$Kob#0EjUS6G_9CiG@79CpE;F$4yg zP&}#+6$>t?k41YTN&pK+sDGE;9QlJ8=hT14t!>qT=J)QvL;#`#w|SXLg};s%w5Vi= zA)Fd1xapBg-uOx-d&}IZHwEFC8bOW+=K*`Hiv{<11QI~BICD`mV2TbHT+~BAT?F>8 zlrZGoKK%j1LFOL9bh};NIRU0E*67b(EXQ2ye!7;}=g|nriPt$D7IvzqB$HkxJ2zH$ zYbNoW9Gr8!6^?N$btX3NKm1LUIr!q49)A0VMybz61y!+Rd|jCP3_y*k%Q!q=i^#7y zs8-WON@QeG3jUT5%FvDh{_mVn$xEJ(kZon~)1J;FQ`mlB3xrPj2>Z{2#<(l_oZ3o8 zLs9)pAAjv_N~h8;D9U6K2y`CZe-7awN8KP_E?#PM*!sMH5+ViUPXEr z&&``(H(+rd$^v3*r}!Lqb>=dx*S4csUhPZ#_b3@vTN2BO(W8a*WK}W*7GN#&eef9y zejtsMeE#8J7XUA?$7Fz_#ww8#%1=0%2qGiNOGFX^HP1Jog@KoZxR)J9VY|V|b80eQ zM1c9E3a)=vfhVQTvv#GV*o1@IVu9->SXY6(WMibrUkS4gZgp_R#TL^4wKoo6n1?;t zVqtgiz4Slt)M>-|^q=6#zISZ^1h36WdQ}T&$B1;RRI8K=#3WN~5>%oj-o44X5>zKu z_(!4vJ5a{F=NISw`2!=|9c$U-jPRL#$(@mFTw487GASR-Y3492B%mdr%aK$m zRYH=c1!D%kd)9So85^#`ZInu7ab&8wYj`CGHsfXVEWLdpMl9POQ%<+8g3*Q$;rxAJ zmr!8_d6j>PQ78x10xB6Z7p|K)8NEk=m$?TgXO9ni`gwBCf(BIAfTD@2@f+3d1p{{bbjC2?Oj??>46+=bSZh*iF< zLJqCumMfJ7juMiYsTh;VY!xoWY0yw|Adlr+P6qy&2=FRXN08LjHSIer=kf~kW&T`& z4F`SaojWn@EpxXYxm*D1we6pk`C}aN89Z4E)`jaJgXVCJ+`98_Oi&;JIx`r@c7{Fb z&9sfIG}ZLnq&;-^b?r@YeHy_x4ebHCpw2Fxwuwl)%FRY&NYz0leZet}H9bEklux6k zI(p)64tDyLgpD<$<}$P3-7pJ_x#_-Y^69NoQhx8fMsLF9=p3jzn}uEM{C+*-mohOisvQ zAaq+V-Tf*urE7ZQ#N3XaU711YQpNy}WYzhlOJoT~00N%66_kkJZ`k)C5{_;f@JpAD z4HTU8O@Sw*7jV0G!J>-r+l`VnGjWFf*Akh}nj|8RK}<-XW$^qQ2Z!#owGB=bW>$=-D(u(bZyjS#i78JjjBD^2=PtKLA+KfJw2s>T z4Ecs6ISzB)a~hr;@fnSF!v(E)Zf!9P_U3&C97r?o*R}pivvff1-~OL=3ih_wX%vvW z%>=TWYU_P$S5{jKwlK8dFisr+p9dnJqeUeX&B5+NZ)_rH-Ijv6_vR5$FI!xjUH3Py zliG!}j#PTxCN%T{O)NP!AHG1d<66{lvNrH4|AVTFG;2q6XpFQWN!8>$HSyo!HQBri zBw%L-)p+ch!;sdIw3{+Zp;ONUCGDNXoy8L%Zb`D{#CuiFRZew|Aw_jAVsRBB=}Ctv zp2RYc=ZEgmDOXlS5}80bvc9q`uu5f-HHW%%1VnVrLy?uo`?#khsd7(;-(MXnQ1R=S z6Ihd()8R1@G+?(1%ouh1$I<1KYaqvO;_dm~>F}7{>As$mae!#2*r)YNUemI~;+Rg! zH6s)`3LSln;;aGEiG6{;NVVk!0#2hT)&+6+D3ao@lMW* z2A}z!@!$ymfHay@Qwd4!lT4}y{sNx-d>&AYKV?R|PzgqCCrqr7ET=(5K&Xrj8d>O}$UPwk;{dvK`PUCd z`}kl{d)Rk)nh@sPXYLG`*)+uQ5q+?WEfF4}0Y=b?*wA~VIUbzu+rBwO1MWL?kDAmC zs&UsF1fo|`y}UXRBSqC(L-9stzC8=%ckY%E%$2>_DaP}iqkMU6= zsuUtInDQ`d<-<_>jQx`6>us4nVO`Bz&}Xv?+IyqE&kS`}4{86yG#)HAS183P23EK? zRUt)I<$RF9exuwGXsoB2Kc#0Dhmu%bkX|s*qb}E3L56AGsMbHG6pKNf&?3LPW9oG8 zC4KWV1Ubuj0sT)_bf_%NmQySy5|rCyBNpD|u{ZT=JPjSNXjXw3!xLEqWwH+~2KL3Y zz*iBZee2yhyo(R^S2T%jOpdK?q=sM*_8W z-Pq^he?z(c){)^vPed3==OeM?crqw3CzHe!VlG9{~pPm^7M) z%3LHiJr}ccjkhd!0)@iVf}TZE+X_pp6=%w&lcGRbsoGZ(sTB-U(Sc$z-M0mH`CW!{ zg{_b$!qu)aSzQVv_M?}sfAHh4uW8$TQc@y&_1lk%xvyGr?v{u|e4I z-5B#|Lr*$5sJrJ+Pd+xMh+@|GyK+!S2b#z z=Ck`CbV==gAI7|qTNSw%wrZ+vfBZ3J6zrl52+{4+CZ^Hrv-~RRlJU=Mo92jhAdQ-b z{;saHE$gPtU^`|KJ&|ySB*BR%Z%?$SbC6oN2Z7qRD%Rs%rKWXNp3>AoJC3xo9KSH#aUcMtaW5h)bV(V81VMVe_{oO2$d*$xh`6pg?|k5dP# zAmXTbZ~Bqkh1h=>9&Y~wRE8uDzrzVVdVp|?&i@bwbaE;}4#={Lrnp=;V^z+h8BR}4M^}>FWc{PxIxdIJy4iMw zR(p6*Hw=N07l+nISE=;srAr>J`ibMz0(|t~0QJPKnK#Qo#z#ckMTOuFBL1k0_14d-tq?fA##@3o_)Zj1&>7E7$ zgk=<0OXrn|w{~WAZAp}Cq>Za?=7(Fe$LgdeXA;cbD#UFx4V&i^a-u$J5$Q5b9XdjR zC9t+`x56mSRWaVL2M#pRL?K|II~XIkI9s!awV2!k0~o9*toMyxHUb(OGPe=wE~~)K zWZ52=INQ>Ou01B#kCB+(t@b*ISdu@Qpi!FMT`0*q$SG`MY0s+c&-)Tu1y~-JNQ=4) zpFcG27nqJ|`vvcl1s>AZMm<32{BzAi6nt>IJ zEI0$Zcn=YNyM!>L9VUKQW~6zZkZg^PF1*?nA<9UUKF|&ggM3#M z;&IPpy)al-k0JowU-c9dx zihrL8xFKnsb1NbBX&s&A5Fip4Dh;w=E6rwASs9mACVcOX9k|}Bbmc775;LZ}Lc1X& zmk2;}!1~E`8Ga@_zOq6}5u<(E!C2dR<_%;cSGy$~$HNzsLR+q$IbgKgWo2oF3=O4MjaTm8~8LqmqOsk`j-WA5zku

IV+g%+iKElkIHtvh3S9{M@LE%7FEvSW+^ zQg-v9o~A(XDSVE?dbmLx{q>F5PwCQ`S|hz1e?6XbERp6#IFs{ky*QL15VrbA2@DGW zln}ZwT^Kk{z!5g&h;*ub-%I8a{&%v z{4!)&)}b^Vu^4j%?(Bk}GX6(|mIi{BL{y=LU^I}_kGsAQ8UZ6WW<0TcHN;mp_(ZUx zH&u&+igCF>#!Orv8UE6LSqx~)TRAGOc!d2S<*{aF!i$v{)lqM!;L^LbK=r(`@NtYn zU^0bg6`^3@S92CKHyOc^nZ0ihcXDRRo-qz1tANJnU@|pXJ!FnPE_Z7F@Y)Ksf8bbOhBAD4>%D z6UbQthfBptWS3X^bqxFo^QbX#qMM8WADNF-@V5I5g;0iO+`4>9b?|Jv_U)TRGSUGE z@#NVu9gb@V$U!k%x=q=a}%tyHEs7l32!5S%}1#daHJ7+JGxCWTmP>_!sycT7U zZrcFCF~LBllty9f;-_z9z+ETna32X@XQd5452H~m#?co#ImPr zM4Z_2)Ot}oPm!|yhX(V7Bs^~3EgR>>;SgQR$;U&VM1(w^Fp=}Hx%ecpCL15$qW(wb zOKgbE1KseVtilx1nr z7bT2$j609$XQDqRffLiD`h&gVp0+$a@ATTG+iUf;;e(;Lg!Fmn=r6t}OYPO-$i|&> zW|k`(iZSS*Lj3`;NNBDmhnHrfDP%u7Pk(zgj=}mfHCxIY4sHRsy^}w+IRL<{_l;vD zS~*oMO*k}waGO`;t;0hMHxy*~zC+YjM@xLUVfC+1C+(my3NkWLsvy5lx_Y4M0M{#6 zoh!Q+$5R%jWx^K1(5j#cM|qX11218HReb!(d`v1$9h%C}HLIe(6|Dhw>|$Zd15#oBaO5wIum7d0EG^%*f+&>$@rA#EW2R+94M z?5oCHRtci%>|48bA;kG(J;Bo!1BgOt%L$>Pj^Hrxv2M0s9>`3PuE!;ykI?MjtCb8w zQ!Psgg43Ff$8la_X`r6a3~Bd4-y5IRY=ysmT@C3ii0D8w9l0ZbM*Hf+%zvR!AE%Te zVPu(4gFn|~tFyGMIAkEFyO55YwqU&bVFb>2GhZ_i)P4N~G_djO`q-v=A|)9U4OFx} zgaXuvVabzxzbQjIv%dvL8@;fJi~q618zipR*##x&tf=pMXv2~!o`90RMk?e{8YH=p zZPq@%;0SjZhl^P3_4|w|YV9Fe2Vw#vY0&KkV)Ao$ z;xnH++*Ms&-VzjxUK`P_+K@(18QrNr31@d3Tv>wl-i14N#>n<9$0w0qnwl-0HsHFltqf1P2s)A(nP^d_Y4) zX+>f0!G0zrFf3Z4qrsvbqN+x(_&KE?>hI`U+ZG(Cj}rK1MnK4B$8fFU-FsU=0~gLa zWvRqBnH58+EmDCqF|_;bjK`M_8U}52WRk<}>L?epI&xH|_He=$NN4M1u2;AbTV~gc zgZMT~_H018aR&)j!gDZk&HA7`poUPQ)JQzQe?fM=A6->4O%s0H>|tv^?A2Ug(< z?!VWk+~gjS6cK(31AUTdp3pZ*`%d4qnyl5t3)w@tZ7Cntfa-zkN`jgwqmSY2ujmpV z#n32%EoE=(6eEVHR6M_nGY3i_a>%h8DzjN`!j9rl>P86w zrnO<0^!>XOZ=)hoO1Go|Jl;YjQ{`k3h2AEyT1e z{c=J-bhjAzHLty{6=NRJVE%x6anLS20=a#}|&q9w#$R zrZ&)+Ub=IQP{&R+vhhRWrqNX@S(xju_&{3Fvk09X1eDJr0MzRz=0d$&1r7YkPl_H)|hX>Ob~LP!}^ zKFkt!L#6r!NwJ#RhQSSIvaZvbsQbT%6@J^&X}-eTMbAWB^*;BPUU*FZ!6w* z^X9D~K=k6#p^2!YOqzrmbs_=?qc;^OZmR!6(<%$%PxQQdRXLU|(n%!j97(-|MsV^9 z6QM|1nH}50wi_YluHqLA$D|SH&uJr;w@K$B-$B|HHAKtf8`v+idV!uuU2V)eZGqxs?@fLl^&l!(iZf|@%#S6zOORedlp`}@WmfUk0l*%cFBv=@<=WSF8v_#AxB~| zQ~_-|bmRV{PU8ZI;b5==aOV31NZz=?6u)&m?ds-$88j{NIySb3mB7oLJs)h;o|w>J)jL zHkXz|vYU{t!Vju!>aw9%vOfa&_eygQF&LFS8^%tv2-bPjXA#6Qx#O#0XFoU9AQZ=j z_tSQ&kkl60r1I1s&LbUM_nJF-*tkUt>UVc{u?F0sROwww2xj4lzVyK25ISNIf_esn zTMb1k+;F0hQnH+vjGe)4ZA9&pQo8A?to25(SiNc!TRC0O4;$+cj{S5dOYtx+NG^C&LNCDyL6*IuKl#x@GXxC$Hi5&!lwL(-=C6dZUi&^ z^f()DuQ*l{&!$J}O!#y$!D~hP-4w~kG;>~l;be6ufFlHE>(nJRle@$5L`;TGz=}?_ z546@Bvy#aQ6}9l$SAafnZRXImX-lI#E?Wxk1>d5q!Vm!K_|st0@xG1ploWcLPS~kj ztE&iB`x;X~i1ViXCgo~jIlOcbP$>;^9MJ1p_-je`_Q|WbN`{Y=|L8aWUXOG97J2;X zc(8Ef5LhEw;3Z*O#HX~QkC-5~oN6z5qYG}ZFUlvwfM4# zPba8Bg9E=+bdcNhztZXeiE)hXsiXdU^RC@ zB|A$nI`cDa9jj*2TwTvT8@(>wT~si)NOq$Cnd4%oZ<)jW_^RS*<+*aBk9=wYE4h)C zT~@g=NW-LH?>TZViUQ4y-2W@t)uR+cNqfq-bz(d1cjzEEcpQZgKo7e32SLWP+yigs z-0bH~i(Q0WcQ@_%YR|{lHwNcS6nFK%vJGti%{lo0$2NSc2mcL&WBd=cfr*WYk@eq! z1tB3jcOq?CR?dGH;h30N|2Gj%N>ut=gcH*EAA-Yw($b9o2n+wEH+%~b|7F4%(X0GJ zzWq9sX(h579x!)Yi<|oQQ?}|Hg@dfxtk3fPsPGzuCI~Jjs6=sGf0wp7DU6 z@j;#mK%ddTp7G%@6y9R-z!qMV5X@ZOsJ+!~;-4pAlcc(5pkDj0v>mxV?CBUDWd-iu+@;h6&#j->B3fV`~9e zQEj+w0F0>cI>O#J3P^-6P!){+@10Cd0s|fZl%Ov~FRbVvh7itgVc>%h0O*vAB>*Yz z*89{OjXFeZJ%Bi>1Gn>g8eadsJVq!`;5wBIfI*@VVVKbqrd<# z02H7MfC~z6f006elL`V?ha5?aG9i3F8H8*f05@psbsxb6@ZQ`2&;i(#7jKMwsQ35U7pCrHZRlkF zZ`S$0+(Sc0M?1HFn{)aO6bmP-@8J4g!O)T3#=`bnI<$ARu=#gk{ohc;e{Jz^v)_EU z&9@a#Z(?X>X8P?X+M4}08U4R4{@dF2-@CUn`3ILbbu=~k4|Du~CM4(on~?uB{YOIn zUxqj%8`D3Ii;I!7hy6E3|Ib}v6o%*HgLiUvG&Qt=hmnZTN%pbEJ;EQo8DG1rFU~J~ z;L4uJ9!+eqLbjZMxC%B`%nNbJSJgLwj~^r2n&Uw+O2 z)K_AbYvYrDG`vMy{d4BB7W_$4HhmGU=*ndtL1(?9fbR`^drsk}joow3<8-}Eg%NA5 z7;NTT4CEZ<4yDb4wFlG&n83j@;q|85?wE9~ODd+?YczS#g7t-y23#yb(3UN36IN$7 zMA(8kJGW;wgqeKrmNjcl?&?$tLFt@P6V6*!DBr?`tFU_QTzk&fC2|7a5As zA1PFofg4ExN&pE0xzD)P=t=-g@sbs3@U?zQN|_OFBL;tz53+if_EvSPyaTESw714m zrMVJpX=jmh)gAN8!i^nA2e`F@tIHD)-qJ}_gX&u!(0dc^9tF>yCYhXzaqEvIN9m5X zzjX^fC<7I3j`|SITwAhZR@ZTg8vcW~}6cuwU*uFk2G1E=1VC&q1QKjK*Ge=QA`N@L( zNZj=5@B};b^~O{63YeAv=z*2r1joT?p zfV4+~M42xq4fRGW?e&}vPBIp?V%f-kAvOnRz~<_oux!fYim4Qmh_(?!LPUQWjb^~m z(LI~4&*_L6GkDfEt&3+mJ-M^-2QXg*LySfS?Jp#67S4;Z!#wa!@sDMqkzKwvgwl6^ zlV~p*4(U>#g#(^`-qtC1Duu|Phlvrc7rX!+U)(2B(W$UI`S7L@zRob*VXH@on`f=_ z@;R=F-$s(%EzEt`S&-NHD#H~TDE8mH+XV1L8Ua#eY2+bmab#XD&`>-qjGjopJiilZ z5$Ea2(!|_TOHh9ZF7g|!DOX-a!PN~zW?OB81gV(4F4_*Cx(B$>)4pGMYrn}0o*<{V ze%i38t8$b)z5xvEpK34Ajo}N%g9PYjqVA{)^RTonRU!N3{0Q64_@ETZQ1lMyT_ns0 z+*sfx{@QEsP&k+M=D%%b>@i?$!)eJX4i&jLvy7RFI7Q8lRzWUA=!G6E)b9^OeKsi8 zOSQDvH0zFV4@^_Cd30>lO!pToLTKY$%)~O|oKYm}(U%q-&|F5k#vrT69`~0nXSOw+ zzL;vfw>2qqqk~6e$?WCl7H4WK>F^$bEF=a)T#Rg%d0w+Wi&4NVcBGpTq!tzDF9%)- zkr4dU{=xByI<~;_-SU-OmpG?ojTh!OR~$i&&zYM6PyDj-+lw%^5phMVV6 zd^233Ol+)QqSBU`87djN6LVX$B@oFC^iLIQ$0z1ZPi|f^BSIKEPZ%Ey5{qo-VklsF z;FzMrmG5cYZ<8a!z;0X)4EA`>PYR*HvUJls)@<$RW>}xQ(**I3v{?GFAKc(^i z+_e6W`QSfj&i?J&|05y%lPCXA&Dno={U z_7&!T>;1n8nc?59{#U;l>whfp_-~i~uQuO*kNPj${~vc>uYZ0sL{*#~R(}XsVR=v^ z0!Fei%s=&hu`AE*qlH-U8kdOCaCl-tcMDxuimepK5%T|06}qTDRD^HuOHM= zuz+4-66GuSk33SB|ew$sf~D(P@aS zX5$Xt$=9z8#R@Gvf;qIBgo-y($;Bq8rsIzf46GCg$hZ^>$qlg%4@m0korsJ`;qDP# z0a;mE`tH>VIW(FyvlFSpvoRVe*@ZL8MW#oep;VC1u{pfFGrr*pIhA7Z*Dtbh$EIV+ z4PN_%lfQ#kNWomX+?&4QDk;7Tm)Pz<;tyQzHu+r7(7DFz6IlUX?lrywE)`s^tN_LY zatq)<68Ys2DlCGIkW0-1-PjJ+b9PV|oBGT4Zf77>H-5~d`J3c$)R6@YaBdZ2u2)j)mVc@O~b0Glii`mFn)+f}8-vg}+BU}D2@z7r2fs&k!; z9)iYOxid?Pq_a7j^)AX(<5Wo@#)^+j8p5ugWA1C7ewIU@+u5yWn{>Spy=vtw%l=-3 zIE64tf1I9Yegl1Lm`AY8#ikpb#Qtc0=T50H4e~JRmr&zT>?!40=2@&nsjmi51mJ*` zg81SZKxm_KprBy1P*{;&$*{rWVC10xFbLq#qp_1Va6G(UK{}$$($BhM7{_!VXk&bP z-K4bh4p&8=XSDk0e0QPVk{fy(-j0wTf*$t7dLs3b^pO0>-tTq=#J_rR>x855_KvTQ zYG1>>M@77M+`o#8c0{y!q)D1!l@g5?Z%Jqn)3@ZF%7}H&I(*oS=-{bWwdNSS*@%bM zcSMR1012n5>dkVDh`4njaJmmWoQ`f|?x7w+81Ptm5xX~aB~YfO)O{F02l~39Urt?6 z!Zs)s`!~-Y_6JStu^E*$)rpMk5B1{B+mE`=#Nh9f%_m=?M#dD(Kbke+yy#-K?$8y?{<9POqw!Fktgo&`WG_ari(Pp;^~k%C5<`h$^9=j7GT=X%EL3VDZ@>X3ItW>(EscpeE zy%KCw+$CQ?3jbvS!$kIW2=tr9<(Sqfv5D=fobc;7UdMMcL|1ByI#x|}JVWW_3`H@(H8Yq!lM#qjS;|CG6LWGc1gQX-Wp5>~KoXOD@X~5>aMfi9^3s~0A#Y^y z7;*YNS8J4eF0*O;@lfA$s4LFfS*By5KLMRJL(q&-@vmSJ_GCYds!P8xL_a+LLHmpl z3qM+3$Vba$PMumSdA(1oRg3E*9VuA7-h(=jlj!`TVc5w(g6;*%j$2_r|Ms1l(RO_U zm-TL8L=@=o(rlTy>7yeR3>HqjU~MB*_D6&p;+-=`Q!-Xe2EE$QDKUHQc57g~s9`$G zp0v;+AqstRA)N>!h6V;2A|EI>q;SlDBSx2~pLMntnPB#t)t>&N4!Cb;M5 zyYNJv0VdCm4zyv{{LGi~=}B>?^gP_|@FsPxN|Nj?!7us%{+)&@MhODOY_*VCa7mEG z6_3AyAfic&eNtJ8akQzF5-N>h>PIW=bb*`Zawq&T0Hl}&U48?6*|wX@thic)(6nGm z!v?pSKn2+cYmDJ4%8Co3^SGl6*->vxFb&4=Yk>Z~jq@+T@=(8Z2ZD9{q)&B?SGE(N z{hNTK?d&RzpsPpiPDvb+Cq8^kzx^6wBt7zOtCt@9c59dM=)N-zWEfF)yUL`}(q(MY zGi1HlDE|yumKhV;MUS*+U2W>Rvmm=mpg{htuUE((?W6r17(3-+!C67}xjbbV0r09A z{%99r} zvMZW;zzI6rMwrmzbgIt)PQB#Yk zwcN}aCb67wuI;vt**EfXmaF#L6scgq*nace!d(FQ^LGwXKJ1Y&-rZ$R#C+?Vb5nJx z3Q_nGH#2qQ zmf=`j!3&3Yty zL?DsBx0HFYdEXFs6);;zM#7k(yZ}$Owivo2r7eUg_ttGdL~Sa#maF!FcvwV`UOzcm z?ARh%iyt2+gJFx=IcO%!a4x3D%<_Wb)C(AcCTv@q4Z~9#|Ico2;H{uA`K+Zut$*qy zyK7zwWbFFf>~ctOHU4Ul^Y;7#SUq`2j`8aFCHJ>3rdh4GCvhp}4a{nzNg8VL7$2$2VG0?YBwqB(Jts;Jr z1XOXbagd@yS~j5q#G%H*PUm|mr5|9+!G2TWk{GGt2HxV|Nvo_BoV9s~1xGDd)FZcI z9ot`ugW4bY{q%g!Gse$B%$2yvft8Rejtc5Jr3{M-p<#q(iPC?fAGXdb=c9DUddD*{ zpEQ$15~o_(w;%2RaD#EuftyTJ*<9+la*T|^#t^wvpO-(tEPnewG*23Hl!pr+(W~DOd}c!9J>6v{rOCtA zgExe9KrmHo+#`Fry|y?xb7AIsM=AYAVN9jtV2myR-JRV+D#Y3mf_gD2iQ?K~PzWc0 z$`}zCuwp`&Ub@xCg$;lUBsP0wQ82#|`_U^K#pN9?iZDA8a$LI|tL9B{odbQWTM&DTTtUV?ljyL*479)A?Q1D!}Lkq?6vq1}T(lWMIINtEdJ zo9CrZPa=;hm8NIt4l@F)MJEFoF36?>o(}p06S=b_fy$zR26>JX3k}-Gfh8>)3oC#) zuLkaC7UpMvNAb49mF2hdM6zMK=6mM8dO~)Zb>mFwx!ymU7$g~)($jAlwWjt-!`^`$ zq5=0}2igr{FM$j!>t<;Sb+nvVNO=&bt=sDujq`+E)z|6@Sv#l(gn?i7d19Kn5?Q4b zj>L<2;pNHTZy~?8@!q?!rJgJj{q(2Iu>s=P4~d3sOH0chZFrUv;h{_Va3wd}Mw|BEhxfU+9*febD934j9SUA1Vp$Qy} zL;s$7h7gmg$sX5DX9#-Tqd5qCyO*9OM4_@7gE@aj^%V6*H<%uI!%~w$NZs7rSRL7< zbKayxZ@TET!E}(<#Q<;PAgB_0Zx`UZsv;*?s}=3bKCJ)BWki40puvo&@1j3fns~~> z_zDJsFkc?vg_CWT5#<~fJ)EFe9Di9XS;GSV;xIq%*9R$3oG41oz_^MDypDS;H#DHG zib{l_h0z5As7}u*r&Rt-2}3|%0VNqjQX2FEc5XB<4wp;7=MEfq1ckwCGc00%=7ORR zEYAVpZJ8!T2~ohw281lN7+opWJ$y$)3^PKi%=0#jJk1jt zZ;B_;saS*TIsaAL-RgMKUD{ z{;sdQPK~^@wmKGSEq=N3rQwZ3mus~r7_POqA(&S_A&dmFrVu=`SDxQrvInxDJ8%dH zqOGkie=&I*a&5A^E>_90u9ja9?SJ~O#YBq&cpo$ALvbAbPo(Q7Z z)H4WV@KtW@;Q#F9y0N6Y74d|d!u0=Iw#wWTGeM&-El|}TR5QD;zZYq-be-qcP{HSx zEYRtTNQi_eR4*cwTI2TK&dnQ0*KL4Pji2ShdM%DM-A9P0S2LiQ3&w-YB{?+H4Z>wl9Artq+K>de$P zkniYopuld*QpzO6Uo8On2njgN;j=Q(Gptdvk@RaWkPA;0x z?>y1Yu)&{N%I_fSdjh`{Rn!&9w-eB_&A2WL5G(;#2aZk0(!SflyuIIj-8J{aZd5=i zuP`2&ImarKs2L0SE&ghzO*KNjEh3jSeYGUk%Pxbr!7R$LSBohkfYJ2F_Tlnjf^PIF z(N)&u#8DziNTrv={Z+LILi`5T4ZGV98cxeZk+BRRqpxlGt@Y5VmMa_kT|*6G#KiOm zx|RW4YynPkYqp)H2FxKz7AI?ust<4O(Zk64qe;I8S~{Ta(-RbxFis{_kU;JnYZDmm zEX2*%&=-_jH_rjIjk1}A)hTlK2!0zymew9cyg+WooKw7PdZwT(01bhC0}zUnqEl%i zRT3;&iV&x!2cW6uA(2Hh^yk0`zC2WOe+p0~B(8v%jaL{C!J?=`34yImAQYO4KOzXh zKnt=OAAmj$q_siF!MXu(wbb-XY@K}NOmo8oF!(qxto?npmXb1TN51TL{;w|A}*7tM#O4fPE5vpOxqFcsvuzN(Eu%9P(18*Or>^TKMJ0w!8M_nee zBUs@cXJiKc$;8 z9S_H&e=RAY6C2;mJLUiJ^_t$EH?O^vfkn6pq^~l&qx6*O>C(jske$*S*~TfMZHEl- zgoA?sohwcDeTR}+chMWQF}1V>5ieh!f}CYUuNI~cS$h+^pFiI1>;@ex91Wb+?npTs z!#S*uFVi-k_Ag zIAiFl@-LAPqm1oNpQysqh0;K+b6uBnLJKapwS_2o^5Yh%YZ6X1WYq&4zXq>seJ)&> zswjed>pT7^AYjN=VT_npppQqx!n+$DgsG7EjJGJ^GiFg?!Dhv3x zqzYH9=@sr)4V)b(bGrZS;bd5=(@`6*8rU6LCyx(`gtN zWw3Ps+XvjV@06LAh78QCe_zf3=HIap6X`qWMR1X_BgnUWjQ zViGP6He?=?xVpJ}t&!Kaab@1P(lF^n?iikc@m)X-FxHXIF9m-B7v zQ9uu{e-^27P{wiZinL4(Tg?l?vR!_0d-dqL-fG8&1hYv*>WLqUo45-4d5Fd4N$2=% zXJvJDVMqOoCBV^D2gBMCU7M3n0~N^Uk26`6-PacLhNe2Yv|8~=l~)xWNg!=RT!@#? zH;7>rnk_e?kRK4+`9_FrDjPlb`qSqm7;a9tW`;PQ69k66(6(2=k;($I^O|!-T;0;(ewyTW%qlOp z%^B^x1Yy`IMB#wrFley|jVeOsfa=KSq2#$Hs?Aw+3DCoCma3(a(ke1231jL~^FoOm z^67@BeK|f4oPx7I+;Hnzh1uP|$l<3Eh)3tg286y7>p43GFqo+?0xu#W2j4Fwgu|mD zZ_!MUfF!IHtp-&|IZ4%cTP3)WGpToB5zYH?y2E>#^?hx7`+eO_yIbz@q-M@aRZT#* z^cXZ1!woC7w?rKXY?p>(gMHRMlQB8FvZKHQ)fMBr-=qJ$;awWvQ#7JiEuTts5@$7O zY>VA1zc}vKxN`gIe*y9gZ*x7t7JEG5twbPp+Zn%*Y8fwJsw zl6SO;iw8>^>PjEVJA%8%?gqO9qF4tD62LmurkEz1BXJ~e!;zup}ls-m&86m@BugemTC>Hoics7n8w7TnmD~bD^c5@8vl&G3;B1P^*D0;F22cBH4NE%N*Ic73BIr1hZVb+>E(0 z0RArt3=}lC_EU1E|L4lr=?%|uUjaV@@d5H14|MPny0#A@BqH+f+k$PkZyvA9p26qu<#_jAFt<@*Dk?G@Sd)yTrKILangq@iRknyZwFW7GRQ34dlXAvk&Zm5uHD zG&Uwi3f&s6XF^!ezV}|Z>7c@$8w`}(Fi|k0oJ~icek;^#@S1;mc(-RB)I|R)Eg_yS z6QrXFjd182K?%sYRKjp2C?Cou$oRO8{5zw}PNA5d`5PR|0IAX8C-uuo-DND}wN9Az zAx}>s8bB;|8>lQKq{66Oygk3>3BtW=gl-&vS(l;ziH2yJ7iLSM(HG9&u{{56Sj(?F z2~fwsocJsH7Hwo(p^W_N^1-qmZD5yx9Kql3yJUTfO*pdTr&1AYa^s@U6v5c0gKRSO z2~B#X*ojC(Tgs4H^_iPeQ_Pzvi-qRD-Z?}A%n9Jr)nT?LRH5X)<;8;YiWj%SVBObf zU5l_YhP(vgMx%U`dNRjspavKH5kEwbM4ChDhVYusnLCbAMe1t$AJ5l ziFeAY;ck@VS7x7WTR)YIdZ!ATTcq1MX zqtV5A$P1d!*9%?CJS?{IlnPh2&%_-h=(o@jUBmT`a6AM98-H*9oy<>fDq%`=Dpkd$ z(jL*DTr?;yhnK9eIXfuvsqPilde(5$95;a$aTX$Zmq{o|9`$Fr3M2qV=#GyvPqS-6ftc)^X3V+pGglgsIAzw)W2ldLjfP8o#-z9%^@ez4W#_;@i4Rfw3;SKW z&&8{vifdvPR`SXCcx6oN!_Ryc@wrA382}3@qAzt+!kP~c8}|_ZM>;OLm-RS}%xPS& zcRI0V450}ED(9^tK%z_y>44Oq!ya&%jv4hT?`y6YL*{BuA@1Su^P!1LTLoXSjFN1I z5W+f>Xf=jMrOV;#2-(QEN)_JsA^FhYkj;24SOPBShzdqD24+n6xM_RXu;3vLO2GQ@ zJVA=T(xfhOqRNcH7}CS0>DoFEgG>x1f?t*;%Aklf5k8=TKlP)SZ#c9- zjf4g1`~ZUan~W$0b6avf(;{K~#56&It3%dAQ%nT~eE5bA_Va+)4fJK8^WNsoFR2Lk zZP4j101jn$M36~kPuCx40S~!^=ktcRZDu(4km^c+sW1Ff99=UO(LU)3)g~d>3=G{x z&mZV)e{?q2^9Ne?pDKR*MsQahrTaCMgY@qPo_Z};#DXHWK1C#`RoEQiGB zDWDd9!^8L>p8$iTi8n}`PV=3YCK%v-Fah!Tqd^3vS5>{?3*wOhx62|j9-mQj?5LeR zT{A|A4ik|Bw~YO&w74`^N2tR+4`D(70n*OTRj&YZWp5Y|2helv<){twGHowy?)zT& z0s$Iqk@7648{UhcQF2jB+4alGu$7*yNN&I~I#QAW!K5R~Zt%e}Jbk4HJ~2`x>+j%` zqoc2DuY=nLo{ORVGG$P7>kSnTDR(G$lZub?FDY}cp$W}HHoEzmH%Ss_ z>!X#3??8DJi?n^r<8zxLCJVW$m1aZV^fzdmaf1j$fiVNRVdfsqMVSg2-PyzCgnBj3 z`Be0bpUYVqhW@8>5lRe zT@FuN&UmcLq0uVjP1V*LlT*hm{AR~g^GUKc;=rUir4@4Jr8u8(Pu@PifnkKgi zMP3lhQQf%TnJ*Tw78eqSBWWO)PMaFFE1uh)&KHd;^_0)^6pfKBJZhJkAo6fcc(D&q zM1EWeVhNrQ5J7wbIB0i#XuimGwKD+;_=UOM*tq|c1;a<~U_fM*qKM%*w0v`}vvb=AVBi?HOWI(gZ`yivf zaiV_HjdoF-*dZ-)o2}0rtvQn#z4QvA3o-BZ8+hwg>j*0ApEtQ^SN%bp@W`he_v!?Y z+reg4#*h>cKw&QQ&_0=E<;#}L?k-SDwz!J|(#Z$_$-NOidOFo`v;_diYq550q;ne5 z$YvDLnaGG={S3&A=L?0m{Cyi&>k2OZc@qB?7cCN)|NBZgfS4E2L`bwlr%p9Zob!|e zI&CD$5fH6hc8dsxk zmX#%jGG?#YL98z1>)SKb2^le_YI>&tMljH2BJ={wbnje#m!LKXtWXl^W}m?39?i)cAZH>EzoSCxVv;ZxTZ4V}E?C7)q#0mPx*hlwBWLi!`byR1YoMHE1+H(6MNgzK_F}6)YOV zC4v)}ggb&jehhUlKT#`y2IbUmVUP6SBD>z#OjU>&#srO+isclMN1oh(vqR%mxDON9$*IlR7iHo z+zEFvF-EZ;;IS$j@Kg%0fZUi_)GoR@vBrT_axOzt(9Y(?VXX6_^J^iV#vr1_2Y&Yj z&y`u}1mu;P&7xS`)u_vDjzZR0N8ga#>~sQ=_|fBTXLV2zS%^{L6z6QW z?#hQ!qQXdl?c;l>JeJGkOJT6KrpbsK03Q>2OjAl)n5^#LkZw0v13 ziY6?QZV9A?qb8ki3qnR+QvT1{f@589|K4n3J7zV)4V^fW9NG$Nap(Un*eS1eb5GKfK=gik(mdh{-f`smUz9_QXiM;e) z?DtuHTOVe5sIrwfO2p8(Kx5f}1-)vV9g$Wf+j_CH{X_dywHc#ZgJ88h3f}1esv8-A zVAPed>s(pms{C4VFXjuj>)N6QddD0Tf1c4jhPqb{zZlAiGV;n^ij-o5oofi)R{S2< zA(wl)k)zgpEsn=thHOp9DG)H7eiKD29fTY>lJJy*`)A5)nd=q=2pHg~UZwN_3<)JSA?S$I0u z`6dW&%q;DrFz<-+N&(coMxBMiRD^Xb+Ac8Hp)_|J5;rqHA43!+bDNaSlGF4aIlmb?1+Y{QeSa{y2#or8UYDaC7x{+EsK zdu%~LT`gSWVjx-=?$?Yx*2; zlExb8K!i8@AB}(Kyy)=!y4RD{ICxz+Y6;yvKOGDvpkB?|ZoFT;EMt{r`>AXBY#8Yb z^5OUY{y|4a#Fr-c>3Tsyn2Im0&H2qYmhppJs|y$9nhhT*2M~V++v5#N)s(_g#v0Kc z)mP1XJK%95$;Ou`lnyM4FJqS0klKJ##KqVYipC2f=@anZp59sGys~yNaasRFHbHgC zAD{_R0D6|lXIeHh6tE%)50AhoTv4;+QVgju)$13^eDiqVZT)3`@3}Qi{B?To)a=h& zMIx^f$2vrpk52$66Z40lfyYLpJ>a*&={XYiV}zRiVZcbVj+uxPlQX@|{}^$y z_XpmsB9d5ZDsHtk($N5M@0Q?UkBqdv8w4E95hfBvB^$M(pE87@qU3PQF=^^8S}y6r zd>`GiQzQ6}U42W@rD`{w1||mbG`uZs~p}6y!~T;tDa7 zl~tydzQ|5xL#*}46GD=!RBN!8qRLo+=ury2Y|YWDP90&O9|~5UZXj3G4eJZfV0{aQ z@LV|#qUmqOa=3W5gj(_%fHeDb&|MuJxso685_+jRFN;cEqJe^H@1I0(UDjy}y>F|K zn-Db@yG#5fBt5+AAaoXVGW(mE6g^|){nh?hhno+qOr$@nm5c7qZ8#Oyyjlhc5|~P9 zff#vMLe+7c;5)+Qd89|955gSEK+?=L3O9V~4AR*%an1rK=5(=wUqe0Y52e0k|ZgaEBJd%;%TW zJ_pbsiU#nLibJyEh%YOxO$y$(GH-ZlrO1sJ7U9y_$ZiJj4mr^YIU}G$3-;0MjhV5s z$)s4Nn;j_B$50sA=^CBq&bAv9@5wVJ2E=PK*TkLA2@0}pj)?1J;cx<_d*d~Y5Z-!o z-B$*mU<_O)jvElWAi&L!0ki?gfGXYswl444$fgjTKe~om^>{JF=Ky(A zn1rcCTDPx=Zot8QT1%QfrfZ2U_ecg*w<_Z)Ii5dkvVR;r}-z@Nd5VKZOMTF@gVeqW^zT0xbWP5}^M_64EjL2cT9^T1lM# zA29pBasvN*89K}V3Jd&y%g|XF{{yM_-!A=M!2(PytpC>jKf(e@O6GD%syM!}`Xlmi zM3-rE)!V>3u6Bf=hrxL@Bp8y!`Be-Yec)t+b`e+%Q~gq|y*wu({4m47w0uf@(o4*h zHc=`o8`4gzu$ttQ<=wn$HafE}Z8pF@YZIkMn!T@{zpuW%hr4h?BLLw0ZB^5pEG5+F z?^21U0PZwNr^929%nzCMORbp(y2GPmj|Zhl6brsN!dMzpvIFx%?eynUOVakXenjBT z_TuA5O-t>ND72dK>C+O}m{KT_=A!ZK6Hor*395P&bt=hel$5W>D7Mr)I$CD*$4Sa4 zscMp~D9E>C`0@&hiFZHq*2$s>?JCCMij1t(?B z8=L#I*-Jq0dA z(%Arv=mPaj#&rT=fcEF(_dx-FD$hAVx77rm$nu{t?sWqOu=4Mr?D;?sZSuWgefR)p z!Fd2c0gUm5HO;~9fdEj!jqvXQ#{uU70*QDd14sk3;eiA0{lNq00{}oq280860)zwR zg9fMvI0DSe1bPAB1C)dHv!@^f)k6k|24DjiBl1HAKmlL{U;)Si;B(ex)}Ti2BU}T~ zH9s-G8S26P>~@iJHPC9`;qmzlO17_g>y?^Hce6ft40?xH3F-;@CnXn}EQ%8Mm9+37 zd`8VAu}zPHhJ>{Widfxw3>vT zjO}eb>F%Ulsb%`-QAqCPFmb-Ys3S>APa3cNW7*l5(CCvpU8~u46MOm7=`-Td^fQZD zVkI^*i>Nc4Cg~_IE3^oFEW~bc2L18wc(m)x#*)=L7&x&N%yg;`OE07d=dKyIMx(Ip zmaT#WL;&wnz(J8wQt6l%_ySBp^a-9*H$QLv3^ojwXPx?JM5q<{sBA z1UgtocqH`f)L4@T;`}g1+q?h~KY8XuRD(F-8*RmeWz1Hdm>rYStCer89y=-6 z=3bK>VdiA*gM<{<7h-md_?`<|6}>YrLaZ$?WS4>!owU#M3Y?Z~Mf;p}cjm7leIU$BH91xR5ZQX#Y0AcZJuH)h`!{0a&paVJR) z!wj*(JSX|L$ZSQuyXaR#OOhKx_1$7GLN12#EFJ##XZ< zojSG90gInPD1s5>ov68bB|{0~CXXlJGPK6lG9t}h)$&Cma?7q3VIh9( zU$YbVrqQ9b_lCER%<%=Bv?o|giNP+5EjSMDioRqCVsEs#I7APP6H(ttvy!hG;%pGv z>iE<)I^vFjUO^>1>E32C3r;9M?OZ7o4v0?%^6aK|+E77`BOHKWkt&k)VX{Q-EJ5&j z>|3db0KP@M8CV;L)%}BLn%Am(c8RIyIo_AX4819jhql+<#dpa5z({>FPtI5<>m#Br zU_{wLCc1n+J>ts{Bq$aKeo|M^&)U3JG5FM;-~?Ooa#hIAYOpRZ6B@rp&oI2cfmncv zjaO*g!NJVQ9$lmYFe5NSd1%#CaXu4rAs-zUS&N^ zQQDs4oarCt`2kmwL}XZ#pup)+C43h`d|`1pSFCxI7z68*e7a>bTe?ct+B6IkN|@*r zO^zd=^Dz-e$Hq1V^Yb=JP@&Nj^LOd7Kr!alV+Z*Dp!DIX6vMsrE4Y7g%znB`hyGSK zpU4!B5~pTBJQ~Sy%sa0B+!0g#^x@am!CkD)!8ok@;gE!1_cb1qNyf6D+zl&+^e5g& z*I$3ax8gYCXtnk2D_^uo*Oe(~V-RLZ>h#(~+S3J+WMQ5u1$CqLk~h{OD=YJ#F~V!f zN)2^``Hp!Wqc8X^F>#4-=Wfb{#T7DMvBZc{v!YDCTo)^m6z4N_qVy$S z^*i?Mzy6P&88Bcm?@-~;B+YiH?RM?75bm&WUBWJvSyj=l#D<4F0H%5arLsjpFu*$s z$&A~|d<`TbYKNG`ljoD``zxjdr`gFPr!V|_)^TA~-T5>Bt^IN;^$Mz;>cZK$xt_k= zd&~X!IrHA*IOA%DiSV87>ET;~L9pINz>e4htUC)YvK}ebGX^~t-Ma4H>YmsOQX6q* zF0fS2oR%_IHs-MZl3=l|;?(VT&c5JnF6H)kv({}3cjxfsj0UON-@FCn#=G8G=|g?8 zeJn03c;w-Yo7ObOKGwK}N0s9DFoP0oXZRMX^LM^g& zRhN4%%+WO3jGgv@fec092SADA&HW+#(e+0YAz^pmrAk%&I2Zg8A-sFmBMj2SY{Pok za6QzH^{}(QLO}1m830j{4HPBTKiLq^Cu$U?-Zo++7h!B#$E&$-{?hY`hY)Hr&(qdEY z6+WBG4>f*bq2bhDJH3DUu2~Sma)SQc>!;*&5E2)m%5y-G}ItQajxYFtiqP zpG?2T+VH9vc`?em3sdJS8{*$~y4(5;N0A{JA<=dnDFe#lhASYY0*E(nlHBpg-<&`r zQg(L!;=UCb&TH<0(5Op-v}liz@-I*>)k2CYK8mZ*%ZrPz{Yp8$WWN3mZ#e29qsSi3 zXl7X*C7TK{LSp-N3*(R8S`jKwYYmY}(R4ErD%yd}BWW5`bS*DW2saC9&?pq6KIpGCTX*y!6&m&5XVWKXkYD_>*pa>lvhb^8vT(3pNd$60 zG0u}PKei>$_zBxA5#7B0O_x7^%fDDtQ3qQe=+uF5EB@Tr&q}*?-dWkLEd*(_BVm*l z!zusvfz2?r;rZTw45o2tHY-yi`;;DC;^Qq)EGD1Zt5-y1ua{|9RVn-Q9$_EM(02BF z-9?(z92I)yop9{MTVxtE6EW6Ec;cCJN}R|^{Tml892hyJuA_8l>%7jv#p_OEykfK9 z9+_^nErmP@vE7hcgWvzQKKG@J(&Y?NOm!N%1qUiTkT1=MRlNbzQATl7&2#kyQ?4a>C^T6@}oT2)+QO_mtO7J5d;1CZY0&bB-qWx%RI8JUEk5 zGw|xuG@)SkWR^(B$XSE~dt7aCvSo!Za@MsBnN%W$_80t{}N zQ5>Sh5P^<6p05bI5^_x_#L5&3qRN`fZ*LMk8y0iv@`dp%nk6`<19%;igMc`kbniK1 zRm}0q9Mu&VpUyvEU@isa?b_dN(d>Fc1-dYb=od$X;;VgA@NlbK!TNRVpksioRG4f0 z@v|cDC0w9Z5f*AX=EYrXtf?tlF7?+?eC?VHtq@%sW0_g3?5ayTTM6-52^ks7ahsUz ztad1Yj49zp?*<;mo_hH`;zvf zzw8GdCB?}$y^?vN}njWc~7}syq z4b`ObIpP&jgw+3r%@o8@Hv~*-X$N~iWET~wxKh;0FMYp$=-a)Z;iWQXG^s7=#ILNg zgJU&}5u@Ad3i54#UP^r^Ng?G>ex|SKKbxT87m1Qq^NUG#4pxtK)2eJQzonk5-*7Jw zK?3hVCOnGMn+vvAU?|K4xMya3>o=?w^R$6bh~yd|gX&#!ZZw)+$L%Bm?HI6r*G6dD zQm;!^7$F6_7e)m2*NU*g-S%N!-c%ZMwCkqUi$YX4tsSy~cN8bNxj2pytmE!E1OB~^ z9jB|_60>^sVvVeql%|;wNS30{WmO#CL3e;A25Q!_dxtH`bq(E&KF~Q5#+eIX78x}m zirEZ6!+FU0d1BK5V%r(X2iBX7v>$_@umb%uFW??HGcSO*qwx19_N$}e?g0*ERDehy z_-L0W)w|=E-@zP`u8pn!c?eEWA`uoQr+s~Uqm+p5##>u+PJnXqgHu=1QWE^1&P%4&CnkzJhvm=Qvjv6|v`*OK*uR3)Y*ttgF55B%rCb zCK95^fHe{X(pV_Hp|uz_B=#Zr;{KN{LmAB!g(lxETw&V0aWisF-?f8@lrZ!W-;Fh8 zv5v4%QD6`g5D*0QoB{x5o_S&5`&B4#m}zYy}IK6>$=PLzQ=c-S8bWdHS-c|C=qIj{}t`YeVwE{XCzry zlxPFH6*XbhSq=Hy5^rkhsV^aT0XJmYV`~F~nfjSdPq6}`=s~L0**OW1yv~R3p?d}{#Yto`* zRU>)VEP8xM4}cXBE(BG#(p)`V6{XhXM@BDLt!Vo)A&yBuncu7VpV!~VF-S1bwoAHc zMG`GP)HbX=5-plwGBfhlutJAj->)=)aRM0=c1mOJKni2S#ENEAibXjf;S`-B`dj?+#R=>l@L$W=CSTx@@z#lw9`t}B(&%uK;YWOt9#bOX=9VVpHxbVPpW@-08S!Y zs-nyHz{nAtU6FH9B=uct-1p^HE`skD9<6L2hnICI2diRZXS7qgB20y{I>nC}y|>Gg z?tAJE^XWi-b-^t-njMRzH%yeW8lu#I!OC(l zM!aI$h^cu)M54GIh!BtbeWu^!Vfh1R>TK|v#{N0*tt}HR2Ad zdeYihbVTvCw6zrc>FF5?h)Q3)q4s!^A{#qkwHPsh`Ry|U=1Vxf;;9pRZ<;b<Hu1vyS@GG;botyB$~r{27gPLFsY z>enqpNR6uGsmV(Q*8`oq#{!6!K-Kg^vH0ZB04=g;L9?if%7*C!D|Xw~nX8s&?W!82 z<|B4ElR@mTo=>ndC+E>)YJ;h|>|2bT1k`X0w%`wItNVD31ju)`dA(oXLoz7-u4hX~dIP?R$%D!*lh@Pe-UU+9=)$)1s1*wFgPslUs~W zz{&g5cgsiJmL_d{4dt?yb0%vfq-Cd|=()LX`Sx~a$zg#H!1m<4fmOINH6&KBBC(Sr zsWwwmhHmOz^mONz@Ew`A^U3veWld7dE~ZT9)b4^$$9YVzWR=Z$&ZX?j@bU4%)9z@l z*0DwW%PV0%(JllNM8*iy$ARjECGvjv?IV(*EF z*6&~M2QHp{g9nV9ojd2hM%2z%Dck#_nEAOFKbDk()+B-@)K?J`vW)Y)ia#hVsq`CaYsM+?t~?lfA_R+TcloozpD zi(hzk^b5{y(U>VlFBDFsUbJ*H02+YxABIuCPqFuoT=Ve)R^JWiYv88G&qA9k@a)@y zXNA@v{)UR1f}Mg?JX2<)W4BW@Q9B8pmh;;$adArq(ewK&N@l9n(k`M}YX=Coc3(#F z)9d+7z>i8sl)VPPR03_LjJyoB{kPd`%r#YX6!(U6?|Hn7dVUH=bXII$kcypeNZC=_9e(;ZYFt-(G&F&0*##KbllRlt zCgf(c#c-c-ZtqO5v0FjAo|~GSPiJbhYH`l;me+$Ne}8_7ZetdxC$KzPP|?lqEHOP2 z^O&R$A1f`S|Kf0b*^dh~E`X%gOq()kS|pz=SRg4U^BXLJwGczL636XbY~9G3A7{zg zy)dX{PY(X2I;)L0LBKhu%vD>$A_*3rh3z}cXphxvGdIGs5-_z;3Rwp(!~)mG`VvIL!mJ{`t1nWqi#9pu@vl`BdlCPe+FyA=ViReJ5-BC8mLHtO4TcQ ze#n_nE4*k8si&`5ThK^mAQ}Bhh`B7U5T>cGY2MJPm7POIqxa_xz@uv*TCuUve@bXl zK`=1)h0P$f3c}l;mlFhS$b?~4wUW~nCt@QYB1Df8^VKC4 z8h!ArsyRdz*Eaj+Uo6oi;i43UT8X{XL`+T%nx3!?ECXu!a8tOeSd$a~VJLsBL#aS}4gH}Hz% zLgnNf?Idl5I%_+w1qb#WKock)=`SK|VRzHQg$I>sqo$+iFi`G4*o?zQGC4)3_D38kA&?RBr3jzg$oiv%hHrTeKLdPD-q1aA&V zQUU;=P>}#c`v6r$(T$Pe!1fX7!@oNXw{3e@^X_Jw{Kd4)H(t$K^f%$T^cnBDXa4r@ zZ}xs1S?*xT@f@m#dFRrj_~BSY_H~Z5TuV~})?b`d(0N=qh)R7}yk&UtgJ8w3<2lle zzwAh`Gn5eRg`k#eZodJ=kV+2>}8KEjQ!>QX*=UL}a z`J@mwOs}aXrBd|DDe37F7ahXk@n6#)q#I$ViAuRs8(Zqv7p03uojCC*l_E#tlKPsI z#MTC0^VZ*U@73QF#;n$rX@{V+uRFt7)+{xBO>xe{pzKw(9Xku*^v$zy{LMk{>lqG( zK^AQ6tSqb#_VBPUzo9;eKIX(vn~_FurE6xK__@IJ<+U}vGL*_jUn=Sp7QqU{Dv6qt z7r6$3Regp&NN|Dcp+76RqF1(vKQ1eMxQd)Yd|K_4ke^ZxRGPl6V%oZr?iknGTNQC= zf`!3|8`{x1C?0Rac~r$Asz$O%l$jAn9l+p~F($=)@r9^otMY z*MZPv0FOKDLQ$yix7WPi&etOAwZ%HbJ_9L|j&v?Gp^e{J_D$MzsCE(Xr*NdXlJX@& zaj&zC`i$nSvz}d(B-k{1+zDL3_yFqthrH*Os=c={4tyO?M{%F*Mpk1Z?wie|Q+hj2 zqkrzE*ObPur`4w{gC&%UNRpMBnx0YFri1POahTir_!LP7*8RqPlMVmI*c`VGyW*|C zpgF`;Rvh-4>PASCP^m?gw8&%x_m)^1=}Og9ChH~X%;c3sFG8HHYRaK38``Wftgt24Fst~VSaJ7$2 zZjxw@E&Qm8(x|0TK%tsiq--o}ShrnV*nN%^>)4M{m-)=qu0wGA9cbuUuVvKbKM|tu`9?xw+73C*n-_qTy#F z%iqd$aF-c*ovgcKZRQs$hBkQ1{}oPOi|Ql6 z?{!0|;dc*6c!&>nY&9%zOSW*5UZ}{FX2+@}13PO3*T?m`(ahrbU#?wRY=C<)Js}tF z9Gvn&JA=7tM*o~aThE^jcTezAkTJ1Ew-s9w^*9(De40*##FK649vx>|NZMg2Q^jxh zMPqLOWmj){RB|6tJ{(_4PS#(wU8|0KKRWtIZ+MoE^|h;uKiD6c zt?Q5LCBO&Cht@hizV_X2FCt%6!jZMxedv}AgakHbPTuF?{;tB}Rp!^w%|EcR!3FXM~qjaJ8`rY~r|w&Vubh3kR@cQ}Mx@~Mee^h`~61uoOlavcSHZ6xqEm8xi^iYA?k0~aidI0lYhjYGC< zIQR&5LdNw6KU_!11;Jw&*8{(OMZmU{r5Z$TkP%%)W*mNY;QHa&)Wjm1Cm6M>R=T|Gxdr%PXPXf!x*K5A4s0g7~D4Y0>7zZ;D% z4Elk-h?AJ24i)Bl&MxB~yXkN<>3C*(#RWeEQWR9BkEpV2Y++|tTqV<63oEN1f3uIx z!_4gTN$y1EtA-=vwflSz{kk8kfg8NNdBTnX`yVWTA{%u|l`JDOEaYKo>| z;%aM__tQZ8>nTJ@On`g!_Km%c|DSxiV}qzmoq0t;8EKSIw4%`r1il{+9-}{N2L+=; zAuv)l?%#HUX?9xcHP<%egXY8!3sfk9MhbjLMXmA);2$mVR<`k%X1ou%t|q8w6opx- zkrySn*-var5ilTldOn;8QRoT?G+sS$i;Clke#JE^%Oe=nRjej6B!sgQ^W2&P@)3M> zD9VAP^0^Hs+7G^bs|}JhH0qU&`9JgA?|9}-a1qWOKo6logSis?Ij&C?LHb&BwDd&N z4%v&cZnn+4g?5E7t2V`oRf)`=T8gs7mUUIEYs;^3d)=>ad=R|Vi)ONoY~KQ(P>AMi zGB%{ko3*!BH%jgb9jqM9gmEeuS}QU$H2cG9dU}LKB2=D{F@l-S`N$u1^794dcpMdZ zGh#R^wl{(}JnO-j>=l`>#AmoMfwnewrqRFB-mBoEj(djm9n@u3*sjXEvTwGrW=2e6 zvem@F_>yE|jxmGrB3Q&~d~j4a6ofvwL%#cWw|BVh-rz_I0$ff$lYmP~f2@)rqx2Pj z7(fMq*~Z+qBy%(RynX9)`@F@kEM`akEM|UN+wc4O&p&^A;dKujriSFf;gd7bx?Piz zJ(U-2?oyNNfhiMwzA79=s`@>|e`Oc5Us7+=5#UDOSR`Nt;1w;CL)*gSNWra>-Tiz{ znIl3f0DU2+9wSln2Ax!bsT(8&SWgs&u_v9;YJVu-)FMFx6^;Vl;D#9s;TEo@T%e&! zO0&&#gGR^hBFMj(ld{?yC@@Wld``ru4UeM@YAUevkWd@=)SQv|?NV(x4j&1LMkg(< zsM0e@AI%MyXHgwy^$TI?@VQ&FKEh?|$jhu9nZO@)j;aCY<;WCqac&bxZ?40SuRCt1mj@%MA4(`tJJZQ!ExyN;gm zQ7RTnM3G#JDxorGn;Y*0fN8rBk~YLVeY89tw@2duCwIV^eqIv_r$k%aR%$B3s~JB;R@~9w$Ml)M|J)Th{ve1k98d;9;sqgYS6yodBg70 zR=y2qaR$CI(P~pbFU0`v*zPVR0GI~4a@LB~i-!CQL#6~S7ky;OxOT5dg_?Z=pqcq6 zuLXrNw=si^BVlsRt#CoJqrruKqtU(BkM{YBxj&R1wtdia{XSs6F2+^wXU&TTn)9f; zo8agA{4i&4z8d^{P_LA3c;16V66HQN54xiYs4JR~UQeq^s`a~P3PAaK_;`qjL!c~g zexY0%GiLS0AlF_*4~R9a>Xg1go(yYo9m3<^N203u2MsDHoTa9Go)xIr%F!D%ygt zC%4$&)-U=hQNV_j0%qIS+3@SwRnWQHq3Ub7()>?)zzLd$LDGC!u+sqV zI-;);t*z^UyYs)kK7EAJQ~y%sMIAf`0n_&s#nIEUY~0bjfzjtVIn$>uM5wu0%s{^% zzY>K-Ecn6GfIeVy{n1>JP&EiPErh}J?U}lxTa0b3x>ndVXS*@#+cs>CI404iQl8c{ zW0`fbArNzySGrUe$-enaOq$h+R;V=uuI%|)X;Ipj-M}$3S*0eu5zSzHp7WZou+BMrare`5`ir2w*|&>VsmVHR#5QrlOYMS$;- z_Kg=@o(QoICmnPrzi@j3^REXMh#@Vl5`kuEeF&g*wXeV!)$QIrt3q_f2jW17PcqYybj|9mb<%zK`FkwadLTW|wiU`Tbe^LS%D zmMn+*aUcPI9}<9~Cq6)OoZmk@UPGSy0V%8xFTL@ap#tWs$tx@BGRwue-Fh}}G*MVm zALMkq(HJhsAPI}u$H%e{WV%{agSlL&;gWP4Tq(q8U6mfZW#gd9|I66b?dZxpm#T?O7ge(2h<{-ZM>>${GWVdRMMzy~n~V`?flK zq9>Sv%g5;8nA*LL7g|QU69Lld1IRs`{lLy>Q)auTNx;Q}x?cfKsii3j*JxoOp`R zZF4&=y8Y0n=MRV(snO?ztR8NA6~C&t@fb|EUO-=}o-9gZ!a4QgPh2F~I ztEEWCUmS1)JG^gZER-xz(NM8k2B;FvI|fZok@ZW$T6t=7BlK1z%C#MV?Gd=SGS-!mN%C}I^(`o@iQYd=L8 zrRLxA3YXwq&SIGzxY($e50i&0d;2Q_*DP&)5!u_M-S1vizid2wz;eh6BsWioAeqBW zZ-efM8ta`-Rp7yr9<}AI)F}sh@J-6@L5W7Co&-1~VDg*!?;6M+#b|JEHn>Gq@Vdul z+lE1Axuc3|WgFRSh@w3NEdsI?#%jg1MKHO1i#Ey`9u6hL#y(J%x!-l3 z=XukS;D#bvzLRQh#m?nF@Lh>j5vMpcCl&Lbi=`ws9Z#2fN4%IkE{$q#tm*#skLf(# zqj*$zoJ`ly--N_zL}S{bQpxhZUWF(8buK{WS^YuKJHBx*kVlD1N4YJ}-ts@5MbW_D zsa9}CsZ&(6Qe{*R+FU;12}!>ziBc?HJs@$kq#5j?1FJ+><(j0c@sB7yU`W-^n8%g; z3$a9+N-jGJT?KolCCk;J94@ zJ4GZHxfv@{npxf(5`X88Rv^~BX*gP%71E_sasjdH6RCTFju(Ra;WNkuD_)xa&e+A3(l*_4TiLw3IPL+X@`h8bhjeXHJkx zb6g=0RR4}hKnE2INnd1&Y0f+LEED|OSW0X)Vvce^PVj#8($F0q%sG1cUhD^bJt7@N zp*ni4BicnkKfEkbysU03@+#K586rJh(n>AZhyeFpv=i);Tmv~jADn_0ma?^U3k%mB ztCjZ=zCwE{**1IajEiMenA!Hvv_jVcZhv{8#ocuvbhHc|NmOH#S&eC10so|Mt}VDI zjuhH}0{$wmMYTub$b8$Pp`?zqw>s=P9S{zv)? zzz~-%8<^Bxs@oFWjb6HAe`>*Mxct#3sKKK}k`hD+dFXqAV zCT|qX|hk=1xorJAb+$;zz4ZH zUt*wRqY&bsS5g5T3pEzcuh_K&P88JIRZIn5gjo9?~xQ4m8fUb zI)LM&g@D$!rUkcvK}#&mrL*-421;QsB`>`xExwk+rN?91;PHr@fdbC3SJAC)>&Sz} ztY!y)A!7EWmaVvdW2n3}BP=Gy9ecRW>&V+eQApoq>1_tw74KGI#|C!7{EVwi98O5t z2kF}oTb4x&o=0&gXbJm?fG5QQu6kf%X8I})Jl8?Lw#Kh4eJep27SOtx|DMblj2V*^ zYDn@@C&Xwx8>lbd<<8{>N23Dp14i%fI~(lQf7)NXa-@7@AFYQ!BKrjVUxbH99fG7M zZji~$#~Sh;3URleO3kU>5c@fL^gThO2LZ^-!U-sy_dvl7<-R*VQi@X6ET$KhC@#^x zdW(g>y_`!tmwYS}Uv`ovW!VSW{oUK++P`idI+`>dS-I7y-Ho_agU{ty137igBO~va zcgY#=F`mV69}}KcawWIG4H9e8oqyAb4hJLb(`Y1i6t?=_so#s%md~n4ora-OZI`2d z7osKa-*ZEj14<|eMnhD%z#sK z9a7u`Q~;^pi;a*@uKC;Ht*oAML6x5}I$OTu*&xb;xr$cSJs9Nso!Kv=+le>;Z&XnD-YnVrD0^wWQx7R!HKY{VyP)Cry*D~G@W>Y7ICRa!QziDwDXcC-)< zQrBRWZ3Wp~Qr~}FG}ou}G@vqL^2*Y>@)k0SnD8*+;myCWJNF@QDJ^&zXa>IESUxi2 zVHjTTcq0#)McKae$K8gQ4`&0_O`5xSoYMwU+7VqE6x`a2hGGCI+Ecw0j z;og6L^WOKiU)Ggza?;~q=HlcHXYvc)jbzu9s033SI3-DLEKIRF7_pbbsjeE2<0~dv zEolI7L73S>2JYELXEX4rBH0apya1OA+_hk~NHESE>x4B@)G$)kK@y)qeC=SpGloOzDR_U?8L}#l@zO9 zV73*B1yX0dfZIk~GJYSfCF|W#B56wzR9>;{ouX>DdK9u#GgwuEqb@3cT{K9Ke>AKc z;P_~3Ur&A*#cs|%^Gcr@>{3!DY;XF>q3jV1$LwEKu3o3k%4es*5J z4!J-=*fq|_)-CP$LV4Rnw2f=O{9ZT;qV`#X2@|#t90Dnqv(Z#Dq!(L_JKa8 zpd+lZ#p-q1pHmxa0yef_Q~flGjX`EfKM0pglf*7`-Rdy5eCUNenD3eU<$lkQ5XzdN zF9r)zO62PXmoGIW!4FE@!4BcFFI#zHqdIc`IvaHEU|HDahzG*kfO`wvy?*<~Ls^BLDXym?r(UjHtb(;2PC$e+fkD_4*GsIiOI zL^!zwR~p;I7#06{Yf;gRB$ykw3#v%%d5F%I(v;qhA{5?4Cs-Ks`(V7llQMlezB};O zKkH7s$8MO72u`g&^l*K6GJ1>d+izG*)NlJ;%A24b-MG)Z@HW@p!< z5naEdyR5LxA$h~yTgIuX(1!Kom2`sICVVG-#Pskpn9ZQ5Y-d78)>`80S`s=P+YcZQ zC-BGlKJSWa53==Z)TJg#YRA)>iq_&yu$~h#)1$Se0)%=avQ#{NSwKIJ1R(em*`QzG z^65)=0h*|a(m#u^IB&cDLo&~6*>-=bdqOsnK<|onVpZQ3^nEYbo5x!HAO@@em z|NDA{*fsW^L@}t%5#M*eH)Gp``R$Fm=pDnU6ER}1{<@G36vZ;FCkcFO02q1KP1)&@IOFP*`2;{P%c_Vs)aJ{V3vO&b(Q!#-Q>JX zJY$lurq5Y{v1xRm2Q$pmV1M+2$m8VJHI9#Hib~ijRmFAeqG>`hLPJR5b_6W`7-Rhg=V-x3tAr!U7Fk6@2mA=mz5oNHCdvIQ~OdW>_ zX;I2g%WLFedq(Dc>4BDp=@ibUa=!9!m=t5vdlygklt;RF<8b8k8J~;mQEauZhlv#y zPjAd0cAeK*c`K|2CDCU`j8eibKYe`*#CKSc`bEpa_IBs7=0>_?73)!_eQGCE1b-N& zo*P&Pzts7)=6%G;S+3S6espI2CC@G$rzX{4SZosF(~ITP9lF!6gIqcFbZ~uHI+~fn zNt5qKW)WP{MG}}sHr5VmNg#q*k$2=8;2b+F#22UVKy?97$If!%;|oO@pk)4viXXaV>2j15)3C^KerP#;~+<&acGg zNagKs|KDpnc{%JfVi*YKL{mHp5N{Dt(baw;L?kw7g}DOw>&TZ_^96wjE4hQEy9O_W zUSL}u$!y({K||)P2cpgBDYTcGF>I^R?yT1oyihkw_CsXn<>uz(q3-)0=n%z_u*g6M z4i~bTCe>oqqT7&q^;q)lRvBimhZ8tjhKQD9e4f;DMkNtB8mK$VwdjF3@A&8YNxZtR2Yh(dMz%Fv zaBl-b;JN3`UTgUXuAM*w@}p*v`3ebI!1%Q9t^pARH*O=S3|_dIYbP$tegv1GdYe|a z-r1>#0|xkw!E7Hl%Uf)sESD`>vgXYgP8`!yBo*-`M&3Qsm9g!GD`0R5?eNWOH$_4U zqQ=KVJ(d&ZX`+rixM}5!n|!-3=i+|PXz(QWAD{4fJMC>ctd!3dT3Xw3RYO;Ke}8){ z;Lv#gBTc{$^FX4$w`h)ZD1c1r_-aU-@uP6Qsr|&g&#!b0f4`r8Pz(Tmm#6Ok7C&YA z|Ae3Zt1kY}kmdhMpR)W9`jnG{HT1EB5X2?O7QIs^pR8i!EON2-h; zQA+KKmop(KK_nv(P&B8I(t3JG5QreWv>^T!hUh4a909epTbGY1%oXCfYPnXcTESa) z(mNkH;NzDs@tyzN)Af7z|I;A(?Sltq0|-Dwez0B>5sj-k(IGepCL}|57!a}#$0o<; z*A1!uu5n3=O7KJSz8^7><3GjfGJwjQ?Z;-{5Wi+)q9C;~u-S1Mf4Yz*7S@$|(UfsgUWs+_qV;0RU1uPH&h{_TWU~JhkG-YmS6%eL2*&^76 zlf_-Q2}qOEc;&3&1F`NZFlSf52g@RM*iq#8!Dx6BICfNU077{K8kSU80*{gpY@!$N znhzlNoDnJYXf`H+n z28aTr2rfViumX4kFaQqdZ~YgkT7U`w2+#%S@C@z;5&%qq512u(0MLLLAO}bRLLdjs z1YiJA0r*#~!ULGde@+E8YQSs}LQ;bwgN6cm51F)Es1;8U@IatF8oeXLOBqLl?;dy0 z8*olL2a}II7o5i*Lygnt`56m2iPS^xfBZKLldV2Za#@m3-YzGZ{k69;Rq0+vo8uN* zB0;Jt;U~72(P!D^JC=g^hB@Kg4}aP`eI808?<7N&R+qT;A@{)gLHeazsHRA6>E9LR zHc9j2^vm;0%`9yW2WkWF!DhW$bKIPKK9kAJ!)|w%IG`EW9*lL;;uGFOmI0B6or92r zxr2*@xx@!QH=XZJ>>`<=uc5qAe|SCY9~%+lfl?Xu$L^==6TK*?xQ_NgQ=#J^-8~Dv zjNV18K5h>!7yWO0MkOO8b9Gl52?hD8|t+K6fVN&9+DI9oM=h(Dhtv&4JrO| z9oyr0SdxcTdKg3djyZR!?z_gAAot1z@r5z)IVcYKBW&bKLK#V3%Q91*~zzu35qAU5tuduDr36Xy|bZ7927kM)S%y+ zu!RQenC`+N#;m!q9`TE_{rqV> z%A(JRGWz_6^m=w8Mdj_&x3O{AeZ4bkL-F@pp}WLq_>$`I1>?>Mxs12W?{}7t?HcqA zElMwumX}6SwJkM+O&yv>d9O}8;d}Sa08``mnNb2qb6FLG!%Y9H~)#XwB;|a zvS`k$JYk2-iqM(OsQdh>!NfP^i=Vait@{q&-)!Us%{>@?N8%Gh>08#S#mA(d{=AM^ zu9Dn#&9YFp8>De;EBNId1g>i=FX|9@S3SP~-YG+HoC7?_MT#!LEvwlxtH?~&^lgei zh+O1Cqaabd$x+1o$GWY+rqMdRB5jGQixo)S4uE#(m(rNRr6nU{cjX;=MX;z(Q;sut zAh2;sM|13NhPXQu`-cMLTh7p{TxFupj2EDvs<=yq13$@GuxeEsCRH`bYuQ!TbESWA zxV$w<;uaRgipqI#DIa_+Ewm2CjFd%vb1SXtBk$Vr_#M=ugsdDE)v(+nlrxJcq-LjG zc#OJBbmRT^aqUgG#IiW!&(3>R@D*;Dech7p= zE9JlkElzE^Saj#IT3gDLeb#kSq{t&3H4FtL3QX24FrX+)l77%T|3Z2zcs)Q)xBQ}c zPP!ruhmA}_NF^LpPfIKaz-CLFC^B?R=_55*g61X2|7GVUrrqgSEBBct*A;(Zfa;(- zDe5pk*`DZNi)g$T1ok>lIzcb)B3JCnomg)s^{Q^1l6X&DrItw~!(m{-{ygvM&%N+u z+}c5-$S`DQ#^2lZ_pXk)<*dxjLL*2>{P*$Y z@1AolD~U`_1f50X^p%RyO!_UtSn;^DyE zMDR!9yUTrF7*ud-6^mJ_6-n3M&so~<_jZ?ZS35biyScd{xO<7JHL2jnZ83kWXmm@v z1MQ>usLfU5}a!VKJ(m!|%6Tn;bO)}3K>9odIU6wmx2$3R3 ziTCk7y35mdE(%*vzIK5m_VR~)PE}0-e@irict?0Vw?4}mpT-l``MdR&)%B2ys&}BC z_-oR=RZ!kh$930oMR~LGE=Vq8awUC6G!PrI5SGW>ebs9Vo=_AuMb=MSdE5*Q@o5^k zr?XExZvd#LgPssXMPZ^Cse+1B8ZA?_oQ&jYWd9|gn*T03b9E$aIjGn>%2h?pZtmU^zS; zK#$yhR(@Za_yJ$h_BtP`(o>2p zcS;32d8K$z2Ndz==&A^U&uEaE_|RwMjvR#G;5Q6)$KHWOnKmiXJL)Bnh3kn|0-S$8 zir)|>mS5#9(-j_eI5bkK%h^(TjkWN!*5f?^8P%r7~H$ z)iYErT9KG0CVI8X2&n65&hPH&UHG3*nvW)hNmR8#9kmA#Hi*G7)FaeW3n-7MC+3z> zDy2#pMGL1^Gu*%SV-4BuXCZUy4^c{G9Pt$@Y1FD;F0FAw$_e6meDwcLzj9-|Q{3F1 zVD5}igM+$53nl+7AhRCWkK-1p#f;ciNV3MDdaD5i;uD6xBWajy;I^dfwmg4>0_4Wc zP2X#aFCygb5zzG^ph^EZJy`q4E3y^JF>Yb)Ah#R% z?OT7XrNz}Px3DLz_==QivE(m;>f zRAFV08gXL|mMoN8anaJAY|0OzF9sT!EQ!uT5w7i|?{+OOe>CQP9Zccc0z(F|AvAnq zc6#Ls=9`xI9<_~zCKh^IZ5LZuk}vOyWYlncr0`Hx5`{Z2)&!GbU8R1;`G1$GdJwbJMLTpI_0Pv6*#uj|7)t71cImp{~3K_o6F#{0uny*Qn!PC zOI~&lUR(J}p0pY8dBM(lu)v3;f8zj`Uy7#t*ISVadLZr8>?3=L*2||Q4Ia9VA6-1q zoq1g|3&kJtud*ZzdqyN>TqL?m#8WSv_-ugx5YSan1*~JDM7b4DUX3(%&DUO;caq+~ zsx7QQ+x80Cp_-4zQko?v?gfxVYFLJR0z~eh&j~HFZ>Yb9EnF|CM4y4lAW~jyv&51Z z_+y4$=1bb${hMWj@rt?UHSSmy!T9*xFQk@(3o{luD<5EaL^;Zbv{WwpW25 zO$-QcL&hDMn!-4SgasO}g91uLBITcC zzg4~2GtlJT^_EDWoOBD3IB#;Es^orH0O6B>x1FEan3v?}^f*CB9@~zYNkJMol{kKZ z_&dPE7#K>AyD$!A#}m@O2jbcKfDcHgRo^kPYC)Ob$f$$e5!p}2-7_-!T_?pAFJx!n z061&{WARPLa?Nc7Bdx|L`h8jC8->FenMN#s5=vr0??EK5VQ1_NjeS|v22~bwQf5r- zMjYqB0@y=<;T8m8HbgBvD!Bc8nbUCtaw0xsj%FgJu)Xxk-6N?^{-v7QG?!|FSr2{h zX!-u}JK>3-o>t?lt%BV8*22!&M?A;-xYo=1vc;L!(pN9aZTDX4ns9tgR3nHSrab#H zaZSv|Q=u`sHrgqWr+1IzmsA&B|)k(18%*pq(y5y zLB#aL^c3~u0N!Bt8R^?p@{wU-?bF-4VpU}DZOuQn!+N(kM|EKt_(|)KJ749ToFzC-HP#zG8gGIoq>a_SVOH+-K4~-xuWDE8`AdkF0Pm% zHAs;}Bf|-MxZ%g5ACkuFZq4{cc!gkEl|e&XNVkHTewvcyT=Bg?8&u2x0fG2{`V(Wj z-Q3>UbfN89f>#D7ba|j0o*REja{xCmKZj6NIC2@hKi7k$_+$NUQyVx*lzdXzv@vyp z)wZ?6)AAQDD@ne6I%u@n#d=Ry;$szrT}){f9Lwcgd3TZY@dxKVYJ~i5EC)!K&$2Of zWjiIUW5h!?#C@IKAS({eF$a~Ob^p(^@sY~bCogWwiHXG{Uvqa&g8j4BnIffQX|H)h zgcCu?u)NXp83~d#(AuxmH~myKOI0N^Ya3KRNdoZ>d_WC-26fY)Vxs6OS%J z;_-s%xwS;oIR5^-1w_9wX1Jt4p=M>*_eyAnRVegn4t4@4y)lex8I zM^oBtJ7itjb9?Iw4s-TW_lN)l5S4X5*<8z?H=*HN<8+!-Un{<0<w_ ztNo#%h*)nJ7L9fgvTxx05J>&5wlZWVOm0U@)4~idu5QTAA_5%S%}6yOJ}hx5y`#Am z%H|l}+<5EBFLTldFqr}I43Jzja67jy82T{M`3bjMpgI=$+9|T9XD4Wx8uC>|i!s#< zx76%%c9YD9pq3q!(3rHcM2jc!&x0Y>DpfVY#GI_Os#203pOYXm{sXKfm8)P8DJ?H0 zr??%0VuLXBtg}(s>6EGD$C92GpV~OKlSGD2e$d*3DGy30KJ3>_Xj=d%JmRfQHtY zjXWVxI~9*&_Xf^QyVX6C?8fV%up|1q!py>|E|z%g{yFTr;%@czLF9<2{u1r(2EH$> zL(?VLhQ5aP6IW#!r=uy0@qZ<^ew?>xcfoW2h+>O+M zT7t){~Z$#uXyp0gbX_QPFNymFB9)>)*wW05H*;Jbfhd0#v58}Q9KC0r0pWfs| zrAZIcfgAkGmtS>jPPfJnr`fvh73?SR zE?el=M(^(n`EX2|t1YX3)xYMpCew@lI%MgzD#bqA`)Bwsk!>F3pYhYq^a*3n9uKWN zB)!Sy3pwAjgm>N6b9v4>l`mY~yJN!ZHGka^{biS2Tj%b2(y?jRWo?=qSvvLjkkRkV z>agYHpvIw|BI{?2EnM3&HY9y#Xl+ZY@@wdG`Ia#`)RdcJ1PN zlpglm^aYm|Kk9hy?UCO`4SST3eEUVIi^Eq`xG;A^V0`+L5yP5%QSRK^7h@*3X)}At z=G=Qa-v8yIt7^>ru{8@U+>-ywxtlp!2XCuXHFD>`jh|erHDN-92WQU@TtBy@>*k1Q z3!0ao^@X*>k)Lj*<+%Gxr@5QLMwN&T>NezyPi$+y`mulQr<2NTinVu|u=~KtTNh4O zyLGM6`U&|{n++YZEMffIhx?k`+0|>ovRS$R{v+4Q4c%5gDRXhlovXu&wA*GpKYhd6 zK^11s{<2+qfyaO5+C1d<39Tx0cvRT=yxx!@*ZT}O-SMsG_sf6Y>ukcxgPqTGy98s(5};y%G&?&)qPs_|vB6XLTuCZf@lX57+#&y~xF(V}px-y>Hyb zUY*BZoU`TQ@BaShd4>0OeR#SbXg3f;P#nT?ur$vU%ulK3rL~O$8CA$tEv%Ym> z=G}F!sU6?nQTf`DVKJ?kR`&Qe?z-GIiKaBb0*W`bj-AnJ-v3k#6DGTC?g{O7tlD5Ql z@!z+?3p}lM>2&GSr>2cOXnpiUpJhi*Y^#0!=Ye;=m^Q3f|FN5#ix*v89Qb;rwxQ)a zRR}Bke)-%5LPq5HUz0qQ>xP;}6vz{~q~?in?(h|7+SduJ)ow|L*429*%2;vaqYbZj z?R~7uxQx@=A3RP!_S3*21Mejb8TihYh}g*3%X4BXjx-z!weM>&rd8AMd^Mg;e7t}D zyz_B8GMvkTZB>H0mfGX!KV)dm-wYvpOU&Qc_+mug-B12p^wGc?C!TzG?a`Lv87F`E zGS`m-YTr6=%j0-&=exrzAHII9Q{waU)lWr6p5FBCv9OFOO=3D+epaQ-O3RVTOFPeO zv%Bpg)9T~B>PNeptjPU+*9tS{Or0|R*^R0@cSNq6H6^rVAJfIQLDos0;jc|FR}X6G zX|ld<*W}7KPgQ+8>aA*xU%bBj=;h>s8QpT_-_ZP7r!MCHng9+c~1G@Aa8g zqg0bd54Y8SdbQvFsMiYFH$VHQ=fRqYE&s7H z57QSm92v0I7*VX(ANB_Om-On>^WAaDeSf}w=(CZLeFq+|7hK@tur2#Wmw0-oVCap7 z{rg_|{LZLO8y`ETk4X32583)|&5T;_#Xd<$&N14uWsfJWWrwz-GphCI`qs$ge&6@L z6tR86SL6O{{`%Dp=kj-HGGTMTr>#z2Pdu{h$PasWZQOKXU9+@nk*luE8G3BTtfCz{ zk6abMWN`1WPZ#AV^Pt(tYr!pFe{$4wHR$_R(<{$NsdDk%<7F~>-g`SHBcqSG{*+ON z>z_C}w9>Zf)m9YVbZO(@cQ##099DH@?gH(v^qha^i@O!(e0w0{PGr*ixovkwb=g#5 zZqch1N?rc_uZ#EQ4V*hZFznH{=ZqQeCJy*}(z;w7-(Qp5y?c?;8Rd$0FZSojsC&gf zsXwPd%;B-;uYbL1$LnpD<~efqpIY^Y%-@!Ftj?6*d!^Q&6t`(x$8s(I{-jS^^SM0d zYOX1JW2LS3>Q0qLJpT6F*Ux^deze(`{Le!trC$zPw(p%8CyEq}>Sqc%9RAz-4L5(^ zIvm%HUcd3#f~t>;%?kLV!y(N1j@eLfX_@52f~_1Md=_)>-;o>6_F6nE$3=v^|N7so z4@+0B8}mhcyN@k-_7?hjc$t}F56|fKZ_gqj@#{xFo^k6*%7sOhZl3J__-^{RfVscD zccZ}M)<@1fJ^p6!&ZGN>=NhoDkRko`;N4|HZl19f8Xx)bBu}3{e;%$mZ+z^X8Icdy zJ^Exzze<)nO}g*2Y~EVnWWe-wi=7jOR!?7fc!@ctXOD_4>nDf0d)&F$&am{CVtgNvL~Z=+M%K^nk_8*#lLs^eA9i~r@fy%?cAYvSi35}EnPaUVBsxicZ9XBpHXel zsn%|3Y^QhB5oQ&wdeoVg~CX8RQ;?a^7-3Be)@t{ZUpSuhW{&JG>K;D7J!yk27)V*{5 z{YiH}AKUlf2VM3fg1axqy|K@|sN!n}6)AJ|_=fnRHqX)$-O_*Q-yr)R9d?`)QHm*eT4kFN}`dpq_1w(0K}pC-Ep zmM-&f>d+iXXHKP+DtqhCFVo6?b0}YrhIQMlE57|fxq{58n)%+F^d-XQhU1t2sVLiCm2n=2bNwnN;uCq{ZK# z30&l8vwd3PpcYAyo4O~|+qLeUDlZQ7tbXISpjw0WU0a*4bMJ8j>Xd5nteEj-0H~W5t@&C#To{=*^A?c3nCgaL_*O-1MdU@7L{9=60oe zWrjCg-gI!=xl`l*UNU#g@~hW-RW5&e!-6Nj7I`p!=iHfLJ5NmN*6!ngLk~xFdGGlD z3KwtsYkKKPf46Vic~$>*V-I}VoY?S-cRk!<|U;oa!DYcgL_-4lIWeW~9{pI+4gmYQ(Tj@K#nAksGy|>PF ztdY3ead!7U=d6jZe>1AXtepd$kt6e!Sog5W><*qkZOv-!S=X)SKW_}a+`Zh)LgizE z-2e6+Q}XVK?G1{8{hI$X&(vjP)3tZ?^j5 zy?$Tp?NF=v#faMalNssJLg9Y>vI?oXr!a?DgD!(e2>PyH}gvyiq=K@W3mb4^9ld z*syBBC4amBh-~^thk+liG6%0;JbT|{PyFFAYZ{F{bL~LhLfy&^tQpd{R_}31*VayZ z*sfUj=uxG6pQ^pFX6ND?W_DYgSbyf&v>nzDQXj=``lW368F#Tm?Ov=rdScUvN^2XG ziWuAM-3NJgtt&D6apL3Gss??yu-W0atLKS%ZQ;oayMDfMs?<$qrQs7plM>yY4oAWc z{<`_KAG?p5*?eN)8#hNBtA6#9K7(DuzS{TZq}ju_#1?Gb?AIIZjqet`F*bhLpQ=uRgxIxZ>9j&dhoJLW4sg(p!zH#ALJ{`tOU4?FWWq6^7%R%4fIVP5e9K?yh6IHgzgDsAi>2XRfY%{6)~F z4y!l*@XnZ>p#izBRGj=r)yl3BdEP2tG3o0{IrCPo8JDx<#!ZVhug_?|v3}1BEiX(9 z>z#0STR-!$d6gTlj_&)-Pe09kHf`IDL3{3D73V+C>$}tQuKuCJ&$dnVTPG~Pwl*U9 z+i7n)pG5vV`Iq6%?@a#V%bQIrtSz^1gZC-r`N!z!!e)3l%R-hcmUvqM)>ww%vfF7i;3_b+~Z_FA6Z@An-Ob$8f+rR~-( znpV0_aO>mU%8Y)t>z&*4dUYxN!^-xLN?#~kwd(OBpIq#+(>(yrK)* zFZ{kna_yMiqc-eb{L_s*%Y$+)jvdzUk36q6tXkFCzsoz8nmDh{_077z+iJ$FedFf= z4IeFS<5+iZ((t%j=5WP$~(2`4;S;_uJ>$r zzH2{iIdSCP@BweMJ+im#^iQg_uCcUs)ApTuezCXWwk_3G?yP8dRB7v@A%{M!@>ji# z)cMtZ3382D5FGw}@#V$78PUAWyEUekJP|j!*_hAQeY`yIv)#{9g2>=zIF3=q0Ks0Z}nyFrh_iO9hY38ap!A6Uq2q2v*?%=-;_W2 z_s7#$x0@DM{nPEM+I_b-N4p~JxBm6G)u!eRJ#F88c4P7Q-sR3+F0sEM0!JKHzDRCMT>jorGBp1!Wm)`K5bds?LY>faXy zkAL)Qhg=ovZ@4g}(zlb3JSY+zSG-rqzT}VFcd2fyQLUE2UH-TyXJWYy_ws(UyHSZ) zclWZTuPi)%sQUGaxz|o>zu6pov{s1hwkgX&rT_^Q>su2Zj!9u~N<(D$$1=-??*~6o22Th%r_syG+;y$lm=E1#?eO*4P_5Hxt z24+nCb7JeD^GCNA7=5_%&(kN*o71C3Qu2)W&G+BG_P^(+kCyBI?arOf2j7Lqf4S%B zwwWhCD*t=^I^!K9N-muFc8+6XUf=F+wKZtifYj8+la5zjv7uDq&BvURzI(P}&7qr1 zCd?b(@$1ln$6Nk1%hB$$8ZTxJxcy0`W95sMTh?pBZ;NWqzZGPu_QR!;@kNU_?eYGQ zTIEhPd%Whtj^7qvNT`=wwM*9v%a-iwG%2a){gVgkxZayH>YJ#bE?0u`e|D&7p<|wL zUo|Pau2AHxW%b*RY!%iW%SZU-&nqVV`sT{SN@eYd-b`C z&0K?zhMjZ#`oXxXGY%a6;z0PjF|B$pp7FnRIi?Lg;Hgt`{*f&q|D4WQV|n`9qq<%D zI)Baihd<2=)4Fc;u_YUZY+G0@M~mnC%l?&X*8QYzhlg9rCC_TtIZsU9LLJwP?>N8w zlwu)y^Z&I!Eco)hxgU+582iDGrin|3-?PuV{`KHTLAP4uU0UEysU4k$SO3LwspNO> zpZs9Zm0zy>UjMTR{X6G~ZU5lTuun%8-&J^Et2cgmT4r+Im?>!kCdO?Ep4zm*XYXFg z->q$()%j=k+^}KW#M1GG_rm`d`N`0_zuj0erA6}Gnb+PPHF9{DjM_)5u4>wSd(o7l z&-2~yHv5yopY$BOCr8Sa4If;t+-zH9+b)6AoBn#VO!e76ytCqP{}#cMOa+^+>)2`0 zlW)$3K98Kx^U(C|KTaDtxL?<(#)wf)|`lj$rr*uFphfdMdQkYujXlcYD>3yJI;3K=Uh0l zPsX5Jr=~VF{PJ$qJ)yJaf6(;Z)W1tF{<+sw>)j{8wJUZG`LW8~6=N5E9{=;!0iAot zyK{avdv2BSRkv(j)@#XM$L7rKQ(;QdrStjbkN*DR?|Z_#rKL2pT==R|v7IgRmdqJZ z;7X#UpRT)?6T8J+%6Mrto7QR64zGu8q#KPzSCm@ z)+Hz0TVC3I=t{muv8RXa3I8#mNX?IuTFkiAFX?jWV-NnyHz%z`qq)DX?;KU|zVZ0f zGa-Eo?Em)KiXRsbd#lR$T!X(Kl9sDx(e&PL?+vCcn z&1kf()xW{k;?82@rw0e;sZecB{o8{Z1$Fsk=F*Cb6T3AX&?sd}!k*PXo$bE#%}oIy-QO!(@>XtLz0S^D@!^pr z%LZ618;V)KPCXiJ$A*a_ zI`^(nEa#EMfA#4U*W2^j(z~^a1x~D({&C|!hE7~(>d|BT_L;SUjx6ikqsJ-tjjI(? zZ)`5U<-p_bpI^I}I%LnKC(n;P`Dn=e)}wQ2tjefHvi zle>3K+5fb(xjRBcrI&&*QRy9llJ&d zlftu&|4X%}jcb->o;L3DVkKsLyJA(V7YD{o8gTd6r{{*>yL0`s&h-bs_u;uiMTcB# zwCBxsW9|+4=+Wq+_U@hqy~iIaT&T^NFCXO{esMxj*o~phf4bc!cf!!nLhp2oyj}9q z)7yWSUo~~+;0E`CPZ^5-Q7v)tjL|!1wMkE}Rqpeq<*F2$)p={e=<>zFKABPeN&8K) zUm9=kTJ}}DUyP5w{PmZd?qk~%TqpAP`uS%5cAvC8)!m*eV%Q%g4i@-6ant%*8!r@$ z|E_-P#I(X2!-ve>lQMAC*5yARES6ED?76y&_D}e(#kCm6!0UYjlUGgo`DW>rMNb{t zXPH-c&<}?Tbg59R?yM1?gyb1CvHk9i1)2{3>2|SZjjoKdRh|5>x`)I?d#W*@($Tpw?gU{GruWfOr0IOY}o3rk3R2Q|7^G;W$38BBLY8db+uOa zPDd8}`t{ufU#*-`{|9^Wv$Cg$RWJ7FV!Lj|CM6ZDXt5aI4?0n8Wrqo0*F3bMKw_0= zE$$TBRQRI`y+2)FC}64e*S(vIZ26|ahUZ_+TlLKkL*{%q?tEN{JNswEWy7EXLL&Kc+=Eo+c)m4cBN0RTKno9DBrN?@`PHZ ziA~Er4BTHeqes#GJtr=jy7A*q(ZzR_wk_ZP+5ghZ53YOnPX3zr!Uq@F5MJ=Z=XpOY z_xG$C7sg+>Ts@AN+&}dxl&8o2y9e+8@BV}M@-51IS|u^xvHkaN zmAT#f!qg)l-rHa)(*3WTL-idu+jz$ef#Zl|1)w)<^k@cWk%Xaq4)5Jv(l_*~mHkNR!%k{tfC~b5gw*O-^n5 zxZ}`LiS}%D|f?UgJ*ny^+>;s7tfv#eLAOF z>0N1-b9IiNxzO=c>$9x`d$rEJVd$zAu4Q9#cKs)C_r6_^m-l&gGHCAV8*x1dJDJ&g3Y*HlyIurZF2X-Dz{{aj$FVjbRy~m*Y#%`gniS&5wo# z>=|3BTaRVe`aW}gIQZAlxu=fob)Rg~-?KMx4r~bMcGuJR8u3wqqUF}6Os-Jed;$GkVSHaL>YZl~4E}o}-&aPK4r;RL8 zA?50T0qyTRFIw<^=+}E*e6Z-FZ~7;e*gZC{r+)Kt!&c-u)oNEzh9mdrxrJ9;m{z*s z%!`fhh2Cnp_`)y2wMMjb-m5adXw|hBia#qnr1I8-5j75)XEy2_GOhio4Q;+ze0o6J zsiCXS&pl#oTls@`;=dZ*E79!PKJ(hX?(Q0=D-@bvA!=U7ZPoe>y7zCrT)$tLH*SCF zcKst)e|Dtd_RYaZMtL6pRAz3kx=-S)O{=UdxMk$Cxr3U%S9?kSw)c7w6KCnhZ}HJ~$&Gz>5W2L}hZEVclr z#T4KSwg)&}cpM5$^LAM50ghlRdrZMLJ96S5gT-bJusE#&c9ThZ2$juhXK)oIr85OP zoY)u<>|h0R6hOm2p*r3_s9scn)oEf6eel9e4)%>;2Kpx}534QJ7!M(`Ib7^9Fb)vq zxO8?0+ZPs z%o&Rx4y(yqajFN^o8F8Mj0ogrY*XG|_To1qfY@!dvcFmLQE`;f!2ZA&&MznD8GQtd zsG>JLYNMcDynK~+tPWOi_EjIlt7cU5F$7r_Of?q~rwXWnq|_&&UXJ+@k^d4^Kr_0G6Z&e7d z%Z2`DqK@eV{m>N-^jz@BVRewGpzvVigsO582AeIwWHr+l=tCFo2sAiJVFd@%KgjK{ zn*$sWCx-*-(22xmGiruj>4bJ*Z>6Scjp=PrX|y4i_E8yRLlx+uwo_r0hyErQgpyP> ziZBJ6o#?|pj;OS1(K51y=H|^pT>J0;4gdX#e?bB&FDoKO8PvMbo0qQ=r~Q(ZznMsI z6l!v>ln7mu%%#vZLt3>ALD!7v=&x_usHSZU_3M-ErHy%J)HYjv6PH6~#p1$*u-0=~ zASsYL7mOfpS6BejU?eIIm^&AQ(HU$DutS{f_+~>dutCfWHV0HT>2Qd&6+nj>57}nW zV23)V?+yqraoGV)ZgV0%(mEh74!eUJDhK4rhLvj$x@t3+i~v$wvFp)kGK-y%@t9g$ zE0_kg5i@(M8L7o6t@<|DiF#&D9jwo|K&T4>?!bOYmyOtjA2ujWI|x7>!49y*WJ2F_ zfed1xfyi)y2QE{b+Q18eN){nlWrj|*L&EGm?Wf#rZku`#Z~{5q&AXaY0bDyS*ehGbVlN}BddR{myf&rzt!y}}`MNZHVa zHgDQ8j2T*!vJqbA1!LT#?~!Q7Y#CZ?wa-GAw8O4CF@|$60|Mq?%;uzqA~Onsw8O&K zAfyf(L=0xtM!%u#tuQMV2&useiM3)VXN9O+Nc-E#Ya<;`h7w{$E*Km|8*H=NYK026F9O0dBoIGKA#<5?Pm!N9`^Xdg4|Ha%9d>v#<6ADO+?jMSGXt@<|D zAh-_D<3KNPQ2#==VO@q`D2e!CwLod3HYDhFvZQc`9UzbR1{+V3O-w{TgViJV(ryQx z-~*X%LTE$#*R(_U=x2j9}f&R(L!!nZe!T}>hHuO7sFzf`SL^(vARg?yvDA7UM zjmDech?UGLYUsp6T*C;JJ|Y8pEgN*wA5OTM#2*KoX(zfcVP(EFLysSJIR8`+LdD*w zJG~hfY|sjno0!Jltg@WB^qUbt%!XG?e-oEjI^qKR10SsLt(o0aKLSQXQ6~0Ke?|tA ziAvJ2jyD7`_!S?+t7cU5F$7r^Ni`GErivzG0&#^NFSj%_s`UPsXu=w6Ws^`)7NHwU z5vhhPLOS^G#$qta1f`Ize(cCnKPKzP9@rultV1zY&0~X!rALL424o&46uFHY85=_1 z^spf=hPh0cF+0mMst8CyXdhEBD#kicn!e0;rq;Y{XVi;u>A80So zO_ldyV~F(s7zl?i8I84BPL|30OKlY|(~0qTRPwox$b3WXKSYLihJZXsHN6#$qGer16I!rN=;1U5(+9RfTZV?Wguflu z!LPqh4}&W(awye22Ktbd zhcc)SA-9oljK{zTC88;qM+Bn>JK&Dm5d?CQ*Ntx$(s*Q%K`Swh;>!f5yar0lkibk6 zcL)jNA`&3x1Z;#Ij~%V3)?52#Okgx1H)EOd_OcegDFgcrkDC5w%mSS9LE(}ahC*U~ zJ4`llOo35#=o|a4v;ZHCPI>}TUNa)LwwGIt!(L98LS#7A#iStMB{e+$jg^?|j?aEqDCNGqFGRz_C z$q-m4gw#obOd%TdY&*tV6rrKmEJZcRL9}8NXhq=FU?nMmO0?pG1s6T2<^8YixDuIsK{17 zW`;iVF|-3M4}l~z34w%8C7!sb=c0ErnC9&;!5q;L5)aG7{xMh}N){%i==_jO?L)IJ ztPf*MqoSnmCKEIS=DT6rP_TjmSqO9rRh6n748u!v!{`LW6&jyX#LETum9fqQ0DW+wcOoLp|8OaM za>B&ZWHDhi(QG08L5~BLnN=L*sszxR@qyys#9_uZdP9GB*^A$d0Ae@vDgDj)g%6w! z^as9Bzh@yd;+X;?s^}a0PKuQp!c0DfhIgzER&e%JAH%C=RP!+eSr$w+7ZIlls6j8G zUXE$VR7s}h@F$=Ky@V19$|7`Vf9APqSTmUCkPd$PwG2H6J&P!u{s=rkK1@qY>H3dd~ka-jR{~*9eFa^NA)vQ+fJ>f z!YGf|#xemXUjr4T0lbP`rBaKO5iB$_Zw}(ufB&DA`6enaE22fEsCA<^FJC21`z0%X zv&QEr)Z||25IUuw`KA_48q)YTqNCqVDaN_b=-KO&SzB~P4g$@okd)Evj-AW|P5rZJ zO29O4?ro7b26qrrK##!;*Nc{vu_!4;N;MB5vXagx3#A~UznvIo)8a%blp`Sj4Iii` z>YF|ia&?@;;3^D0D19TCf&R(L!)i*k#Y4zx3W**JUO^|(3|E6ylll`yi%<$JqM&aU z{HB>5HW>_ZDc(tNMgk>fNZ?UZ1dNa{gh)V!SpA#2xms=QoAH21pv=TD^{q0NezWQm zqtVqE3E&k=M?7GE-~(qC3^_)Yq(wh*e=~)1htsJA%@986) zWM&8PW~-~Pn8O0z*uX1_a50|YH|1d@P-6PSfds@LhJ-%iaj6OMH!)DHw)V}KNYzne z#OmLah%r#fsQxDDA|A2Uz?<=aWkwB%S*%59aEpZ0r0g4-OJyXBTB{78H*W@{WUPIK zH)2n(o|*D81X&eFwJ_qeDwY_m`s9*0m0htkXyuYvOpMWYU?^xI4&AUtr2h$Hs8^u} zXV)vv+9E6pgs>GK7|z*IKU(3zRzHx>2N=zns&BTC18x=#4k!;jSoH*B2;Jvzy#*n% zQXqwSq8t(ZO_Q)LGG8cwBOuF5A85sc@}`f3TwNZ)kf<&=X(Mzjeu&RS1Zw_)C@XZ3g*x1mQycF<^O|HS^L|y|WW=LqU2J=IK1exeTU%^M^ z2Stt4dTZZ|2}B^}CXT6Zm9zAlGSF`dLDApDES3)W5UU}R3r$1AVR+*7R$oVr1X&eFH4`I^))#?%#sgI@Rc5L5Y2VZuDj!t&rtb!= zT&m5Z@4@hZq#n#JIFU`T7_YJ*AeucN8f!j$yCfp|C-g{)*RHh&71_fFPhYbU0|FwD z66r~Br`Bqdln|AuDaV%Wau6_oX*rGE@fq$kPjr-~6q6~to3+ds_P?|kPEJTte2lgn zz5zwOMTT!5QPCKTp`M;S-6`(GXg4-`1q2&Eh)PI^3UC?2Q$6U(##RaL*r))L#n>|* zqhW_J#)HJEo>csB8dKAglkqFn&{bcayb0~U%S-Sirl+F3XirLXyqo_*xysM<_%u&) ze1EC{heRhO_fJV#V5#NKj;WT=&hInFQh3YXY{C~@bYzP4BXjv_+!)aWqT4*o7~0T;$Bf5<$7*cZpqVkE zV@qHPF&G;*z#lD)5p6?^VG#|DjUtR6L>Svd7~4h|uz1thCp{?*vYZ$Tj=Jo|*p#RY z&f3th=Eer9q#GNgAc?VIv^&NVA0K55i;7N9a~oTxdE#T-24gF4y0+fGqIi-hhS3;B zlAE5;Gv3|L80AaD@}m`j++d7WvAcOzH_z(UWJU43>lr;fjfbc4_|h1R9&e&Vjz5W~ zP2y>jd})o?o~GbS;z`q4QiCy_r%l(SP4}jaiHePNrx;^UK{uFXw;EI3(P^HfL}QQi z_;`03$sy659A_{hArvb_G}V~mj`gIbp}ZI)>%k=M#i3R;a-GdU$GCOsPU^Z;cV@j2d@loHdERF5aoO@AjurADX6(+{Toj8SOjBwmX? z>F!iQ6O+_8(dh0M9Uqmz{)|tGg?5ie#f>0}{)ECzLfaanpdyp{@tTFY?XCr zg&RLOR`$sU=fD_GhKEErK52kEG1hJD?`?pN-oJW66EVI;r>BsW=+ElQIt@cdw6I?s zWlxU*gd4e(pmbw0R9jL^v>U9Z#`kr(9@q`(tt9(_q-k+U>8TJIV*`!wh57zA7#na= z3G-GkjI*Z+hd1%1H8%04X~NUAQUtt}CJ~w^9_`E%wB<&Rh>uE7GbY6*CAxbXqoa^bucIYH z6&@9frU@ro0R_)pD`OjXYEpU%nQCPgu_59hNRS$!#5)@#LIh#R*;R5ntE|0Aj{5+a zlwcBzfG;f!&}6HZ2~Nc0nFr>rHii)lpw=5PdHfE*3^{u-vJrjbzgSuf1o$sjJq!=n zFHCAv288U{i(|pk0``kz!5D-6;#d%R!Y>0N77WO-V19>wAuP*Y918;d>=(y^*>d)a zW5GNc`^B*!JWIbY5N0oqh0W~%$gsd+=ifLMOc$_}91B)JvR@nvUyp^67XxC=8y+%U38`$B{sNEe7Acv@pgpEhw2OWCU!=B|Z`@owgm9up$|tU^j}G_k>zzF^iFvsW-?GlYV9uhkUH zd$W#0)|azcki>f4>9qyPtYqCidj(<6P@stScJ0uL_4w?eMW{ePD~HNi*M1pVtfgW| zeD=r0`=wSSvFM5t`SwPeSU1fsUPZ8dqK@fKR=8Kxd4Jb6EbHyrE6L2evW5aPrjB(b z(a9qKXiGBt*~X$*u`;jBsz&wFWJaK0&nq+2!`Y;O8$T@tilXqfftgvxY~tlzRg0H* zVolqcSwGJ%UM?X%HD>1a*VmWK+%D@l&iZjSOX6l)O98@V`nKhEU0)JOS~g4K)?QbV z*bmHp)@@}fGu+~9@p4x{+XhT!yrjNnHi-?p;p?|%M0XhYQXeaHfx}IAif%Km&4a;7InD5#|yd=nMae&60zu) zQRpj?d-j?Vu_{62F7x-ZS(4%sXxdTL6W(^@YC=a-W_p4aUo!%HdV)5m2{bAF*=Jj5 zj`yXK=npUV?lryFqPYDUysT5bgfsr|s$PPx4Y-@2X#=ds72Cj12wta|{ghIkMU@Mg`6w^Adl{=s)$jhM!INqhUNk)$K6ijMHcB&^Jw>r2W^YxpZk(i&DpYiJ}k zv$2IAytEZx&r=&8N@#ilon!D)>F|eFvg5RMgG%z%*Or;p_J>#U_-%^E@8!6Ss~$|L zvo>ZMbcD919VFSN2rCW*PKjdzn>;44Wi}@8M0tJdgpphyT)O$&N{oz$20zPlW zru1wLUgkJw4=?Qn)7O^{|Izb-4&-{NEc&T0?XVK?s{Kv1>~`MWv>MKy*~r~rN!-=d z$fBJ)!J2+d$CG560@c&?>T4)9_l#5Y-cvxR_dj8 zsh83My=-%an=UN{+^A_e&dgdi>#G`6AIDXD>g5bKr#jALW)yFH#m452$P&AQGYtvGD0WZ^E*{rYRV>m<~!=X%4(AFD)^R$93yV6AmC<`3o&bzOz zY2UI~64Pwiq>az=X{3q{%oKQ**_?nw9o+l+JT0*lD3GFnwAtvTobiWOniZfkDp^Tt z52qcEB4^l4;7d5;uOu}#=hY<+9-PxkDeL0d#VhtII{iuDcxL*+Uwu_=;H$411@v-; z>j$k~a4@ZsJql<&y3n?KvQi_R%3LO$k|?wVZ8pzttJ9gS`V#5f2?kMVqr>L_z@#m! zoR&s9rYPGbDw@NmOX$2#D$%E-oJ`+jlXp@CgAN@K@n$j_@zeTFX-0)M@C$e|n^B=1 zz?4N3b*D2u7|1JCbQ}+Zcsb9Np^oF3#UlNcr21vPl2k3|Er}~ZT}hcujQT4{S<;|s zTSW_M+LrlPFKJtUc=@shjV^U6;~ouOHbs$5yvpo@roMb-gRj3ixmwh5hWS|8EJ^j2 zd~LwpC2dKP-Jx^YUfRF>@rpY|T3)HMBi`1Q=R%xJQ)ZJURSWuPQszQ5t&-V{hd&CW z2#iyTz|hWv>~hAX#$>(qb@3%18qGsHeqV~$rG{~Q7Mb?`>U*+F8hg4ji|qKrD~$+U zsvoAdq)SbTX*LnV6aQlhuCD^@I-#eiSZJN%U_MQvS5)YjKKT$#mY z{o)lP612UQc&EjiN$>E7S9LXgoKieZ4c^TBN`H7&FH(b7wD&HiWV6X%X|;(c}IW;9=sha34 z03>(|fJlN17|BNV=)!T4qCx{mkvf&PfH0}ksu;ki>e($#oecI02v*{W5)DvhBJGcD zQY6_Ftb~$%LXCBPq%5;rYpHuB8Qg%y|27Nf>Kpai7a}TnQTI!#` zqo{o!A$*C5zOggywEkK|^?Edotwf)-E#hZ)if+!zZy%8yADks5%TZ>I4!fQ~>VJ}} z!%oy=$$U(b7knU9CjHNEagb8Th<3&gr_S(!nube!f$B>n=|6CbHl3YlL&a%vXBH*$ zk6T?q;%i+KUqj+^bFn;DR#Uie;=KZ=t{k!HhDTqfPyKW=64=yQF5NNxf)=*)H# zs6j3bn|OFj%OI+Tlv#X@9b?V#_}qEGln9816lMBb+e0#o*Z&7@#kgy6E7sPl zNKEo-J0K%je;McKb{mNlX@UTY`xRHhR~#P&>p90J8?s%T635ea8a4$0Rpu*>PbKJ! zVdIm*ZfS{tiLXe`Hg0K*3N0zA6uRRq`@(CM)(rx;=!ViUb&z_UG?_D7B8Z(2 zimRsS_GZ~xl-43+>jdkp`r?=leHrKc7N=-OZL6qDjl6w@4nh>EBZypBs=?UI6N7DD zjQKeGoAL!H;Q;R9!IUuNgT2AbZej;DBL-W^n7e^Y%3Iw7M7{Hg!V`CQ|ZD4~JYZJVA-4&+MK08JWUowrB&PuKLLfV(G$;<BBszmBkh`{YU)Cr$xEYa%~Hx$%p9djBH|o zvbc?%SWCZ^Nqij0qp(O3ekDLhM>46p-KX4LoR1ohgO9Uc#w>0RaFCH=Qh30Lc2}y# zhDUA)qNoEU1VRv{cGyy>n5|$wPok-w&-CzHTXo|Jx=Qio)-YI+6%1N<$HQn>VI}@z z;)4;X`bkl%80x8M_?#R}r)ncjeC<(IYskIwmv9h;^Cp5{=>0=srim~4A;YcKhX*16 zQFJf63Y%J7ap33=K6K4$4Y{3tSq-^AMVR?$(TmxfN#hVbFF~wCaUciWj|NqI3_~UH zw(%Ba@s;IIOvyaHq$J+GNa7Tg;l+!+s0L#T9HbEylGHDtGnGomFX0Ley^p6`$<*AF z;7Nn86^N6GJkd=O(;DIAi%@r(JGy#6V3Ra=LXg!~9YxTM>i?0^AtE{6 zlZMj}LXuLeqmGKhr2Ev!okE`!KOis!d8$SvdlDnkqS7dnvS}Om65VO3?c6D;>8TBS z(LDYZUuCsxPVpxnm^Y?y@8 zO_EcQ9)V=;)dQB09O;gCR}F!02zu!vV~!q2V1%b6^+;`!*t$h^cC?uaPfGzJcTBC8 zNoiD7MHc~8hC7Agdes9I9HB|kwLnn{lJUL}7#7~9mKo=EgyYbO>hK`AuJwW=u@Xe#FOyc2jUb9daEKi( zpv-G3xg3Bf8dHHd0a5y?0&x*Ui;&LR%pij9L}U%XiZX);3lEeloyUw^bZ@#Q z4T!KPLk|THh_EVWJ17tkVO7PNV+Ijc9=TRAg9ti8R)ZNt&=m(72#BD20euh@Zc@7| zLu>&NR%J$?7j6L&bga526NsQomo*UJu_;kKB^QXWDXzN$0TDL7`%0PEEOB z16={Ffq)GTU0b4RCY?ywzy`XS!O&eId7lt|+f zOMoZEx4}s~X-N#K4DbnxleRduUj0q=V}=dq^*{=gbqaw5_MuQC6%5R(tqfQKTc<}Q zrllunZK=w&HtuLLcl}$qaiUQSayeB&i1?rdsBwcYaC;PmL8iTNRD4f_T?kHB!!S{c z!0~!X45aG5$S9ot)~cr(Plh6Al4}SgBTZ@98CU3{s!Wj?3h_|$E5=AUTqUr5R9bYL zJ0_frv_K#_9xbTLvUIZDNuzF1%{SN16n%G zm(jt&NpT63l+kA3y+0%+isWBW{yZ5@4ArIV1W z=7Yhw?gX#=DPOV=lJaHQBH|jL%>vzt=?R{UAm}!Y@2W{arMNsU-g*&f z?kHl1OYM3*H-oluXApz6e2PeiH)YWYRAhQ|vDj=|dj*iw~ z=N^NOK<+Z=s%2%CT91pFYDSM*El|j(y)by;1u|o;no9-5thEk1vyM9C%slFNMfOpT zh#5#No{S(9Fj^Dp&_P#&=*j>cR@H%0 z^MVem+MN{`_kXogl@Y`}U~R(#20CoYx@@&v3+S+^W8`^d0KpS25qJ`N|7pJc0F-->;OD8z0)IB6!snphnng!D7jWlWt!o0Iq zU24*}_|gYOc2OE?PnSOEYK7X<@%B0xYVXqZS>#2_xK#D4mO&DWb6%Cq-U>mTcuV#I zp~KY4Gfmxt0j4W!c=5i(=uw&8dWHv|wscH8A1hOE5L65~b3n1{dt=cvO=b zjG)Ut#F~H?c4Z<|iv;YTYXHU6;0PUmFMvUfGMA`rH&W|#wV;@obeift`08f@?RKx| zc{ybQ?RKv;`@kf;yk*caePE*9E2};*(e4$0ADC!Y?Vtt;(at-)jvS(02~BH?M77Oc zP2xpOipZ`;d3>lz7twj|V2QTcG#YzIqew-j3}96YbmqnN@@DLru!d?p20f9HhVO%4DF18d6~nSzJkrIb?CQ zfOdyEUe*)|+8tiq<0}%hJ7nRufOfhvN)Sv7Xs3hPMKEZ0s6M2xNL0kE4$d@C&`vjO z2so^u-JyEXn$$$Q5*ydBgzULPSr4iO6YXC0<|UHpY}Ikq;3nGDK%53lw9A6Y`~`K; zs7XzPei%Rk#9do$FR>95WONwI@=Cs(oBYTHpkrz{e7(C(C5!4BG;ax2(D zyHjoj;4sS^ae#KZEl#Mm1GLjsR3eyYR~8BTq{rkS+U2%!5bZL%9YnjInh@=BD>#UD zxfL8lJ73eLkz+)M2rOA#BsO!@T5dauc4dA_LyePY_YOk5QsN}qWfkir+GQ2%B-*_m zrVk0xt_Cf9GUX)NmFa42O^9}7@s}1%w5uUa4HD4q@(x_QMFMJ;`R4-dF4+XQK)Xx! z2wb4uC3^%e(C(70whOeolzo4iYP&$YOBPobXm`ot>H_U9SukCo-6h*U7tt;W4{B|e zEC9I)X0LauvI)U5VBmbx$OtAG2&|3@e5r{c-T{dZObn4sImX5W7WE<~CjeGsO5S$F zu$jQ>pu>lo7~&nr_`qNYLW~T#;O~<%`fn3}b3t_`0J=vLA<WO9GDd zPn25nV$CKb2V7z#xuAfHJr>SBgNs%j&B@>rcWAZ;5k-by+kQ0K1zg4tZUQdjXY5pF z%6-CXHZd+pZZ3I|W;G_};~B{q*1L=P6RQXrT;c+uL3&n8ZS84%47gNF8Y2TPae>Ck zfGZI#O??;_locr&s?3ZFl7o%8al)epCpCB&7u0yJ4~}Y@)u|&5lyO0FWz6K20=ra8 za!UahO{ z*V{oU#Dqm5k}Qya3b@1t3N`^Q)sj3^z$GqFOaasDOcu1VLq00tGJeJdHCpUzEi2=K ztQg5n#ikRf2U!^x)agMV9u#YqQ@1C0*gcy z`I=azBT+@pCg3uD#syiz$=$@Pm_!x%n}D8L_bTMwq zvQMrnrnn?o0~)is;=?Ct7_nFPAuS3xkzr7LQ>GXl$u*ytpt)A3%Dft`LnVD%OW||WVx#Uou2it}_I^Ps0D-dY=qcU@}&>1wk?T)%lddDrp@uWL8P%kQt+^ z;PvdWgK1W2*hVJID#h){fLWzr44ECP6pNv7iB;L!RvNl#}0)cD|T@$M(jRGY$spZMe*rb-HFbUmD3Je;Fa)4l)r2fdl*dz@__QfW- zIAmSu3U7VQkkl+GC^9WJsny7^(3Qsm0wS1eeNA=AsMwTs_CB7INwGR>6+^0|1GN}&D}ICm1FaarDZ;40Kq*FP zihL=t7N^t)MDhJRZTVfLc2qi%^#}aBMsdq57B#j3`4@w47t{ z2lX~2RTC0rSmv!uN0h;B(!q!_lWOplGKeyNcLnjA79>rq8!%qpY|9QA-JnOPEyARnk$Ld)MnJFvc0xEGjU@8C8uc zFvb~mRHwj*Gs;ypYHOOQ&DFhi3iqjz^f}32g9oasF^f5v)%XoBfyEn?Wy`8;fC#V8 z%u|5`ulLI#AOJB8Ek96wuP@2dpz_Mb0=4d_x>?mtEDiBhD>E!G$@P>{8x~_zM@c*n zGMQBmibFs@zxfsmN;rgQP)9i&LNw@F-wYZo>YN@=0~#!<&Eyc!VBs87>jN4rYP5)@ zp~AJ=fVs-*c#o%mNLh3=Fc(>k9P%_kV^MaxaT=Iwtd9P98qi?XX&G{ft-2mY?yyyj zUh`a_!K%jLI0Q6URhOATz%Cs}$@{hHT8cbht4<@4*K6f{Lg5X0ymZwxvtAr85LWHg#OW(|`t>PDhewYf~4Eu{1!8-7|znsSbIxHZ^X|lYj`D z8dl;E5Mfi@W)1-nHg(?thkyvX>QizE%Cf7&K@I^Cc3pQPuhq_p(7Trmw|}KZJ}qy2 z*e_A1(MP-L1@J<_1G|m~sD*N@go1~hT)P_dV427{wd+(FIi_}0JIL>)TANKU9j^|N>`5aCeAh8zMS9O~edL6FI$lTLCv9jdRylYj^Z*U?I2 zle6j2^)YfZ9jX(-bCH;f=;hQw{+UPSrc-5D?*1{b~k5 z6219hGi|z#$tKx!N|ep7>68nbTGN>^Hmj!kT)Zd{;Z%pJ90DSo>N;``AtF>Si9?78 zodZBlqEn|L0nl4Qat@t3oy2C#bp8RGDAVq-!N^*i^YyJb%&g? z0S#GLwe?u2-YS-cbXhW1vxVZy?<5K%uOQ50=#USk~<|JumSG3?Gcq0 z5Q@v2>CWPm080>tX+4ut0>YE};%5t7Zk?Exlp2R@3@^R}#$@0I;{aO_-107gtp-H8 zJ9Mdz?~xu{cnqBJ@nNZ{QTn*CDTJq^Lc2D<^iwDKP`6>Tx^8Ngsz55!jb z)5m~B4x_)xVW9ssFc$O{VdU@%FifLJFlNkk>0pLwbSc1?1<=Cm*tPhO`T39d+5+GG4z}Q*>9SqkMiRFUN z7IIgFbZj?`0As7J1Q=UKE5MkOBEW2<9t9Y)p#qGZ{w=`Rj&lL#BEzSL@d+{k#&+Kd zFf(}t0*oEaAi&se2LZ;8BM@Nhbb0~Cb`c3Mw)I>OL#$ksXE=0Z6@+wbe}(|F(DD=k z#`ZM`Ft*Q3fI--#ybeDw7b$mrUJIM77GUVhQaZW6VFkZjXDp|d^D;k8D1)s96krZg z)B=pHBhkYk_!6HH{gZfr=$M2LORd`vMjL3h6NO?5FQTZ%91Fk~mQhVdXhZ zscOpwK0BE^0p_5gf&gPX?es8sV^SIL$0WWu{qz}}Ng=f_7LZB(4Xd*x9$@K{TrN94 zU8o;h4X%gbkYb5mY;cn5j7@J6uUu?Xxqy$Y-4|dsn$i|ve)#Ni&=i`GjvY0ugCTZH z!!iNJc6kdhwsB5?vF$$s%t|i10Aq1J0cNM^4FSdu#us4he8ITAOR}{%x=89Xh#AmGNuL*M#RVAZ$1cee(y;?Y1Q-jIi7*;Y z2r#w-Q4hnx+;X|>z$GCan@tm8G(ZtxY$8E`u^@sD23tWf0xb-y`LXImgyE2M5r&;( z6gtx7#ikC?rvd-iX%*UZ!MGbsvK4l0a1nJj4u7JsmynlD=ZP@MreGHc4by~lcFF!? z|A!<)kUq&?!oR0MsU9EpyhuF2kX&d>tZ|b2Dh3QvUxgPTja?AMk?bHiN<(j5U0}LJ z-v=Qf$@f8fuyxl$UUtxx0An}E2r#zzS%9&l*Yz+&T&4P9+nvBG9F@Y(L=^I}A+i8t zv(o~MZ9NuXa-YF2a8XWCu7g$$2zlAfAOegX#jl6K$CUD7x4a-5U?{s-QJWWPob8Cz z!7!>2WhmHzs)&67x9mthmjgbHSQi}nCCLF|dXikhm6G%>$dJZwfKk*?TjyZx3Xu9L zwggCW53?ot&$ur})Dc*7$F|7p%fLz>QC<*yqv=?EI*c`h{)YWQY>AnWj?G;QFgB+s zz}VI*0md${5@2vV#kzpea$VT&HGN)$OQpQHluO8q)2~>lNyy9AZwN5iABP$ebvy83 z$RO4kM*vCf3&9d~r_;eMbp`Sze%(S&iUoOs76UwFKmSVp|UD#P%y1bY&r?~?G zCd(BT;)^i~lp*=(biSS#lR;pPojj*41N(TTm@jmvQ?$QSXEEjhd~7O2iw`h#bde61 zG&En-{%Ft&J7z$cBPkd7U-CZv=65~P#nX8>c{G=;px6+OWz{)N5F>A;|_{k{v{3PO<@rZiu!5b&=xPfXO!AYGd15^>v0g3vz&V zW4oe-bkaB!4JnO<2qyIfgqCP+sSY2a@**85*D3nDnCWJ_fQ7v5SYSO23sprvBYY*s zBXEWq+j%MEmD>XvQPNj{NqQGCGRa0E9wv_Su$P71tEVj&z6CocMhC;K!cw2X?3QF_ z;30{AI{;FQ0x-7XURwrWZ0V5zW9KIdFm@xm0Au$a3oy16Lxf4X#E$MO=od^UOED;{ z>0>8d>hQrDN$rb;H=;d9UUsmFkXM=uL^|0YqS%cfr>Gy>M5V`vQ_Mww!;T@g(2p?c zW+zJsdD%^=0!*4u!EsPh+ybWrN^{_-A3MfQhYxk8l?(!mZG;qHY}sEz(2qwy9x~}#%X{L&bOEsTP(yjLIgmJnIoEGrc(s; zb+$@#y%hD4>@ULTk{-gD1Y&1x#8W0T?@nNxHZMJxh7 zcJ`eBgRvEPkJB85zJ-A^yJc0I7jhuYN8#WIcGG}19bnRW2Ef?jcp)8I{4KzwIVI#} zdy;hN;B|^~q?n13))Y~lCHaF}BH9^H#!j6U%8=IaART6l1pd*EcfoEUofPjR?uoHn z1k$8+3V=y{AD2o=F(}X`%}pR3J5O6r2Yec_ec`}}u|wo#OMHdAuoeQn=z^j@gt|y` zBG}^zuS?1+ja`rq(RC@EOZ3OlqotS;U~DtCuFf=-FO>_~5bP!LvfDm{ylj!X0F(S7 zrgZoE9nRCPe1MwKK>ot?2+vnky%m+`gFcmiPikTd>{8E6o!F#%{9L@eil$ zi#88(DvcMgSU_5X1{nSq+RcLHL!w*(Cg~S=Qex~2_+VNkd{T@8=`gz^rUN>me}E2Y zjDyf7+c>7@0nE8X2j;uQGSEWed=JXN1hr5XOc98&T!cW`eq&v^;FK5xV4+fh4#1>& zFu-IvgYhde^brohrlHpNO4@&diIu21Mk;4@}&q;&rBO6x$exkiZ%sj;h4m>M4j0Qs5+iv6d==Umew5tpR`T}Fe#n`vn9>5qg-|-w7y*04IuIl z<1(=yAp{`xEqFsx-@=MJF&=@s$UX@6PD}j_UZOZJ3B$;?OzP`Q3t)sgLlw($DIC!+ z$|>AGF&!YXJOd`#Bdnnk$Ii&hj+WQe58M-Dkuc}d`YZCv=@i2QERB>@T#gWPbq@bq)fX?C2FOy;v+D&Eud)V}eWH9^ebR za!{Waj*h5z5nmJcTwnkpt#JTMnvcRn2P&;E7wP0!3zmn;^wL6oDX+9I0fRg_{(>!2 zV*8>l(pp$B6v|jAgO;EP_6X@@{{L0YUN9ac=R~`poq$|eUu$WMq$A&X0$Dm;1 z6F&P;gn^O_gFY1&2It54tLPjg;qw1a!N39ED0DEFX-DGFexqon6#z{Fa!pqyzHc6 zp)L|_xWR-S{ijU_*{c3Z#?P2?EBh$Pvnw)?Xo= zv_F7gq79{?BpqF#!-tioVvH8_vg>h$bW;2ZLqusE6kyW&SismOYXP4WYeqULUWZi* zAVpti)KAjwNQa4WeLBFTxoE(ocn)Av%m^@caI~(@I9g7$Z&*;yjvv*h>x5-ItuR! z>9AfoSoA?an>4S62`|Y80EP&l(3XgAi19k4!(v@29lH)&Uq4#-C8ooCfKUb^hteJ~ zEQyg~3V@;2C46uxB^bM6NM9F>V#Pj)hLh=lcPrEn<+9`Y1$@%j59!#Bd?B5*?g1kb zDP{>CAkZMvfq0!n8-_ws{a`Q!z7RgqhGN2BS{Du&yTU_XXM`xkaxsl4k3+FuMU(?8 zF2@x440A4yKQJhh))QjnBI`+P@f7FxF|cRH(`xHX(Pzoh>OF<*yh;4@l&_&q#CAzenNEbxLPXJDj@Z?|~JE0Jie) z?BgA4X^wYhu&|1UmCLjItDa+DPd9IEFv-+DveN3j!m&v`bhP-i`wUk5mpi^>B&TWW zN9wM(!1n$T>~dc^os)}m%Ve2r(s*08_~d)!{E-q%e)gzq%{}%@oncOhy0=)pQ%^Qn z#N7S6>0jCFl)Fp07*>3)!P4FYE4~1%;(A#;N*2%;SvmIpDaY|#n3Yi2L+X<1mVHAc zg+Twku6A3#pAh$y1tvr+=Fjg{?gZF+$#z>qvX`XHFzu#pI;{2d>%z+4gEst_a+BXH zU)xH}l5^?}kF2X)`S)SGUi)0ZRu0*1YJ!glvO&3PxSNR1d6;1l-V66{Y zRq3OeEFF0_nwRn^DYqW8zwFCIU#4y_Sjr_VZY5j5)~lHN@41g+u6)Vzv5d}2U|~l?Q?(=m~&wEa!$3e zo|oV1vJ~XqLnSHMf=W{PX$DLGDoo`VFKs&KKws*PXB9=7t-6&9Nx9N>VJjWvKDHsQ z=kFm<2Bt41H?h3ddWMxBn>F!6$|bOh>ws~;XJ5R_lR0$M3;XK2WaYI#}s5u<|#;IIgk{Ds0GlzDJ$UEZoIGgB1sDEa540!3coa zE@36U$4ciB-@`rVP~7Y4U&$bp(A(s+!72w6jDchSJs478U|bW;r|!5wG=-JldRzAn zi5f3kM(QpTL6mb3EBhL(?V?U73UbnAsTg^y2T5cX^DM=^iY1VVcI9p1BRhfZImrYISOHw zD-OMKB?H4M_nq*v(jj1Fvm}5ZjPC9F=0v+4Q?Bg%u!`v)tiC17NZQQ=r&JywSozgp z>*vlr#)!8`%@3 z&9RK6&C)SmTtwQNlswTtY><+}Py=eMVF=g$eV{|cKG(*2fNNW8^0k!yCLKl1Gc5gY zu9V7wsEze(-`)n!PVQAq#5&i6Xy;k%_ln<+U|swdiFb;N2&0I`oHF5+j?Fbu_qnA} zbKsOrKNFJlN^E^OUVSbOxN?;<|5`{9z2Bj0#y7ZSD;$`QtR4vM0h20qXZE zZx4b}=O4m5Oux8tK1uu@yHx7G$}tXSIigo@~orA7k?5)u*;fQ*f7f|evc$o=M`>zo#V9Wl-C6N35|~5W0I+TWEi!si0J79mm;P0 z1rehq-;)LMoOEz@uEcR=MgJ_)vd6-TyHB;RctjUy`HHCfB@6IklkE0+aaWZ609HJ1 zSmk1cNf=bWSG-8&%AR8%Nl+bi$B&)AH{UYW#{Hz)i@lNOxYU)h zVr5-Ts=KqU4QxZ@7ModRk{BB z^71-=8nG9#uK)OcewlxDc>Vk9yT6`p&UdHVEz0yWf9tzpvMI9>1TQ>pVGD)|Ptu-mxHI(2pbF;NW0)cX#t&s0S<- zYiVhT$z(DZjM33iI(?H)XVU2mI-O3VZ_?;28toq@jYjL~>7mj$sWcXqN~O?P6e^2C zVNfWPhK2?*jYX!i$P^}-{11anCX=Wv5{W`0kxENTi>a()3agmREG{l4vJQyM10t10 zq_Bv^3?h+ABvOb(VtRTyfptJ&9uOD@1PY5lW)etDLNS9tAQA`!9PH(I*!jk`CVzE>#7K@=BV5kQe%0Igp5)(tB zV@MQCF%5$yU@%k+1``|{97H(?qU;8dcY}zOAS@v$h#C|`4hq5s1qGog2Wav?yJ+$z zn)DA7O=O_4bTpQLMpMve3>uC0@bEy9Hc=!Ns`wuUs+f)cXhk{&Wh4?)t?`$rFkW59597={W%;b15% z42gxoU}|b=P$UM52!g`kP-rm}3YEdoWKd)oJ){f_AtNIrDJcm-P#`b_1PX^h^&n6f zL}gYkv-xw zGrx4+!od2nmIjRN)ea#0lN|&AbU^KY<^Q)O0QV69VuwIzKq5D{h>9njQZ<+=C}&fS zXssU3fM{QTNpF2Hk|U#h1_p=WXn4-kFo4!pJ6;6y9V@qPubV8>i~R6%w7veteRv|T zl#SDdS+2r==6WaKxY>H-1Dgt)j)wV0RQvVSv5v;YN9e(HDcjB_w_JGYFX{Yev6WV;A?Q)_7%bqJ1XVPAVEacYl7PPZiFajTWQzbwl-d@9sEl2=QSKR z8^6h#UC-mKS+ZlJ*JMw}`+B((>{0fy=Xj+IkT7H@eB{%>6WLQ>&`(@8xFmxnVN}hw zW`VtKd;cQy8ZMEI9K7LqT}%cwf~+|Tz%+@z0gn(3rH@5Vw5p93i2zQ17>@7RRbj7R z{|aOO3%Iz9K@y|ij$%h79Z!Ka-;6M|TXw`PGJmfCQx>R>T^CAR+Ekohj^c8YCttQla$3&jAl|D<0XRFc^wN`uBM zkY<`wpb}{{E(vSgu_vS>42{@3V2}WEu%rW8Z5P>Id*=yK$4)0Xlv=RYvf2Cig9raUi{imCa_GVv*BcNHa8tJ*)@OVzcx!Gmr?U(_&pD*}xo>YF`16y4 z^~TTrhx=uk*(~)49H^Eh8&>y)Gy0m)6aGwTZqB9zD-JPi+owJ=2}*6)mIXhdZ>Y&* zY~;&%g0hCFoLv|(UTiwFk7LB}xyqMn4F81hkgfF4*c;C?L!1~x;Q=?6O=cgXR@95b zBikumDgLMG_cleJwqjs9w3WXecj@1tKPf!DHLjlMzbNny-yBn)fkZcm*P-vH4PAGjjP{ zdP73kh>4Tn+o8X<$gj(8eQ4_H|E?0o_(%o$2KBGiBA)kl-ag>m!mMZx`e6EoM6cLv zE4=>Tx3ypBG4!pnX6FEsaT4ABf>R0%ZkgHWi(-^N=d+!@XxIC5kUV8~QFPtR_ zeql7rNK9qGxP91N!ZXEEln8P(i>l4DL)JJ40tFZX)nIYQIE6U3mVEd6pp9U^@El+6 zYLUM~!#W0UJj~?ZX#uU=#wr#!jmN4a!@U)hV!q~)_-mng#dwbFulZ!VT9p#2xY8@7 z{6~^Lsu|>5XHJLocDuJ`bwNWX_s z7nI2>Wlq%Tw7Mmozwxb%WmJ1E3^5f^`mKD^uHImAbSkRnTg7f>z0rpCiedljd8oB0O!?+xdrK)jT(`IeaPjpza%-cE^yw$krSL1G_J zvttXLJ>Q!R-Bdj{Y!-X!oLizM8@+z;I`@73{sA}{bjFEQ|6EWf{AVX9`g~z{|JWBLKh#KX?y$LiN@J!UrdQb%nei zxDo1+!1kLhp{XKE94n{lRoS`UvDJLTK2{4|bg=kL%bJ+tF}_qVv@m!)TRkM&_6>Kt zpF2=YOgjNf<1p+TFpS?#u{U!3#D*J|sMAUf_wnUPMLnxlP$lxc%msr_0JwvejN^R1 z71tNL&uXM+#X2N0ek}rOLbPmMNl#Fj-jMNBL>fNRQ^1khuI6>dx2$}2AzLdF*|nVv+Yif6zX8_n!A;?n*<<{CSh66vN5o zx*JgoUW%a{H?o3#PX1=v_@8Sln%uq*?OkGIN7+}Z?_Bpd3CvYqD^&cm1$}+H>s2RD zSLj!_OGkb$A%8n<$JB#L)w&+rP2F9%du4IjCYq^aHb zTi#NCKc6l;{-m|yv+b*suZupOq?OdZh!*)1kiGJA+V#?7Tk5CRhq;AMK~n~WA5VU8 zu%d3W=@|lJhEY?wl8WY0G35o)QOoJ#+g{n~Z$Y$u%p;v$NMIVMM&YyE=iU~lQ#Mf- z8vUnAJzn2h{6R2&@ns?*iq^)7O?CbJo$=e~S^at=z3yj4r(G(`gm!ybv>| z6vze%66(ZliN|Vw3D$53;5ifU?zj(I5dPzjSn$H#4}m_SgsbgQaosvR{9J68l~5C| zVJ?fe#}?K1IJ{@N@QA{wwLq`DA~$~}3|29*@3=>7l-C{3fQbDwVG)VS0eWh!iOfa! zLlva zrI@B(J^Lf*o;W`AAjOoaUak{cq~lH@UM&#|mkmsvwn|NTj#(|ZPV0y`b99;zNsedV zk11YHDN?|L#gj9bZtFjU)dR5tsdpC@G1DnGibl}Ydg*B+A$36^s^oME)$b7`<1xYg zAu5AP4QVgV=!2v`Imnpk%%JII#wcVCVKXEBGtGs+3 z+_IEz@6|@l9b_4KXX%H#z26k}eSXJ)GiHsNJwKfNiJ857ko^^sv!|D{kIFf~=KLzo zIi%+NW##}sbJ)^y>=d$f2SRn$?|`|pyQ0$d{fR#o@LX7bw{;@_C{fT&!2^2NhwLiVR1KbZU$4D5DZi zh(_oaM@APXZ{6^B$uAssat>Rr)%lV!0l!mtwMhhKT;OvGJtd09=keGL<8ajG#H z!&^__2M1d0m*jRuSUBhmM>%CEi{v4r=d8k8Ys;SaM_NE{!ZxDC={H~lna{sxF04gt zEkwem(>|#yrQ(v$fgJ>2Q3G=Lz%+JMUmeHGBXI#)7EY+C1Gx(_|uB+Qyg)} z+&wq}K7JLE4b=Tnu2?rD?m*c+J1P&%yw9*M<+|n`Jwh<^t`1! zHq@m?cpWd=eb+ZF@`rWwuZ1d?F{~1bWSK7F+z@AsuhH$ONxMZti<6H1zmYKxbb ziOl6@R%!ld>HRk!d}btE-?_JZ7;FAullywPWp}yGM&c3mR*S)#ianM5?b1j0{2v9E zv>X}~|CXR+u07JjKVmn`1(#8J_FMRWQ}}*UlC~(qwiF?cR#lr;h@rFRLaX%0R=%j# zlNk>Ty(z2D8|7l1i_QURD{UIT+h7@W!JL%4g>6rcINSBg+Rv2Tl_+zq*Sn@T?rSbq zB5`md-KKdird_}HvASyefq~!$F=u zO)ITu@qP0gy-3$wRYL%@?AdA9ab4wMZg6MyQGsl$Lcf0cov6TMUgakny?s@dH3RO_ z#_sW^5-B`NacFlBHA6`-vU(*WY}Lc@vT9yXu(Kp5H|GQv2TMAR?KdUV-r1<};6+7g8NBkr*SM z%Tx%gX{KFc!f=vMVN4tDjZ>$~lapA*9< zyEPP2uQA3_BFSB&KfO{=v}WGA`>4E2nciySWH5`YU?)OsOaRBVMJhBkVo}33>FU9a zVKP9Nk%+%XhgCA=Mn~}U2b6W=Nas;T`$dl-Ynw8iMtVkE?11?rhn&j)SUY<3ijM&knPwaT8t^6Yl~i#xgTU4<}H=6YT2~Ge()yag)v#lR5sA%P%vQ4kwYr zlg#zWx0xAl;-*^H$3E~EY`vU%ZAf2#84PxN0g8UHU;g5t@5Qf|FAfi1{FP+v(WiDp z@{2tgLs1Ow=Igvq7}pmV$98-KrKT&4UWf{Wio{QM`%g=PEnN$)^fxtK`5B;=N%<#@P(R4v(1V_i94}Mv3)@(<7=?p9+XcQ98T+bHV`t z|AjV=daQs=+fB9V!G_tMiCIMVtby~)*JOV-^aE3D8G9YAg-^uphxhgRe(|4Z+Gx03 zS9+N09qrVvu`M_Fk72pO2<1^XtbNH8qDzgdE4;Z=`FUsH{@vK#@QC7@uT;ASzmR?X zeK}!CQ){@8ieO33=&kRZ{Pq1t@z~9h9*xcF(%(zi`rG<1%U7b8Ti2p~&tEMcUdC*6 zTNy8hyDqPO)F{uJ1wpA;K$e6e(0y6kg$B;|^x_8}`*IrNk;kx%oqDE{ArA zucwawsi7&&g6RD#lQFQPOl^Z-L+NjO51sq#}Bzs2l$k0k49F{ZpQ5dKB&0P+*az>9mH+_j`|TeX6>EA;hR;&xVS< zu2Wi-IlM(GohYCZfO?yP9sVcn5f(<3KU z7JF)J$M7~R@BgF|je2#T`~m;h4o(;BR8=?bMHTEX@yv|cPT-> zjht*h?;YW(k4ea!F8llB^OIt;mSfZoo>;0y>9vqe>`KAn#f$}E!jTK^tW1kla9SkGfAB+_E)b0 zS)$qH;WK3>_eoh^+A(EoB|)FO)`N~OCw5{>JWBeddeU@0d+d1K55Dc!-+dzB2FKCT zzJ_;a{O9$Dw-Pt*gHL_F--G?s?Tg3ox3c&~;5^zHDFQaHrk;>Y);)U{`-DEFVt+*o z8`aByzN%&#uYYtb&fB1h5AkY{FV_4M>Hh7n16Faem8*v-zzCXM4a6mK%<0Rd+hVHX zxy^?Cx(9ZTm>*AiUw--?d?&uKpkLgJHO*Ifw# z^)^@JZ;|jD_kD)e!u_FpmTjHCl&gN&}O(p z{uO@v02_@>gB)#c&pv%N!4dxIE~`;xF&VqTXHugYxS8v^{-|gergf+V01~t>WlszE zuZ^gG*&hJ}``M&s0UFCJiAPMskI8s*fgl7T!DXl4T4bI$cf%8#`ObG4#=1bmfBEb?hkA$Fi?#0a z3Qmn~9XHkt#8e#$AVM+#tWc4SCy0Zai2Le|N>drNQHT9_z|O-Vylz1jm%U2B^sXNo z%n?R1@}VGPoDg0)&E4jieoEJwp+RAVd{4D`#734xT!E2z#?XMT<*{77fU)L*IU(); z6g?fbjzTiBtjjwIzpFHD*mxlh(LbxgQd4&<3uqn>QhfU#%gA_tfP7{GsNRdkfAoBo zb@`6w&`IV2JPiV$I2n@o=&qh@n>LeZDo2Ga;XF19nc*#%T`h7w)M8@u-rh)d@IUc#HR zq9W-Eg^TQzi;tL{e1e^97VIRW4NUuV{~PIvFNp8YdV~5Zpcx7VIhf!H!gR|XN9}Wo zZ>^7g#q-c-KdQ*Rv9TemZrP{{ztt4CIc6jXjKxiBrz9O)(K2Wg+-$Q0Jw|_fvT2!d z6xp6@r;J8A8V$|#z|kjnY(KVSCaaD9ecwK-`tvYk$V~GBYf|-r+Q(u&A)lScb4lBX zSznc5ZHKEE^N^_-gkHf5M_DjU)T1_TRHsTOqaBxP$sRV&EKW{r9hP_yqOghJem^eZ zJ8lPDr5aA?pI&L)ra7vLp-Ef<1|e=Nh@s`9$-2qRCHO+Mo#lBxQWHr#BYCF{(gG%( z0|^>8R@XU zLBCDN5t>5#<|x?cCvryY%LJ{S;b?<3X04IBndw#U?(51ixa;g)Ca1=ZB_0iO%k5hb z0)aRUfnW{IeKPvhMGK(~R2=B{*ry~h+z1?w{{F^~a zDi(9||9JWAl1qE@^BB^ek=8CNPye!P7PIxbI-I@8P*83rUF02$^|C zu)WqWJ!{2t{B)}Ee)GV1)8mzQ{C^<5mwUgVSvNknI0NjZ6|HZ*xkwCE=R2<$qiTOk z-nKv3JErsA`7GqSRrk)t*rxHmKSnvwFKaRlx*m=haQ5{>*%#prp0`^2b=fq<-cjC zk~=?yJW_jrzYt@YSOFENNhCX*Jhd_W{BhqsJWrF@tvx@%F?h;kayF_(a zooHHqVuo(RHkOF2bJ$C-9FS*RluQ!{Y7heM&ed6q=RQA6P7|i$0?*iZj*9N<2b>F( zE76@yJ~w{a+c#uX5V|g(<$uj}R;QkLwoXAdB%IId>@)HI#BLz&xN#$-&d+?|36NEJ z7?d?bo_Q}raI^Q6L7#mqo7XZ|_uneQJTF1AGM)Xt9{xg0!@G<^&H^113tnWwuX|ON z;U50HTaLZYoEih18$HhPYIOf{rlg3;qr`&UCV5@jDxI5y*RHuQ{c@pd%r}PD249I> zcj;YseuNnK==JB9YsH=zB~fA9dEFf~q`07%;2h#BwbDIk;&RlMS8>@-Io54LC8@Q9 zV-#dbN>uAJd;CBl^qPIF`&_OLp8;e5RLurD{kTe`ffO1V8td_L-KDE@$NVG#z>`A? z+a>e?-f|clr=Sd=&jWxUFg7I;t-~f7E@A*m5%-hp#ka~b7R2VjU19K>Y@AK(kXBuX8k zxeb{h(Om%YcNbLGcf4QdUKj_vAg*K2bx2MzoWOy^1IIbQcWLLj^k{g25E`3SU3gY# zoUi0Y@pJ80vaPxuGpCH7AQjT+!0f7Zt+VP>Kwn%XvFq()rys!ia(X{XXh{I{= zExkB_1A!CTaEA2r0(OuD!6YQubHjbHcm39*_?=*n|L{E5iNjLjL{a@n30WDq8TMX14|Hh!f7`9?PtgA&U7O0t-qbehx6IFT;&vk}w&a9OA~k0X$*;eIbMRYYOw@E8pO+5HBV zqyZOB#VGH>Z&qugh2|Fq7!|uIr&-TLrlh~i6Q(mxXZDB=p^_Nd82+07j5kdKX^@DP zJb)^D{C?1o%sz}ue@OON5HWUjN8^X%VS-?U)i7*bFx6q={HJPw^VFw1*q#xyW0A~3 z8Hq1xp42zn=a;(MVlVEKQY#=Z?p}~lJOE+&Z2E3;$ecl@tMSK+)zX1M0Tz!Ej3#1# z6tgk%H?sXmekVBW_sY8?lOKaC@yDKHl2)T-d1-uqg$Fh-?0&917}ov!<=*``q{@q} zaqyK*glS5Jq3KOd$wUw*;asc;uc~Pr)+1FBA1T-kHAs{gfj!(F&5%dotM_=(`H#bSInjCYn5t zg@4F{^WNm)8-iDVOWNb>)j}ojf1_yuW?;A}7{L1i9aV$RzR2~6nfLsT9jIVFef7;{aO>v5Vx ztYY}B!aV!TDC{nR;9&kH9;0U&yIuS=T96uI!=@!6a~O4&o?rwdiW;QY(f18;{0#h^ ze4eAbd>obxu)bcR1}j0GnE-{1LbHW6%$PWt!4A;(U?#|^;cdV8yZ&#rk^I`IzxE6 z_rSJvur_2=UT;DUVK?k)_dLXIByM8ZXhI%htxX5p?t-66+EDq^+}QC7k6b~9)q6p=7=2s%ZuUn;j>Zn9tLn_N1?50y`x5oEW5*~hQg9o-|2pT?X! zWWzmWPg^s%$hkTGo_&J%fbF~t7^;`B^d7W5WWV!riaB&qx_D9!$96_0Nt13jDLR!S z2mq1iYS6f!JC3j077a*(;`J zZYHQfz^YF!t4&^3U%jj`JfntTg8+E&0i_0L1sBh#>|8!~W%jSepBb3c>`CY8uB6L^ zAdMFpfYGF*@v5WAj-%KdQ|Lapzf@6-O15@{+pAtOQ`DQP-oO6uTz$@`>k>JC(g + + + Bi-nodes Of Interest + + +

+ Bi-nodes Of Interest +

+

+ +

+This window allows you to specify for which bi-nodes you wish Quantum Fog +to calculate a joint probability distribution. +

+If +

    +
  • + you click on the box to the left of the words "Enable bi-node selector", + and +
  • + you click in the Main Window on a node named, say, "x_1", and +
  • + you click in the Main Window on another node named, say, "x_2", +
+

+then a new row with the string "x_1\x_2" appears in the above window. +

+If +

    +
  • + you select any row of the list, and +
  • + you press the DELETE key, +
+

+then the selected row disappears. +

+When you press Go Forward, Quantum Fog calculates the joint probability +distributions for those bi-nodes that are listed in the above window. +


+

+[Table Of Contents] + diff --git a/Legacy/Help/QFogManual/data/bi_nd_probs.html b/Legacy/Help/QFogManual/data/bi_nd_probs.html new file mode 100644 index 0000000..35cead2 --- /dev/null +++ b/Legacy/Help/QFogManual/data/bi_nd_probs.html @@ -0,0 +1,37 @@ + + + + Bi-node Probs. + + +

+ Bi-node Probs. +

+

+ +

+This window displays the joint probability distribution of the bi-node whose +name appears on the face of the window's popup. The window displays this +distribution for the latest e-case analyzed by the computer. +

+The popup of this window lists only those bi-nodes that were listed earlier +in the Bi-nodes Of Interest window. +

+For the bi-node selected in the popup and for the latest e-case, +

    +
  • + The left margin of the table lists the states of the first node of the bi-node, +
  • + The top margin of the table lists the states of the second node of the bi-node, +
  • + The table itself lists the probability of each pair of node states. +
  • + The small caption labeled Info gives the Shannon Information for + the displayed probability distribution. +
+

+None of the entries of this table can be edited directly by the user. +


+

+[Table Of Contents] + diff --git a/Legacy/Help/QFogManual/data/choose_color.html b/Legacy/Help/QFogManual/data/choose_color.html new file mode 100644 index 0000000..6f6183e --- /dev/null +++ b/Legacy/Help/QFogManual/data/choose_color.html @@ -0,0 +1,24 @@ + + + Choose Color + + + +

+ Choose Color... +

+

+
+Pressing this menu item is equivalent to double-clicking the palette's swatch. +Both actions cause a Mac color-picker window to open. Color-picker windows +vary slightly with MacOS version. One specimen looks like this: +

+ +

+Choosing a color from this window and pressing OK changes the palette swatch +to that color. +

+


+

+[Table Of Contents] + diff --git a/Legacy/Help/QFogManual/data/color_picker.jpeg b/Legacy/Help/QFogManual/data/color_picker.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..a8b537cd8ff59370442ec2fb978531a6a3a5e2c7 GIT binary patch literal 22627 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 literal 0 HcmV?d00001 diff --git a/Legacy/Help/QFogManual/data/command_key.gif b/Legacy/Help/QFogManual/data/command_key.gif new file mode 100644 index 0000000000000000000000000000000000000000..8ba1dce12daf816511d011fc6e806db0cc660eb7 GIT binary patch literal 953 zcmbu8%}dmA5XK*+g9Z`aM3mO`A`~V&_I~N0sddO8gKk+mVst3fmTrX*t5>5Myo6E2 z5>Xx^5Q02p(GYkH+C$KJp;Hvp^vv&H=zG{@n3-oj^UUt(_^G4Ern=CBpFrgE2#e4N zi9kl~;TEpp5{^uohgq10Nf@$LJ=8)qR6>!h;vp8IArb;A1w3E@4M>0iwJA+4HnSQz zC!e{iySO9AGBR^hH*rH!FsbIMuHuS>Vy&2qx`+$N$X16r)FBQ|B{jteO-f=h$HCO5 zG_}}_Tqt8cH4`)BejLk4)l^K8>ym;=Q4=u%w94Qdbr*P|cAWH;^L{)FI$q^205 zNy$=ja4@wgO)aEznP$uNRU5{^tHHmCW{lM&Bax+wlF$f zFTBgv!j3#bv0*9|(0P-BBZUiT{v3EEn#Y}*Km*tW>Oc*s0+YZnPzE}P@gM1Cv)O1g zHa9ox^?I#Vt5&O%las^4!{u_hqa(F@f9-1F7Y^h{{wGG;7SYnyJ@)d^yQS9n)Awxf z+t!^u9jy~%uhvJFJLT%v{+;#FmCnB7-R(bmw^#emUKo0_@%ZEN-jS{Eo#*t!gF`po zPPcDd`gHH)((Wf;R;PBBD)U_<4~L$9UfXxDzOYiMZ?B!1y+8f?{QmJ5ho|oLoPPcM o{cZIA?YVMo?s{c*PD_IWM+PdT%eP7wZ_dn@Cgx@rXBKecA1!C3XaE2J literal 0 HcmV?d00001 diff --git a/Legacy/Help/QFogManual/data/cu_co_pa_de_se.html b/Legacy/Help/QFogManual/data/cu_co_pa_de_se.html new file mode 100644 index 0000000..795b92a --- /dev/null +++ b/Legacy/Help/QFogManual/data/cu_co_pa_de_se.html @@ -0,0 +1,82 @@ + + + Cut, Copy, Paste, Delete, Select All + + + +

+ Cut, Copy, Paste, Delete, Select All +

+

+

+All editable fields (i.e., rectangles in which you enter a single name or +number) allow you to select some (or all with Select All) of their +text and then Cut, Copy or Delete the selected text +(Copy = copy it onto the Clipboard , Delete = erase it, +Cut = Copy, then Delete). After using Cut or +Copy, you can use Paste to paste the Clipboard contents at +the current cursor position. +

+In addition, there are 2 other places where you can use Cut, +Copy, Paste, Delete, Select All. +

    +
  1. + In the Main Window, you can select some (or all with Select All) + of the nodes and arrows of your net. (For more information about how to select + items in the Main Window, look in the Palette section of this + manual.) Then you can Cut, Copy or Delete the selection. +

    + After using Cut or Copy, you can click on any Main Window + at the position where you want the drawing to show up, and then press the + Paste menu item. Besides the picture of each node, its transition + matrix will also be pasted, if it makes sense to do so. You can paste from + one Main Window to the same Main Window or to a different one + (one belonging to a different project). +

  2. + In the Amplitudes Table of the Node Prior-Info. window, you can select + a rectangular subset of the cells of the table. (For more information about + how to select cells in the Amplitudes Table of the Node Prior-Info. + window, look in the "Node Prior-Info." section of this manual.) Then you + can Cut, Copy or Delete the selection. +

    + After using Cut or Copy, you can click on any cell, call it + the "click cell", of any Amplitudes Table, and then press the Paste + menu item. The clipboard contents will be entered into the table and selected. + The top-left corner cell of the selection will be the click cell. You can + paste from an Amplitudes Table to the same Amplitudes Table or to a different + one (one belonging to a different focus node or to a different project.) +

    + You can also use Cut, Copy and Paste to transfer data + between an Amplitudes Table and a table belonging to a spread-sheet program. +

    + Importing Via Clipboard: You can select a rectangular set of cells from + a spread-sheet table and copy it onto the clipboard. Then you can paste + the contents of the clipboard onto an Amplitudes Table of a Quantum Fog project. + Of course, Quantum Fog will refuse to paste the data if it is inadmissible. +

    + Exporting Via Clipboard: You can select a rectangular set of cells from an + Amplitudes Table of a Quantum Fog document and copy it onto the clipboard. + Then you can paste the contents of the clipboard onto a spread-sheet document + (or even onto a TEXT document). +

    + (When exporting and importing via the Clipboard, Quantum Fog puts into the + clipboard a string of characters in TEXT format. Within this string, new + columns are indicated by a TAB, and new rows by a RETURN. All the elements + of the first row are listed, then those of the second row, and so on.) +

    + If no cell or one cell of the Amplitudes Table is selected, then pressing + Select All will select all the contents of the cell that contains + the blinking cursor. If two or more cells of the Amplitudes Table are selected, + then pressing Select All will select all the selectable cells of the + table (i.e., all cells in the 2nd, 3rd and 4th columns of the table). Thus, + to use Select All to select all the selectable cells of the table, + you must: (1)select at least 2 cells of the table, (2) press Select All. +

+

+At all times, the DELETE keyboard key and the Delete menu item produce +identical results. +


+

+[Table Of Contents] + diff --git a/Legacy/Help/QFogManual/data/det_wind_cnot.gif b/Legacy/Help/QFogManual/data/det_wind_cnot.gif new file mode 100644 index 0000000000000000000000000000000000000000..60afcde8770df66015d96d59e85cad7e749cc863 GIT binary patch literal 9829 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 literal 0 HcmV?d00001 diff --git a/Legacy/Help/QFogManual/data/det_wind_cnot.html b/Legacy/Help/QFogManual/data/det_wind_cnot.html new file mode 100644 index 0000000..60c7a83 --- /dev/null +++ b/Legacy/Help/QFogManual/data/det_wind_cnot.html @@ -0,0 +1,92 @@ + + + Parameters Of Controlled-Not + + + +

+ Parameters Of Controlled-Not +

+

+ +

+When you press the OK button in this window, the computer checks that +

    +
  • + the focus node has precisely two parents, +
  • + each parent has precisely 2 states, 0 and 1, in that order. +
+

+If these conditions are satisfied, the above window closes. Furthermore, +the states and amplitudes stored in memory for the focus node are changed. +If the conditions are not satisfied, the above window remains open, the states +and amplitudes are not changed, and a warning message appears on the screen. +

+


+

+Consider, for example, what will happen if the above window is closed with +the above settings: +

+Suppose M1, M2, N1, N2 are elements +of {0,1}. The Parent Nodes table of the Node Prior-Info window +will display the two parent nodes in a certain order. Say M1 is +the state of the first parent P1, and M2 is the state +of the second parent P2. Define (N1, N2) +in terms of M1 and M2 as follows. + + + + + + + + + + + + + + + + + + + + + + + + + + +
M1M2(N1,N2)
00(0,0)
01(0,1)
10(1,1)
11(1,0)
+

+This table may be described by saying that +

    +
  • + N1 = M1  and M2 is transformed into + N2 , +
  • + P1 (the "control" bit) causes P2 (the "target" bit) + to flip (i.e., to change from 0 to 1 or vice versa) whenever M1 + is 1, and +
  • + P1 has no effect on P2 whenever M1 is 0. +
+

+Quantum Fog gives names N1N2 (i.e., 00, 01, 10 and +11) to the states of the Controlled-Not. When the states M1 and +M2 are given by a particular row of the above table, Quantum Fog +assigns unit amplitude to the state N1N2 shown in that +row, and it assigns zero amplitude to all the other states. +

+


+

+More information about Controlled-Nots can be found in the document entitled +"Quantum Fog Library Of Essays" that accompanies this manual. +

+


+

+[Table Of Contents] + diff --git a/Legacy/Help/QFogManual/data/det_wind_margie.gif b/Legacy/Help/QFogManual/data/det_wind_margie.gif new file mode 100644 index 0000000000000000000000000000000000000000..9514e3aa0203f4879cc0d94e66ce1e1f6a36ed0e GIT binary patch literal 8770 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 E01Hvq`~Uy| literal 0 HcmV?d00001 diff --git a/Legacy/Help/QFogManual/data/det_wind_margie.html b/Legacy/Help/QFogManual/data/det_wind_margie.html new file mode 100644 index 0000000..c9068b4 --- /dev/null +++ b/Legacy/Help/QFogManual/data/det_wind_margie.html @@ -0,0 +1,63 @@ + + + Parameters Of Marginalizer + + + +

+ Parameters Of Marginalizer +

+

+ +

+

+When you press the OK button in this window, the computer checks that +

    +
  • + the focus node has precisely one parent, +
  • + the names of the states of the parent node are sufficiently long for the + steps described below to be doable. +
+

+If these conditions are satisfied, the above window closes. Furthermore, +the states and amplitudes stored in memory for the focus node are changed. +If the conditions are not satisfied, the above window remains open, the states +and amplitudes are not changed, and a warning message appears on the screen. +

+Let m[P1, L] be an operator which acts on any string STR, and +yields the substring consisting of the elements of STR at positions from +P1 to P1+L-1. (We assume that the length of STR is +>= P1+L-1). For example, if P1=2, L=3, and STR = +apple, then m[2,3]apple  =   ppl  . +

+Let P1 be your entry to the first field of the above window, and +let L be your entry to the second. P1 and L must both be positive +integers. Quantum Fog defines the set of states of the marginalizer +to be { m[P1,L]STR : for all STR such that STR is the name +of a state of the parent node}. For example, suppose that the set of states +of the parent node is { apple, banana, mango, fig  }. Furthermore, +suppose that P1=2, L=2. Since m[2,2]apple = pp  , +m[2,2]banana = an  , m[2,2]mango = an  , m[2,2] fig += ig  , Quantum Fog will define { pp , an , ig  } to +be the set of states of the marginalizer. As another example, suppose that +the states of the parent node are the 32 binary numbers 00000, 00001, ..., +11111. Furthermore, suppose that P1=2, L=1. Then Quantum Fog will +define the states of the marginalizer to be 0 and 1. +

+When the state of the parent node is STR, Quantum Fog assigns unit amplitude +to state m[P1, L]STR of the marginalizer, and it assigns zero +amplitude to all other states of the marginalizer. In the fruit example presented +above, when the state of the parent node is apple  , Quantum +Fog assigns unit amplitude to state pp , and zero amplitude to states +an  and ig  . In the binary numbers example presented +above, when the state of the parent node is 01011, Quantum Fog assigns unit +amplitude to state 1, and zero amplitude to state 0. +

+More information about Marginalizers can be found in the document entitled +"Quantum Fog Library Of Essays" that accompanies this manual. +

+


+

+[Table Of Contents] + diff --git a/Legacy/Help/QFogManual/data/det_wind_pshifter.gif b/Legacy/Help/QFogManual/data/det_wind_pshifter.gif new file mode 100644 index 0000000000000000000000000000000000000000..ca182f08795c239c3bf895fb20b583bc29d9bedb GIT binary patch literal 8847 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⪚cH++2wRcSf+TIC}gT z@qPE(=hB2{zfS2k17bS=b~WtnrmKas4sE9<%Y1C?acgeSYGD^llHNxt!FJ8vhNmyr z01~@y7kJi}!`T|sSor(^y!FS!{q6?keuxzq1!!t@>aRFH%#x8Ctye~-IKpkLaGA!| zeB{a*Kkag1x7n6g$Ni`{V;$9=?Khyndo4q`bKQ51fxY*lTtx^70s| zf)_CF)Ei!=Xo6Ztw2?kWqSWH?L7PkB22d`heiR^QULmC#xCcFs zScXM4OPIzKtBkzqO$76M_xFd9A@b`GwmY|q4^VsDuYNBN-t}Q*2z3d_d-4_Z2aHtR zLfu(@PB>#FT>nXf%FT-2{dUV-W(>G|L z2obvHN6}Ahvh$AD-I{ANu5Yd|3SxYRDqG_$k1yTV##TYjD;#Fqe_|_Wol4uBpkG;d z|AuqPd!v+D!;KII*~xFyQzWjjYQ_FEo%iCQoP9Ws|GE=L2jh=4mYy!xVW;REYI#)I zv(*Joch39h4!NaAvx+|4xi%jpAwH7eI8>PL@-xJ)^+)Q{)_qhq07=qyE_TZ;wyHY6 zjvrYRrlL${?jLEsK=W3Eu7C0{Y;BQkDrOpYdm}0Qg!iK7aL{9=pb? zXYn|TMX%Jo!Sclu>BrYZ0dM8!mTfSq1EeW=#YtDFo4Dx6lt1(kf6wtYUn=IjIDTKw7Wx$-zne~S3X;BmvTeb1}n z4oCa^lfPZ6NqD_TdW|E#i7e>YL(d8u>Gxm%ox*RswyE;y-~~vOW>;H~WpA8G>Wm!@ HfSvyb0Ef5i literal 0 HcmV?d00001 diff --git a/Legacy/Help/QFogManual/data/det_wind_pshifter.html b/Legacy/Help/QFogManual/data/det_wind_pshifter.html new file mode 100644 index 0000000..2879153 --- /dev/null +++ b/Legacy/Help/QFogManual/data/det_wind_pshifter.html @@ -0,0 +1,45 @@ + + + Parameters Of Phase-Shifter + + + +

+ Parameters Of Phase-Shifter +

+

+ +

+When you press the OK button in this window, the computer checks that +the focus node has precisely one parent. If you put a check mark in the +Multiply Theta by occupation number box, the computer will also check +that the states of the parent node are non-negative integers. +

+If these conditions are satisfied, the above window closes. Furthermore, +the states and amplitudes stored in memory for the focus node are changed. +If the conditions are not satisfied, the above window remains open, the states +and amplitudes are not changed, and a warning message appears on the screen. +

+Quantum Fog defines the set of states of the phase-shifter to be exactly +the same as the set of states of its parent node. +

+Suppose Theta represents your entry to the first field of the above window. +

+Suppose you put a check mark in the Multiply Theta by occupation number +box. When the state of the parent node is N, Quantum Fog assigns amplitude +(1, N*Theta) (expressed in polar coordinates) to state N of the phase-shifter, +and it assigns zero amplitude to all other states of the phase-shifter. Note +that N must be an integer. +

+Suppose you don't put a check mark in the Multiply Theta by occupation +number box. When the state of the parent node is STR, Quantum Fog assigns +amplitude (1, Theta) (expressed in polar coordinates) to state STR of the +phase-shifter, and it assigns zero amplitude to all other states of the +phase-shifter. Note that STR need not be an integer. +

+More information about Phase-Shifters can be found in the document entitled +"Quantum Fog Library Of Essays" that accompanies this manual. +


+

+[Table Of Contents] + diff --git a/Legacy/Help/QFogManual/data/dlog_for_spec_nd.html b/Legacy/Help/QFogManual/data/dlog_for_spec_nd.html new file mode 100644 index 0000000..7753844 --- /dev/null +++ b/Legacy/Help/QFogManual/data/dlog_for_spec_nd.html @@ -0,0 +1,55 @@ + + + Dialog Windows For Specific Nodes + + + +

+ Dialog Windows For Specific Node-Types +

+

+Suppose that the focus node of the Node Prior-Info. window is +of a certain type X, and that this node satisfies certain minimum conditions +that all type X nodes must satisfy. Then pressing the Generate +Amplitudes... button of the Node Prior-Info. window will open +a dialog window which depends on the node type X. This dialog window will +allow you to specify certain parameters that completely characterize type +X nodes. Such dialog windows are entitled ``Parameters of X". In the next +few sections, we will discuss all ``Parameters of X" windows. We will discuss +them separately for each X. But first, let us discuss some traits common +among them. +

+All ``Parameters of X" windows contain an OK and a Cancel button. +

+When you dismiss such a window by pressing OK, the computer changes +the transition matrix and states stored in memory for the focus node so that +they are consistent with the parameters that you've specified. +

+When you dismiss such a window by pressing Cancel, the computer does +not change the transition matrix or the states of the focus node. They remain +the same as they were immediately before you pressed the Generate +Amplitudes... button. +

+For some X's, type X nodes have photons as inputs and outputs. For such nodes, +it is convenient to make the following definitions: +

+
+ scalar-field node  +
+ A node with scalar-field states  ; i.e., states named by non-negative + integers. These integers refer to the number of particles (photons) in the + state. +
+ vector-field node  +
+ A node with vector-field states  ; i.e., states named by pairs + (Nx, Ny) of non-negative integers. The first component + refers to the number of photons polarized in the X direction, and the second + to the number of photons polarized in the Y direction. For example, + (1,2) represents a state with 1 photon in the X and 2 in the Y. +
+

+


+

+[Table Of Contents] + diff --git a/Legacy/Help/QFogManual/data/do_one.html b/Legacy/Help/QFogManual/data/do_one.html new file mode 100644 index 0000000..3d88243 --- /dev/null +++ b/Legacy/Help/QFogManual/data/do_one.html @@ -0,0 +1,23 @@ + + + Do One E-Case At A Time + + + +

+ Do One E-Case At A Time +

+

+
+This option is available only if an e-cases file has been requested. +

+If this option is turned ON (indicated by a check mark), and you press Go +Forward, the computer runs through the next unconsidered e-case in the +e-cases file. +

+If this option is turned OFF (no check mark), and you press Go Forward, +the computer runs straight through all the e-cases in the e-cases file. +


+

+[Table Of Contents] + diff --git a/Legacy/Help/QFogManual/data/drum.gif b/Legacy/Help/QFogManual/data/drum.gif new file mode 100644 index 0000000000000000000000000000000000000000..443756fc236d0d0f1fcb8bf2deae752fec0b81a6 GIT binary patch literal 1085 zcmW+#OK6p65dEVm2`at5Q+ForP@iL*MJvpa_~ ztb$sCHQ0hZID&};Vv>xCB@+@P#KK8jG!cs@kYEZul!};$iv(~gSP?B%F%?${6@-YT zF{CDD;wE8&SYZP&bukxr2^RznV<6HH3-OQ$AyQZcwWgTWQ-n&a%t=g>QT1d(DJ_`f zHA#UOGyq`)jZ~)UssScbM1~d7GE+AVQ(P)S#L^ftS9c9pTr*;Y4ZtkaLnD;P5HyT| z$kHWSkP#bmvI=TTFa7)vq_F-t~a3ns8K7EJP%q(BTBfG~naDmM!=a$`5~w4%AW z+u-nn{{HiMo(F#Ck;TM;6Q59@zAY`uva)OmUS{b(k(Ea_qkP^Mm-+_}mseDlX7%TW z4ozFwSU0o%hoNuhRJ0s9+1oNyn7gq1zc()y9qg-WT3TAa<#FSYsu#D<9P9b}%Skm~ z%|6-jnD2i-t#iEj*x32Ovv0bld@`l@wDH{1=IJAgcMbe@qNZ=hs;|F!MhDiP`m40K zd*`}~4MPvt-C6&H2Fliszu)wK>!z!d25%JB{-?dS+8-ULZR`5Icj|`mj?47?Y)@n5ht_=m+dq%b a*xOxw_CnH literal 0 HcmV?d00001 diff --git a/Legacy/Help/QFogManual/data/example,amps_file.gif b/Legacy/Help/QFogManual/data/example,amps_file.gif new file mode 100644 index 0000000000000000000000000000000000000000..86a1353060b7c03bf5294bcc7abc5069cd21378b GIT binary patch literal 8394 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 literal 0 HcmV?d00001 diff --git a/Legacy/Help/QFogManual/data/example,e_cases_file.gif b/Legacy/Help/QFogManual/data/example,e_cases_file.gif new file mode 100644 index 0000000000000000000000000000000000000000..df920f045d4a0b0d133a9fff812d619daf399830 GIT binary patch literal 6876 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 literal 0 HcmV?d00001 diff --git a/Legacy/Help/QFogManual/data/example,nd_sts_file.gif b/Legacy/Help/QFogManual/data/example,nd_sts_file.gif new file mode 100644 index 0000000000000000000000000000000000000000..d6d4c15fb35060a4d8131158c7d2ab21bbd040d3 GIT binary patch literal 5536 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 literal 0 HcmV?d00001 diff --git a/Legacy/Help/QFogManual/data/export.html b/Legacy/Help/QFogManual/data/export.html new file mode 100644 index 0000000..ab9d38d --- /dev/null +++ b/Legacy/Help/QFogManual/data/export.html @@ -0,0 +1,35 @@ + + + Export + + + +

+ Export
+

+

+
+Choosing the item Topology... opens a Mac "file-designator" +window—a window that allows you to propose a name and location for +a new file. Suppose you use the file-designator window to submit +AliceTopology as the name of a new file. When you press the +OK button, Quantum Fog creates a TEXT file called +AliceTopology, and writes information into it. The information +characterizes the topology of the net being displayed at the moment in the +Main Window. +

+By choosing the items Names Of Node States... or Amplitudes..., +you can create TEXT files containing the names of the node states and the +amplitudes of the net. +

+IMP: If all nodes are unselected, and you press Export/Names +Of Node States...(ditto, Export/Amplitudes...), then +the TEXT file generated will contain a list of the names of the node states +(ditto, a list of the amplitudes of the nodes) for every node of the graph. +However, if some nodes are selected, then the file will contain this information +only for those nodes that are selected. This feature is convenient when you +want the file to show information for just a few, not all, of the nodes. +


+

+[Table Of Contents] + diff --git a/Legacy/Help/QFogManual/data/filter_amps.html b/Legacy/Help/QFogManual/data/filter_amps.html new file mode 100644 index 0000000..612cc64 --- /dev/null +++ b/Legacy/Help/QFogManual/data/filter_amps.html @@ -0,0 +1,44 @@ + + + Prune Node Amplitudes... + + + +

+ Prune Node + Amplitudes... +

+

+
+Quantum Fog does NOT spend any memory +in saving transition amplitudes that equal zero. (By a zero amplitude we +really mean one whose magnitude is smaller than 10-12). Thus, +a 1000 × 2000 transition matrix (for a node with 1000 states and 2000 +input states) with a single non-zero entry occupies the same amount of memory +as a 1 × 1 non-zero transition matrix. +

+It is possible to encounter situations in which the transition matrix of +a node has so many columns or rows that there isn't enough memory to store +it. If only a minority of the entries of such a matrix have a large magnitude, +and the rest have a small one, one may wish to filter out those entries that +have a small magnitude; that is, to replace them by zero so as to save memory. +

+Define GAP to be the smallest |A|, where A ranges over all non-zero +node amplitudes of every node of the graph. When you choose Prune Node +Amplitudes... from the Prepare menu, Quantum Fog first calculates +GAP. It then opens the following window: +

+ +

+

+This window displays the current value of GAP (rounded to the nearest power +of ten). Suppose you enter a number N in the shaded box to the right of the +words "I wish gap to be". If next you press the OK button, Quantum +Fog replaces by zero any amplitude whose magnitude is smaller than +10-N. Obviously, this has no effect if 10-N is smaller +than the initial GAP. This operation CAN'T BE UNDONE, so you better save +a duplicate copy of your file before trying this.
+


+

+[Table Of Contents] + diff --git a/Legacy/Help/QFogManual/data/gen_state_names.gif b/Legacy/Help/QFogManual/data/gen_state_names.gif new file mode 100644 index 0000000000000000000000000000000000000000..8663533c0e8989cf22ee9cae7305718c5f455260 GIT binary patch literal 7760 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 + + Generate State Names + + + +

+ Generate State Names +

+

+ +

+This window opens if you press the Generate State Names... button +of the Node Prior-Info. window. You can always enter manually (or +import, or cut and paste) the state names of the focus node of the Node +Prior-Info. window. This window gives you yet another option. It will +instruct the computer to generate certain kinds of name sequences automatically. +This is especially useful when the focus node has a large number of states +and you wish to label them by an increasing sequence. +

+Think of each name as a vector with N components. All names generated will +have the same number of components N. You enter N into the field labeled +Number Of Components =. Each component can only be a single alpha-numeric +character—that is, either a letter from a,b, ...,z or an integer from 0,1 +, ...9. Assume that alpha-numeric characters form an increasing sequence: +0, 1, 2, ..., 8, 9, a, b, ..., y, z. Suppose Cmin and +Cmax are two elements of the sequence such that Cmin +is less than Cmax. You can specify Cmin in the field +labeled Smallest=, and Cmax in the field labeled +Largest=. Let S[Cmin,Cmax] be the set of all +alpha-numerics greater or equal to Cmin and smaller or equal to +Cmax. The computer will list all the N component vectors such +that every component belongs to S[Cmin,Cmax]. If you +put a check mark in the Use commas and parentheses box, then adjacent +components of the vector will be separated by commas and a parenthesis will +precede the first component and follow the last one. +

+For example, +

    +
  • + If N = 3, Cmin = 0 , Cmax = 9, and Commas=No, the computer + will list the 1000 decimal numbers 000, 001, 002, ..., 999. +
  • + If N = 5, Cmin = 0, Cmax = 1, and Commas=No, the computer + will list the 32 binary numbers 00000, 00001, 00010,..., 11111. +
  • + If N = 5, Cmin = 0 , Cmax = 1, and Commas=Yes, the + computer will list the 32 binary numbers (0,0,0,0,0), (0,0,0,0,1), + (0,0,0,1,0),..., (1,1,1,1,1). +
  • + If N = 3, Cmin = x , Cmax = z, and Commas=No, the computer + will list the labels xxx, xxy, xxz, xyx, xyy, ..., zzz +
  • + If N = 3, Cmin = 8 , Cmax = b, and Commas=No, the computer + will list the labels 888, 889, 88a, 88b, 898, 899, 89a, 89b, 8a8,..., bbb. +
+

+This window will NOT override the number of states, call it D, that has been +specified in the Number of Rows window. If the parameters that you +specify imply a sequence of names that is longer than D, then only the first +D terms of the sequence will be used. Conversely, if the sequence is shorter +than D, then all the terms of the sequence will be used. Those states not +covered by the sequence will retain the names they had immediately before +you summoned the above window. +

+When you dismiss the above window by pressing OK, the state names +of the focus node become those specified by the window. +

+When you dismiss the above window by pressing Cancel, the state names +of the focus node remain the same as they were immediately before you summoned +the window. +

+


+

+[Table Of Contents] + diff --git a/Legacy/Help/QFogManual/data/ggate.gif b/Legacy/Help/QFogManual/data/ggate.gif new file mode 100644 index 0000000000000000000000000000000000000000..8cbf05570db3548ea0c0f1ebba3d622aee5fbc83 GIT binary patch literal 51306 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 literal 0 HcmV?d00001 diff --git a/Legacy/Help/QFogManual/data/go_forward.html b/Legacy/Help/QFogManual/data/go_forward.html new file mode 100644 index 0000000..0753d74 --- /dev/null +++ b/Legacy/Help/QFogManual/data/go_forward.html @@ -0,0 +1,57 @@ + + + Go Forward + + + +

+ Go Forward +

+

+This command causes the computer to calculate node and bi-node probabilities +for one or more e-cases. +

+Which e-cases are analyzed when you press Go Forward once? It depends +on the current settings in the Prepare menu. If in the Prepare +menu: +

    +
  • + an e-cases file has been designated, and +
      +
    • + the Do One E-Case At A Time option is ON, then, when you press Go + Forward, the computer analyzes the next e-case in the e-cases file. +
    • + the Do One E-Case At A Time option is OFF, then, when you press Go + Forward, the computer analyzes all e-cases in the e-cases file. +
    +
  • + no e-cases file has been designated, then, when you press Go Forward, + the computer analyzes the e-case specified in the Node Prior-Info. + window. +
+

+Immediately after pressing Go Forward, it becomes possible to open +the Node Probs. window. +

+If, prior to pressing Go Forward, at least one bi-node was selected +in the Bi-nodes Of Interest window, then, upon pressing Go +Forward, it becomes possible to open the Bi-node Probs. window. +

+If, prior to pressing Go Forward, the Illustrate Stories option +of the Prepare menu was ON, then, upon pressing Go Forward, +it becomes possible to open the Stories window. +

+If, prior to pressing Go Forward, a Node Probs. file (or a Bi-node +Probs. file, or a Stories file) is designated by means of the TEXT Files +Used During Run... window, then, upon pressing Go Forward, the +Node Probs. file (or Bi-node Probs. file, or Stories file) is filled with +data for the e-case or e-cases that the computer analyzes. +

+You can remind yourself of what e-case a given Node Probs. or Bi-node +Probs. or Stories window belongs to by looking at the top of Main +Window's pane. Quantum Fog displays there the name of the current e-case. +


+

+[Table Of Contents] + diff --git a/Legacy/Help/QFogManual/data/how_to_write_amps_file.html b/Legacy/Help/QFogManual/data/how_to_write_amps_file.html new file mode 100644 index 0000000..b119f09 --- /dev/null +++ b/Legacy/Help/QFogManual/data/how_to_write_amps_file.html @@ -0,0 +1,111 @@ + + + How To Write An Amplitudes Files + + + +

+ How To Write An Amplitudes File +

+

+
+An amplitudes file (amps file) is a TEXT file listing the transition matrices +of one or more nodes of a net. Using an amps file is recommended if you wish +to write a separate computer program, an amplitude generator, to calculate +the transition matrix of a Custom Node. If so, you should make the amplitude +generator write its results in the format described below, the format of +a Quantum Fog amps file. Then you should load the amps file into a Quantum +Fog project using the Import/Amplitudes... item of the Edit +menu. +

+As an example, consider a file called my_amps.txt, that contains +the following: +

+ +

+This amps file refers to a net with 3 or more nodes. Three of the nodes of +the net are: node A with states a1 and a2, node B with states b1 and b2, +and node C with states c1 and c2. +

+The specification of each transition matrix starts with a hash character. +The first line after the hash character is the name of the node whose transition +matrix follows in the amps file. The example above specifies the transition +matrix of nodes A and C. +

    +
  • + Node A is a root node. The amplitudes of its two states a1 and a2 are, + respectively, 0.707107 + i*0 and 0 + i*0.707107. +
  • + Node C has four input states: (B, A) = (b1, a1), (b2, a1), (b1, a2) and (b2, + a2). +
      +
    • + For the input state (B, A) = (b1, a1), the amplitudes of the two states c1 + and c2 of C, are, respectively, 1 + 0i and 0 + 0i. +
    • + For the input state (B, A) = (b2, a1), the amplitudes of the two states c1 + and c2 of C are, respectively, 0 + 0i and 1 + 0i. +
    • + For the input state (B, A) = (b1, a2), the amplitudes of the two states c1 + and c2 of C are, respectively, 0 + 1i and 0 + 0i. +
    • + For the input state (B, A) = (b2, a2), the amplitudes of the two states c1 + and c2 of C are, respectively, .707 + 0i and .707 + 0i. +
    +
+
+ Suppose that in the above amps file, you erase the 4 lines concerning the + input state (B, A) = (b1, a2) of node C. Quantum Fog will interpret this + omission to mean that: For the input state (B, A) = (b1, a2), the amplitudes + of the two states c1 and c2 of C are both zero. In general, if you import + an amps file which lists the transition matrix of a node C but which omits + some input states of C, then Quantum Fog will set to zero the amplitudes + of all states of C for the omitted input states. +

+ Pressing Export/Amplitudes... in + the File menu will produce a file that follows the format rules for + a Quantum Fog amps file. If no nodes are selected in the Main Window, + the file will contain the transition matrices of all the nodes of the net. + If some nodes are selected, the file will contain the transition matrices + of only those nodes that are selected. So if you want more examples of amps + files, you can ask Quantum Fog to generate some for you. +

+

+Next we will state the general rules that one must follow in writing an amps +file for Quantum Fog. Some of the terminology used below is defined in the +section entitled "Terminology-Alphabetic". +

+General Rules: +

    +
  • + Everything from the beginning of the file up to the first hash character + will be ignored. Hence, you may include a header in the file, as long as + the header does not include any hash characters. +
  • + You must include for each node whose transition matrix you wish to specify: +
      +
    • + A first line consisting of: [hash symbol] [white-spaces] [RETURN]. +
    • + A second line consisting of: [node name] [white-spaces] [RETURN]. +
    • + For each input state of the node (except for those input states that you + wish to omit as explained above): +
        +
      • + For each parent of the node, a line consisting of: [name of parent node] + [white-spaces] [name of state of parent node] [white-spaces] [RETURN]. +
      • + For each state of the node, a line consisting of: [name of state] [white-spaces] + [real part of amplitude for the state] [white-spaces] [imaginary part of + amplitude for the state] [white-spaces] [RETURN]. +
      +
    +
+

+The order in which node names, input states, parent names and node state +names are enumerated does not matter. +


+

+[Table Of Contents] + diff --git a/Legacy/Help/QFogManual/data/how_to_write_ecases_file.html b/Legacy/Help/QFogManual/data/how_to_write_ecases_file.html new file mode 100644 index 0000000..924e236 --- /dev/null +++ b/Legacy/Help/QFogManual/data/how_to_write_ecases_file.html @@ -0,0 +1,66 @@ + + + How To Write An E-Cases Files + + + +

+ How To Write An E-Cases File +

+

+An e-cases file is a TEXT file listing several e-cases. Using an e-cases +file is recommended if you wish to study many e-cases of the same net. +

+As an example, consider a file called my_Ecases.txt, that contains +the following: +

+
+

+In this example, 3 e-cases are given. +

    +
  • + For the first e-case, called "case_1", all nodes of the graph have a default + active state list. +
  • + For the second e-case, called "case_2", all nodes of the graph have a default + active state list except for the node called "month". All the states of "month" + are inactive except for the states called "april" and "may" . +
  • + For the third e-case, called "case_3", all nodes of the graph have a default + active state list except for the nodes called "month" and "day". All the + states of "month" are inactive except for the states called "april", "may" + and "august". All the states of "day" are inactive except for the states + called "monday" and "tuesday" . +
+

+Next we will state the general rules that one must follow in writing an e-cases +file for Quantum Fog. Some of the terminology used below is defined in the +section entitled "Terminology-Alphabetic". +

+General Rules: +

    +
  • + Everything from the beginning of the file up to the first hash character + will be ignored. Hence, you may include a header in the file, as long as + the header does not include any hash characters. +
  • + You must include for each e-case: +
      +
    • + A first line consisting of: [hash symbol] [white-spaces] [RETURN]. +
    • + A second line consisting of: [e-case name] [white-spaces] [RETURN] The e-case + name must be a Quantum Fog allowed name. +
    • + For each node that doesn't have a default active state list, a line consisting + of: [node name] [white-spaces] [name of active state] [white-spaces] [name + of another active state] [white-spaces] [name of another active + state]...[white-spaces] [RETURN]. +
    +
+

+The order in which node names, and state names are enumerated does not matter. +


+

+[Table Of Contents] + diff --git a/Legacy/Help/QFogManual/data/how_to_write_nd_sts_file.html b/Legacy/Help/QFogManual/data/how_to_write_nd_sts_file.html new file mode 100644 index 0000000..718f519 --- /dev/null +++ b/Legacy/Help/QFogManual/data/how_to_write_nd_sts_file.html @@ -0,0 +1,61 @@ + + + How To Write A Names Of Node States File + + + +

+ How To Write A Names Of Node States File +

+

+
+A names of node states file (names file) is a TEXT file listing the names +of all the states of one or more nodes of a net. +

+As an example, consider a file called my_node_states.txt, that +contains the following: +

+ +

+This names file refers to a net with 3 or more nodes. Three of the nodes +of the net are: node A with states a1 and a2, node B with states b1 and b2, +and node C with states c1 and c2. +

+ Pressing Export/Names Of Node + States... in the File menu will produce a file that follows the + format rules for a Quantum Fog names file. If no nodes are selected in the + Main Window, the file will contain the state names of all the nodes + of the net. If some nodes are selected, the file will contain the state names + of only those nodes which are selected. +
+

+Next we will state the general rules that one must follow in writing a names +file for Quantum Fog. Some of the terminology used below is defined in the +section entitled "Terminology-Alphabetic". +

+General Rules: +

    +
  • + Everything from the beginning of the file up to the first hash character + will be ignored. Hence, you may include a header in the file, as long as + the header does not include any hash characters. +
  • + You must include for each node whose state names you wish to specify: +
      +
    • + A first line consisting of: [hash symbol] [white-spaces] [RETURN]. +
    • + A second line consisting of: [node name] [white-spaces] [RETURN] The node + name must be a Quantum Fog allowed name. It must already be the name of a + node appearing in the Main Window. +
    • + For each state of the node, a line consisting of: [state name] [white-spaces] + [RETURN]. The state name must be a Quantum Fog allowed name. +
    +
+

+The order in which node names and state names are enumerated does not matter. +


+

+[Table Of Contents] + diff --git a/Legacy/Help/QFogManual/data/illustrate.html b/Legacy/Help/QFogManual/data/illustrate.html new file mode 100644 index 0000000..4e832d1 --- /dev/null +++ b/Legacy/Help/QFogManual/data/illustrate.html @@ -0,0 +1,46 @@ + + + Illustrate Stories + + + +

+ Illustrate Stories +

+

+
+If this option is turned ON (indicated by a check mark in front of the item), +the computer will store in memory all the possible stories for the last e-case +it considers. If after pressing Go Forward in the Go menu, +you press Open Stories in the Windows menu, you will be able +to see a picture of each of the possible stories. +

+If this option is turned OFF (no check mark), the computer will at no time +save in memory the full set of stories of any e-case it considers. Instead, +at any given time, the computer will have only one story stored in memory. +Since the set of stories is not stored, the Open Stories item of the +Windows menu is disabled in this case. +

+You should not confuse the Illustrate Stories command with the command +to write the stories into a file (see TEXT Files Used During Run... +command ). The first of these commands writes the stories to memory, the +second to a file in your hard disk. You may run Quantum Fog with just one +of these options ON, or with both ON, or both OFF. +

+The ON mode of the Illustrate Stories command allows one to study +all the possible stories by viewing them on the Main Window. However, +one pays for this luxury by having to use a lot of memory to store the stories. +Thus, the ON mode is recommended only if the net being considered does not +have a large number of stories. +

+The OFF mode of the Illustrate Stories command does NOT allow one +to study the possible stories by viewing them on the Main Window. +(One can still study them, but not graphically. One can ask Quantum Fog to +write the stories into a file, and study them there). The OFF mode uses less +memory than the ON one. Thus, the OFF mode is recommended if the net being +considered has such a large number of stories that pressing Go Forward +in the ON mode causes the computer to run out of memory. +


+

+[Table Of Contents] + diff --git a/Legacy/Help/QFogManual/data/import.html b/Legacy/Help/QFogManual/data/import.html new file mode 100644 index 0000000..56bd134 --- /dev/null +++ b/Legacy/Help/QFogManual/data/import.html @@ -0,0 +1,32 @@ + + + Import + + + +

+ Import
+

+

+
+Choosing either the item Names Of Node States... or the item +Amplitudes... opens a Mac "file-chooser" window—a window that allows +you to open an already existing TEXT file. If you select, say, +file_1 in the file-chooser window, and then press its +Open button, Quantum Fog attempts to read file_1. If +Quantum Fog can do this successfully, it updates its data about the net with +the data in file_1. +

+If you started by choosing the Names Of Node States... item, Quantum +Fog assumes that you are opening a Names of Node States file. This is a TEXT +file that contains the names of the states for one or more nodes of the net. +See the section entitled "How To Write A Names Of Node States File". +

+If you started by choosing the Amplitudes... item, Quantum Fog assumes +that you are opening an Amplitudes file. This is a TEXT file that contains +the transition matrix for one or more nodes of the net. See the section entitled +"How To Write An Amplitudes File". +


+

+[Table Of Contents] + diff --git a/Legacy/Help/QFogManual/data/initial_run_st.html b/Legacy/Help/QFogManual/data/initial_run_st.html new file mode 100644 index 0000000..ff5a4cf --- /dev/null +++ b/Legacy/Help/QFogManual/data/initial_run_st.html @@ -0,0 +1,16 @@ + + + + Go Back To Initial State + + +

+ Go Back To Initial + State +

+

+This command transfers the program back to the initial run-state. +


+

+[Table Of Contents] + diff --git a/Legacy/Help/QFogManual/data/introduction.html b/Legacy/Help/QFogManual/data/introduction.html new file mode 100644 index 0000000..0a3e2e5 --- /dev/null +++ b/Legacy/Help/QFogManual/data/introduction.html @@ -0,0 +1,44 @@ + + + What is Quantum Fog? + + + +

+ What is Quantum Fog? +

+

+Quantum FogTM (US Patent 5787236) is a Mac application for modelling +physical situations that exhibit quantum mechanical behavior. It's a tool +for investigating and discussing quantum measurement problems graphically, +in terms of network diagrams called quantum Bayesian nets. It can calculate +one- and two-variable conditional probability distributions, and it can draw +a picture of every Feynman path that contributes to a physical situation. +It simulates a general purpose quantum computer. +

+Quantum Fog is NOT a Monte-Carlo simulation program. Its results are exact +(within machine precision). +

+Quantum Fog is NOT a wavefunction plotting package. +

+Quantum Fog does NOT espouse any particular interpretation of Quantum Mechanics. +It abides by rules that are common to all the mainstream interpretations. +

+You'll find Quantum Fog easy to understand and use, even if you have little +or no prior knowledge of Quantum Mechanics. +

+Quantum Fog can be used as: +

+A teaching tool. Students embarking on their first Quantum Mechanics +course will find that Quantum Fog greatly improves their understanding of +the subject. Quantum Mechanics teachers will find Quantum Fog a very effective +tool for explaining measurement theory. +

+A research tool. Despite its apparent simplicity, Quantum Fog is a +flexible, powerful, sophisticated program. Even advanced researchers will +find it useful. +

+


+

+[Table Of Contents] + diff --git a/Legacy/Help/QFogManual/data/main_wind.html b/Legacy/Help/QFogManual/data/main_wind.html new file mode 100644 index 0000000..434b796 --- /dev/null +++ b/Legacy/Help/QFogManual/data/main_wind.html @@ -0,0 +1,19 @@ + + + Main Window + + + +

+ Main Window +

+

+
+This is the window wherein one draws the net. +

+The name that appears beneath each node can be edited directly if and only +if Quantum Fog is in its initial run-state. +


+

+[Table Of Contents] + diff --git a/Legacy/Help/QFogManual/data/memory.html b/Legacy/Help/QFogManual/data/memory.html new file mode 100644 index 0000000..1e5b8f2 --- /dev/null +++ b/Legacy/Help/QFogManual/data/memory.html @@ -0,0 +1,35 @@ + + + + Memory + + +

+ Memory +

+

+If Quantum Fog complains that it's running out of memory, save all your open +projects, and quit Quantum Fog. This happened because you had one or more +large projects open at once. If you want to open the same projects again, +you should increase the memory allotted to Quantum Fog. This can be done +as follows. After quitting Quantum Fog, select its application icon (i.e., +click once on it), and press the Get Info item of the File menu. +A window entitled "Quantum Fog Info" will open. In it, you'll find a box +entitled "Memory Requirements" which gives three memory sizes: +

    +
  • + Suggested Size +
  • + Minimum Size +
  • + Preferred Size +
+

+The Suggested Size is not editable but the other two are. We strongly suggest +that you do not change the Minimum Size. Increase the Preferred Size to whatever +you can afford on your computer. +

+


+

+[Table Of Contents] + diff --git a/Legacy/Help/QFogManual/data/menu,active_project.gif b/Legacy/Help/QFogManual/data/menu,active_project.gif new file mode 100644 index 0000000000000000000000000000000000000000..b3389d3ad4c5c4693afb795dd2d62cc85a12e0d0 GIT binary patch literal 13942 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 QH_03c$j*F&K>@A*1td!GKL7v# literal 0 HcmV?d00001 diff --git a/Legacy/Help/QFogManual/data/menu,change_run_state.gif b/Legacy/Help/QFogManual/data/menu,change_run_state.gif new file mode 100644 index 0000000000000000000000000000000000000000..47c0cadcf0acb96faaa7d36998cfe6895ea40066 GIT binary patch literal 4814 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


|YhT2myj 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 literal 0 HcmV?d00001 diff --git a/Legacy/Help/QFogManual/data/menu,export.gif b/Legacy/Help/QFogManual/data/menu,export.gif new file mode 100644 index 0000000000000000000000000000000000000000..a7df81c732f15cf6db6f201ba554ad81b0225077 GIT binary patch literal 12287 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 literal 0 HcmV?d00001 diff --git a/Legacy/Help/QFogManual/data/menu,file.gif b/Legacy/Help/QFogManual/data/menu,file.gif new file mode 100644 index 0000000000000000000000000000000000000000..55ab43ac9056207b606b7c2735ed3cf119c62220 GIT binary patch literal 6984 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 NANB`3fDpjwzX0-sU!MQ~ literal 0 HcmV?d00001 diff --git a/Legacy/Help/QFogManual/data/menu,import.gif b/Legacy/Help/QFogManual/data/menu,import.gif new file mode 100644 index 0000000000000000000000000000000000000000..ab8346fde60b83b880076babe70d7fd04983d1f4 GIT binary patch literal 11802 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 b3m1L5GqwNnOWBLG$jvulJ44)1K<9q}RK_B* literal 0 HcmV?d00001 diff --git a/Legacy/Help/QFogManual/data/menu,run_preps.gif b/Legacy/Help/QFogManual/data/menu,run_preps.gif new file mode 100644 index 0000000000000000000000000000000000000000..8a0ba36465cc1922644a045f657d263a011edd0a GIT binary patch literal 6723 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 O2VE{M@g@MU|9=2CpE$Ar literal 0 HcmV?d00001 diff --git a/Legacy/Help/QFogManual/data/menu,windows.gif b/Legacy/Help/QFogManual/data/menu,windows.gif new file mode 100644 index 0000000000000000000000000000000000000000..dc6074bc2b1ca47184eba1f09d4def993533e8ef GIT binary patch literal 9185 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 + + Node Prior-Info. + + + +

+ Node Prior-Info. +

+

+ +

+This window allows you to define, view, and modify the transition matrix +associated with each node of the graph. +

+At any given time, the window refers to only one node, the one whose name +appears in red. We'll call it the focus node. You may change the focus +node by either of 3 methods: +

    +
  • + Clicking on the First and Next buttons located to the right + of the red name. +
  • + Selecting a different node from the popup menu located to the right of the + red name. +
  • + Double clicking on the node's icon in the Main Window. (When the Palette + is closed, this always works. But when the Palette is open, you must + first select the Open tool of the Palette before double clicking + the node.) +
+

+


+

+

Focus Node Field

+

+This field gives the name of the focus node in red. The field can be edited +directly by the user. If you enter into this field a node name that is longer +than the box surrounding the field, the name will scroll automatically to +show the last character typed. This scrolling may hide some of the first +characters of the node name. Use the left-arrow key to move the insertion-point +cursor (a blinking vertical line, like the letter "I") to the left, the +right-arrow key to move it to the right, the up-arrow or HOME key to move +it to the beginning of the node name, the down-arrow or END key to move it +to the end of the node name. +

+Besides appearing in this window, in red, the name of the focus node also +appears in the Main Window, directly beneath the icon of the focus +node. One can edit this name either where it appears in the Node +Prior-Info. window, or where it appears in the Main Window. Changing +one occurrence will automatically change the other. +

+


+

+

Parent Nodes Table

+

+The box entitled "Parent Nodes" contains a table that specifies one of the +possible input states of the focus node. None of the cells of this table +can be edited directly by the user. However, the input state can be varied +by using the First and Next buttons to the right of the table +or by using the popups in each row of the table. +

+


+

+

Amplitudes Table

+

+The box entitled "Amplitudes" contains a table that displays the transition +amplitudes of the focus node when the input state is the one given in the +Parent Nodes box. +

+The second column of the table lists the names of all the states of the focus +node. These names can be edited directly by the user. +

+The first column tells which states are active. Active states are indicated +by a star (*) and inactive ones by a blank. Clicking on a cell of the first +column will toggle the cell's contents between blank and star. +

+The last two columns of the table give the complex amplitudes of the states. +These amplitudes can be edited directly by the user. Alternatively, one can +edit them with either the Generate Amplitudes... button or the +Import/Amplitudes... menu item. (The Generate Amplitudes... +button is discussed below. The Import/Amplitudes... menu item is discussed +in the section entitled "Import".) +

+Let [C1,C2] be the set of all cells contained within a rectangle with cells +C1 and C2 as opposite (top-left and bottom-right) corners. Let U be the set +of all cells in the second, third and fourth columns. To select more than +one cell, you will need to use the SHIFT key. You can select any subset [C1,C2] +of U in one of 2 ways. +

+If +

    +
  • + while holding the SHIFT key down, you press the mouse button down on the + cell which you intend to be the initial anchor of your selection, and +
  • + you release the SHIFT key if you wish to do so, and +
  • + while holding the mouse button down, you drag the cursor to the cell which + you intend to be the final anchor of your selection, and +
  • + you release the mouse button, +
+

+then all cells in set [initial anchor, final anchor] will be selected. +

+Alternatively, if +

    +
  • + you click on the cell which you intend to be the initial anchor of your + selection, and +
  • + you release the SHIFT key if you wish to do so, and +
  • + while holding the SHIFT key down, you click the mouse button on the cell + that you intend to be your final anchor cell, +
+

+then all cells in set [initial anchor, final anchor] will be selected. +

+


+

+

Number Of Rows...

+

+Pressing the Number of Rows... button opens the Number Of Rows +window. This window allows you to change the number of rows of the Amplitudes +Table. See the section entitled "Number Of Rows". +

+


+

+

Generate State Names...

+

+Pressing the Generate State Names... button opens the Generate +State Names window. This window generates new names for the states of +the focus node. These names appear on the second column of the Amplitudes +Table. See the section entitled "Generate State Names". +

+


+

+

Total Probability =

+

+Let R be the number of rows of the Amplitudes Table, and let Z1, +Z2, ...ZR be the complex amplitudes given by that table. +

+Pressing this button calculates Pr = |Z1|2 + +|Z2|2 +... |ZR|2, +

+and displays it to the right of the button. +

+If Quantum Fog is not certain that the value being displayed for Pr is +up-to-date, it will erase the value and show a blank. Better to display nothing +than to display an erroneous value. If no value for Pr is currently showing +and you wish to see one, just press the Total Probability button. +Quantum Fog will then re-calculate Pr and post it. +

+Pr will usually be very close to one. After all, it represents the probability +that any state of the focus node will occur when the input state is as given. +However, one can construct nets (see the section entitled "Parameters Of +Beam-Splitter" for an example) that will always give correct physical predictions +even though some of their Pr's are not one. (By physical predictions we mean +the information contained in the Node Probs., Bi-node Probs. +and Stories windows). +

+


+

+

Generate Amplitudes...

+

+The effect of pressing the Generate Amplitudes... button depends on +the node-type of the focus node. +

+If the focus node is a Custom node, nothing happens. +

+If the focus node is of type T, where T= +

    +
  • + Beam-Splitter or +
  • + Deterministic Node, or +
  • + Polarization Rotator or +
  • + Polarizer or +
  • + Qbit Rotator or +
  • + Stern-Gerlach Magnet, +
+

+then a window entitled "Parameters Of T" appears. +

+These windows allow you to specify certain parameters which depend on the +node-type, parameters which are sufficient to specify a transition matrix +for the focus node. Upon dismissing these windows with an OK, the +computer changes the transition matrix stored in memory for the focus node. +

+


+

+

Reorder Icon

+ +

+See the section entitled "Reordering Items In A List". +


+

+[Table Of Contents] + diff --git a/Legacy/Help/QFogManual/data/nd_probs.html b/Legacy/Help/QFogManual/data/nd_probs.html new file mode 100644 index 0000000..0cc387b --- /dev/null +++ b/Legacy/Help/QFogManual/data/nd_probs.html @@ -0,0 +1,37 @@ + + + + Node Probs. + + +

+ Node Probs. +

+

+ +

+This window displays the probability distribution of the node whose name +appears on the face of the window's popup. The window displays this distribution +for the latest e-case analyzed by the computer. +

+The popup of this window lists all nodes. +

+For the node selected in the popup and for the latest e-case: +

    +
  • + The first column of the table tells which states are active(*) and which + are not(blank). +
  • + The second column of the table lists the names of all the states of the node. +
  • + The third column of the table lists the probability of each state. +
  • + The small caption labeled Info gives the Entropy for + the displayed probability distribution. +
+

+None of the entries of this table can be edited directly by the user. +


+

+[Table Of Contents] + diff --git a/Legacy/Help/QFogManual/data/net_terminology-abc.html b/Legacy/Help/QFogManual/data/net_terminology-abc.html new file mode 100644 index 0000000..4fd402e --- /dev/null +++ b/Legacy/Help/QFogManual/data/net_terminology-abc.html @@ -0,0 +1,116 @@ + + + Terminology-Alphabetic + + + +

+ Terminology-Alphabetic +

+

+This section lists the same terms as the section entitled +"Terminology-Crescendo", but here the terms are ordered alphabetically. Clicking +on a term will open the "Terminology-Crescendo" window at that term. +

+

    +
  1. + active state  +
  2. + active state list (set) + of node X  +
  3. + acyclic graph  +
  4. + arrow (edge)  +
  5. + bi-node  +
  6. + conditional + probability  +
  7. + cycle +
  8. + default active + state list  +
  9. + [description of + something]  +
  10. + deterministic node  +
  11. + ditto  +
  12. + ending  +
  13. + entropy  +
  14. + evidence case (e-case)  + +
  15. + external arrow  + +
  16. + external node  +
  17. + Feynman Integral  + +
  18. + graph  +
  19. + input state (parent state) + of node X  +
  20. + internal arrow  + +
  21. + internal node  +
  22. + labeled graph  +
  23. + net (network)  +
  24. + node  +
  25. + node amplitude (transition + amplitude)  +
  26. + node matrix (transition + matrix)  +
  27. + parent nodes of node X  + +
  28. + possible story  + +
  29. + Quantum Fog allowed + name  +
  30. + degeneracy of node X  + +
  31. + root node  +
  32. + state of node X  + +
  33. + state set of node X  + +
  34. + story (graph instantiation) +
  35. + story amplitude (net + amplitude)  +
  36. + TEXT file  +
  37. + total probability of all + stories  +
  38. + white-space  +
+

+


+

+[Table Of Contents] + diff --git a/Legacy/Help/QFogManual/data/net_terminology.html b/Legacy/Help/QFogManual/data/net_terminology.html new file mode 100644 index 0000000..a62a9c4 --- /dev/null +++ b/Legacy/Help/QFogManual/data/net_terminology.html @@ -0,0 +1,275 @@ + + + Terminology-Crescendo + + + +

+ Terminology-Crescendo +

+

+This section defines some terms and notation that will be used freely +in later sections. The list of definitions given below is ordered so that +each definition only uses terms that have been defined in previous definitions. +

+

+
+ ditto  +
+ Throughout this manual, when we say "...X1 (ditto, X2)...", we mean that + everything we said about X1 applies also to X2.  +
+ node  +
+ A bounded shape. +
+ arrow (edge)  +
+ A directed line. +
+ bi-node  +
+ Two separate nodes. +
+ internal arrow  +
+ An arrow that connects two nodes. +
+ external arrow  +
+ An arrow that exits a node, but does not enter another node. These arrows + are NOT draw by Quantum Fog, but it is occasionally useful to speak of them. + See Ref. [Tuc95] if interested. + A net is considered the same, whether its external arrows are drawn or not. +
+ internal node  +
+ A node that has one or more outgoing internal arrows. +
+ external node  +
+ A node that has no outgoing internal arrows. +
+ graph  +
+ A collection of nodes and arrows. In this manual, the arrows of our graphs + are all internal ones. +
+ labeled graph  +
+ A graph in which each node has been assigned a name (label). +
+ cycle  +
+ A closed path of arrows within a graph, with the arrows in the path all pointing + either clockwise or counter-clockwise. +
+ acyclic graph  +
+ A graph that contains no cycles. +
+ root node  +
+ A node with no incoming internal arrows. It corresponds to a "wave-function" + in Quantum Mechanics. +
+ parent nodes of node X  +
+ Nodes connected to X by arrows that enter X. +
+ state of node X  +
+ A state that X may assume. +
+ state set of node X  +
+ The set of states that X may assume. +
+ degeneracy of node X  +
+ The number of states that X may assume. +
+ input state (parent state) of node X  + +
+ An assignment of a state to each of the parent nodes of node X. +
+ node matrix (transition matrix)  +
+ A matrix assigned to a single node. The rows of the matrix are labeled by + the states of the node and the columns by its input states. +
+ net (network)  +
+ As in Ref. [Tuc95], we define + a net to be an abstract construct comprising a graph and a node matrix for + each node of the graph. The graph is labeled and acyclic. We define a + Classical Bayesian net  to be a net of the type used in + Refs.1-3 —a net such that + the entries of its node matrices are non-negative real numbers. We define + a Quantum Bayesian net  to be a net of the type used in + Ref.[Tuc95]— a net such that + the entries of its node matrices are complex numbers. In this manual, unless + stated otherwise, when we speak simply of a net, we mean a Quantum Bayesian + one. +
+ node amplitude (transition amplitude)  +   +
+ An entry of a node matrix of a Quantum Bayesian net. +
+ story (graph instantiation) +
+ An assignment of a state to each node of the graph. Stories correspond to + what the Quantum Mechanics literature calls Feynman paths. Unlike the term + "story", the term "path" feels awkward to us when speaking about a system + of more than one particle. Whenever possible, we will use the term "story + " instead of "path". +
+ ending  +
+ An assignment of a state to each of the external nodes of a graph. An ending + is part of a story. +
+ conditional probability P(H|E) +
+ The probability that H occurs, conditioned on  the fact (i.e., + assuming that) E occurs. H is often called the hypothesis and E the evidence + or condition or data. +
+ active state  +
+ A state is active in a physical experiment if the experimenter has determined + by prior measurement (or can determine if he tries) that the state can occur + during the experiment. Quantum Fog calculates conditional probability + distributions for nodes and bi-nodes, the evidence for the conditional + probabilities being which states of each node are active. +
+ active state list (set) of node X  +   +
+ The set of states of node X that are active. +
+ default active state list  +   +
+ An active state list that is as full as possible—it contains ALL the states + of the node. +
+ evidence case (e-case)  +
+ An assignment of an active state set to each node of the graph. +
+ story amplitude (net amplitude)  +
+ A story 's amplitude is calculated as follows. A story determines a unique + transition amplitude Ai for each node. How? For the i'th node, + choose as Ai the element of its transition matrix with (row, column) + = (its state, its input state). Only one such row-column pair is consistent + with the story. The story amplitude is defined as the product + A1*A2*...AN, where N is the number of nodes. +
+ possible story  +
+ A story that assigns active states to all nodes of the graph, and that has + a non-zero amplitude. +
+ Feynman Integral  +
+ The Feynman Integral FI(e) for the ending e is the sum of the complex amplitudes + of all possible stories with ending e. In general, FI(e) depends on which + states of each node are active. +
+ total probability of all stories  +
+ The sum over all e of |FI(e)|2, assuming that all node states + are active, where FI(e) is the Feynman Integral corresponding to the ending + e. This probability should be 1. +
+ deterministic node  +
+ A node for which the input state uniquely determines the state of the node. + For each input state, only one state of the node has a non-zero amplitude. +
+ entropy  +
+ Given a classical probability distribution p1, p2, + ..., pD, its Entropy S is the following number : +

+

+ S = -[p1 log2(p1)   + p2 + log2(p2) + ... + pD + log2(pD)]. +

+

+ For example, if all pi are equal to 1/D, this gives + S=log2(D). D is the number of states or degeneracy of the + distribution. If D = 2B (B is referred to as the number of bits), + then S = B. +

+

+ As another example, suppose that one pi equals one and all others + equal zero. Then, S=0 (because log1=0,  and xlog(x) tends to 0 as x + tends to 0 with x>0.) +

+

+ In general, one can show that 0<= S <= log2(D) so the two + examples just given represent the two extremes. +

+

+ You can think of S as measuring the spread (dispersion) of the distribution. +

+ TEXT file  +
+ A data file in a special format. Most word processors and spreadsheets allow + you to save a file in this format. We recommend that you use TextWrangler, + a free application, to deal with all TEXT files associated with Quantum + Fog.  +
+
+ Quantum Fog uses TEXT files for both reading and writing data; specifically, + it reads and writes TEXT files with UNIX line endings (TextWrangler allows + you to save TEXT files with either UNIX, Mac Classic, or Windows line endings). +
+
+ TEXT files generated by Quantum Fog should be viewed in a fixed-width font + like Monaco or Courier. Otherwise, columns will not line up properly. + Alternatively, you can open the file with a spreadsheet application. This + way, you can use the powerful features of the spreadsheet to manipulate the + data. When reading a TEXT file, spreadsheets will jump to the cell in the + next column and the same row when they see a tab, and to the first cell in + the next row when they see an end-of-line. TEXT files created by Quantum + Fog are formatted with this convention in mind. +
+ white-space  +
+ Result of pressing the space-bar, RETURN or TAB keys. +
+ [description of something]  +
+ A symbol that should be replaced by whatever is described inside the square + brackets. In particular, [white-spaces]  means one or more + white-spaces. +
+ Quantum Fog allowed name  +
+ A string of no more than 31 characters and such that none of those characters + is the hash character (#) or a white-space. +
+

+


+

+

What Next...

+

+Some of the above definitions may not make sense to you the first time you +read them. Don't worry. You'll understand them better as you learn more about +Quantum Fog. +

+Congratulations! You've just endured one of the hardest parts of this manual. +And now for a fun part. +

+We suggest that next you read the section entitled "Quick Tour". +


+

+[Table Of Contents] + diff --git a/Legacy/Help/QFogManual/data/num_of_rows.gif b/Legacy/Help/QFogManual/data/num_of_rows.gif new file mode 100644 index 0000000000000000000000000000000000000000..c956b6b795bbfad5c941938a21c2e7097d28cd7c GIT binary patch literal 5582 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 literal 0 HcmV?d00001 diff --git a/Legacy/Help/QFogManual/data/num_of_rows.html b/Legacy/Help/QFogManual/data/num_of_rows.html new file mode 100644 index 0000000..aca76b0 --- /dev/null +++ b/Legacy/Help/QFogManual/data/num_of_rows.html @@ -0,0 +1,30 @@ + + + Number Of Rows + + + +

+ Number Of Rows +

+

+ +

+This window opens if you press the Number of Rows... button of the +Node Prior-Info. window. It allows you to change the number of states +of the focus node of the Node Prior-Info. window. This number is the +same as the number of rows of the Amplitudes Table in that window. If you +ask for more rows, new rows are added to the END of the list of rows. If +you ask for fewer rows, rows are deleted from the END of the list of rows. +

+When you dismiss the above window by pressing OK, the number of rows +for the focus node becomes that specified in the window. +

+When you dismiss the above window by pressing Cancel, the number of +rows of the focus node remains the same as it was immediately before +you summoned the window. +

+


+

+[Table Of Contents] + diff --git a/Legacy/Help/QFogManual/data/pal.html b/Legacy/Help/QFogManual/data/pal.html new file mode 100644 index 0000000..bcd3fa3 --- /dev/null +++ b/Legacy/Help/QFogManual/data/pal.html @@ -0,0 +1,265 @@ + + + Palette + + + +

+ Palette +

+

+This window allows you to select tools for drawing in the Main Window. +

+Below, we will refer to the colored rectangle to the right of the paint brush +icon as the Palette swatch. To change the color of this swatch, one +can +

    +
  • + double-click the swatch, or +
  • + use the Choose Color... item of the Edit menu, or +
  • + use the Copy Color tool of the Palette. +
+

+


+

+

Select

+

+When this tool is selected: +

+You can select or unselect any number of nodes or arrows of the graph displayed +in the Main Window. +

+A selected node is indicated by four red dots surrounding it; a selected +arrow by two red dots. +

+Clicking on any node or arrow toggles its selection status between selected +and unselected. +

+Clicking on any node or arrow while holding down the OPTION key selects all +the nodes and all the arrows of the graph. Alternatively, you can press +Select All in the Edit menu to select all nodes and arrows. +(But note that if one of the text boxes below a node is currently active, +then pressing Select All in the Edit menu will instead +select all the text in the text box.) +

+Call a non-graph point of the Main Window any point that is not part +of any node or arrow of the graph. +

+Clicking on any non-graph point of the Main Window while holding down +the OPTION key unselects all the nodes and all the arrows of the graph. +

+Let [A,B] be the rectangular region of the Main Window with points +A and B as opposite (top-left and bottom-right) corners. If +

    +
  • + you press the mouse button down when the cursor is at non-graph point A of + the Main Window, and +
  • + while holding the mouse button down, you move the cursor to point B of the + Main Window, and +
  • + you release the mouse button, +
+

+then all the nodes and arrows within [A,B] will be selected. +

+


+

+

Drag

+

+When this tool is selected: +

+If +

    +
  • + you press the mouse button down when the cursor is over a selected node or + arrow of the Main Window, and +
  • + while holding the mouse button down, you move the cursor, +
+

+then the selected parts of the graph will move as the cursor moves, and will +continue to do so until you release the mouse button. The unselected parts +of the graph will not move. +

+


+

+

Open

+

+When this tool is selected: +

+If run-state = initial, then double clicking on any node will open the Node +Prior-Info. window. +

+If run-state = intermediate or final, then double clicking on any node will +open the Node Probs. window. +

+


+

+

When Palette is Closed

+

+When you close the Palette, the cursor becomes a "pointer"—a bold-face +arrow pointing towards the top-left corner of the screen. This cursor performs +the first 3 Palette operations: selecting, dragging and opening. When +the Palette is open, to go from selecting to dragging, you must first +de-select the selection tool and select the dragging tool. When the +Palette is closed, you can go from selecting to dragging continuously, +without doing any intermediate steps. Thus, when the Palette is closed, +you get a pointer cursor that behaves like it does in drawing applications +such as MacDraw. More specifically, it behaves as follows: +

    +
  • + If you click on a node or arrow, then +
      +
    • + if the node or arrow clicked on is initially in the selected state, then + nothing happens—all nodes and arrows retain their previous selection status. +
    • + if the node or arrow clicked on is initially in the unselected state, then + everything is unselected except for the node or arrow clicked on, which is + selected. +
    +
  • + If you click on a non-graph point of the Main Window, then everything + is unselected. +
  • + If, while holding the SHIFT key down, you click on a node or arrow, then +
      +
    • + the node or arrow clicked on has its selection status toggled between selected + and unselected. +
    • + the other nodes or arrows that were not clicked on retain their previous + selection status. +
    +
  • + If, while holding the SHIFT key down, you click on a non-graph point of the + Main Window, then nothing happens—all nodes and arrows retain their + previous selection status. +
  • + Let [A,B] be the rectangular region of the Main Window with points + A and B as opposite (top-left and bottom-right) corners. If +
      +
    • + you press the mouse button down when the cursor is at non-graph point A of + the Main Window, and +
    • + while holding the mouse button down, you move the cursor to point B of the + Main Window, and +
    • + you release the mouse button, +
    +

    + then all the nodes and arrows within [A,B] will be selected. +

  • + Same behavior as when Drag tool is selected. +
  • + Same behavior as when Open tool is selected. +
+

+


+

+

Rotate

+

+When this tool is selected: +

+Clicking once on any beam-splitter node will rotate its icon clockwise by +15 degrees. +

+


+

+

Paint

+

+Custom Nodes are initially created white and Deterministic ones black. However, +you may change this: +

+When the Paint tool is selected: +

+Clicking on any Custom Node or Deterministic Node will paint the node in +the color of the Palette swatch. +

+


+

+

Copy Color

+

+When this tool is selected: +

+Clicking on any Custom Node or Deterministic Node will paint the +Palette swatch in the color of the node. +

+


+

+

Draw Arrow

+

+When this tool is selected: +

+If +

    +
  • + you press the mouse button down when the cursor is over a node, and +
  • + while holding the mouse button down, you move the cursor so that it lies + over another node, and +
  • + you release the mouse button, +
+

+then an arrow will be draw from the first to the second node. +

+


+

+

Change Source Node of Arrow

+

+We will say that two nodes X1 and and X2 are compatible  if they: +

    +
  1. + Have the same number of states, +
  2. + These states have the same names, +
  3. + These names are listed in the same order in the Node Prior-Info. windows + of nodes X1 and X2. +
+

+Consider 3 nodes X1, X2 and Y such that X1 and X2 are compatible and there +is an arrow going from X1 to Y (X1->Y  X2 ). Suppose you wish +to change the arrow's source node from X1 to X2 (X1  Y<-X2 ). You +could accomplishing this task in 2 steps, by first deleting the arrow from +X1 to Y, and then drawing a new arrow from X2 to Y. But the first of these +steps would destroy the transition matrix of Y. That's because the number +of columns of this matrix depends on the number of arrows entering Y. The +Change Source Node of Arrow tool allows you to accomplish this task +in a single step that preserves the transition matrix of Y. +

+When this tool is selected: +

+If +

    +
  • + you press the mouse button down when the cursor is over an arrow from node + X1 to node Y, and +
  • + while holding the mouse button down, you move the cursor so that it lies + over another node X2 which is compatible with X1, and +
  • + you release the mouse button, +
+

+then the arrow from X1 to Y will be replaced by an arrow from the X2 to Y. +The transition matrix of Y will remain unchanged throughout this process. +

+


+

+

Popup for Selecting a Node Tool

+

+This popup allows you to choose a tool that will draw a particular type of +node. +

+Clicking at any point of the Main Window will draw a node of that +type, centered at the click point. +


+

+[Table Of Contents] + diff --git a/Legacy/Help/QFogManual/data/params_SG_mag.gif b/Legacy/Help/QFogManual/data/params_SG_mag.gif new file mode 100644 index 0000000000000000000000000000000000000000..392e630321d9ea88a0bb681a2660e5adf3f0b0f9 GIT binary patch literal 10974 zcmdU#XHZk!xA0E_NT`M)(g`3YD$0!l!@hysxsiV%9}p$bR|O+yg^D266M z5J3?_2N4L>NRc8SDgvUIi_bH6{`bRs=l$}2dDqN7`?vR5C2Osn$xO~MG&WFEzm*I+ z1KI`t%HH1I*47r9w1=VWVcYlQvBPR=YBU-RfIx7xJpzG1r_Y?C<_t5Qo!^6W= z>Y)x1ifShk$tWyU5Z&J1PA5|6C=?1}Ng)!6>FMbt5(!CM5k!#X<>hf?8kS5alZR2H zEdq&#B@SB>=x8DhL!=rJw$$)+OH0f2LvuU{gTbKD*h5jn598^3c-kI*cn^gimX{}> z(P%Xs4UVH385v`Q5=%s5@klHIfhA)w6g3PH zg~1~*Bm{;Cg~4Gk7#dANqsa&~5sjw6F=RCi2@Zz~%Bu;&5hxTHi6Y|2bPS1x|N9AP zc*3w6nrLZBLXuW22{dFn6_3ZO;c04Uf|@0PL>e}-B$3HvJU(3zCJ#rYV~I2b0s*rm zS)y@pB>u282>h@SzFpoDizm}aBwBhp8487B2xKTsP2LC%L!i?M!xRcd4M8N3=_@NM zRO(7Qb%jD*!I4+6Bsz+?LO3i=IvGvgLzA|Uq&-W*icvZZfv2UD=_E28A}Ei-lTj!P z0)>VCWs0DnAQUD~rqD_M-u4i z=@i`X3YNOp-cExG3R2qXyU|ue8S7i=P&@c^N{6lWBd+{!Rv>t^tUjF^Pyl$06;zUuy}(1 z*>fBPfZ9Xf$D97MCw~h7j$Hr%%GLkueZTupu|Q~kf7dgI4LB5#&`ki~5MwY_594wt z0l%;kP14RKBzznzr-2S&=f8!lF{HhkQ{-xp;KHT5=e@cK0 zR_U;t0HEiC3HH0|h7N$~93EH~n4XUp=3an{pCZiI`?j(o>@*yH?jOUyhZ6Yv3j#nG z024D5VF`d)19?w6P|3w_5}?v1g+{d{Z<7VjxX(~)OS|vG^pYAD0396=*g^`XKz`hp z3%}i4Xk1@DP@v|&Hq%pIG4u!#!!BmhK)MnuYr&g>a)asUS(cg)1A^}*l0Uw|^PO_) zr_?TVr%PXXXxd!2)JHhuG1uQ*@Al>@3oS7ueQSA?WL+H?hH3mfLB8E*F4}m)hBbz3 zAm=5$KaYhwutNNV9#aNA-X$POis>s%P+bFt)57DSf@16Xvb>l5n1LywUB*Li!W*HF zE7p3)=!o5wZE|fanun!5dKRMfhVIhJ^6XdKj}ZfBw{4Ikq~kIiMc-vaGYd22T;w$3ks_hDw#Do(H4K1J5CJK?#&zc2?U4>KL3D^0pL>3lF%q5 zYf)Jj2oObf6$Jq(s-Qr4D-y{Xjw1+z0YyTIM`SVfvAZOhii7I#b}WK80%5G_ZZO16 z2_@6xI{f0)jw=Pa+mft)+*|D&g`De6%i+PBcG66)B|SLKt6Q)2oLRSh31UDy%1{mn zs9U*(r0R$>dFczqK{=Uw<%-<`{kjUgw%R|Hr)cC6SS7a@er~svs4!*~9?>2g!Ax0D zha-H8SC@3QYRc7F5&{DJSmkdZMf?<(Z{LD%kFb@T%V+bD8$AtFKk2wj5v{%vv2)yd zseD|9DP{}o&gungfAd&he#(HEr|=_=DLeq-$0rAR)ApciX@TBM~J?%aaSZwQbQI7$i&SFigD7`~SBR;8qu+tCc z@S>veEkD?^X=7&^)2*~S6ENX*VOmm=6*$U6VVLR5c^1sv>81XPwNhDy0w3`6sZmpMJNk% z7l6~9TzYabnh7k^NXW?fARoqT$QQ4n!RH%33Bx+vk}x0!s@JyR*ZRFN6}$c+7^SuK zy54MIcBSIkpZ#(}9RIJaZk0=5$t}8$v8M|3^`9rw9|F0rqO(3ad^*DnP4V>-<`odY zvwXeE4Pw7T-20vT%6yx{8x$rYFlD3B+yemb?8K&}DD7+p#lgnTB1;1F5`nJI*4`I^ zB5X(dh$QNA_eDwYcK0R7^&T%~o8pg*lAw6eMv(dB4Ys3TY@0UxzKQksn|n}9wXhT_ z>3d&^z=lEQuGiOO6lVu?GN-gM5emY)Pk-5WZP}1XgFrO%!*wroijLHH-3_?GES&ZD zxk8_Rx`{RG()i0WQ(wJ;H62=^TkVuaBHzOY#XrtgbcoWw#=6*u(fybW`IYN3yf}37 zbulEqzD@K!g2`V)!$k41kW)q{QvfLI|qACB}q56kZ4ZbiL_IZT8DbR1nL(614798;K-)>oBEu`=m2>MVzzc#fhdmbcM<6j5~9_{cyU8{9|h|0*gORg_|CrzGt6dRKRYXw-e=4!33zldaR#CXP1@SG3k(k zp9mZ4a~yH!;3Okdg;US5OUYQ>_`p6{yP5cyF!03n!i{(57f+WJay>;GhFUdlR5$Ed ziMaCUT8+IJYLtod^8Auucaed+UUq^}JSri}VtL1E0>68nxRx`2(?7lRUTcV)x}%s!!;n zQLtp8N!y-FB`YTARrt@{R{%E|$7)Iki|n;S%*oNm`{_q6?sY)Z$gy&!AK7mRcKq^+ znN;ro$Q`=(2F6{BH#D8+y+L52Op_CB`{xB(_TIwNYEyROoR1Q^FQ^UHrUmsci2vH_ zMsU}qCzviuiTtD*nb&3J_Akm_{MlnEaGF&Ub-NV#vlls7m($e0q#XLQ&mhk)yTkO; z>4KmAX!H8~i5Xs1e;i`~lU852Y`U!BGdU1ASpRUhe_6ZQuAgJ8p2%vpqAQXw%R%%b z9vxUQxVS%Z*SvvMfNRy{#{N6PW@4E_(W-gq{%FqJS(2gIn$<76_vPk|Rko?FHud{s zK$DmG6SMe z>eOr2lSFj&kPLv*e1ZD`nlEZz+`=jgjKT|Wa)Q9>!95qfeX^S6Ud=>bwwlmfDNft(ZF#twcE5Sy*t2zkhPJOt zk6JfhzWg=!{m*XOQSGe+mEZGxjJ+-k?QcW#wq-v zNBI6|kR~Jh^i53q1E-xuiGzZhQi*eKau8?}`HID%QFIEZC821JbE z*yEKa_-sFqz1tKd$?9Lp%BL?FCv6mcvpn)#ROFfBxKRNGrH){^7*7tOC!7dswe@u& z1jB6OGos_i&j)Gb`WYi5db{qePVfrjeAO!?@5m=;+a@R%dyTn9#tMdy%dy(BMt^gK zBr+&?dwkrzt~i7$WI;BOKuCNz5hhFG%Mc7tEln&@OVZRyEW;*|uzZi?`O2xd%Dp5q zf$yncasxK0T9B_E8`nrlCKHld_ma1RlHnhd*I84#NQs@;lwP#Q>pk8cT1uZ_YGY2y zJ7j9*k<`l*iQipQXK0xB$h*q|Y4d7ni^#N3*t8Ww+VYXRYqYe@y|gV-8b5_^2$I$k zpL#F;{=@S7Z%C=tUH9{jr2ERI=L$q>T)kf<=<@>4mz&_hTp1@JA6&4KuKzVP`*@n< zO5%5dr-*{bFvKr~8Ur@=VZM9!h(huoLi%Z*j2c?zTT;exTKGtOJb(%%?qqymG-WFH zWQaA#e>{>|bUkxCCv(5cYvQ=~CANDXg8~fhCKybnn7?tVooKaIp487cTpiS z92z4Yq#I;hWas)&qxpf5P>5Y{;X<=((@I{?WB@k=BTfW?uV%+%vNwM|O<*s=Z&jLQO+xlW6M3K&@NNum^GKX zRi)>3N_|5r9CpgFFDl-4l?B-I1@=}%hm=KXkm5~T{d+U|D#B72FGy)qr1X7Krf_AJ zMrDqDB_X6TKfki@MJ08)B0;z+zPzHuzRJ#^syx4{{z!S%RFzA7RgG}Zx>M{dX@sG2r56HqY1B zy(Y#B#svK54ZK<9(#~GU+ZU?xS&O~gQ<7lpzgM1qJ-%jmq98jl0<{}8VgRq(FBhXk z2_*O~cKOXM6R5I&LdVJed;W?S?yKYm=b$~$1^I_l{8NnmqbPnl6#-6(QNI(4@T-7V zcW%?9*V<&2kMJ{ge7HldG|u*!rdps&P~d1ntoL#3cXU($<9JNaZjd29n$5kiu6r!%QHXjIh$Ygo*MSlE{6?LcMG5U@@F_87v3b7ndcVrG$`UpP~F%4 zNH`hqaHWC$c)kiY;PKsODm?k$rz-tESNh**3Me40*$3-g3_q=a`{)MY!DGgkn^J|M zN6tq~G^a^U<{7U5!n(P#9`&{&exbV&k{o>TWB`e%qq_6`a`$5xGJCY-nY!g3k$+*s z5uV9G;D+QzdEod3pI3k8)n4U&l>FTEcwtU;gV1D)Wm40GFyEFv?Nx)r(~FmvO~q#&vYfZMm0}nh2%Asn)I8k4RlhL0vZ|3q3r$CKKP( zhITtP7ovJ<$4~NG6uyxcZOmuOU9_dP-gP%&q)?ahs4Z70X;0oduIHvEQX`GsoH?^V zeR+wkojHo#RXaU)o_X6>x{Z;&y+Y-<7u1x`Px)?iU*qiBro0}YWq6zMbop_ z^S`e4(O7%h>?m86eU$ZAV8O17DV;R7?#jZx^vZ6n*878#eO1Q&VKe>Vg?UNFU1w)9 zQu=FWIEyCTT%y7T%Go;|`unkkH8C?(U)e6Ns=?0=6_Aq^tS70+z`?El*UwK5{rTNO z%x?k}J?nEA_U#>dl`?#!sEyOHiv4MCAhL|#aYP_|M6hT?_~nSe!BzP)V(|#5vZ~;k zY1MXEl5_!|f*Jah7Fu;>B>W8^naZog(0R8XmfjFHiky0PzGF1v(`fk4yJnVmQjVkB zcU@$)$`M+8S6;fAJ$2JP7&-0uUcvW0uNR+f$e6|cdw9oK;HR;B0%NLLqtaeuElC|e z`X8fac|Ek;yp-IW&EB7N9NT?zS3PymeU{Hh%q^75%~xy8UkmDLM*8*SeaI|2e84r* zY}~+cqJC`{`*h4?e_W}k*wrJbF`+o`X+lBjns#HA3iP4QJSin zon(BT0@u=PlxQ;H!w061v$*)cCPbCmY0H&qP)IS;{`BjC>2@)odth9@Kl7#IOs7}& zkk(8G*X*d$Y}rP!9v97JgI3Qu*~AbF-I4Tsy;>x9;NE<|TizE8&zQsZ%z;17-Lu23 ziGA2G{_x(dv38c40r~J->BGjxhc8_8i39J+0a`$K^<2^Tr{`)O7or-bJ6aTzmbF4N zjC;q~a!1waJwLsK*$0m7emu?{T_;96FE%NkN6!?CENE)3HBI8<9^m)>7*{}P5(2c% zd^+tu!n7BJYG#;~$Bvj!L(;~PPa5RhLIj19Pi+(lb1#UC&kMCJSOqN{C@!5rj|1-JAa+7V~|BcRl!no6`pm?GHY4b7&dWAgUntG}=^~~#Ywb*Bsk#|YIiUoRu znj=0pYOgnVKbJONLFT-7X8)|5O0#!bI}x!KnUY^MH^1cgDLDe2_|mm|juyAs89%@` zUE{j&&~-L~E-PNF-?lb0es%ND=9bfi^Ml&o#lN)JeA#ijGNipS_i+9B%VE3T_2}!H z=)g_ghnu^spMY1Rliq0NNY^7DmW&R*Bo3y68KZ;dYroSroy<2rdvAPf<2&l(Dt*(H zM`c6WBX52Ni1>POz7FvpHA+98Yp<#BtSjsM==`(&V(y2w@{0b@S3ZmHW};h45&+i; zsI%0nX5WtY&DBTdt0mqGFT7T{M5<9Fu+h;Pyl!fM0&&`nz)|}ej zQ;&RbSEe6qd`efL=Ze$s&GBZuTFyJV{2=mY#L*oc<*x?C>oZ++*@YD7pJW?lK18_Q zxwIu)?a#&%?9tIo9O9-%!!X?_ZXp8)$kkgN(NNY& zUnmH~qz7h3al+c6K&HaAnmcxwDAuDK_Jd_YfJ{#Ti_i0PyU}F}qD~yQOfTk}Zhb*PRoLtsM%*<=30awwbS4x7y zIJe;v>qp{Z?Pu5CRZY}{F=jQ~Hpa+~eRBgEK^`;pOrGm|s*6S`(WjoBo$+rTUmkgE zQPGyWvb6TT)-89iY47GDOZJfI?|OCT{H5k+ZbK0l2X;5)x^pEaTRtpASzNz#$uT?} zU}{*`06i*wh9GX9;U+KcNI!!U3OUv;6+y{cx}0a;WAwN$Zg1&9_4s}DdG$Dn`WzPe zzLy0q+050!U%>Cz zv1M}FN<-$6-f0u%mhEp>9+j8X>WDPiDD*w*W%f5aKONvtX(K(!cm=6E^W9AI`+I*4 z)$h^|j7x^MjR&+i&TS7fR`yT4>%ADmn^kAPlO6C*@7PnnR%uC1PkCL1AKRlAN<|M| z7|JE{+t^r#TfM&|!P#JL4!U;lx_!r;MyhrA$!m2E9zT9etb4oITrUnBcz+G`;M#S> zE!DTY+qa3mU}JU(}J!Vx=vQzT;Z15#m}GOyO% zdCmDdOq_o)^~%os`6c+=_??`qmxby*Wtfwub3AGqZeO}ovr7;4+L;{AElw7C85DVb zYJezbJvm!i;Ckk6!P#u}c}7Xma}5)c^o@{D)h(ZR*BqK;l~B+6c2qqoH_nD`)cZQU zw@a8@%5$%qeBPqnkg)T`yA8yAaU$+7Qh2H78a9qpujbV|w=dhveLB*iNpH|s?+uU%OKF3Ed>SEoNTkbXcBoy75 zb$j+Q=%U1#KiI_wwh_Uf3WELwuaxFSgsfFJ{RvsGpAZk3i_+EFrN4Q0^xoG#R=8)s z-i63;i5@pbc%!77aKwI4z^jPg!7Q5Je*en-62V}B-+L~d4{%{$Y->SeI8ua}#ApbJ zwq-O=8J$@Psl(}H86&hvXB^R@=|CeaVBVO!$u_zEi}RCtE;YS~f%7h*@ASORZ9Ta2;!L_9lPAe3SsWGtp){ z?^w({PEpDw8JrPwyMzurRivv9_OJo(R|ukhJlC9lCrXls^Rp1L8dqVj+oo2!08*`7 zWLBc^5=2pByfY2kUn-u<1Q@J!s>i3~pNI>j+RJ3hDj`Y*B;LHy-nyfZEF^LpzIw{+ zc^QkjdgfOfFjF@gCoevXkkGI*E^g#;ZS}kJ$vm-r;u>pkYJiNfCX}U`Dw%dhRbS#A zp2uYETjo-}t9T@%r_^T6LdFmEn5pb^z0UgQg7cs<*p=o!aAvvc;`;@;ds1dWZT=~j z`(5w!GWEEhl$B%hO%e58?KX*aKZ7?$#t_Di(R#~TQ@Z4t0XUCYVlGy8W*Wa7m77ZRv?s`!A!r3{z zSDFJJohsc=e;g&<1J=BazoxsbWc*{b()Got?++X8HPuw7Z^qZ2Sh-jJ zF1?}urs`Sk;FloZiym$7dK>Em8m=%v9yc6I#&$dtb??nyzdAcP`0Dhhs=yyJr|)YZ zp6}qZSmKsxZTuhxcVW~?VWOvtQm9?O>-GBVxDFvTXw-VA6yyd0;5H4le_wvRvD!t+ zU5*?F>vRsoy4*K^EIeA8lT}VBTtOA^N3l?GOx!3$HbojZqK0ESjRer8F;P;cME2;t zPRS>s5dAy0Ez?WhK`&coKa0=vMU!4LC*h)YTC?3_F7w_zGme~d&$tq(7Q>o!iud;? z+gHDqd?F8$9gY@ua1YtN5iBPs*ukWDI9xF?V!u%k!@UkX;jMT%JpLTn@FkPOx_v>J zb^D*I52e$1!&!NFtAE?RJ+4RqM7J^l>^pbRj5n15BcD?p&^Lw7zW~2to%~Wf$0W zk#vsoVLche4X|lT`@4cq0To&YtLAR@qdDU-3T-Hm?pE>O>|l`G6cA z6zfSj;SnCHPR{Y!c@ zz~2syM$N~2)6AaOaq#n9d_UDIx}p!^9%j3BB z-74X_7Km$IcKo7zv7H-qe$#@P9T2c|BqsL7L zwGN>qh0r)iks9KKj}oiXb`+$k3#@{rXPgHRdfsj=OnzHG@*yxjet0|QCY+7`&L5_N z<*;RSMgk&08ydNXlV2m6M28{@8u@4k8B zrjv}jPwVuV&SdWXmrOh>2sy>97|Z7%4mjBoLLNSnCrt-VW74cp{8ev@=0yFaK|Rpn z|D=O0U;qIcZHcu+b&S1vMJsqYRm#WEgCeBmRi|EFI@#`AR~g8w4l-^}Ln1hMTDh9r znegpwhtE%$Po8@XDm(=>{^O476I*OO>?3+fcJ0PE-Q0D@$uCV$-{v~KQ|7;Q+D zr897JCB_^b#ncWyLX8rj849JxgnP!wLo@|ZI30X6BQk)h1K`3P&RPUqyoihP5^WQt z0Aj@0)9AQ?+p$OGK{=krxt=|82o?((vkeBE^E-+e-E)n`d>w22=r@r48+Tov$z(W+ z10R*Hs3>1-c%P}QT(bE*qBFIycTuXQ@;Cl+smaq6plX}r=?v8~1$SO8ri?S?3>kbD z0m{151Hv*lg<=+ONcPh2w5Rohdgr5iCG@#fxJ$f&pMG^AM-mh^W~+MYB;(v*8oKpkfsA4(KEu z*Sr0YJS~#Qjum3x1dkZ)vZN7KH{M2_G zHws5ZS;!%yjEn{x5S0B~7?#4N!|mP{*e2gZWp%SV_S+BN~e%!qSR#RpjMW(SfUC zvm+u0L*U^!M||v6!RXEH!TY!6GO8>)_u1Y&F`9}ca%Zam>z1gqu>jwBaUFx*Le5iO z;4?S?35#PTgH*$TGg{VX&8!*c9IelX16E|vg*X-nJVuuG4ieXWy?%JRjE(axSd**a z-uz`x&{+c5U@_^*dDO@f6j!^5o6k?ty9_pzXE}2X5Fvp~2W-q{ZOk`pEZ*9PSORC1 zSPT(h!)rDVGl!?vs?$%Ix`kNrEWE6>9@;_F)N00%Qci5bnQJwf9KvmS$zx{_;7cn} zww8df(RCNc>#knc-NMK3T*KL}fG#1TZ(bg=Ik3KU^7xCB>@HO#yQk%L8{~|IYx`Ls zK`Q8;qivvxeUZ0s&_V6?^X>!z&P#djK6h51pI6Hg{ zG1WLTWOg6ZH=CN%q4nX1Fr90zTF7bsp74U!T&c0s(t*$?FQ)=kPQ#cvU>+b4oYpoZ zK8rQ1|B(3X#k9ULxBn4$9=Q2+K;oMh({+uT`(JV2#2Q%Cn4}Q4_r?H8XtV(J=E3aE zKN~k02R8w36i6HeRz@*tqnOQ6EKaB+-YC`x6eNw#+;)@8aw1qJ`V12Hg$n{){4Wo& BXOsW{ literal 0 HcmV?d00001 diff --git a/Legacy/Help/QFogManual/data/params_SG_mag.html b/Legacy/Help/QFogManual/data/params_SG_mag.html new file mode 100644 index 0000000..698792e --- /dev/null +++ b/Legacy/Help/QFogManual/data/params_SG_mag.html @@ -0,0 +1,76 @@ + + + Parameters Of Stern-Gerlach Magnet + + + +

+ Parameters Of Stern-Gerlach Magnet +

+

+ +

+

+This window opens if you press the Generate Amplitudes... button of +the Node Prior-Info. window when its focus node is a valid Stern-Gerlach +magnet. The window allows you to specify certain parameters that characterize +a Stern-Gerlach Magnet. +

+We define type 1 and type 2 nodes as follows: +

+
+ type 1  +
+ A node that can assume two states named "0" and "1". Here 0 and 1 refer to + the number of particles (spin 1/2 fermions) in the state. +
+ type 2  +
+ A node that can assume three states named "(0,0)", "(0,1)", and "(1,0)". + The first component refers to the number of spin - particles in the state, + and the second to the number of spin + particles in the state. For example, + (1,0) represents a state with one spin - particle. +
+

+(Mnemonic: type 1 has 1 component, type 2 has 2 components). +

+Even if the focus node is a Stern-Gerlach Magnet, when you press the +Generate Amplitudes... button, the computer will refuse to open the +above window unless each parent node is of either type 1 or type 2. +

+Quantum Fog gives names of type 2 to the states of the Stern-Gerlach magnet. +

+


+

Quantization Direction of Output

+

+The output of a Stern-Gerlach magnet is quantized along the direction of +its magnetic field. The Quantization Direction of Output box contains +2 editable fields. You must enter into them the polar coordinates theta and +phi that specify the magnetic field's direction. +

+


+

Quantization Directions of Inputs

+

+The Quantization Directions of Inputs box contains a table. The first +column of the table lists the names of the parent nodes of the focus node. +The cells of the first column cannot be edited directly by the user. +

+The second column of the table gives the spin of the parent nodes. The computer +determines the type (either 1 or 2) of each parent node. It then writes the +symbol "-" inside spin cells of type 1 nodes and the symbol "- +" inside +spin cells of type 2 nodes. Clicking on the spin cell of a type 1 parent +node toggles the spin between + and -. Clicking on the spin cell of a type +2 parent node does nothing. +

+The cells of the last two columns can be edited directly by the user. You +must enter into them the polar coordinates that specify the quantization +direction of each parent node. +

+


+More information about Stern-Gerlach magnets can be found in the document +entitled "Quantum Fog Library Of Essays" that accompanies this manual. +

+


+

+[Table Of Contents] + diff --git a/Legacy/Help/QFogManual/data/params_beam_spl.gif b/Legacy/Help/QFogManual/data/params_beam_spl.gif new file mode 100644 index 0000000000000000000000000000000000000000..8c1c7527be0698854efd6bffe13e041acf33bb2c GIT binary patch literal 8406 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 literal 0 HcmV?d00001 diff --git a/Legacy/Help/QFogManual/data/params_beam_spl.html b/Legacy/Help/QFogManual/data/params_beam_spl.html new file mode 100644 index 0000000..f281c7f --- /dev/null +++ b/Legacy/Help/QFogManual/data/params_beam_spl.html @@ -0,0 +1,84 @@ + + + + Parameters Of Beam-Splitter + + +

+ Parameters Of Beam-Splitter +

+

+ +

+
+This window opens if you press the Generate Amplitudes... button of +the Node Prior-Info. window when its focus node is a valid Beam-Splitter. +The window allows you to specify certain parameters that characterize a +beam-splitter. +

+Even if the focus node is a beam-splitter, when you press the Generate +Amplitudes... button, the computer will refuse to open the above window +unless: +

    +
  • + the focus node has exactly two parent nodes, +
  • + Both parent nodes are scalar-field nodes OR both parent nodes are vector-field + nodes. +
+

+In the scalar-field case, M2, M1, N1 and +N2 are the numbers of photons that pass through the two incoming +and the two outgoing ports. Quantum Fog gives names of the form +(N1,N2) to the states of the beam-splitter. +

+In the vector-field case, M2, M1, N1 and +N2  also correspond in a 1-1 fashion to the incoming and +outgoing ports, but instead of being non-negative integers, they +are 2-component vectors. For example, M1 = (M1x, +M1y), where M1x and M1y are non-negative +integers. Quantum Fog gives names of the form ((N1x, +N1y), (N2x, N2y)) to the states of the +beam-splitter. +

+t  and r  , satisfying |t  |2 ++ |r  |2 = 1, are the complex transmission and reflection +coefficients of the beam-splitter. You must enter into the first 3 editable +boxes the magnitude squared of t  , phase of t  and +phase of r  . These 3 parameters completely specify the complex +numbers t  and r  . +

+Consider the scalar-field case. Frequently, nets which contain a beam-splitter +node are such that we know what is the maximum number of photons that will +ever enter the beam-splitter. For example, suppose that a net starts +with 2 photons in its root nodes, and that for one of the input states +(M1, M2) of the beam-splitter, M1 + +M2 = 3. Then the list of states of the beam-splitter node would +be forced to include all states with N1 + N2 = 3. Or +would it? Clearly, such states would never occur in any of the possible stories +of the net. So if we were to exclude such states from the list of states +of the beam-splitter node, the physical predictions of the net (that is, +the results reported in the Node Probs., Bi-node Probs. and +Stories windows) would still be valid. That's where the Max. Output +Number editable field comes in. Quantum Fog lists those and only those +states (N1, N2) for which N1 + N2 +is smaller or equal to the value specified in the Max. Output Number +box. In our example, we could set the Max. Output Number to 2 and +thus exclude states with N1 + N2 = 3. Of course, excluding +some states would cause the Total Probability button of the Node +Prior-Info. window to give a result different from 1. But the physical +predictions of the net would not change, and we would save memory by excluding +unused baggage from the transition matrix. +

+In the vector-field case, Quantum Fog lists those and only those states +((N1x, N1y), (N2x, N2y)) for +which N1x + N1y+ N2x+ N2y is +smaller or equal to the value specified in the Max. Output Number box. +

+More information about Beam-Splitters can be found in the document entitled +"Quantum Fog Library Of Essays" that accompanies this manual. +

+


+

+[Table Of Contents] + diff --git a/Legacy/Help/QFogManual/data/params_det_nd.html b/Legacy/Help/QFogManual/data/params_det_nd.html new file mode 100644 index 0000000..4c1d704 --- /dev/null +++ b/Legacy/Help/QFogManual/data/params_det_nd.html @@ -0,0 +1,30 @@ + + + + Parameters Of Deterministic Node + + +

+ Parameters Of Deterministic Node +

+

+This window opens if you press the Generate Amplitudes... button of +the Node Prior-Info. window when its focus node is a valid Deterministic +Node. The window contains a popup menu called Node Type:. The appearance +of the window depends on which item you choose from this popup. There are +currently 3 possible choices: +

    +
  • + Controlled-Not +
  • + Marginalizer +
  • + Phase-Shifter +
+

+Each of these choices is discussed in a separate section. +

+


+

+[Table Of Contents] + diff --git a/Legacy/Help/QFogManual/data/params_pol_rot.gif b/Legacy/Help/QFogManual/data/params_pol_rot.gif new file mode 100644 index 0000000000000000000000000000000000000000..4c1d422ca70c1958396669165c0112c0c6b01a2a GIT binary patch literal 6248 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 literal 0 HcmV?d00001 diff --git a/Legacy/Help/QFogManual/data/params_pol_rot.html b/Legacy/Help/QFogManual/data/params_pol_rot.html new file mode 100644 index 0000000..7315ea5 --- /dev/null +++ b/Legacy/Help/QFogManual/data/params_pol_rot.html @@ -0,0 +1,38 @@ + + + + Parameters Of Polarization Rotator + + +

+ Parameters Of Polarization Rotator +

+

+ +

+

+This window opens if you press the Generate Amplitudes... button of +the Node Prior-Info. window when its focus node is a valid Polarization +Rotator. The window allows you to specify the rotation angle theta that +characterizes a Polarization Rotator. +

+Even if the focus node is a Polarization Rotator, when you press the +Generate Amplitudes... button, the computer will refuse to open the +above window unless: +

    +
  • + the focus node has exactly one parent node, +
  • + the parent node is a vector-field node. +
+

+Quantum Fog gives names of the vector-field form (Nx, +Ny) to the states of the Polarization Rotator. +

+More information about Polarization Rotators can be found in the document +entitled "Quantum Fog Library Of Essays" that accompanies this manual. +

+


+

+[Table Of Contents] + diff --git a/Legacy/Help/QFogManual/data/params_polarizer.gif b/Legacy/Help/QFogManual/data/params_polarizer.gif new file mode 100644 index 0000000000000000000000000000000000000000..4e13c0164e0048e34839f726d8e28e0c9dfbc0c1 GIT binary patch literal 6219 zcmds&dpJ~U+rZbH55yvesZC8u#%UVa<&;cBL$&u1<&*}=NHjUrsMO>*q?$?@gdsEz zX;fPy(V}DsP3bUU??$DD(w<07Me~i_^|Ki^;9eXaF8zvp@G=f2l{-_KfW zgSVHXQ#c7G0KNbKfCW`5l~AQ(ic}=FR45eE>2#q&#h0pNG8s>*lt?6Uxf~>rBvJ)e zs)8VhLT5^)Qi(*$<7-+OOQaNw#gJ6NgA{B?#TCmrVijAg5{X1&sX{DKFog<{M8Os* zxgx0}T_}_&ghDA-CofHlg8pR_!37)0g*yuFc=_H!V)Q1LK#yaX9#3$Hk-@kGWb#kSIXoFNNfp% zA>wj*EH=axDVa=mAVx!e5(sp*kj@s6Xbhf2>KMpovbh`%#Dz4$N=YP=BSS!?Qb|-gi!bI1 zH4o`Xp)sjU9)->#Inr4I2~RBNi{%uKgvS%J*&lPeI4WPGtg2+8>(&0dWK1%XH+5GkOh zB@mcQ5s#<2cr2cXBNPb)B7s81;6Z_0h|UoTMRF`i06_wc$x|woETJM$px|l(1VOCk z!h)Lc1WJ{r5dZIG$yX!{0ImZ|)HB{59)26#H`r0^RssORB%H4{v9IF{P?u<%|)G$@UJ9Z{U#%Wlf;bn1gdo>Q=cQs6kWF=@e!{2Mzb}liR zUL&ju0B|~?Ngm-+#|d#r%^j7}Fqem%XL{8i6g? z0RUR2YW0}LuTCxi%o?fHDmS(I`vd@>^8p~=Au>5(|3A7KZCD=w{BPr*LI1Q40E3!1 zHKHk!`acK%$?^Xr<{vc*08~H#utjrkpaMW42LP6D0|5PB0Dz|9O;iAGV)?K8XA*%q zK}Bs2|LN$T;r~q&weG+yk=#d_$Nuqo|uENM$^ zX!q5s`vsK9o(taBs{4u^6UT?UuU+av;dJmexbSw#McP@b?LF6P1}@Pr`jq(mQTwDW z@S3yhf?q3q1AdIWlPVUC z+~Ll*4(k;+zUtzcZ7ki?e0B6b-`*@PgMN+lTK2w_95hmky6Uo}tgrI~>=(O= zJ?dyy!l&a4ZqMrle^))3yyLk`B-g(Ky?nznmvJaehbpK9)1*91mu`h2 z=mEb>Ov+dh>)|h2BdBm~ z#Wujiepu3B%|hPbXxYnvkrdBdhn=UvmCA@bFA6~>&V+YPEI7d5_Sax>N zGI<(*rT^G5q&}e$f?ql89;Ur|{Rr&RN-BN$m<^3nhD;Ix28f!XaTCPpn`+9~`J*2X z5G+0~Fxmyz2?I&tJAHsIYiX-~CepcA5R%>Fgs-X8w*l{-ldkE#<8P6XnQV`n%w;Ire$yQqaz^= z$av@@i>-&~L}~r~`Tf)bYMGYtwsppFNe|=2bbvnUHF9r2RlDa-v$KpddfTobHeDP2 zLX|BE&Dc(b>sTn0Wf2=w;|(tCENXb7NZ9wPOJVe}XYoo4rBBc32X*~^_-`I1e?O-D z9!oZfR~}kD7-`J@^orLKV({?vwy@@3)I}T1A+PnWRn03{ephY-4n=@P=m6U+(|6AW zr+3No;~S7G?t&G~HvY^H=j|V*#w!$qP-3&a!OYh;(iC#b^=dWLJs~Q4Cmwz55oUl) z*>+|20l#d>8oB=b_mt)-Z#vMB*vW7nN4L<)rlE%q#lYQI;pCY~#Ht^mFZ|fw?@ZP_ zgDZHBr@U>pL*Gp;mRFT~rG7XxvJv{x^jJtM{BY!>eNKOps8#33dpN1kpvsHZp+RSSRn-Eq9^HLe#C)y0 z9nOOvPqLSlV?-7mYrcIv#jzO?lQTQ^B{!b5&|8L^U)bSM3c@#PEvq^lK=aX?Je8MU zx!fVgT{lz?N69Nm8@zk`iYD`gn?^0QL?U|as+u_$n`YJd0ruy2zE zkajgC+q*Yn;S^u8sd{BWckeFesY1!ED$Ea{Z+Gxik*v3R^^NYn_#czH;>v1=F7N(? zqNxjt*UKHXl-Wb#sS;)0r8RH89~>NjA{bo|NV_(g0(ZK`o;iOB{dA0Oag9Bwc(?Z(j-CJ{OA6Gk1*K7*6^1tL0 zP^I}e2KMd#?Mm&FhJ%Jxp|iDtT}2N?XQu0!QNo~so~KP)qb|pvs0%HCKWiR*(vaL* z7dBM%to7Tu`qbGvM$1B3`@-|JnXdH_#YM8tFmp8TMEy>Sjn8|6KVRkd)$ejR6m)L& z)5d_D_At-lM-S5WTUEBk?*4uEAh%(4IhxuNd-*B{u4YCx?dy!Ah1{1u9{)_b?U@V9 zv*O8pI*$a|k%P~LY%M(x$M$hyM}bkEqg8^(zT@W7(+MWb*QL82R>5R8X8z@Ah+ zV59U=6DME8SI|CC$>2Q#bPVh)+2eOFWbw@MbIpX&3HQ`kw;0@O2N-YNo@*{VB8uZq zJC+`YP{J1=Ip7~IqD(^@5Fy*@(dl``ujBZ+#|hybR_;A0F(==6hPuR!`}a}Tcf)UW zmZ5)`+nzjrKl1svK;jkUiu7y6k;E4S$qI1NH_#?zmh5@s+KI(}dl>nE4TSbVDLqm3 z^cRbqTFy)~o(so5U##2Q_1ovG=f*rjk5Rs=8@;`uV${`_mGxWiQ#unpn=jB;={iXu zQ?B+$mk>8~POnchN#UR`qsG=1IIB!h`N zAnW*bsjYBB#JINZT}bcz-@e$>FTb|IADMMu_eq|WZjOz5m}9i}!1IlRpA%wQ|2DT< zqL|8^T*Q`bJ>q#Sc~h9(oo!Fgzi}@{rERy4Ou1Kexp8ZDh@sLM)ofmUJuYVUP3)|! zlXBk9FJ*$h<5f~SJ?DLDvER^8|BW^@c(tjo_XQ`q@ZMV236HT80a6}>Z`bNN`*FyhDli;{m#*`pvwuxh*}J~|?dZY2i{xqkmez6G+s;q7G$hyM zr@V`wILNfu*q2I*;R(*eYZS4G;`@2=aI~#=-N zw*az7(^PoB!&Fz#)Kj;w%7HGce#>_T6Q9?9r<*&g6ECjVrOaMDec=fH>s0KIDeJ$= zU#+-(v8(OJ=e_jzs|XoO!Gf7b5vrYco~07ZVZL6Eg&akp;D{X9VlX?wF*_+Rdp|onnF}LQa1=SpLQ1!i zq|HQ!wnwGnM>CD7*hb&1JQ;V1I@~maW5Uq$jgzA`v+(EWxaAD^QfbaoQI3F+Tj7{n zNy;r%G#`>_1l3(qIBH=SP26~V&Dz|=rkgh z&&%Vp@_J=?{i-~vBCkiBmj<8@F>oXXs)P<(cp!7^UK&&t>H9JDN4CNH46~aAJ#EJ7 zMbq?DI-CaJ8Uz>yfaVaf9NwvE@u?ZvsUNCSv;0$Eu-IuKrUAgw=)aXVrY>t0N{6Izw4-mcu!7 zh;im11)Zm+qqb0BctdVt_JKd29UOJkUpsAVGzK1paPd^k-F-$OS5GJUZqYHv?*)+S z<@hNQIs(Av6L|}i=NP#2-aLFE4_CuO?s$&1SDsr&MV|rBhgdXAugoX5m87gVjC6dp@#6U zV_;?sn4++BJO-8p!p4IzSq#`o9^8n9-Y3%3zVxkkX*~tGo`w3A3iydieyu95dRx#P zaMTcWp(Drc?i6m!{j@%4Hd=vL{Sp>Rr%3 zQ$5~&arSE&%voR`E$}}U^4*xf&fCwY)>Eg}p(dT|@4TKqzIKaxxBWyic}JwhhsYAM zg|^QZR0bWZ*m<+UX|Tc>uXR9BTFb$&veL3-V3KOfVg@g=@s)?1E4T03l_e=&x=MH_ zg`C8&S5zS4IaQcSM4nI8t%|j8UJ^HLA?JUqIv-rY&owNnt=KhQLmo#I2};>=#H!t} zC=fyC)$Sj^m@-)JKXNvrS`fnaYYG8#Wdv0t6k+$@Ql`4RW% z4SID#mfuc5c?WRjS$hJQj1idsBz^^tv|5Q@b(UnOrW1O;8Ll8UY;DB<4q=W9;JFaq zi~`SQVNH40eOj*j#NvfKTrme<&AVR7gZmuE6obf3Eq`nXxn3{8T8XfSmB=+MiHCE8 zsX4ojj2HLsMlSUy=kBx2hLPo03AfLfB^MLyBiEl!sqhk@j)U;^LogE%9S)(hip9At zVs`=d_;)d{PR#uUZ6bx4LHH#iY_Rl(;i0C|4ac$gn+v~VwgnT$grH*xxiX~5zY%|w zfxZmF%^+B2F(QYD5Er-HY-zbQ)Y4Yha${q&2?f4Hir=Ng)N2{8wLJdbVoMzhwo+-W zJ;HtLlBFF^s7`=&TN^&uh_aR=P1PK64yDbJ-uC8Do1(aFyru1}OIr?0Y$``uQ&EH8 zYYhvIOk!g8Zga6yBCJQ3p(w3ST%bHQzvw0Xw+K7}Y|EjyVd)6aq+NeayFqBXkxe_6 z-j)NQO({S%3;L|(OY^B4t^!*w`907w3HJq&;px_)=~_g@^bq|)9eRxb=EOl5-@3DA z_>O)a!bt#IBS6~^H;V?ND_joOMeUAl^2^|4E%x@CSO|gBcX#tJx^x6r)EPS588*|& zFu50zhh3!vQUqxKTLl~PZf7!?F6VEXC8tlkh7EnE*U4dqv~;@CYIz`Q+rufOG_#mIbzMyuvL zx&u>x{8qo?qki8dM~vU4!5H@Nb*r6{LHGr*v78&BCq3mlQWy125o!1>%=x@$|~T*nyUSm8QYxqYxYbx>F`Slc>S|L0)C?4ZbW=&I|`m5JwWEKMpA z;zpU)6vkJH^AbFl-Qtu^JinegEGZf8X&vtUbGU!rP-h=pi#y~g7%Br%@+24x2Dtne Dy8I6< literal 0 HcmV?d00001 diff --git a/Legacy/Help/QFogManual/data/params_polarizer.html b/Legacy/Help/QFogManual/data/params_polarizer.html new file mode 100644 index 0000000..a15d445 --- /dev/null +++ b/Legacy/Help/QFogManual/data/params_polarizer.html @@ -0,0 +1,42 @@ + + + + Parameters Of Polarizer + + +

+ Parameters Of Polarizer +

+

+ +

+

+This window opens if you press the Generate Amplitudes... button of +the Node Prior-Info. window when its focus node is a valid Polarizer. +The window allows you to enter the angle theta between the X axis and the +polarization axis. This angle is sufficient to characterize a Polarizer. +

+Even if the focus node is a Polarizer, when you press the Generate +Amplitudes... button, the computer will refuse to open the above window +unless: +

    +
  • + the focus node has exactly one parent node, +
  • + the parent node is a vector-field node. +
+

+Quantum Fog gives names of the form (Nx, +Ny)Nloss to the states of the Polarizer. Nx, +Ny and Nloss are non-negative integers. Nx +refers to the number of outgoing photons polarized in the X direction, +Ny to the number of outgoing photons polarized in the Y direction, +and Nloss to the number of photons absorbed by the polarizer. +

+More information about Polarizers can be found in the document entitled "Quantum +Fog Library Of Essays" that accompanies this manual. +

+


+

+[Table Of Contents] + diff --git a/Legacy/Help/QFogManual/data/params_qbit_rot.gif b/Legacy/Help/QFogManual/data/params_qbit_rot.gif new file mode 100644 index 0000000000000000000000000000000000000000..6808079713156e8aa731ecfc8f6481d0974ee2af GIT binary patch literal 7858 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 E0Bv?(DF6Tf literal 0 HcmV?d00001 diff --git a/Legacy/Help/QFogManual/data/params_qbit_rot.html b/Legacy/Help/QFogManual/data/params_qbit_rot.html new file mode 100644 index 0000000..105cf21 --- /dev/null +++ b/Legacy/Help/QFogManual/data/params_qbit_rot.html @@ -0,0 +1,42 @@ + + + + Parameters Of Qbit Rotator + + +

+ Parameters Of Qbit Rotator +

+

+ +

+

+This window opens if you press the Generate Amplitudes... button of +the Node Prior-Info. window when its focus node is a valid Qbit Rotator. +The window allows you to enter the angles theta[0], theta[1], theta[2] and +theta[3] (in degrees) such that the amplitudes of the node are given by the +entries of the following 2 × 2 matrix: +

+exp(i*(pi/180)*{theta[0] + theta[1]*sigmaX + theta[2]*sigmaY + theta[3]*sigmaY}), +

+where sigmaX, sigmaY and sigmaZ are the Pauli Matrices. +

+Even if the focus node is a Qbit Rotator, when you press the Generate +Amplitudes... button, the computer will refuse to open the above window +unless: +

    +
  • + the focus node has exactly one parent node, +
  • + the parent node has 2 states, 0 and 1, in that order. +
+

+Quantum Fog gives names 0 and 1 to the states of the Qbit Rotator. +

+More information about Qbit Rotators can be found in the document entitled +"Quantum Fog Library Of Essays" that accompanies this manual. +

+


+

+[Table Of Contents] + diff --git a/Legacy/Help/QFogManual/data/preview.gif b/Legacy/Help/QFogManual/data/preview.gif new file mode 100644 index 0000000000000000000000000000000000000000..ba99fc1b82d32d793771afc0f68e65c1a2fb2970 GIT binary patch literal 6572 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 literal 0 HcmV?d00001 diff --git a/Legacy/Help/QFogManual/data/preview.html b/Legacy/Help/QFogManual/data/preview.html new file mode 100644 index 0000000..f255fb1 --- /dev/null +++ b/Legacy/Help/QFogManual/data/preview.html @@ -0,0 +1,22 @@ + + + + Preview + + +

+ Preview +

+

+
+This command causes the computer to calculate, for the case that all node +states are active, the total probability of all stories and the number of +possible stories. The results of the calculation are reported by the following +window:
+
+
+

+


+

+[Table Of Contents] + diff --git a/Legacy/Help/QFogManual/data/refs.html b/Legacy/Help/QFogManual/data/refs.html new file mode 100644 index 0000000..3451b3e --- /dev/null +++ b/Legacy/Help/QFogManual/data/refs.html @@ -0,0 +1,36 @@ + + + References + + + +

+ References +

+

+

    +
  1. + [Pea88] Judea Pearl, Probabilistic Reasoning in + Intelligent Systems: Networks of Plausible Inference  (Morgan Kaufmann, + Palo Alto, 1988). A text book dedicated almost exclusively to the subject + of classical Bayesian nets, written by one of the fathers of the field. +
  2. + [Kor91] Ari Kornfeld, "Causal Diagrams: Clarifying + Uncertainty", AI Expert  , Nov. 1991, pp. 42-49. A simple, + fun-to-read magazine article about classical Bayesian nets. +
  3. + Kevin + Murphy's list of computer programs that handle classical Bayesian + networks. We recommend that you download a demo of one of these programs + (for example, Ergo, Netica, Hugin), and play with it. +
  4. + [Tuc95] Robert R. Tucci, "Quantum Bayesian Nets", Int. + Jour. Of Mod. Phys.  B9, 295-337 (1995). US Patent 5787236. + This paper is available electronically + at quant-ph/9706039 +
+

+


+

+[Table Of Contents] + diff --git a/Legacy/Help/QFogManual/data/reorder_icon.gif b/Legacy/Help/QFogManual/data/reorder_icon.gif new file mode 100644 index 0000000000000000000000000000000000000000..2a2ec35cd859d5a2b06adafb862e78087d604918 GIT binary patch literal 918 zcmb`G(QDIi5XZmCw3Ru^n2noQC50i=HIi*eR|M@0SPLD_Z88;PWNB=w z3S&dWfhZ2NPx_!JJ~$A;2Ok9SX;{SnK(J4ObWDl&OBn6L&=(JWxz8Q)SYhN7Vh5R+RD7iPV5RFbK3oRLh#QA{}JbCU6l&y$R=IF>^(dB$2^ z%@W@rj@gsr3h@)-P|oL7#xp*DU_7to*xfJ0vgu|ECbeM)8N*q+xRuxDrQS*A5zKd(XOUm8-y6Njv0U-{oo@x4i6uf3} z`Ecpd5DkEY+cOR9+~>OAsBUNh_`Tb88^>LDqYea?f#tYXw&%TAisn86|FZo@``Ll7 z^iC2QlG|#uvgtL(3zLEBJ79uNDhb@L00*XkuD!r1;!F~J$JX;V8K69;Aah)8YO=^xoZ}wxvVuIQj=WgrL6w literal 0 HcmV?d00001 diff --git a/Legacy/Help/QFogManual/data/reorder_nds.gif b/Legacy/Help/QFogManual/data/reorder_nds.gif new file mode 100644 index 0000000000000000000000000000000000000000..7c131edc8f66f5a7cf35047f800a6f87dd857732 GIT binary patch literal 6448 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 Czh2A$ literal 0 HcmV?d00001 diff --git a/Legacy/Help/QFogManual/data/reordering.html b/Legacy/Help/QFogManual/data/reordering.html new file mode 100644 index 0000000..b98e07b --- /dev/null +++ b/Legacy/Help/QFogManual/data/reordering.html @@ -0,0 +1,56 @@ + + + + Reordering Items In A List + + +

+ Reordering Items In A List +

+

+The Reorder Icon appears +at 3 different places within the Node Prior-Info. window. +

    +
  1. + Adjacent to the name of the focus node. Clicking here permits you to change + the order in which nodes are listed in the popup menu directly above the + Reorder Icon. +
  2. + On the top-right corner of the table inside the Parent Nodes box. Clicking + here permits you to reorder the rows of this table. +
  3. + On the top-right corner of the table inside the Amplitudes box. Clicking + here permits you to reorder the rows of this table. +
+

+In all 3 cases, clicking on the Reorder Icon opens a similar dialog window. +Thus, we will only discuss the dialog for case 1: +

+ +

+This dialog lists the nodes of the Kindergarten Net considered in Part II +of this manual. +

+You can select an item of the list and then drag it to a new position. +

+If you press the (a,b,c) button, the list is ordered alphabetically. +

+When you dismiss the above window by pressing OK, the order of items +in the node popup becomes the same as that exhibited by the above window. +

+When you dismiss the above window by pressing Cancel, the order of +items in the node popup remains the same as it was immediately before you +summoned the above window. +

+Tip: Suppose you have a long list of numbers that you wish to order +numerically. Take the numbers 12, 7 and 1, for example. Not a long list, +but this is only for illustration purposes. The (a,b,c) button will +order this list thus 1, 12, 7 (alphabetically) instead of thus 1, 7, 12 +(numerically). Note, however, that if you write your numbers with zero +placeholders: 01, 07, 12, then the (a,b,c) button can accomplish the +task of ordering the numbers numerically. Indeed, with zero placeholders, +the numeric and alphabetic orders are the same: 01, 07, 12. +


+

+[Table Of Contents] + diff --git a/Legacy/Help/QFogManual/data/run_def.html b/Legacy/Help/QFogManual/data/run_def.html new file mode 100644 index 0000000..ec8b81d --- /dev/null +++ b/Legacy/Help/QFogManual/data/run_def.html @@ -0,0 +1,89 @@ + + + Quantum Fog "Run" + + + +

+ Quantum Fog "Run" +

+

+
+A Quantum Fog Run is a session of Quantum Fog during which one or more e-cases +are analyzed sequentially. +

+In a single-e-case run, you specify the single e-case via the Node +Prior-Info. window. +

+In a many-e-cases run, you specify several e-cases via an e-cases file. The +name of the e-cases file is entered into Quantum Fog via the window that +opens when one chooses the item: TEXT Files Used During Run... in +the Prepare menu. +

+When Quantum Fog is at the beginning of a run, before having analyzed any +e-cases, we say that Quantum Fog is in its initial run-state. Likewise, +after finishing with one e-case of an e-cases file, but before beginning +a new one, we say that Quantum Fog is in an intermediate run-sate. +Immediately after finishing the last e-case, we say that Quantum Fog is in +its final run-state. +

+Note how the last three menus of Quantum Fog depend on the current run-state: +

+


+

Prepare Menu

+

+All of the items in this menu are disabled (dimmed) if the program is not +in the initial run-state. That's because these menu items deal with choices +that you must make at the beginning of a run. +

+


+
+ +

+Pressing Go Back To Initial State transfers the program from an +intermediate or the final run-state to the initial one. +

+Pressing Go Forward advances the program to the next run-state—either +an intermediate or the final one. +


+

Go Menu

Windows Menu

+ +

+The windows in this menu are grouped according to when they can be opened: +

+Can be opened at any time: +

    +
  • + Main Window +
  • + Palette +
+

+Can be opened only in the initial run-state: +

    +
  • + Node Prior-Info. +
  • + Bi-nodes Of Interest +
+

+Can be opened only in intermediate or final run-states: +

    +
  • + Node Probs. +
  • + Bi-node Probs. +
  • + Stories +
+

+All Palette items are enabled in the initial run-state. But some +Palette items are disabled in the intermediate and final states. In +those run-states, Quantum Fog disables those Palette items that would +allow you to add new nodes, or to tamper with the transition amplitudes of +already existing nodes. +

+


+

+[Table Of Contents] + diff --git a/Legacy/Help/QFogManual/data/stories.html b/Legacy/Help/QFogManual/data/stories.html new file mode 100644 index 0000000..af4bf97 --- /dev/null +++ b/Legacy/Help/QFogManual/data/stories.html @@ -0,0 +1,29 @@ + + + Stories + + + +

+ Stories +

+

+ +

+This window allows you to study the set all possible stories for the latest +e-case analyzed by the computer. +

+The stories of this set are listed in the popup of the window. For each story, +the popup gives the complex amplitude (either in rectangular or polar +coordinates) and the story queue number. In the above example, the popup +face shows story number 2, with complex amplitude 0.218508 + 0 i. +

+When this window is open and a particular story appears on the face of its +popup, the computer draws a state name beneath each node name in the Main +Window. The state names drawn are those specified by the story whose +name appears on the face of the popup. +

+


+

+[Table Of Contents] + diff --git a/Legacy/Help/QFogManual/data/support.html b/Legacy/Help/QFogManual/data/support.html new file mode 100644 index 0000000..10c0d2a --- /dev/null +++ b/Legacy/Help/QFogManual/data/support.html @@ -0,0 +1,33 @@ + + + Support + + + +

+

+ Support +

+

+

+The Artiste company welcomes your +

+Bug Reports / Questions / Comments / Suggestions  +

+about Quantum Fog and its documentation. +

+Please send them to: +

+rrtucci@ar-tiste.com +

+For the latest news about Quantum Fog +

+visit our Web site: +

+www.ar-tiste.com +

+

+


+

+[Table Of Contents] + diff --git a/Legacy/Help/QFogManual/data/table_of_contents.html b/Legacy/Help/QFogManual/data/table_of_contents.html new file mode 100644 index 0000000..41070dc --- /dev/null +++ b/Legacy/Help/QFogManual/data/table_of_contents.html @@ -0,0 +1,226 @@ + + + QFog Manual- Table of Contents + + + +

+ Table of Contents +

+

+Cover Page +

+Support +

+Introduction +

+


+

+Part I: Our Linguistic Idiosyncrasies +

+Terminology-Crescendo +

+Terminology-Alphabetic +

+


+

+Part II: Quick Tour +

+

    +
  1. + Drawing The Net +
  2. + Specifying State Names +
  3. + Specifying Node Matrices +
  4. + Specifying Active States +
  5. + Specifying Bi-nodes Of + Interest +
  6. + Running Without An E-cases + File +
  7. + Running With An E-cases File +
+

+


+

+Part III: In-Depth Look +

+Quantum Fog Run +

+Menus +

+

+Windows Opened From Windows Menu +

+

+Dialog Windows Opened From Node Prior-Info. Window +

+

+TEXT files +

+

+


+

+References +

+

+

+ diff --git a/Legacy/Help/QFogManual/data/text_files_used.gif b/Legacy/Help/QFogManual/data/text_files_used.gif new file mode 100644 index 0000000000000000000000000000000000000000..78a8b2c11150617e6f5fbf8edb8e4876f5d64e08 GIT binary patch literal 10729 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 Fe*i+B8btsA literal 0 HcmV?d00001 diff --git a/Legacy/Help/QFogManual/data/text_files_used.html b/Legacy/Help/QFogManual/data/text_files_used.html new file mode 100644 index 0000000..7efe261 --- /dev/null +++ b/Legacy/Help/QFogManual/data/text_files_used.html @@ -0,0 +1,87 @@ + + + TEXT Files Used During Run... + + + +

+ TEXT Files Used During Run... +

+

+
+This command opens the following window:
+
+
+
+Pressing the Choose Folder button opens a Mac "folder-chooser" window—a +window that allows you to choose an already existing folder. Let's call +the folder that you choose the designated folder. Your designated +folder will store TEXT files used by Quantum Fog. Once the folder-chooser +window is dismissed with an OK, the path to the designated folder will appear +to the right of the Choose Folder button. +

+To the right of the word Prefix, is a text box. You should enter into +it a string. This string will be used as a prefix to the name of all TEXT +files requested in the bottom part of the Text Files Used During Run +window. +

+The bottom part of the Text Files Used During Run window allows you +request files you want Quantum Fog to read or write. You request a file +by putting a check mark (by clicking the box) in front of the file's +name. +

+If you press the OK button of the Text Files Used During Run +window, then, when you press Go Forward, the computer will +

    +
  • + READ information from <prefix>Ecases.txt, if that file + was requested, and if Quantum Fog finds a file with that name in the designated + folder, +
  • + create a file named <prefix>NodeProbs.txt (ditto, + <prefix>BinodeProbs.txt, + <prefix>Stories.txt) located in the designated folder, + and then WRITE information in the file, if that file was requested. +
+

+Pressing Go Forward, with the + <prefix>NodeProbs.txt option on, will OVERWRITE +any files named <prefix>NodeProbs.txt that are stored +in the designated folder. If you do not wish this to happen, before you press +Go Forward, move such a file to another folder. The same warning about +over-writing applies for the + <prefix>BinodeProbs.txt and +<prefix>Stories.txt options. +

+As its name implies, the <prefix>Ecases.txt file should +contain a list of e-cases. See the section entitled "How To Write An E-Cases +File". +

+The computer will write into the +<prefix>NodeProbs.txt file the probability distribution +for every node of the graph. (Actually, if no nodes are selected, it will +write the probability distribution for every node of the graph. However, +if some nodes are selected, then it will write the probability distribution +only for those nodes that are selected. This feature is convenient when you +want the file to show information for just a few, not all, of the nodes.) +

+The computer will write into the <prefix>BinodeProb.txt file +the probability distribution of those bi-nodes which you specified earlier +in the Bi-nodes Of Interest window. +

+The computer will write into the <prefix>Stories.txt file +a list of all the possible stories. The stories are listed in groups such +that all members of a group have that same ending. The file gives for each +story: +

    +
  • + its complex amplitude +
  • + the state assigned by the story to each node of the graph. +
+

+


+

+[Table Of Contents] + diff --git a/Legacy/Help/QFogManual/data/tour_draw.html b/Legacy/Help/QFogManual/data/tour_draw.html new file mode 100644 index 0000000..f7372a9 --- /dev/null +++ b/Legacy/Help/QFogManual/data/tour_draw.html @@ -0,0 +1,65 @@ + + + Drawing The Net + + + +

+  Drawing The Net +

+

+

    +
  • + Double click on the Quantum Fog application icon. +
  • + Select the Custom Node icon in the Palette. Click once anywhere + on the Main Window. +
  • + Change the name of this new node to whatever you want. +
  • + Color the node as follows. In the Palette, and double-click the rectangle + (we'll call it a "color swatch") next to the paint brush icon. Choose a color + from the ensuing dialog. The color that you choose will appear in the swatch + of the Palette window. If now you select the Paint icon in + the Palette and then touch a Custom or Deterministic Node, the node + will take on the same color as that of the palette's swatch. +
  • + Create a second Custom Node on the Main Window. Select the Draw + Arrow icon in the Palette. Draw an arrow by dragging the bow and + arrow cursor from the first to the second node. +
  • + Select the Select icon in the Palette. Click on a node. It's + now selected. Click on it again. It's now unselected. Click on an arrow. + Click on it again. +
  • + Select a node. Select the Drag icon in the Palette. Place the + cursor over the selected node. Press the mouse button down, and, while holding + the button down, move the cursor. +
  • + Select a node. Press the DELETE key. +
  • + Create other nodes of types:  Beam-Splitter, Deterministic Node, + Polarization Rotator, Polarizer, Qbit Rotator, Stern-Gerlach (S.G.) Magnet. + Draw more arrows. Continue to experiment with the Select and + Drag tools and with the DELETE key. +
  • + Choose Select All from the Edit menu. Press the DELETE key. +
  • + Copy the following diagram. Use the same node labels and node + types. +
  • + Use the Save As... item of the File menu to save your copy + of the above diagram. Call the new document MyKindergartenNet. +
  • + Close the Palette. The cursor is now a "pointer"—a boldface arrow + pointing towards the top-left corner of the screen. Click on a node, and, + while holding the button down, move the cursor. Click somewhere on the Main + Window away from the nodes or arrows. You will find that this cursor + performs the 3 functions of select, drag and open that you have come to associate + with such a cursor, in drawing applications like MacDraw. +
+

+


+

+[Table Of Contents] + diff --git a/Legacy/Help/QFogManual/data/tour_ecases.gif b/Legacy/Help/QFogManual/data/tour_ecases.gif new file mode 100644 index 0000000000000000000000000000000000000000..c0af06f2d922130eb9fe5f6e68a64bed552b7b9d GIT binary patch literal 5729 zcmb`Ic~leG(!e_qNLZAxNf5+<3qe%EB7{Zl07~$QW?X}VW01wj+AKnYh)u#0kR>2u zK-3`45D_%U7Ev)QLO{?cBSvKWg3Ay=ov1SsaLEhfdFQ=9-gmx#zB=8xzgxF%Roz>a z(*c2-$)2GPfgWH6m=_fSOH_zbsZ?o1D3GW)90{mWaa1a@B2+*^1ydk__kI$2Ec>*4f%SE_Ss!VfC4gy0ElgX5-I5Zxfiy$-_jiVV5gu~%L5G0_J z<#L2XB5@H|%Ajjh92izAU>ZVzVVEnSDdiBEMB<1+rT~vX2Ty~DN+GBekd#8r5y)~eO(vqr zghItBa~_o_rBNj`st=0f{Ii5~v_Zg@_)_k?15hE|Wx~)08k15l|5kD2JGMH(bUIXHCsuvKxm)mLYfs z0?H&3CBz&&W~YE5F^@+xGvgBpJR*TlAn;%Umq~;O%Qek!JBvmEfEut>e+l&S+Y#U! z;7oFM0RV05PzZ|A(pbdCB`0e11bXm30%jDz09pVJzyoVS!;&Bhjkb0EFZAE#(PyjIZ z007Ys|JHpx{P$&{m}W_lu9^a91Z8;u01TF>)vq;i7Zw1(*F|czYNJ~H`7HqGmIFY! zN7#|Xl)r5?)~I0s_`l}g5B=Rc0E}tQsgb`M;6En+xe)jF#r$nX0)Pu*0NAN{13&<% zL;zsrUH~w$0syLpw}OC{wZp&O@0SS7i%vvP==VT>Pyc^@Vq=c{%jbNL8AinI-l-Yq z3up~Q06{<~5ca)b^YL_X0B{yFPc=78k@@jIB{>3Kqp2nU_{BqMiH8p{lL-_}!$uJN z;$xvB$q|XG34w88YgZFoNThXtZ=7#RVEzjNVAX&g)|v<*U2LrBst}2=rY8@#Y)dt@ z>B5~8SiLA~6|TC!gy2_T9eC~Hz)9lH`jCNZKi@4g^02!|^35JTLr$6+A84+-e;#D( zFWJ%}cu-3Yph>8VU$8&hcx*YlrM3RiWqNbeZ-cFu_cq!bE}+-bx@Byqk^232+Zvy? z6ODG@Y;7mTe}+Cz{dTwg>KH0@LHfn%c4dE^hy4&w$r4WVbAPD%N*#H5f|UHHqQ><1 zO@nvu|8y&Tbk;R;xO)AW7D`QPc9m=27~c4LTP&B>Rm7#47+UV4E9G6R0z=+OhU71= zWnZ>BCH4o+tz5Jj#vkkp+Qu9{)_cMdO&n75kKOq4;xXHSi)JqvF-x$y6V#QxW{yf4 z9{=skWWuxcslzgR6MRp#=^g9@Q%*6$INRzHjQ;~n)Vw=VZb~=nRea=}`+LgByx<@;M4leVb z42*1DsTCM4*EU-7xX?~Pd@R-4?wU|&7T|iY!LD#MchGKV)j`!s0W}(CpCDcd|Ioj* zQe>yU_8Hf+Y=I5s&eIT68G@;|d#|QMV$*zB`e|fj2N}l|F6TX#Exyt#DVsNDndb%_xz(hsTwv3uu{1CfeQA#44 zBu}ty_6sn@m3Q74@98l*{n~E;H-$osGLaYkHdBGfEA-l)7?b^J+a&v!j8vBmyI03t z)3bkSm^kQmL^WQuaZ8C3yhR%%-D0xBH_P%!Pmrl?W$jIiKE$zkb_0UQF zbw~RP6U4b2n=W^@0K$qkbv-XC`Ke>%fTGDNC_S6fWs^yK*MW|ko~?Sl?ZqZ;oA7= z7frbf&ILl(?`KF+;xBbGLAt|rk6q?o!Nkqc&;DdtNGb8l0I{K{2eUM}#vqt4HURh@ zS07BEY7MmC>Eg-SQ$c7z%72``&ejT$qc+G0dP#M4_ut<;^ap9vaw5ejFl0i%48*J; zgcd}>3-ta1{q@yeLX;tcp}mBPvYX06Url&n@>amYrQo#j3J|-S*}tMQYXgM$4~LB{ zzv1z@Bs2E9M(3T;5*$UJ3+Y~r4g!9x#VqAc6dP}qr|5Dh@5Biu<6TexXAaNWmt9<( z(i;}7pGH03$o1|OElstl^zJ3!i)KpmEH@Y(6EY?TlU)cfoGA?wY#zvj}-0h zEQ(RB-wSI8aUM4an~nVXD0?NnYZSND!Qy2xx*OLYmmYgIp<24m-rv!SOUaRi*Pvrv z)F?gG$MfGZy1c6i`76EdI=n7fpEf8zv>SZ`Ho+FGEc7D3`hmLNO12t)G@ls_ddP8gQB33=-xLQ{k5l!sd z*bD%}KH}AY$Z;DA3<0EFtHS}%If_!ZZ+YQa27mXOs2a-g52NiLMtYJjf6kFlwcu~x z;%^MX=Kk?5}#`Q7nEFI;D3RW796O zF)K+~hAyE+;P}ihwK`krx`divFU)i+{<;@(pdb_(>+K0DQUrNgKQ!2=(__Ec>C3(& zp%4c#IIGZh+R~*n#*p3FCCn|RP;{)?>FA$?eNLI73!GH+mfg&AF5U#_4FXr44iJh88KKmJ7`PjNq#)^J1g*=dI&0RuAbaF>GgE> z-uc>V2Y)w|de1z$cf7Bej|o!vT6IWIJo#8-F|63^J@4>rhBbdQirF1+8!}# z|IaF8?$2o<85+lSxAT^@VVJ<4gxzg23P zkp*NRZS9YT-=!F!$EVgxTGnah4n4Yx4~E)1XNF^7Bdf;`bn}eF6Dz_#ewJfPT5sQ3 zA73<73}oUd-S*qw$G7K>s(*1u`74q2W-e$`fk+Y%cPb~~#)P)I5;5vl0xrapFG(e{ zH=JzVz#clUwBMsp*~>njJ30Q+y6bww42Z0!iYKXcWa+D*cNe|CPP!dW={vveNU77; z--E7pjLshWD?vMBnvt6NILGGGwfLiNf<11Gomui1bl&If(5L5Pmy17L?LXTN^SmET zUrC5C4O?((dh0EbrBsD>7~!#9f~Zq#U+z~1+TYw9NxO{lDF+S^ zv}0Ac#Es!u-9`OvRVzss>ghHgE8}kr-+DG9*>s~ptIGt{0fn&4{Ls1+?6ylE(q*4R zKB7@bFXjX5prQYai#Fg~ycPwFzc21NzvX?AQ_@SLY@^c_618EJEe&b*Fc4iDSXB(WmxGr(^WTGuC zFZvMMt3N4Im6ysvXhf9%p=36d^OGv~gqoQFsyHb!&URU989B8S&JR7EUnM$HEz3{d z%h{TjI~cj^5~kqRr~Ib2jc`(|KoVV#jh5&x1VGePQM4Bm=G4L7n{O1%_IskwZ)lx z-vd9&O7v$+TH1~OJak;o->S0txX#3JfEe9IG;LLIzftpHqPc;}SsuE%705E-WH}zn z+JIy|CF9I!A-xg#gaLCh-FpEa+I*rSA-}NL;E?lxb?bLL|Zeok>)`3&MMP`~{e4U?^e84OW$B`EL0a0nkF4(8- z5=6Jy;d&ttYGp-V#LiX|o5n2Px0BjQmC;B5V2jK0)hkO+OH1Y+bC)0Y^x!r1C29pg zz1-7VDpOj>xL(q}WehHw7N1Nr%pKw0)YWY{nQA1};RTo13KGs7J}pNrY^B-0n(=H^ znt2UGH}qq)62Qj8xtlK;H_aZGCs20S@`e_9eG;8ncjH`qH`2me4`!N}Y~4cNG*Z;!mdWAz8xGfIQsTxhs0yG*RN3nM8~9 z6qBkXZx3W?N6d#j&ZfP^D++45XR90skJ!##c++;yWiZNZU+tpPHOBe1u8V7Z^e=dI zly|xVcKlQ8(rfn_m+z+;E}yHR4w_5giyNYNc>$Pwi>h0y6J6v&*&c&wy7^^?pDFsO z!-}*3OpzQ+$9WW8N?j71R%As%S^8nhX3sy9l;{{2zmOgM9h;#|$k^!&m?D_pmjAM* zzQ*c(@z7+(b+t!HCgIqxsU@;Q<}J*cZBw;cmN_pcEBLP~u$Q>|CbZ#w7u?CE?fJ(o z0)a1erRI{-9VomO%J*JcjTgOa0jF$LAYdvhi%ZM0B$~ShZ(KmE^$cdMe{xdt>Es%j z+4djmQoMfNIG7T)>fD2==;UWL8-sKC2`waW2Ki^8~)k~ergW+?dBi@_qP!x^*^s0!8Yu*Xp@$2_h)>v7}k zvV3!UN!+uv)`Ck{o=rtP9&5eb*UGpNb-=sLlh_tHZ60wq`nmo&qGQrzRP#>9Bjc7y zZ=x#30^4_=V7(u!h)+AV7_WP8Drz?UwC&yEuX9&315t=&Q|BHbr?Pz$NARdmc>6Vv z`?`hwG|Du(vg~tC)%E5+2i*DmOq(C82HdZ$_+tlgNVP#{m}4j7AD#Q7JD(MFKCSPR4R$`7>U>bY-83<}w*HoIPm2}B$(?rl z({z;Tvhm#A+h6ZSssF)3`G}kLi0i_5f7yw#U(D4yrI>3lAXt@1{WjEdV^75GO6 + + Quick Tour + + + +

+ Quick Tour +

+

+
+Welcome to the Quick Tour section. It guides you step by step in the building +and running of a quantum net called MyKindergartenNet. In the +process of doing this, you will learn how to use the most important features +of Quantum Fog. Once you are finished building your Kindergarten Net, you +may want to compare it with ours. We've placed ours in the folder labeled +KindergartenExample. +


+

+[Table Of Contents] + diff --git a/Legacy/Help/QFogManual/data/tour_net.gif b/Legacy/Help/QFogManual/data/tour_net.gif new file mode 100644 index 0000000000000000000000000000000000000000..8a65e1837cf569a799cb9f5c9b3557faf7f7a259 GIT binary patch literal 3175 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 literal 0 HcmV?d00001 diff --git a/Legacy/Help/QFogManual/data/tour_run_with.html b/Legacy/Help/QFogManual/data/tour_run_with.html new file mode 100644 index 0000000..cb461e1 --- /dev/null +++ b/Legacy/Help/QFogManual/data/tour_run_with.html @@ -0,0 +1,100 @@ + + + Running With An E-cases File + + + +

+ Running With An E-cases File +

+

+

    +
  • + Open a new folder on the desktop. Call it MyQFogWork. +
  • + Use TextWrangler to create a new TEXT file entitled + KinderEcases.txt that reads as follows: +

    + +

    + Store the file KinderEcases.txt inside the folder + MyQFogWork. The meaning of this file is that we want to run + 3 different e-cases called "case_1", "case_2", and "case_3". +

      +
    • + For case_1, all node states will be active. +
    • + For case_2, all states of all nodes except node nz+  will be + active. Only state 0 of node nz+  will be active. +
    • + For case_3, all states of all nodes except nodes nu+  and + nz+  will be active. Only state 0 of node nu+  will + be active. Only state 0 of node nz+  will be active. +
    +
  • + Now go back to Quantum Fog. Choose Go Back To Initial State in the + Go menu. +
  • + Choose TEXT Files Used During Run... in the Prepare menu. +
  • + Click on the Choose Folder button. A "folder-chooser" window will + open. Use this window to choose the folder MyQFogWork. +
  • + Type "Kinder" in the blank box after the word "Prefix". +
  • + Put a check mark in the box entitled + <prefix>Ecases.txt. +
  • + Put a check mark in the box entitled + <prefix>NodeProbs.txt +
  • + Put a check mark in the box entitled + <prefix>BinodeProbs.txt +
  • + Put a check mark in the box entitled + <prefix>Stories.txt +
  • + Press the OK button of the window entitled "TEXT Files Used During + Run..." +
  • + If a check mark does not already appear in front of the Illustrate + Stories (ditto, Do One E-Case At A Time) item in the + Prepare menu, choose that item. +
  • + In the Main Window, make sure that all nodes are unselected. +
  • + Repeat the following actions 3 times, once for each of the 3 e-cases in the + KinderEcases.txt file: +
      +
    • + Choose Go Forward in the Go menu. +
    • + Open the Node Prob. window and explore its contents. +
    • + Open the Bi-node Prob. window and explore its contents. +
    • + Open the Stories window and explore its contents. +
    +
  • + Choose Go Back To Initial State in the Go menu. +
  • + Look inside the folder MyQFogWork. Open the TEXT files entitled: + KinderNodeProbs.txt, KinderBinodeProbs.txt, and + KinderStories.txt. +
+

+


+

+

What Next...

+

+The Quantum Fog Distribution contains a folder entitled +QFogLibOfNets (contains many examples of quantum nets) and a +pdf file entitled QFogLibOfEssays.pdf (contains an essay explaining +each net found in the QFogLibOfNets folder). At this point, +you might want to look at the examples, and consult this manual whenever +you have any questions about Quantum Fog. Or you might want to finish the +manual now, and look at the examples later. +


+

+[Table Of Contents] + diff --git a/Legacy/Help/QFogManual/data/tour_run_without.html b/Legacy/Help/QFogManual/data/tour_run_without.html new file mode 100644 index 0000000..0807054 --- /dev/null +++ b/Legacy/Help/QFogManual/data/tour_run_without.html @@ -0,0 +1,60 @@ + + + Running Without An E-cases file + + + +

+ Running Without An E-cases File +

+

+

    +
  • + Choose Preview in the Prepare menu. This will open a window + that will report the total probability of all stories. You will get a number + that is very close to 1, provided that so far you've followed properly the + instructions of this quick tour. If you do not get 1, the most likely explanation + is that you entered the node matrices incorrectly. You'll have to go back + and fix things. Press OK to dismiss the Preview window. +
  • + Choose Illustrate Stories in the Prepare menu. +
  • + Choose Go Forward in the Go menu. +
  • + Choose Open Node Probs. in the Windows menu. This opens a window + that shows the probability distribution of each node of the net. These + probabilities are calculated by Quantum Fog using your inputs into the Node + Prior-Info. window. +
  • + Choose Open Bi-node Probs. in the Windows menu. This opens + a window that shows the joint probability distribution of each bi-node that + you listed in the Bi-nodes Of Interest window. +
  • + Choose Open Stories in the Windows menu. This opens a window + that contains a First and Next button. Click successively on + the Next button. All possible stories will be portrayed in the Main + Window. +
  • + Choose Go Back To Initial State in the Go menu. +
  • + Open the Node Prior-Info. window and make nz+  its focus + node. Click the star of state 1 so as to make this state inactive. Now only + state 0 of nz+  is active. Close the Node Prior-Info. + window. +
  • + Choose Go Forward in the Go menu. +
  • + Open the Node Probs. window. How does it differ from the Node + Probs. window that was obtained on the first run? +
  • + Open the Bi-node Probs. window. How does it differ from the Bi-node + Probs. window that was obtained on the first run? +
  • + Open the Stories window. How does it differ from the Stories + window that was obtained on the first run? +
+

+


+

+[Table Of Contents] + diff --git a/Legacy/Help/QFogManual/data/tour_spec_act_sts.html b/Legacy/Help/QFogManual/data/tour_spec_act_sts.html new file mode 100644 index 0000000..293faa2 --- /dev/null +++ b/Legacy/Help/QFogManual/data/tour_spec_act_sts.html @@ -0,0 +1,20 @@ + + + + Specifying Active States + + +

+ Specifying Active States +

+

+In the Node Prior-Info. window, select any node as the focus node. +Click on a star (*) in the first column of the table inside the Amplitudes box. The +star disappears. Click again at the same spot. The star reappears. Click +on the *None button. Click on the *All button. A state whose +name is marked by a star is said to be active. For now, make all node states +active (their default value). +


+

+[Table Of Contents] + diff --git a/Legacy/Help/QFogManual/data/tour_spec_bi_nds.html b/Legacy/Help/QFogManual/data/tour_spec_bi_nds.html new file mode 100644 index 0000000..7ff3b36 --- /dev/null +++ b/Legacy/Help/QFogManual/data/tour_spec_bi_nds.html @@ -0,0 +1,36 @@ + + + + Specifying Bi-nodes Of Interest + + +

+ Specifying Bi-nodes Of Interest +

+

+

    +
  • + Choose Open Bi-nodes Of Interest in the Windows menu. The + Bi-nodes Of Interest window will appear. +
  • + Click on the box to the left of the words "Enable bi-node selector". +
  • + Move the cursor to the Main Window, and click on node nu-  . + Now click on node nu+  . A line with the symbol nu-\nu+  will + appear in the list of the Bi-nodes Of Interest window. Select the + line nu-\nu+  and press the DELETE key. Click again on nodes + nu-  and nu+  so as to get the nu-\nu+  +  bi-node back on the list. +
  • + Click on the nodes nz-  and 1mag  so as to get the + bi-node nz-\1mag  listed. +
  • + You should list in the Bi-nodes Of Interest window only those bi-nodes + out of all possible ones for which you want Quantum Fog to calculate a joint + probability distribution. +
+

+


+

+[Table Of Contents] + diff --git a/Legacy/Help/QFogManual/data/tour_spec_nd_mat.html b/Legacy/Help/QFogManual/data/tour_spec_nd_mat.html new file mode 100644 index 0000000..fb25c6e --- /dev/null +++ b/Legacy/Help/QFogManual/data/tour_spec_nd_mat.html @@ -0,0 +1,151 @@ + + + Specifying Node Matrices + + + +

+ Specifying Node Matrices +

+

+

    +
  • + In the Node Prior-Info. window, make root  the focus node. + Note that since root  has no incoming arrows, its list of parent + nodes is empty. In the Amplitudes box: +
      +
    • + In the row of state (0,1), insert 0.5 for the Real Part and 0.5 for the Imaginary + Part. +
    • + In the row of state (1,0), insert 0.707107 (i.e. 1/sqrt(2)) for the Real + Part. +
    • + All other entries of the Real and Imaginary Part columns should remain at + their default values of zero. +
    +
  • + Make nz+  the focus node. +
      +
    • + For 1mag  = (0,0) in the Parent Nodes box, make the following + changes in the Amplitudes box. In the row of state 0, set the Real Part to + 1. +

      + Explanation of last action: We are using the notation (n-, n+) to represent + a state of 1mag , where n- is the number of spin - particles and n+ + is the number of spin + particles. Node nz+  has 2 states, 0 + and 1, where the numbers 0 and 1 tell how many particles of spin + go through + node nz+  . By setting to 1 the amplitude of nz+  + =0 when 1mag  = (0,0), what we are saying is that with unit + amplitude, when 1mag  =(0,0), zero particles of spin + traverse + node nz+  . +

    • + For 1mag  = (1,0) in the Parent Nodes box, make the following + changes in the Amplitudes box. In the row of state 0, set the Real Part to + 1. +
    • + For 1mag  = (0,1) in the Parent Nodes box, make the following + changes in the Amplitudes box. In the row of state 1, set the Real Part to + 1. +
    +
  • + Make nu+  the focus node. +
      +
    • + For 2mag  = (0,0) in the Parent Nodes box, make the following + changes in the Amplitudes box. In the row of state 0, set the Real Part to + 1. +
    • + For 2mag  =(1,0) in the Parent Nodes box, make the following + changes in the Amplitudes box. In the row of state 0, set the Real Part to + 1. +
    • + For 2mag  =(0,1) in the Parent Nodes box, make the following + changes in the Amplitudes box. In the row of state 1, set the Real Part to + 1. +
    +
  • + Make nz-  the focus node. +
      +
    • + For 1mag  = (0,0) in the Parent Nodes box, make the following + changes in the Amplitudes box. In the row of state 0, set the Real Part to + 1. +
    • + For 1mag  = (1,0) in the Parent Nodes box, make the following + changes in the Amplitudes box. In the row of state 1, set the Real Part to + 1. +
    • + For 1mag  = (0,1) in the Parent Nodes box, make the following + changes in the Amplitudes box. In the row of state 0, set the Real Part to + 1. +
    +
  • + Make nu-  the focus node. +
      +
    • + For 2mag  =(0,0) in the Parent Nodes box, make the following + changes in the Amplitudes box. In the row of state 0, set the Real Part to + 1. +
    • + For 2mag  =(1,0) in the Parent Nodes box, make the following + changes in the Amplitudes box. In the row of state 1, set the Real Part to + 1. +
    • + For 2mag  =(0,1) in the Parent Nodes box, make the following + changes in the Amplitudes box. In the row of state 0, set the Real Part to + 1. +
    +
  • + Make 1mag  the focus node. Press the Generate Amplitudes... + button at the bottom-right corner of the Node Prior-Info. window. + A window entitled "Parameters Of Stern-Gerlach Magnet" will open. +
      +
    • + The Theta and Phi boxes at the top allow you to specify the polar coordinates + of the magnetic field of the Stern-Gerlach Magnet. Set Theta and Phi to zero + (their default value), indicating that the magnetic field points in the + + Z direction. +
    • + The Theta and Phi entries of the table allow you to specify the direction + of the spin axis for the particles coming from root  . Set both + of these angles to zero (their default value), indicating that the particles + emanating from root  are polarized along the Z direction. +

      + Press the OK button. Now scan over the 3 possible input states of + 1mag  by pressing successively the Next button of the + Parent Nodes box. You'll see that the Amplitudes box contains new amplitudes + for each of the input states. +

    +
  • + Make 2mag  the focus node. Press the Generate Amplitudes... + button at the bottom-right corner of the Node Prior-Info. window. + A window entitled "Parameters Of Stern-Gerlach Magnet" will open. +
      +
    • + The Theta and Phi boxes at the top allow you to specify the polar coordinates + of the magnetic field of the Stern-Gerlach Magnet. Set Theta to 36 degrees + and Phi to zero degrees. +
    • + The first row of the bottom table shows that nz+  is a Parent + Node. Click on the Spin entry of this row until it reads +. Set both Theta + and Phi of this row to zero degrees. +
    • + The second row of the bottom table shows that nz-  is a Parent + Node. Click on the Spin entry of this row until it reads -. Set both Theta + and Phi of this row to zero degrees. +
    +

    + Press the OK button. Now scan over the 4 possible input states of + 2mag  by pressing successively the Next button of the + Parent Nodes box. You'll see that the Amplitudes box contains new amplitudes + for each of the input states. +

  • + Save your work by selecting the Save item of the File menu. +
+

+


+

+[Table Of Contents] + diff --git a/Legacy/Help/QFogManual/data/tour_spec_st_names.html b/Legacy/Help/QFogManual/data/tour_spec_st_names.html new file mode 100644 index 0000000..94ab100 --- /dev/null +++ b/Legacy/Help/QFogManual/data/tour_spec_st_names.html @@ -0,0 +1,59 @@ + + + Specifying State Names + + + +

+ Specifying State Names +

+

+

    +
  • + Select the Open icon of the Palette. Double click on the node + called "2mag". The Node Prior-Info. window opens, showing information + about node 2mag  . The node whose name appears in red is called + the focus node  of the Node Prior-Info. window. You may + change the focus node by either of 3 methods: +
      +
    • + Clicking on the First and Next buttons located to the right + of the red name. +
    • + Selecting a different node from the popup menu that is located to the right + of the red name. +
    • + Double clicking on the node's icon in the Main Window. (When the Palette + is closed, this always works. But when the Palette is open, you must + first select the Open tool of the Palette before double clicking + the node.) +
    +
  • + Choose root  to be the focus node. Click on the Number Of + Rows... button. Insert 3 for the number of rows and press OK. + In the box labeled Amplitudes, in the column labeled State, change the 3 + current state names from x to: (0,0), (0,1) and (1,0). +
  • + Repeat the last step, but this time for node 1mag . Give it 3 + states called (0,0), (0,1) and (1,0). +
  • + Repeat the last step, but this time for node 2mag . Give it 3 + states called (0,0), (0,1) and (1,0). +
  • + Repeat the last step, but this time for node nz+ . Give it 2 + states called 0 and 1. +
  • + Repeat the last step, but this time for node nz- . Give it 2 + states called 0 and 1. +
  • + Repeat the last step, but this time for node nu+ . Give it 2 + states called 0 and 1. +
  • + Repeat the last step, but this time for node nu-  . Give it 2 + states called 0 and 1. +
+

+


+

+[Table Of Contents] + diff --git a/Legacy/Help/QFogManual/data/undo.html b/Legacy/Help/QFogManual/data/undo.html new file mode 100644 index 0000000..87820cb --- /dev/null +++ b/Legacy/Help/QFogManual/data/undo.html @@ -0,0 +1,32 @@ + + + + Undo + + +

+ Undo +

+

+

+All editable fields (i.e., rectangles in which you enter a single name or +number) allow you to Undo a previous Cut, Delete or +Paste. In addition, there are 2 other places where you can undo your +work. +

    +
  1. + In the Main Window, if you Cut or Delete some nodes + and arrows from the net and then change your mind, you can use Undo + to restore them. Besides the picture of each erased node, its transition + matrix will also be restored. +
  2. + In the Amplitudes Table of the Node Prior-Info. window, if you + Cut or Delete or Paste a rectangular subset of the entries + of the table and then change your mind, you can use Undo to restore + the original entries. +
+

+


+

+[Table Of Contents] + diff --git a/Legacy/Help/QFogManual/data/wind,bi_nd_list.gif b/Legacy/Help/QFogManual/data/wind,bi_nd_list.gif new file mode 100644 index 0000000000000000000000000000000000000000..65d98592db1b2e0ba153ac18b12e4d56432dd7bd GIT binary patch literal 4830 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 Y9CiR3#++h#jEcun)*u?Yz<|a702)fcQ2+n{ literal 0 HcmV?d00001 diff --git a/Legacy/Help/QFogManual/data/wind,nd_pi.gif b/Legacy/Help/QFogManual/data/wind,nd_pi.gif new file mode 100644 index 0000000000000000000000000000000000000000..0313c52d02b290ed93b4cdb7e0aa86509f0b050d GIT binary patch literal 17488 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 Nw13{I&qP1~06WZ`&6@xK literal 0 HcmV?d00001 diff --git a/Legacy/Help/QFogManual/data/wind,nd_probs.gif b/Legacy/Help/QFogManual/data/wind,nd_probs.gif new file mode 100644 index 0000000000000000000000000000000000000000..f9b82f3a1834ad024b785b114f2811a9c615291c GIT binary patch literal 7333 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 W-wxfIvq_G&&w})V@~vUOzW)P{(?G`n literal 0 HcmV?d00001 diff --git a/Legacy/Help/QFogManual/data/wind,pal.gif b/Legacy/Help/QFogManual/data/wind,pal.gif new file mode 100644 index 0000000000000000000000000000000000000000..62d561c76d9f21d50ff1a82e4226683eb09fedff GIT binary patch literal 8236 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 KhME!-aQz?ic;c7< literal 0 HcmV?d00001 diff --git a/Legacy/Help/QFogManual/data/windows.html b/Legacy/Help/QFogManual/data/windows.html new file mode 100644 index 0000000..90bd1b5 --- /dev/null +++ b/Legacy/Help/QFogManual/data/windows.html @@ -0,0 +1,61 @@ + + + Windows Menu + + + +

+ Windows Menu +

+

+

+With Quantum Fog, you can have several Main Windows open at the same +time, each displaying a different net. +

+For each Main Window that is open, you can open additional +satellite windows. A satellite window (like, for example, the +Node Prior-Info. window) shows data that pertains to the Main +Window that owns it. +

+A Main Window together with its satellite windows is called a +project. A project is given the same name as its Main Window. +

+All projects use the same Palette. One can therefore think of the +Palette as being JOINTLY owned by all projects. +

+Occasionally, you may want two satellite windows of the same type but belonging +to different projects to be open at the same time. For example, you could +open two Main Windows called "QFog-1" and "QFog-2", and then you could +open the Node Prior-Info. window for QFog-1 and the Node +Prior-Info. window for QFog-2. To prevent confusion in such situations, +satellite windows exhibit a small caption with the word "Project:", followed +by the name of their project. For example, the Node Prior-Info. window +for QFog-1 exhibits the caption: "Project: QFog-1". +

+The project that owns the currently active window is called the active +project. +

+If you select the Active Project item of the Windows menu, +you get a list of all currently open projects. The name of the currently +active project is preceded by a check mark. If, in this list, you +select the name of any project, that project becomes the active project and +its Main Window is selected. +

+In the Windows menu, all menu items except the first 3 (Active +Project:, Open Main Window, and Open Palette), refer to satellite +windows owned by the active project. +

    +
  • + If satellite window W of active project X is closed, its name in the + Windows menu is prefaced by the word "Open". Choosing menu item Open + W opens W of project X. +
  • + If satellite window W of active project X is already open, its name in the + Windows menu is prefaced by the word "SELECT". Choosing menu item + SELECT W selects W of project X. +
+

+


+

+[Table Of Contents] + diff --git a/Legacy/Help/QFogManual/start_here.html b/Legacy/Help/QFogManual/start_here.html new file mode 100644 index 0000000..b7fb6d5 --- /dev/null +++ b/Legacy/Help/QFogManual/start_here.html @@ -0,0 +1,24 @@ + + + QFog Manual- Cover Page + + + +

+ +

+

+

+

+ Quantum Fog Manual +

+

+written by: Robert R. Tucci +

+last changed: Sept. 1, 2006 +

+(c) 1997-2006 Artiste. All Rights Reserved. Quantum +Fog TM. +

+Next Page + diff --git a/Legacy/QFog2-MachO/QFogSource/Ansi_General/.DS_Store b/Legacy/QFog2-MachO/QFogSource/Ansi_General/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..6a81c8133903c7e581d37740d94f5de2b9d08e16 GIT binary patch literal 12292 zcmeI1u}&L75Qb;L2s=pF9W;@yNoy%pQeMCYSpp(KgrK^}q@b__4gI|h55+_92+2RQ zW3#(<5CtMA`bXNG^WOZov!C(Ktq_s0clYbF$UsE8XzDv3(5*1NuWiZJd}JFw*fY-L zhYaOPZYQ&)XbzA73A{G~`rGZvku+!%Nq)aKSJTJvGX%eeCL`9W!=s@{^Sn8z}DOfu@pIr87f3ciD} z@82n3`#w`ew@?%_SWapDAd7G0z`n~d)-^)5Ln-u{Vfd0{*e~?Y|NVS|`fH*FAleE7 zsM%`Wt?1d4011%5f`IN16`K0meH*=P9q8-`0N=r|8Lst(K{b{8+I<^6?!ZEn!bfTF zBSwgFj8`64yKke9atVI;2tIT06H2hz@%+ldCDhTgCjk=339QGD1Fiq#zn}ke5kHXt z3H(wfc{WZpU%>#Xk&jUFq`RYxiyR7=f|=8wPeH gKmsH{0wh2JBtQZrKmsH{0wh2JBtQZr@Tvs<0OGUFVgLXD literal 0 HcmV?d00001 diff --git a/Legacy/QFog2-MachO/QFogSource/Ansi_General/L_LIST.cp b/Legacy/QFog2-MachO/QFogSource/Ansi_General/L_LIST.cp new file mode 100644 index 0000000..8b1c420 --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Ansi_General/L_LIST.cp @@ -0,0 +1 @@ +#include "L_LIST.h" #pragma mark ----DIR_DATA ---- //****************************************** template DIR_DATA::DIR_DATA() :its_next_p(0) {} //****************************************** /* CW PRO2 couldn't find this template DIR_DATA::DIR_DATA( const TYPE & data, //in DIR_DATA * next_p) //in :its_data(data), its_next_p(next_p) {} */ //****************************************** template DIR_DATA::DIR_DATA( const DIR_DATA & source) //in :its_data(source.its_data), its_next_p(0) {} #pragma mark ----L_LIST ---- #pragma mark --creation/destruction-- //****************************************** template VOID L_LIST::clear( ) { DIR_DATA * x_p = its_first_p; while(x_p) { x_p = its_first_p->its_next_p; delete its_first_p; its_first_p = x_p; } its_first_p = 0; its_last_p = 0; its_len = 0; } //****************************************** template VOID L_LIST::copy( const L_LIST & prev_list) //in { its_len = prev_list.its_len; if(its_len==0){ its_first_p = 0; its_last_p = 0; return; } DIR_DATA * x_p = prev_list.its_first_p; DIR_DATA * new_x_p = new DIR_DATA(x_p->its_data, 0); //delete: via ~L_LIST()->L_LIST()::clear(). // See also L_LIST()::extract_xxx() methods. ThrowIfNil_(new_x_p); its_first_p =new_x_p; its_last_p =new_x_p; x_p = x_p->its_next_p; while(x_p) { new_x_p = new DIR_DATA(x_p->its_data, 0); //delete: via ~L_LIST()->L_LIST()::clear(). // See also L_LIST()::extract_xxx() methods. ThrowIfNil_(new_x_p); its_last_p->its_next_p =new_x_p; its_last_p =new_x_p; x_p = x_p->its_next_p; } } //****************************************** template L_LIST::L_LIST() :its_first_p(0), its_last_p(0), its_len(0) {} //****************************************** template L_LIST::L_LIST( const L_LIST & s ) //in { //s = source copy(s); } //****************************************** template L_LIST & L_LIST::operator=( const L_LIST & rhs) //in { //rhs = right hand side if(this != &rhs) { clear(); copy(rhs); } return *this; } //****************************************** template L_LIST::~L_LIST() { clear(); } #pragma mark --const functions-- //****************************************** template DIR_DATA * L_LIST::get_first_p() const { return its_first_p; } //****************************************** template DIR_DATA * L_LIST::get_last_p() const { return its_last_p; } //****************************************** template const USHORT L_LIST::get_len() const { return its_len; } //****************************************** template BOOLEAN L_LIST::has_this( const TYPE & target) //in const { DIR_DATA * x_p = its_first_p; if(x_p==0)return false; while(x_p->its_data != target){ x_p = x_p->its_next_p; if(x_p==0)return false; } return true; } //****************************************** template TYPE & L_LIST::operator[] ( USHORT loc) //in const { //0 based indexing //assume that its_len>0 if(loc >= its_len)loc=its_len-1; DIR_DATA * x_p = its_first_p; for(USHORT i=0; i < loc; i++){ x_p = x_p->its_next_p; } return x_p->its_data; } #pragma mark --insert an element-- //****************************************** template VOID L_LIST::insert_first( const TYPE & data) //in { DIR_DATA * x_p = new DIR_DATA(data, its_first_p); //delete: via ~L_LIST()->L_LIST()::clear(). // See also L_LIST()::extract_xxx() methods. ThrowIfNil_(x_p); its_len++; if(its_first_p == 0){ its_first_p = x_p; its_last_p = x_p; }else{ its_first_p = x_p; } } //****************************************** template VOID L_LIST::insert_last( const TYPE & data) //in { DIR_DATA * x_p = new DIR_DATA(data, 0); //delete: via ~L_LIST()->L_LIST()::clear(). // See also L_LIST()::extract_xxx() methods. ThrowIfNil_(x_p); its_len++; if(its_first_p == 0){ its_first_p = x_p; its_last_p = x_p; }else{ its_last_p->its_next_p = x_p; its_last_p = x_p; } } #pragma mark --extract an element-- //****************************************** template BOOLEAN L_LIST::extract_first( TYPE & data) //out { if(its_first_p == 0) return false; its_len--; data = its_first_p->its_data; DIR_DATA * x_p = its_first_p->its_next_p; delete its_first_p; its_first_p = x_p; if(its_first_p == 0) its_last_p = 0; return true; } //****************************************** template BOOLEAN L_LIST::extract_first() { if(its_first_p == 0) return false; its_len--; DIR_DATA * x_p = its_first_p->its_next_p; delete its_first_p; its_first_p = x_p; if(its_first_p == 0) its_last_p = 0; return true; } //****************************************** template BOOLEAN L_LIST::extract_last() { if(its_len == 0) return false; if(its_len==1){ delete its_last_p; its_last_p=0; its_first_p=0; its_len=0; return true; } DIR_DATA * x_p = its_first_p; DIR_DATA * pre_x_p = its_first_p; while(x_p != its_last_p){ pre_x_p = x_p; x_p = x_p->its_next_p; } pre_x_p->its_next_p =0; delete its_last_p; its_last_p = pre_x_p; its_len--; return true; } //****************************************** template BOOLEAN L_LIST::extract_target( const TYPE & target) //in { DIR_DATA * x_p = its_first_p; DIR_DATA * pre_x_p = its_first_p; while(x_p->its_data != target){ pre_x_p = x_p; x_p = x_p->its_next_p; if(x_p==0)return false; } if(x_p==its_first_p) return extract_first(); if(x_p==its_last_p) return extract_last(); pre_x_p->its_next_p = x_p->its_next_p; delete x_p; x_p = 0; its_len--; return true; } //****************************************** template BOOLEAN L_LIST::extract_target( DIR_DATA * target_p) //in { if(target_p==its_first_p){ target_p=0; return extract_first(); } if(target_p==its_last_p){ target_p=0; return extract_last(); } DIR_DATA * x_p = its_first_p; DIR_DATA * pre_x_p = its_first_p; while(x_p != target_p){ pre_x_p = x_p; x_p = x_p->its_next_p; if(x_p==0)return false; } pre_x_p->its_next_p = x_p->its_next_p; delete x_p; x_p = 0; target_p=0; its_len--; return true; } \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Ansi_General/L_LIST.h b/Legacy/QFog2-MachO/QFogSource/Ansi_General/L_LIST.h new file mode 100644 index 0000000..cf6300f --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Ansi_General/L_LIST.h @@ -0,0 +1 @@ +//****************************************** // Purpose: To define a singly-linked list. // The list will dwell in the heap. //****************************************** #pragma once //****************************************** template class DIR_DATA //dir_data = directed data { public: // data TYPE its_data; DIR_DATA * its_next_p; DIR_DATA(); DIR_DATA( const TYPE & data, DIR_DATA * next_p) {its_data = data; its_next_p=next_p;} DIR_DATA(const DIR_DATA & source); }; // The class DIR_DATA, which will be used only by the class L_LIST, // has only some of the four horsemen, only those that will be used // by the class L_LIST. In particular, the assigner will not be used. // Also, there is no need for an explicit destructor as // DIR_DATA never calls "new". //****************************************** template class L_LIST { private: DIR_DATA * its_first_p; DIR_DATA * its_last_p; USHORT its_len; // len = length public: VOID clear(); VOID copy(const L_LIST & prev_list); L_LIST(); L_LIST( const L_LIST & s ); L_LIST & operator=( const L_LIST & rhs); virtual ~L_LIST(); DIR_DATA * get_first_p() const; DIR_DATA * get_last_p() const; const USHORT get_len() const; BOOLEAN has_this( const TYPE & target) const; TYPE & operator[] (USHORT loc) const; VOID insert_first(const TYPE & data); VOID insert_last(const TYPE & data); BOOLEAN extract_first( TYPE & data); BOOLEAN extract_first(); BOOLEAN extract_last(); BOOLEAN extract_target( const TYPE & target); BOOLEAN extract_target( DIR_DATA * target_p); }; \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Ansi_General/L_LIST_INST.cpp b/Legacy/QFog2-MachO/QFogSource/Ansi_General/L_LIST_INST.cpp new file mode 100644 index 0000000..fc2ebb0 --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Ansi_General/L_LIST_INST.cpp @@ -0,0 +1 @@ + #include "L_LIST.cp" #include "BI_NODE.h" template class L_LIST; template class L_LIST; #ifdef _mac_gui_app //''''''''''''''''''''''''''''''''''''''''''''\\. #include "C_ARROW.h" #include "C_ANTHOLOGY_ITEM.h" template class L_LIST; template class L_LIST; #endif //_mac_gui_app \\............................................// \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Ansi_General/MATRIX.cp b/Legacy/QFog2-MachO/QFogSource/Ansi_General/MATRIX.cp new file mode 100644 index 0000000..92dc320 --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Ansi_General/MATRIX.cp @@ -0,0 +1 @@ +#include "MATRIX.h" #pragma mark --creation/destruction-- //****************************************** template VOID MATRIX::clear() { for(USHORT row=0;row VOID MATRIX::copy( const MATRIX & s) //in { its_num_of_rows = s.its_num_of_rows; its_num_of_cols = s.its_num_of_cols; if(its_num_of_rows==0){ its_elements_p_p=0; }else{ its_elements_p_p = new TYPE * [its_num_of_rows];//new[] //delete: via ~MATRIX()->MATRIX::clear() ThrowIfNil_(its_elements_p_p); for(USHORT row=0;rowMATRIX::clear() ThrowIfNil_(its_elements_p_p[row]); for(USHORT col=0; col VOID MATRIX::set_to_default_mat( const TYPE & default_value, //in USHORT num_of_rows, //in USHORT num_of_cols) //in { if(its_num_of_rows==num_of_rows && its_num_of_cols==num_of_cols){ for(USHORT row=0;row MATRIX::MATRIX() :its_elements_p_p(0), its_num_of_rows(0), its_num_of_cols(0) {} //****************************************** template MATRIX::MATRIX( const TYPE & default_value, //in USHORT num_of_rows, //in USHORT num_of_cols) //in :its_elements_p_p(0), its_num_of_rows(0), its_num_of_cols(0) { set_to_default_mat(default_value, num_of_rows, num_of_cols); } //****************************************** template MATRIX::MATRIX( const MATRIX & s) //in { copy(s); } //****************************************** template MATRIX & MATRIX::operator=( const MATRIX & rhs) //in { //rhs = right hand side if(this != &rhs){ clear(); copy(rhs); } return *this; } //****************************************** template MATRIX::~MATRIX() { clear(); } #pragma mark --const functions-- //****************************************** template USHORT MATRIX::get_num_of_rows() const { return its_num_of_rows; } //****************************************** template USHORT MATRIX::get_num_of_cols() const { return its_num_of_cols; } //****************************************** template TYPE & MATRIX::entry( USHORT row, //in USHORT col) //in const { return its_elements_p_p[row][col]; } \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Ansi_General/MATRIX.h b/Legacy/QFog2-MachO/QFogSource/Ansi_General/MATRIX.h new file mode 100644 index 0000000..e6c3035 --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Ansi_General/MATRIX.h @@ -0,0 +1 @@ +#pragma once //****************************************** template class MATRIX { private: TYPE * * its_elements_p_p; USHORT its_num_of_rows; USHORT its_num_of_cols; public: VOID clear(); VOID copy(const MATRIX & s); VOID set_to_default_mat( const TYPE & default_value, USHORT num_of_rows, USHORT num_of_cols); MATRIX(); MATRIX( const TYPE & default_value, USHORT num_of_rows, USHORT num_of_cols); MATRIX(const MATRIX & s ); MATRIX & operator=( const MATRIX & rhs ) ; virtual ~MATRIX(); USHORT get_num_of_rows() const; USHORT get_num_of_cols() const; TYPE & entry(USHORT row , USHORT col) const; }; \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Ansi_General/MATRIX_INST.cpp b/Legacy/QFog2-MachO/QFogSource/Ansi_General/MATRIX_INST.cpp new file mode 100644 index 0000000..5e15978 --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Ansi_General/MATRIX_INST.cpp @@ -0,0 +1 @@ +#include "MATRIX.cp" template class MATRIX; template class MATRIX; \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Ansi_General/SET.cpp b/Legacy/QFog2-MachO/QFogSource/Ansi_General/SET.cpp new file mode 100644 index 0000000..877856e --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Ansi_General/SET.cpp @@ -0,0 +1 @@ +#include "SET.h" #pragma mark --creation/destruction-- //****************************************** VOID SET::clear() { delete [] its_array_p; its_array_p = 0; } //****************************************** VOID SET::copy( const SET & s) //in { its_num_of_elems = s.its_num_of_elems; its_num_of_comps = s.its_num_of_comps; //its_num_of_comps >= 1 its_array_p = new LONG[its_num_of_comps];//new[] //delete: in ~SET()-> SET::clear() ThrowIfNil_(its_array_p); for(USHORT i=0; i its_num_of_comps. //(2)is absolutely necessary for new_num_of_comps < = its_num_of_comps, //(3)resets its_num_of_elements to its new value. if(its_num_of_comps !=new_num_of_comps){ LONG * new_array_p = new LONG[new_num_of_comps];//new[] //delete: substitution of delete-new pair ThrowIfNil_(new_array_p); if(its_num_of_comps < new_num_of_comps){ //we've grown for(i=0; i= its_num_of_comps)return false; //pos = position USHORT bit_pos = elem % 32; LONG mask = 1; mask = mask<= its_num_of_comps)return false; //pos = position USHORT bit_pos = elem % 32; LONG mask = 1; mask = mask<= its_num_of_comps); //pos = position USHORT bit_pos = elem % 32; LONG mask = 1; mask = mask<>( LStream & in_bd, //i-o SET & set) //in { USHORT new_num_of_comps; in_bd >> set.its_num_of_elems >> new_num_of_comps; if(new_num_of_comps != set.its_num_of_comps){ delete [] set.its_array_p; set.its_array_p = new LONG[new_num_of_comps];//new[] //delete: ThrowIfNil_(set.its_array_p); } set.its_num_of_comps =new_num_of_comps; for(USHORT i=0; i> set.its_array_p[i]; } return in_bd; } #endif //_mac_gui_app \\............................................// \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Ansi_General/SET.h b/Legacy/QFog2-MachO/QFogSource/Ansi_General/SET.h new file mode 100644 index 0000000..36d61b5 --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Ansi_General/SET.h @@ -0,0 +1 @@ +#pragma once //****************************************** class SET { private: USHORT its_num_of_elems; USHORT its_num_of_comps; //always >= 1 LONG * its_array_p; public: VOID clear(); VOID copy(const SET & s); VOID empty(); VOID resize(USHORT max_num_of_elems); SET(); SET(USHORT max_num_of_elems); SET(const SET & s ); SET & operator=( const SET & rhs ); virtual ~SET(); USHORT get_num_of_elems() const; BOOLEAN contains(USHORT elem) const; BOOLEAN extract(USHORT elem); BOOLEAN insert(USHORT elem); #ifdef _mac_gui_app //''''''''''''''''''''''''''''''''''''''''''''\\. friend LStream & operator<<( LStream & out_bd, const SET & set); friend LStream & operator>>( LStream & in_bd, SET & set); #endif //_mac_gui_app \\............................................// }; #pragma mark - //****************************************** inline USHORT SET::get_num_of_elems() const { return its_num_of_elems; } \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Ansi_General/STRINGY.cpp b/Legacy/QFog2-MachO/QFogSource/Ansi_General/STRINGY.cpp new file mode 100644 index 0000000..9c8ddd5 --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Ansi_General/STRINGY.cpp @@ -0,0 +1 @@ +#include "STRINGY.h" //The following is an exerpt from LString.cp //dpo #ifdef __NOEXTENSIONS__ extern "C" { #define SIGDIGLEN 36 #define DECSTROUTLEN 80 // max length for dec2str output struct decimal { char sgn; // sign 0 for +, 1 for - char unused; short exp; // decimal exponent struct { unsigned char length; unsigned char text[SIGDIGLEN]; // significant digits unsigned char unused; } sig; }; typedef struct decimal decimal; struct decform { char style; // FLOATDECIMAL or FIXEDDECIMAL char unused; short digits; }; typedef struct decform decform; extern void num2dec( const decform *f, double_t x, decimal *d ); extern void dec2str( const decform *f, const decimal *d, char *s ); extern double x80tod( const extended80 * x80 ); extern void dtox80( const double *x, extended80 *x80 ); extern void str2dec(const char *s, short *ix, decimal *d, short *vp); extern double_t dec2num(const decimal * d); } #endif #pragma mark --creation/destruction-- //****************************************** VOID STRINGY::clear() { delete [] its_cstr; its_cstr = 0; its_len = 0; } //****************************************** VOID STRINGY::copy( const STRINGY & s) //in { //s = source if(s.its_cstr == 0){ its_len=0; its_cstr = 0; }else{ its_len = s.its_len; its_cstr = new CHAR [its_len+1];//new[] //delete: I delete its_cstr via ~STRINGY()->STRINGY::clear(). ThrowIfNil_(its_cstr); strcpy(its_cstr, s.its_cstr); /* alternative to using strcpy(): for (USHORT i =0; iSTRINGY::clear(). ThrowIfNil_(its_cstr); its_cstr[0] = '\0'; } //****************************************** STRINGY::STRINGY( CHAR ch, //in USHORT len) //in :its_len(len) { //Constructor. Creates a ch-filled stringy of length len. //See below, where this constructor is used to define + for stringies. its_cstr = new CHAR [len+1];//new[] //delete: I delete its_cstr via ~STRINGY()->STRINGY::clear(). ThrowIfNil_(its_cstr); for( USHORT i=0; i< len; i++){ its_cstr[i] = ch; } its_cstr[len]='\0'; } //****************************************** STRINGY::STRINGY( const CHAR * cstr) //in { // Constructor. Converts a character array into a stringy. if(cstr==0){ its_len=0; its_cstr=0; }else{ its_len = strlen(cstr); its_cstr = new CHAR [its_len +1];//new[] //delete: I delete its_cstr via ~STRINGY()->STRINGY::clear(). ThrowIfNil_(its_cstr); strcpy(its_cstr, cstr); } } //****************************************** STRINGY::STRINGY( SHORT i) //in { // Constructor that converts shorts into stringies. CHAR cstr[80]; sprintf(cstr, "%i", i); its_len = strlen(cstr); its_cstr = new CHAR [its_len +1];//new[] //delete: I delete its_cstr via ~STRINGY()->STRINGY::clear(). ThrowIfNil_(its_cstr); strcpy(its_cstr, cstr); } //****************************************** STRINGY::STRINGY( USHORT i) //in { // Constructor that converts ushorts into stringies. CHAR cstr[80]; sprintf(cstr, "%i", i); its_len = strlen(cstr); its_cstr = new CHAR [its_len +1];//new[] //delete: I delete its_cstr via ~STRINGY()->STRINGY::clear(). ThrowIfNil_(its_cstr); strcpy(its_cstr, cstr); } //****************************************** STRINGY::STRINGY( LONG i) //in { // Constructor that converts longs into stringies. CHAR cstr[80]; sprintf(cstr, "%i", i); its_len = strlen(cstr); its_cstr = new CHAR [its_len +1];//new[] //delete: I delete its_cstr via ~STRINGY()->STRINGY::clear(). ThrowIfNil_(its_cstr); strcpy(its_cstr, cstr); } //****************************************** STRINGY::STRINGY( DOUBLE x) //in { // Constructor that converts doubles into stringies. CHAR cstr[80]; sprintf(cstr, "%f", x); its_len = strlen(cstr); its_cstr = new CHAR [its_len +1];//new[] //delete: I delete its_cstr via ~STRINGY()->STRINGY::clear(). ThrowIfNil_(its_cstr); strcpy(its_cstr, cstr); } //****************************************** STRINGY::STRINGY( const STRINGY & s) //in { copy(s); } //****************************************** STRINGY & STRINGY::operator= ( const STRINGY & rhs) //in { if(this != &rhs){ if(its_len == rhs.its_len){ if(rhs.its_len==0){ clear(); }else{ strcpy(its_cstr, rhs.its_cstr); } }else{ clear(); copy(rhs); } } return *this; } //****************************************** STRINGY::~STRINGY() { clear(); } #pragma mark --cstr, len (const functions)-- //****************************************** STRINGY STRINGY::get_sub_stringy( USHORT starting_pos, //in USHORT sub_str_len) //in const { //starting_pos is zero based ThrowIf_(starting_pos + sub_str_len > its_len); STRINGY sub_sgy('x', sub_str_len); for (USHORT i =0; i31)return false; for(USHORT i=0; i= 0x7F) || //0x7F = delete (ch =='#') ){ return false; } } return true; } #pragma mark --comparison (const functions)-- //****************************************** BOOLEAN operator==( const STRINGY & s1, //in const STRINGY & s2) //in { if(s1.its_cstr == s2.its_cstr){ return true; }else{ //if they are not equal: if( (s1.its_cstr==0)||(s2.its_cstr==0) ){ return false; }else{ return ( strcmp(s1.its_cstr, s2.its_cstr)==0 ); } } } //****************************************** BOOLEAN operator==( const STRINGY & s, //in const CHAR * cstr) //in { if(s.its_cstr == cstr){ return true; }else{ //if they are not equal: if( (s.its_cstr==0)||(cstr==0) ){ return false; }else{ return ( strcmp(s.its_cstr, cstr)==0 ); } } } //****************************************** BOOLEAN operator==( const CHAR * cstr, //in const STRINGY & s) //in { if(cstr == s.its_cstr){ return true; }else{ //if they are not equal: if( (cstr==0)||(s.its_cstr==0) ){ return false; }else{ return ( strcmp(cstr, s.its_cstr)==0 ); } } } //****************************************** BOOLEAN operator<( const STRINGY & s1, //in const STRINGY & s2) //in { if(s1.its_cstr == s2.its_cstr){ return false; }else if(s1.its_cstr == 0){ return true; }else if(s2.its_cstr == 0){ return false; }else{ return ( strcmp(s1.its_cstr , s2.its_cstr) < 0 ); } } #pragma mark --concatenation-- //****************************************** STRINGY STRINGY::operator &&( const STRINGY & rhs) //in { // concatenates two stringies. if(its_cstr==0){ return rhs; }else{ // if its_cstr!=0: if(rhs==0){ return *this; }else{//if its_cstr and rhs are both non-zero: USHORT tot_len = its_len + rhs.its_len; STRINGY temp('a', tot_len); // temp = temporary strcpy(temp.its_cstr, its_cstr); strcat(temp.its_cstr, rhs.its_cstr); /* alternative to using strcpy and strcat: for (USHORT i=0; i> ( ISTREAM & in_bd, //i-o STRINGY & s) //in { //Stream input. This works also for a file, //since an fstream is-an istream. CHAR cstr[STRINGY::stringy_max_len + 1]; in_bd >> cstr; delete [] s.its_cstr; s.its_len= strlen(cstr); s.its_cstr = new CHAR [s.its_len +1];//new[] //delete: substitution of delete-new pair ThrowIfNil_(s.its_cstr); strcpy(s.its_cstr, cstr); return in_bd; } //****************************************** ISTREAM & STRINGY::copy_line( ISTREAM & in_bd, //i-o USHORT max_len, //in CHAR stop_char) //in { // usually stop_char = my_endline // This member function for STRINGY acts like // the "getline" member function for ISTREAM. // Both transfer a string from an istream object to something else // ( a stringy and a character array, respectively). // This also works for a file, as an fstream is-an istream. CHAR cstr[stringy_max_len + 1]; in_bd.getline( cstr, (stringy_max_len < max_len)? stringy_max_len : max_len, stop_char ); delete [] its_cstr; its_len=strlen(cstr); its_cstr = new CHAR [its_len +1];//new[] //delete: substitution of delete-new pair ThrowIfNil_(its_cstr); strcpy(its_cstr, cstr); return in_bd; } //****************************************** #pragma mark ----used only with macgui---- #ifdef _mac_gui_app //''''''''''''''''''''''''''''''''''''''''''''\\. #pragma mark --creation/destruction-- //****************************************** VOID STRINGY::fill_LStr255( LStr255 & pstr) //out const {//to go from STRINGY to Str255 (which is an unsigned char[256]) //both STRINGY and Str255 have a max length of 255 characters pstr[0] = its_len; for(USHORT i=1; i<=its_len; i++){ pstr[i]=its_cstr[i-1]; } } //****************************************** STRINGY::STRINGY( const LStr255 & pstr) //in { // to go from LStr255 to a STRINGY if(pstr[0]==0){ its_len=0; its_cstr=0; }else{ its_len = pstr[0]; its_cstr = new CHAR [its_len +1];//new[] //delete: I delete its_cstr via ~STRINGY()->STRINGY::clear(). ThrowIfNil_(its_cstr); for(int i=0; i'9' ){ return false; } } return true; } //****************************************** BOOLEAN STRINGY::is_ushort( USHORT & n) //out const { if(its_len==0)return false; for(USHORT c=0; c< its_len; c++){ if(its_cstr[c]<'0' || its_cstr[c]>'9' ){ return false; } } LStr255 pstr; this->fill_LStr255(pstr); SInt32 nn; ::StringToNum(pstr, &nn); n = nn; return true; } //****************************************** BOOLEAN STRINGY::is_ushort_pair() const { //This function recognizes a stringy of the form (ushort, ushort) //If it finds such a pair it returns true. if(its_len<5)return false; if( its_cstr[0]!='(' || its_cstr[its_len-1]!=')' )return false; USHORT num_of_commas=0; USHORT i; for(i=1; i<=its_len-2; i++){ if(its_cstr[i]==','){ num_of_commas++; if(num_of_commas>1)return false; }else if('0'<= its_cstr[i] && its_cstr[i]<='9'){ //do nothing }else{ return false; } } return true; } //****************************************** BOOLEAN STRINGY::is_ushort_pair( USHORT & n1, //out USHORT & n2) //out const { //This function recognizes a stringy of the form (ushort, ushort) //If it finds such a pair it returns true //and places the components in n1 and n2. if(its_len<5)return false; if( its_cstr[0]!='(' || its_cstr[its_len-1]!=')' )return false; USHORT num_of_commas=0; USHORT comma_pos=0; USHORT i; for(i=1; i1)return false; }else if('0'<= its_cstr[i] && its_cstr[i]<='9'){ //do nothing }else{ return false; } } //example (12,456) //its_len = 8 //comma_pos= 3 //comma_pos-1 = 2 //its_len - comma_pos - 2 = 8-3-2 = 3 LStr255 pstr; LONG num; STRINGY str1('1', comma_pos-1); for(i=1; i< comma_pos; i++){ str1[i-1] = its_cstr[i]; } str1.fill_LStr255(pstr); ::StringToNum(pstr, &num); n1 = num; STRINGY str2('1', its_len-comma_pos-2); for(i=comma_pos + 1; i< its_len-1; i++){ str2[i- comma_pos -1] = its_cstr[i]; } str2.fill_LStr255(pstr); ::StringToNum(pstr, &num); n2 = num; return true; } #pragma mark --i/o-- //****************************************** LStream & operator<<( LStream & out_bd, //i-o const STRINGY & s) //in { out_bd << s.its_cstr; return out_bd; } //****************************************** LStream & operator>>( LStream & in_bd, //i-o STRINGY & s) //in { CHAR cstr[STRINGY::stringy_max_len + 1]; in_bd >> cstr; delete [] s.its_cstr; s.its_len= strlen(cstr); s.its_cstr = new CHAR [s.its_len +1];//new[] //delete: substitution of delete-new pair ThrowIfNil_(s.its_cstr); strcpy(s.its_cstr, cstr); return in_bd; } #endif //_mac_gui_app \\............................................// \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Ansi_General/STRINGY.h b/Legacy/QFog2-MachO/QFogSource/Ansi_General/STRINGY.h new file mode 100644 index 0000000..8297117 --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Ansi_General/STRINGY.h @@ -0,0 +1 @@ +//****************************************** // Purpose: To define a class of string objects living in the heap. //****************************************** #pragma once #include "QFog_constants.h" #include "GLOBAL_FUN.h" #include #include #include #include #include //****************************************** //****************************************** //We use: //pstr ending for Pascal string (like Str255) //cstr ending for C string //no special ending for STRINGY or LStr255 //buf_p indeterminate sex (either C or Pascal) //****************************************** class STRINGY { private: CHAR * its_cstr; USHORT its_len; // len = length. //"its_len" does NOT include the \0 termination character. public: enum {stringy_max_len = 255};// 256 once include termination char VOID clear(); VOID copy(const STRINGY & s); STRINGY(); STRINGY(CHAR ch, USHORT len); STRINGY(const CHAR * cstr); STRINGY(SHORT i); STRINGY(USHORT i); STRINGY(LONG i); STRINGY(DOUBLE x); STRINGY(const STRINGY & s); STRINGY & operator= (const STRINGY & rhs); virtual ~STRINGY(); USHORT get_len() const; const CHAR * get_string() const; STRINGY get_sub_stringy(USHORT starting_pos, USHORT sub_str_len) const; BOOLEAN is_legal_name() const; friend BOOLEAN operator==(const STRINGY & s1, const STRINGY & s2); friend BOOLEAN operator!=(const STRINGY & s1, const STRINGY & s2); friend BOOLEAN operator==(const STRINGY & s, const CHAR * cstr); friend BOOLEAN operator!=(const STRINGY & s, const CHAR * cstr); friend BOOLEAN operator==(const CHAR * cstr, const STRINGY & s); friend BOOLEAN operator!=(const CHAR * cstr, const STRINGY & s); friend BOOLEAN operator<(const STRINGY & s1, const STRINGY & s2); CHAR & operator[] (USHORT i); const CHAR & operator[] (USHORT i) const; STRINGY operator &&(const STRINGY & rhs); friend OSTREAM & operator<<( OSTREAM & out_bd, const STRINGY & s); friend ISTREAM & operator>>( ISTREAM & in_bd, STRINGY & s); ISTREAM & copy_line(ISTREAM & in_bd, USHORT max_len, CHAR stop_char); #ifdef _mac_gui_app //''''''''''''''''''''''''''''''''''''''''''''\\. VOID fill_LStr255(LStr255 & pstr) const; STRINGY(const LStr255 & pstr); BOOLEAN is_double() const; BOOLEAN is_double(DOUBLE & db) const; BOOLEAN is_ushort() const; BOOLEAN is_ushort(USHORT & n) const; BOOLEAN is_ushort_pair() const; BOOLEAN is_ushort_pair(USHORT & n1, USHORT & n2) const; friend LStream & operator<<( LStream & out_bd, const STRINGY & s); friend LStream & operator>>( LStream & in_bd, STRINGY & s); #endif //_mac_gui_app \\............................................// }; #pragma mark - //****************************************** inline USHORT STRINGY::get_len() const { return its_len; } //****************************************** inline const CHAR * STRINGY::get_string() const { return its_cstr; } //****************************************** inline BOOLEAN operator!=( const STRINGY & s1, //in const STRINGY & s2) //in { return !(s1==s2); } //****************************************** inline BOOLEAN operator!=( const STRINGY & s, //in const CHAR * cstr) //in { return !(s==cstr); } //****************************************** inline BOOLEAN operator!=( const CHAR * cstr, //in const STRINGY & s) //in { return !(cstr==s); } //****************************************** inline CHAR & STRINGY::operator[]( USHORT i) //in { // Returns alias to the ith character of a stringy so that // the ith character can be changed. ThrowIf_(i >= its_len); return its_cstr[i]; } //****************************************** inline const CHAR & STRINGY::operator[]( USHORT i) //in const { // Constant function that returns a constant alias to // the ith character of a stringy. // For use on constant objects. See, for example, the copy constructor. ThrowIf_(i >= its_len); return its_cstr[i]; } \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Ansi_General/VECTOR.cp b/Legacy/QFog2-MachO/QFogSource/Ansi_General/VECTOR.cp new file mode 100644 index 0000000..8002d16 --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Ansi_General/VECTOR.cp @@ -0,0 +1 @@ +#include "VECTOR.h" #include "QFog_constants.h" #pragma mark --creation/destruction-- //****************************************** template VOID VECTOR::clear( ) { delete [] its_array_p; its_array_p=0; its_len=0; } //****************************************** template VOID VECTOR::copy( const VECTOR & s) //in { // s = source its_len = s.its_len; if(its_len==0){ its_array_p = 0; }else{ its_array_p = new TYPE [its_len];//new[] //delete: in ~VECTOR(). ThrowIfNil_(its_array_p); for(USHORT i=0; i VOID VECTOR::set_to_default_vec( const TYPE & default_value, //in USHORT len ) //in { if(its_len == len){ for(USHORT i=0; i VOID VECTOR::resize( const TYPE & default_value, //in USHORT new_len ) //in { if(new_len == its_len)return; if(new_len==0){ clear(); return; } TYPE * new_array_p = new TYPE [new_len];//new[] //delete: substitution of delete-new pair. ThrowIfNil_(new_array_p); USHORT i; if(its_len < new_len){ for(i=0; i VECTOR::VECTOR() :its_array_p(0), its_len(0) {} //****************************************** template VECTOR::VECTOR( const TYPE & default_value, //in USHORT len) //in :its_array_p(0), its_len(0) { set_to_default_vec(default_value, len); } //****************************************** template VECTOR::VECTOR( const VECTOR & s) //in { copy(s); } //****************************************** template VECTOR & VECTOR::operator=( const VECTOR & rhs) //in { //rhs = right hand side if(this != &rhs){ if(its_len == rhs.its_len){ for(USHORT i= 0; i VECTOR::~VECTOR() { clear(); } #pragma mark --const functions-- //****************************************** template USHORT VECTOR::get_len() const { return its_len; } //****************************************** template USHORT VECTOR::loc_of_target( const TYPE & tar) //in const { if(its_len == 0) return max_ushort; USHORT loc = max_ushort; for(USHORT i=0; i< its_len; i++){ if( its_array_p[i] == tar){ loc=i; break; } } return loc; } //****************************************** template TYPE & VECTOR::operator[]( USHORT i) //in const { ThrowIf_(i>=its_len); return its_array_p[i]; } #pragma mark --insert an element-- //****************************************** template VOID VECTOR::insert_last( const TYPE & data) //in { TYPE * new_array_p = new TYPE [its_len+1];//new[] //delete: substitution of delete-new pair. ThrowIfNil_(new_array_p); for(USHORT j=0; j VOID VECTOR::insert_ptr_last( TYPE data) //in { TYPE * new_array_p = new TYPE [its_len+1];//new[] //delete: substitution of delete-new pair. ThrowIfNil_(new_array_p); for(USHORT j=0; j VOID VECTOR::extract_at( USHORT loc) //in { if(loc >= its_len)return; USHORT new_len = its_len - 1; TYPE * new_array_p = 0; if(new_len!=0){ new_array_p = new TYPE [new_len];//new[] //delete: substitution of delete-new pair. ThrowIfNil_(new_array_p); USHORT i; for(i=0; i//contains exit() //Ref. on template friends: post on newsgroups by Dave Meyer //forward class declaration of template template class VECTOR; //forward function declaration of friend to be template BOOLEAN operator!=(const VECTOR & s1, const VECTOR & s2); template BOOLEAN operator==(const VECTOR & s1, const VECTOR & s2); #ifdef _mac_gui_app //''''''''''''''''''''''''''''''''''''''''''''\\. template LStream & operator<<(LStream & out_bd, const VECTOR & v); template LStream & operator>>(LStream & in_bd, VECTOR & v); #endif //_mac_gui_app \\............................................// //****************************************** template class VECTOR { protected: TYPE * its_array_p; USHORT its_len; // len = length public: VOID clear(); VOID copy( const VECTOR & s); VOID set_to_default_vec(const TYPE & default_value, USHORT len); VOID resize(const TYPE & default_value, USHORT new_len ); VECTOR(); VECTOR(const TYPE & default_value, USHORT len); VECTOR( const VECTOR & s ); VECTOR & operator=( const VECTOR & rhs ); virtual ~VECTOR(); USHORT get_len() const; USHORT loc_of_target(const TYPE & tar) const; TYPE & operator[](USHORT i) const; VOID insert_last(const TYPE & data); VOID insert_ptr_last( TYPE data); VOID extract_at(USHORT loc); friend BOOLEAN operator==(const VECTOR & s1, const VECTOR & s2); friend BOOLEAN operator!=(const VECTOR & s1, const VECTOR & s2); #ifdef _mac_gui_app //''''''''''''''''''''''''''''''''''''''''''''\\. friend LStream & operator<< ( LStream & out_bd, const VECTOR & v); friend LStream & operator>> ( LStream & in_bd, VECTOR & v); #endif //_mac_gui_app \\............................................// }; //CW likes "VECTOR_FRIENDS.h" in header file //gcc likes "VECTOR_FRIENDS.h" in implemetation file #include "VECTOR_FRIENDS.h" \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Ansi_General/VECTOR_FRIENDS.h b/Legacy/QFog2-MachO/QFogSource/Ansi_General/VECTOR_FRIENDS.h new file mode 100644 index 0000000..a03823f --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Ansi_General/VECTOR_FRIENDS.h @@ -0,0 +1 @@ +//****************************************** template BOOLEAN operator==( const VECTOR & s1, //in const VECTOR & s2) //in { if(s1.its_len != s2.its_len)return false; USHORT len = s1.its_len; for(USHORT i=0; i BOOLEAN operator!=( const VECTOR & s1, //in const VECTOR & s2) //in { return !(s1==s2); } #pragma mark ----used only with macgui---- #ifdef _mac_gui_app //''''''''''''''''''''''''''''''''''''''''''''\\. #pragma mark --i/o-- //****************************************** template LStream & operator<<( LStream & out_bd, //i-o const VECTOR & v) //in { out_bd << v.its_len;//write_net for(USHORT i=0; i LStream & operator>>( LStream & in_bd, //i-o VECTOR & v) //in { USHORT len; in_bd >> len;//read_net TYPE x; v.resize(x, len); for(USHORT i=0; i> v[i];//read_net } return in_bd; } #endif //_mac_gui_app \\............................................// \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Ansi_General/VECTOR_INST.cpp b/Legacy/QFog2-MachO/QFogSource/Ansi_General/VECTOR_INST.cpp new file mode 100644 index 0000000..7281a54 --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Ansi_General/VECTOR_INST.cpp @@ -0,0 +1 @@ +#include "VECTOR.cp" #include "NODE.h" #include "STRINGY.h" template class VECTOR; template class VECTOR; template class VECTOR; template class VECTOR; template class VECTOR; template class VECTOR; \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Ansi_Nodes/.DS_Store b/Legacy/QFog2-MachO/QFogSource/Ansi_Nodes/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..f566275a7f9a62f13f0fef42ee906a3ece45c2a1 GIT binary patch literal 12292 zcmeI1y-EW?6ov1^AR#eonR0tUw6R`ef&|p~+t@^+g@vGv)?51oK7?;z=c5RAf}O3N zduNcz?!-z|meWc!CrE$<{u%-O?#@Y9`m!$D5`TZMwwVRTwiR<@~Z6sf3x{oq75IZ!V z?qk)J={>zg@v~8UX+7=^u`f~V0`|utcF2+JLk~e+N$jT?C~=oZ?)Fr7IWN|jbgm=U z0N3qL%URPEKSeoPA?KvCl+RXr8@c9W51)>Kk@t6+X8C}1E=9g(!dJ>w%dx`e$kWE> zX%j@ZL30!Dg}&d(Y={tfjhwBdvz%`QYg~(5xX8a~sM*>YEw3C&fCNb3lYs6I8M4afRZK|NW}JZRw+XV9FtLcP_6M-1ofn9o979<=c4?cyvmt`jo5 z@Py(lJLWSBM-lYOkpxI!lE93Axv2HOKmGZC(!^IJKmz}YfUEZodR^R7sI8To(^{LM zpP*~gxWcPhFobe!2U?0d=+-+{rwN4m-wE~Keh2*Y8kmm+ zNZ@w~d|UlTMYqRs=;t4XIL`F;pn1^3D`wDG{|y5N5+DH*AOR8}0TLhq5+DH*AOR8} M0TLhq68KgEALb|CasU7T literal 0 HcmV?d00001 diff --git a/Legacy/QFog2-MachO/QFogSource/Ansi_Nodes/BEAM_SPL.cpp b/Legacy/QFog2-MachO/QFogSource/Ansi_Nodes/BEAM_SPL.cpp new file mode 100644 index 0000000..d8ab756 --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Ansi_Nodes/BEAM_SPL.cpp @@ -0,0 +1 @@ +#include "BEAM_SPL.h" #include "GLOBAL_FUN.h" #ifdef _mac_gui_app //''''''''''''''''''''''''''''''''''''''''''''\\. #include "C_BEAM_SPL_AMP_GEN.h" #include "StCPTstate.h" #endif //_mac_gui_app \\............................................// #pragma mark --creation/destruction-- //****************************************** BEAM_SPL::BEAM_SPL() {} //****************************************** BEAM_SPL::~BEAM_SPL() { } #pragma mark ----used only with macgui---- #ifdef _mac_gui_app //''''''''''''''''''''''''''''''''''''''''''''\\. #pragma mark --creation/destruction-- //****************************************** VOID BEAM_SPL::init_port_locs() { DOUBLE dd = default_mask_rad/sqrt(2.); its_port_locs_p[0].v = its_port_locs_p[1].v = its_center.v - dd; its_port_locs_p[2].v = its_port_locs_p[3].v = its_center.v + dd; its_port_locs_p[0].h = its_port_locs_p[3].h = its_center.h - dd; its_port_locs_p[1].h = its_port_locs_p[2].h = its_center.h + dd; } //****************************************** BEAM_SPL::BEAM_SPL( const Point & m_down_pt) //in :NODE(m_down_pt), its_icon_dir(0) { init_port_locs(); for(USHORT i=0; i<4 ;i++){ its_port_guests_p[i]= -1; } } #pragma mark --port related-- //****************************************** BOOLEAN BEAM_SPL::pt_is_in_greeting_cir_of_avail_d_port( const Point & pt, //in USHORT & sub_nd_id) //out { C_CIRCLE greeting_cir; greeting_cir.its_radius = port_greeting_rad; for(USHORT i=0; i<2; i++){ greeting_cir.its_center= its_port_locs_p[i]; if((its_port_guests_p[i]<0) && greeting_cir.pt_is_in(pt)){ sub_nd_id = i; return true; } } return false; } //****************************************** BOOLEAN BEAM_SPL::pt_is_in_greeting_cir_of_avail_s_port( const Point & pt, //in USHORT & sub_nd_id) //out { C_CIRCLE greeting_cir; greeting_cir.its_radius = port_greeting_rad; for(USHORT i=2; i<4; i++){ greeting_cir.its_center= its_port_locs_p[i]; if( (its_port_guests_p[i]<0) && greeting_cir.pt_is_in(pt) ){ sub_nd_id = i; return true; } } return false; } //****************************************** VOID BEAM_SPL::remove_nd_from_all_port_glists( USHORT g_nd_id) //in { for(USHORT i=0; i<4; i++){ if(its_port_guests_p[i] == g_nd_id)its_port_guests_p[i]=-1; } } //****************************************** VOID BEAM_SPL::renumber_nds_of_port_glists( const UI_MAP & map) //in { for(USHORT i=0; i<4; i++){ if(its_port_guests_p[i] != -1){ its_port_guests_p[i]=map.its_newfo[its_port_guests_p[i]]; } } } #pragma mark --drawing-- //****************************************** VOID BEAM_SPL::draw() {//drawer its_efield_p->Draw(0); if(!its_efield_p->GetSuperView()->FocusDraw())return; if(its_state_num_for_cap!=max_ushort) draw_state_cap(); StCPTstate saved_st(true, true, false); saved_st.Normalize(); Rect r; ::SetRect(&r, its_center.h -default_mask_rad, its_center.v -default_mask_rad, its_center.h +default_mask_rad, its_center.v +default_mask_rad); //first paint yellow mask if there is color: if(UEnvironment::HasFeature(env_SupportsColor)){ ::RGBForeColor(&C_COLORS::its_yellow); ::PaintOval(&r); ::RGBForeColor(&C_COLORS::its_black); } //now draw black rim: ::FrameOval(&r); //finally, draw crossed arrows and bisecting line C_ARROW_DRAWER cupid(its_efield_p->GetSuperView(), 6, 30); //(view, arrowhead's length, halfwidth) limited_degrees(its_icon_dir); DOUBLE theta= my_pi/180 * its_icon_dir; //theta gives icon_dir in radians DOUBLE rad = default_mask_rad-2;// minus two to avoid glitch (stepping-beyond-boundary) SInt16 ssr= nearest_int16(rad*sin(my_pi/4 +theta)); SInt16 ccr= nearest_int16(rad*cos(my_pi/4 +theta)); SInt16 ssm= nearest_int16(rad*sin(theta)); SInt16 ccm= nearest_int16(rad*cos(theta)); SInt16 ssl= nearest_int16(rad*sin(my_pi/4 -theta)); SInt16 ccl= nearest_int16(rad*cos(my_pi/4 -theta)); Point init_pt, fin_pt; ::MoveTo(its_center.h + ssm , its_center.v -ccm ); ::LineTo(its_center.h - ssm , its_center.v +ccm ); ::SetPt(&init_pt, its_center.h - ssl , its_center.v - ccl ); ::SetPt(&fin_pt, its_center.h + ssl , its_center.v + ccl ); cupid.sketch(init_pt, fin_pt); ::SetPt(&init_pt, its_center.h + ssr , its_center.v - ccr ); ::SetPt(&fin_pt, its_center.h - ssr , its_center.v + ccr ); cupid.sketch(init_pt, fin_pt); } #pragma mark --move-- //****************************************** VOID BEAM_SPL::move_by( const Point & delta) //in { undraw(); if(its_is_selected) undraw_sel_handles(); its_center.h += delta.h; its_center.v += delta.v; its_efield_p->MoveBy(SInt32(delta.h), SInt32(delta.v), false); for(USHORT i=0; i<4; i++){ its_port_locs_p[i].h += delta.h; its_port_locs_p[i].v += delta.v; } draw(); if(its_is_selected) draw_sel_handles(); } #pragma mark --rotate-- /* This function no good because the errors feedback and each time you use it //****************************************** VOID BEAM_SPL::rotate_rim_pt( Point & pt, //i-o SInt16 ang) //in { //pt is both input and output DOUBLE cc = cos(my_pi/180 * ang); DOUBLE ss = sin(my_pi/180 * ang); DOUBLE x, y; x = its_center.h + cc*(pt.h -its_center.h) - ss*(pt.v -its_center.v); y = its_center.v + ss*(pt.h -its_center.h) + cc*(pt.v -its_center.v); pt.h = nearest_int16(x); pt.v = nearest_int16(y); } */ //****************************************** VOID BEAM_SPL::refresh_port_locs() { DOUBLE theta= my_pi/180 * its_icon_dir; //theta gives icon_dir in radians DOUBLE rad = default_mask_rad; SInt16 ssr= nearest_int16(rad*sin(my_pi/4 +theta)); SInt16 ccr= nearest_int16(rad*cos(my_pi/4 +theta)); SInt16 ssl= nearest_int16(rad*sin(my_pi/4 -theta)); SInt16 ccl= nearest_int16(rad*cos(my_pi/4 -theta)); ::SetPt(&its_port_locs_p[0], its_center.h - ssl , its_center.v - ccl ); ::SetPt(&its_port_locs_p[2], its_center.h + ssl , its_center.v + ccl ); ::SetPt(&its_port_locs_p[1], its_center.h + ssr , its_center.v - ccr ); ::SetPt(&its_port_locs_p[3], its_center.h - ssr , its_center.v + ccr ); } //****************************************** VOID BEAM_SPL::rotate() { its_icon_dir += the_rot_ang; limited_degrees(its_icon_dir); /* for(USHORT i=0; i<4; i++){ rotate_rim_pt(its_port_locs_p[i], the_rot_ang); } */ refresh_port_locs(); draw(); } //****************************************** VOID BEAM_SPL::set_icon_dir( SInt16 icon_dir) //in { SInt16 ang= icon_dir; limited_degrees(ang); USHORT count = ang/the_rot_ang; // remainder is thrown away its_icon_dir = count*the_rot_ang; refresh_port_locs(); } #pragma mark --amp gen-- //****************************************** VOID BEAM_SPL::call_amp_gen( QB_NET * net_p, //in C_PI_WIND * pi_wind_p) //in { if(its_amp_gen_p==0){//set to nil in NODE::NODE() and NODE::NODE(const Point & center) its_amp_gen_p = new C_BEAM_SPL_AMP_GEN(this, net_p, pi_wind_p); //delete: by NODE::~NODE() //Created first time it is used ThrowIfNil_(its_amp_gen_p ); } its_amp_gen_p->talk(); } //****************************************** VOID BEAM_SPL::obey_amp_gen( USHORT max_n_sum, //in const TWO_MODE_FUN & two_fun, //in const USHORT * m1x_p, //in const USHORT * m2x_p, //in const USHORT * m1y_p, //in const USHORT * m2y_p) //in { empty_trans_mat(); SHORT row = -1; COMPLEX zx(0, 0); COMPLEX zy(0, 0); USHORT n1x, n2x, n1y, n2y; USHORT nx_sum, n1_sum, n2_sum; TM_COL_NUM in_st; BOOLEAN tm_row_starting; if(m1y_p==0){//scalar field case for(nx_sum=0; nx_sum<=max_n_sum; nx_sum++){ // nx_sum = n1x + n2x for(n2x=0; n2x<= nx_sum; n2x++){ n1x = nx_sum - n2x; tm_row_starting = true; for(in_st=0; in_st=amps_floor){ if(tm_row_starting){ row++; its_st_names[row] = STRINGY("(" ) && n1x && "," && n2x && ")"; tm_row_starting=false; } its_tm_amps.set_ele(row, in_st, zx); } } }} }else{//vector field case for(n1_sum=0; n1_sum<= max_n_sum; n1_sum++){//n1_sum = n1x + n1y for(n1y=0; n1y<= n1_sum; n1y++){ n1x = n1_sum - n1y; for(n2_sum=0; n2_sum<= max_n_sum - n1_sum; n2_sum++){ for(n2y=0; n2y<= n2_sum; n2y++){ n2x = n2_sum - n2y; tm_row_starting = true; for(in_st=0; in_st=amps_floor){ zy = two_fun.get_bs_amp(n1y, n2y, m1y_p[in_st], m2y_p[in_st]); if(abs(zy)>=amps_floor){ if(tm_row_starting){ row++; its_st_names[row] = STRINGY("((" ) && n1x && "," && n1y && "),(" && n2x && "," && n2y && "))"; tm_row_starting=false; } its_tm_amps.set_ele(row, in_st, zx*zy); } } } }}}} } } // ********************************************* #endif //_mac_gui_app \\............................................// \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Ansi_Nodes/BEAM_SPL.h b/Legacy/QFog2-MachO/QFogSource/Ansi_Nodes/BEAM_SPL.h new file mode 100644 index 0000000..4193e11 --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Ansi_Nodes/BEAM_SPL.h @@ -0,0 +1 @@ +#pragma once #include "QFog_constants.h" #ifdef _mac_gui_app //''''''''''''''''''''''''''''''''''''''''''''\\. class C_MAIN_VIEW; #include "C_PORT_RELATED.h" #include "C_COLORS.h" #include "C_ARROW_DRAWER.h" #include "UI_MAP.h" #include "TWO_MODE_FUN.h" class QB_NET; class C_PI_WIND; class C_BEAM_SPL_AMP_GEN; #endif //_mac_gui_app \\............................................// #include "NODE.h" //****************************************** class BEAM_SPL : public NODE { private: public: BEAM_SPL(); virtual ~BEAM_SPL(); #ifdef _mac_gui_app //''''''''''''''''''''''''''''''''''''''''''''\\. private: enum {the_rot_ang=15, port_docking_rad = 0, port_greeting_rad = 5 }; SInt16 its_icon_dir; //its_icon_dir measures in degrees //the amount of clockwise rotation of the icon // Let nw=northwest, etc. The beam splitter icon before // being rotated has two destination-only ports at nw and ne, // and two source-only ports at se and sw. We will identify // nw=0 and ne=1 (destination ports) // se=2 and sw=3 (source ports): Point its_port_locs_p[4]; // max_load=1 for all ports SInt16 its_port_guests_p[4];// the nd_id of guest or negative number if no guest public: STRINGY get_class_str(); ND_CLASS_ID get_class_id(); VOID init_port_locs(); BEAM_SPL(const Point & m_down_pt); USHORT get_port_guest(USHORT sub_nd_id); C_CIRCLE get_docking_cir(USHORT sub_nd_id); BOOLEAN pt_is_in_greeting_cir_of_avail_d_port( const Point & pt, USHORT & sub_nd_id); BOOLEAN pt_is_in_greeting_cir_of_avail_s_port( const Point & pt, USHORT & sub_nd_id); VOID add_nd_to_port_glist(USHORT g_nd_id, USHORT sub_nd_id); VOID remove_nd_from_all_port_glists(USHORT g_nd_id); VOID renumber_nds_of_port_glists(const UI_MAP & map); VOID draw(); VOID move_by( const Point & delta); // VOID rotate_rim_pt(Point & pt, SInt16 ang); //ang in degrees VOID refresh_port_locs(); VOID rotate(); BOOLEAN has_icon_dir(); SInt16 get_icon_dir() const; VOID set_icon_dir(SInt16 icon_dir); VOID call_amp_gen(QB_NET * net_p, C_PI_WIND * pi_wind_p); VOID obey_amp_gen(USHORT mx_n_sum, const TWO_MODE_FUN & two_fun, const USHORT * m1x_p,const USHORT * m2x_p,const USHORT * m1y_p,const USHORT * m2y_p); #endif //_mac_gui_app \\............................................// }; #pragma mark - #ifdef _mac_gui_app //''''''''''''''''''''''''''''''''''''''''''''\\. //****************************************** inline STRINGY BEAM_SPL::get_class_str() { return "BEAM_SPL"; } //****************************************** inline ND_CLASS_ID BEAM_SPL::get_class_id() { return BEAM_SPL_id; } //****************************************** inline USHORT BEAM_SPL::get_port_guest( USHORT sub_nd_id) //in { return its_port_guests_p[sub_nd_id]; } //****************************************** inline C_CIRCLE BEAM_SPL::get_docking_cir( USHORT sub_nd_id) //in { return C_CIRCLE(its_port_locs_p[sub_nd_id], port_docking_rad); } //****************************************** inline VOID BEAM_SPL::add_nd_to_port_glist( USHORT g_nd_id, //in USHORT sub_nd_id) //in { its_port_guests_p[sub_nd_id]= g_nd_id; } //****************************************** inline BOOLEAN BEAM_SPL::has_icon_dir() { return true; } //****************************************** inline SInt16 BEAM_SPL::get_icon_dir() const { return its_icon_dir; } #endif //_mac_gui_app \\............................................// \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Ansi_Nodes/CUSTOM_ND.cpp b/Legacy/QFog2-MachO/QFogSource/Ansi_Nodes/CUSTOM_ND.cpp new file mode 100644 index 0000000..69b598a --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Ansi_Nodes/CUSTOM_ND.cpp @@ -0,0 +1 @@ +#include "CUSTOM_ND.h" #ifdef _mac_gui_app //''''''''''''''''''''''''''''''''''''''''''''\\. #include "StCPTstate.h" #endif //_mac_gui_app \\............................................// //****************************************** #pragma mark --creation/destruction-- //****************************************** CUSTOM_ND::CUSTOM_ND() {} //****************************************** CUSTOM_ND::~CUSTOM_ND() {} #pragma mark ----used only with macgui---- #ifdef _mac_gui_app //''''''''''''''''''''''''''''''''''''''''''''\\. #pragma mark --creation/destruction-- //****************************************** CUSTOM_ND::CUSTOM_ND( const Point & m_down_pt) //in :NODE( m_down_pt), its_color(C_COLORS::its_white) {} #pragma mark --drawing-- //****************************************** VOID CUSTOM_ND::draw() {//drawer its_efield_p->Draw(0); if(!its_efield_p->GetSuperView()->FocusDraw())return; if(its_state_num_for_cap!=max_ushort) draw_state_cap(); StCPTstate saved_st(true, true, false); saved_st.Normalize(); // first draw colored mask: ::RGBForeColor(&its_color); Rect r; ::SetRect(&r, its_center.h -default_mask_rad, its_center.v -default_mask_rad, its_center.h +default_mask_rad, its_center.v +default_mask_rad); ::PaintOval(&r); //now draw black rim: ::RGBForeColor(&C_COLORS::its_black); ::FrameOval(&r); } #endif //_mac_gui_app \\............................................// \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Ansi_Nodes/CUSTOM_ND.h b/Legacy/QFog2-MachO/QFogSource/Ansi_Nodes/CUSTOM_ND.h new file mode 100644 index 0000000..98669e3 --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Ansi_Nodes/CUSTOM_ND.h @@ -0,0 +1 @@ +#pragma once #include "QFog_constants.h" #ifdef _mac_gui_app //''''''''''''''''''''''''''''''''''''''''''''\\. #include "C_COLORS.h" class C_MAIN_VIEW; class QB_NET; class C_PI_WIND; class C_BEAM_SPL_AMP_GEN; #endif //_mac_gui_app \\............................................// #include "VECTOR.h" #include "STRINGY.h" #include "NODE.h" #include "STRETCH_OR_FOLD.h" //****************************************** class CUSTOM_ND : public NODE { private: public: CUSTOM_ND(); virtual ~CUSTOM_ND(); #ifdef _mac_gui_app //''''''''''''''''''''''''''''''''''''''''''''\\. private: // The node has one s/d port that can carry unlimited s and d loads. // loc = the center of the icon, // greeting_rad = sel_rad // docking_rad = mask_rad RGBColor its_color; public: CUSTOM_ND( const Point & m_down_pt); STRINGY get_class_str(); ND_CLASS_ID get_class_id(); virtual VOID set_st_names_to_default(); const RGBColor & get_color() const; BOOLEAN has_color(); VOID set_color(const RGBColor & color); VOID draw(); VOID call_amp_gen(QB_NET * net_p, C_PI_WIND * pi_wind_p){}; #endif //_mac_gui_app \\............................................// }; #pragma mark - #ifdef _mac_gui_app //''''''''''''''''''''''''''''''''''''''''''''\\. //****************************************** inline STRINGY CUSTOM_ND::get_class_str() { return "CUSTOM_ND"; } //****************************************** inline ND_CLASS_ID CUSTOM_ND::get_class_id() { return CUSTOM_ND_id; } //****************************************** inline VOID CUSTOM_ND::set_st_names_to_default() { set_st_names_to_monotone_seq(1); } //****************************************** inline const RGBColor & CUSTOM_ND::get_color() const { return its_color; } //****************************************** inline BOOLEAN CUSTOM_ND::has_color() { return true; } //****************************************** inline VOID CUSTOM_ND::set_color( const RGBColor & color) //in { its_color = color; } #endif //_mac_gui_app \\............................................// \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Ansi_Nodes/DET_ND.cpp b/Legacy/QFog2-MachO/QFogSource/Ansi_Nodes/DET_ND.cpp new file mode 100644 index 0000000..95b1d63 --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Ansi_Nodes/DET_ND.cpp @@ -0,0 +1 @@ +#include "DET_ND.h" #ifdef _mac_gui_app //''''''''''''''''''''''''''''''''''''''''''''\\. #include "StCPTstate.h" #include "C_DET_ND_AMP_GEN.h" #endif //_mac_gui_app \\............................................// #pragma mark --creation/destruction-- //****************************************** DET_ND::DET_ND() {} //****************************************** DET_ND::~DET_ND() { } //****************************************** #pragma mark ----used only with macgui---- #ifdef _mac_gui_app //''''''''''''''''''''''''''''''''''''''''''''\\. #pragma mark --creation/destruction-- //****************************************** DET_ND::DET_ND( const Point & m_down_pt) //in :NODE( m_down_pt), its_color(C_COLORS::its_black) { } #pragma mark --drawing-- //****************************************** VOID DET_ND::draw() {//drawer its_efield_p->Draw(0); if(!its_efield_p->GetSuperView()->FocusDraw())return; if(its_state_num_for_cap!=max_ushort) draw_state_cap(); StCPTstate saved_st(true, true, false); saved_st.Normalize(); // first draw colored mask: ::RGBForeColor(&its_color); Rect r; ::SetRect(&r, its_center.h - mask_rad, its_center.v - mask_rad, its_center.h + mask_rad, its_center.v + mask_rad); ::PaintOval(&r); //now draw black rim: ::RGBForeColor(&C_COLORS::its_black); ::FrameOval(&r); } #pragma mark --amp gen-- //****************************************** VOID DET_ND::call_amp_gen( QB_NET * net_p, //in C_PI_WIND * pi_wind_p) //in { if(its_amp_gen_p==0){//set to nil in NODE::NODE() and NODE::NODE(const Point & center) its_amp_gen_p = new C_DET_ND_AMP_GEN(this, net_p, pi_wind_p); //delete: by NODE::~NODE() //Created first time it is used ThrowIfNil_(its_amp_gen_p ); } its_amp_gen_p->talk(); } #endif //_mac_gui_app \\............................................// \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Ansi_Nodes/DET_ND.h b/Legacy/QFog2-MachO/QFogSource/Ansi_Nodes/DET_ND.h new file mode 100644 index 0000000..c3659f2 --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Ansi_Nodes/DET_ND.h @@ -0,0 +1 @@ +#pragma once #include "QFog_constants.h" #include "VECTOR.h" #include "NODE.h" //det = deterministic #ifdef _mac_gui_app //''''''''''''''''''''''''''''''''''''''''''''\\. class QB_NET; class C_PI_WIND; class C_DET_ND_AMP_GEN; enum DET_ND_TYPE {k_cnot=1, k_marg, k_pshifter}; #endif //_mac_gui_app \\............................................// //****************************************** class DET_ND : public NODE { private: public: DET_ND(); virtual ~DET_ND(); #ifdef _mac_gui_app //''''''''''''''''''''''''''''''''''''''''''''\\. private: // The node has one s/d port that can carry unlimited s and d loads. // loc = the center of the icon, // greeting_rad = sel_rad // docking_rad = mask_rad enum {sel_rad=8, mask_rad=6}; RGBColor its_color; public: DET_ND( const Point & m_down_pt); STRINGY get_class_str(); ND_CLASS_ID get_class_id(); virtual VOID set_st_names_to_default(); virtual USHORT get_sel_rad() const; virtual USHORT get_mask_rad() const; const RGBColor & get_color() const; BOOLEAN has_color(); VOID set_color(const RGBColor & color); VOID draw(); VOID undraw(); VOID call_amp_gen(QB_NET * net_p, C_PI_WIND * pi_wind_p); #endif //_mac_gui_app \\............................................// }; #pragma mark - #ifdef _mac_gui_app //''''''''''''''''''''''''''''''''''''''''''''\\. //****************************************** inline STRINGY DET_ND::get_class_str() { return "DET_ND"; } //****************************************** inline ND_CLASS_ID DET_ND::get_class_id() { return DET_ND_id; } //****************************************** inline VOID DET_ND::set_st_names_to_default() { set_st_names_to_monotone_seq(0); } //****************************************** inline USHORT DET_ND::get_sel_rad() const { return sel_rad; } //****************************************** inline USHORT DET_ND::get_mask_rad() const { return mask_rad; } //****************************************** inline const RGBColor & DET_ND::get_color() const { return its_color; } //****************************************** inline BOOLEAN DET_ND::has_color() { return true; } //****************************************** inline VOID DET_ND::set_color( const RGBColor & color) //in { its_color = color; } //****************************************** inline VOID DET_ND::undraw() { NODE::undraw(mask_rad); } #endif //_mac_gui_app \\............................................// \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Ansi_Nodes/NODE.cpp b/Legacy/QFog2-MachO/QFogSource/Ansi_Nodes/NODE.cpp new file mode 100644 index 0000000..e7d71dc --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Ansi_Nodes/NODE.cpp @@ -0,0 +1 @@ +#include "NODE.h" #pragma mark --creation/destruction-- //****************************************** ST_NAMES_GENERATOR_DATA::ST_NAMES_GENERATOR_DATA() :its_num_of_comps(1), its_min_char('0'), its_max_char('1'), its_has_commas(false) {} //****************************************** NODE::NODE() :its_degen(1), its_st_names("x", 1), its_st_name_dict_p(0), its_num_of_in_sts(1) { #ifdef _mac_gui_app //''''''''''''''''''''''''''''''''''''''''''''\\. its_amp_gen_p = 0; #endif //_mac_gui_app \\............................................// // note that the default TRANS_MAT constructor creates a 1 X 1 zero matrix its_active_states.insert(0); } //****************************************** NODE::~NODE() { #ifdef _mac_gui_app //''''''''''''''''''''''''''''''''''''''''''''\\. if(its_amp_gen_p!=0){ delete its_amp_gen_p; its_amp_gen_p = 0; } #endif //_mac_gui_app \\............................................// } #pragma mark --degen-- //****************************************** VOID NODE::set_degen( USHORT degen) //in { //I've coded so that this function is never called with degen==0 //ThrowIf_(degen==0); its_degen = degen; its_st_names.resize("x", degen); its_tm_amps.set_num_of_rows(degen); its_active_states.resize(degen); its_cum_probs.set_to_default_vec(0, degen); its_cum_amps.set_to_default_vec(COMPLEX(0, 0), degen); } #pragma mark --state names-- //****************************************** VOID NODE::set_st_names_to_monotone_seq( USHORT starting_point) //in { USHORT j = starting_point; for(USHORT row=0; row32); for(pos=0; pos32); for(xpos=0; xpos // QB_NET::kill_nd_st_dictionaries()->NODE::kill_dict() ThrowIfNil_(its_st_name_dict_p); }else{ its_st_name_dict_p->add_one_user(); } } //****************************************** VOID NODE::kill_dict() { if(its_st_name_dict_p->get_num_of_users()<=1){ delete its_st_name_dict_p; its_st_name_dict_p = 0; }else{ its_st_name_dict_p->del_one_user(); } } #pragma mark --in nodes-- //****************************************** VOID NODE::set_num_of_in_sts() { // note that if its_in_nds has zero length, // this sets its_num_of_in_sts to 1. its_num_of_in_sts = 1; for(USHORT i =0; i < its_in_nds.get_len() ; i++){ its_num_of_in_sts *= its_in_nd_degens[i]; } } //****************************************** VOID NODE::add_in_nd( USHORT nd_id, //in USHORT nd_degen) //in { its_in_nds.insert_last(nd_id); its_in_nd_degens.insert_last(nd_degen); its_in_nd_sof.init(its_in_nd_degens); set_num_of_in_sts(); its_tm_amps.set_to_zero_mat(its_degen, its_num_of_in_sts); } //****************************************** VOID NODE::del_in_nd( USHORT nd_id) //in { USHORT loc= its_in_nds.loc_of_target(nd_id); its_in_nds.extract_at(loc); its_in_nd_degens.extract_at(loc); its_in_nd_sof.init(its_in_nd_degens); set_num_of_in_sts(); its_tm_amps.set_to_zero_mat(its_degen, its_num_of_in_sts); } //****************************************** VOID NODE::set_in_nd_degen( USHORT nd_id, //in USHORT new_degen) //in { // assumes that nd_id is contained in its_in_nds. USHORT loc = its_in_nds.loc_of_target(nd_id); if(its_in_nd_degens[loc]==new_degen)return; // we used to try to save some of the trans_mat. Now we just set it to zero. // VECTOR new_nd_degens = its_in_nd_degens; // new_nd_degens[loc] =new_degen; // COL_LABEL_TRANSLATOR ator(its_in_nd_degens, new_nd_degens); // its_tm_amps.relabel_cols( ator ); its_in_nd_degens[loc] =new_degen; its_in_nd_sof.init(its_in_nd_degens); set_num_of_in_sts(); its_tm_amps.set_to_zero_mat(its_degen, its_num_of_in_sts); } //****************************************** VOID NODE::renumber_in_nds( const UI_MAP & map) //in { //called by VOID QB_NET::reorder_nds(() for(USHORT i=0; i saved_in_nds(its_in_nds); VECTOR saved_in_nd_degens(its_in_nd_degens); STRETCH_OR_FOLD saved_in_nd_sof(its_in_nd_sof); for(i=0; i< num_of_in_nds; i++){ old_i = map.its_oldfn[i]; its_in_nds[i] = saved_in_nds[old_i]; its_in_nd_degens[i] = saved_in_nd_degens[old_i]; } its_in_nd_sof.reorder_degens(map); if(touch_tm)its_tm_amps.reorder_cols_as_part_of_reordering_in_nds(saved_in_nd_sof, its_in_nd_sof, map); } //****************************************** VOID NODE::change_in_nd_to_compatible_one( USHORT old_nd, //in USHORT new_nd) //in { //this function is called by QB_NET::change_source_nd_of_ar() USHORT loc= its_in_nds.loc_of_target(old_nd); its_in_nds[loc] =new_nd; //its_in_nd_degens: no change //its_in_nd_sof: no change //its_num_of_in_sts: no change //its_tm_amps: no change } #pragma mark --out nodes-- //****************************************** VOID NODE::renumber_out_nds( const UI_MAP & map) //in { //called by VOID QB_NET::reorder_nds(() for(USHORT i=0; i saved_st_names(its_st_names); for(i=0; i< num_of_rows; i++){ its_st_names[i] = saved_st_names[map.its_oldfn[i]]; } //I won't reorder the dictionary since I don't expect it to //be around when I call this method. ThrowIf_(its_st_name_dict_p!=0); its_tm_amps.reorder_rows(map); SET saved_active_states(its_active_states); its_active_states.empty(); for(i=0; i< num_of_rows; i++){ if(saved_active_states.contains(map.its_oldfn[i])){ its_active_states.insert(i); } } } //****************************************** VOID NODE::change_tm_as_part_of_reordering_nd_sts_of_a_pa( USHORT pa_id, //in const UI_MAP & map) //in { its_tm_amps.reorder_cols_as_part_of_reordering_nd_sts_of_a_pa( its_in_nds.loc_of_target(pa_id), its_in_nd_sof, map); } #pragma mark --active states-- //****************************************** VOID NODE::fill_act_st_set() { for(USHORT i=0;iits_next_p; reset_dyn_in_st(); } //****************************************** VOID NODE::move_dyn_dir_ele_ptr_to_first_col() { its_dyn_dir_ele_p = its_tm_amps.get_row_ptr(its_dyn_st); reset_dyn_in_st(); } //****************************************** BOOLEAN NODE::has_dyn_in_st() const { if(its_dyn_dir_ele_p==0){ return false; }else{ return true; } } //****************************************** VOID NODE::reset_dyn_in_st() { if(its_dyn_dir_ele_p!=0){ its_dyn_in_st = its_in_nd_sof.vec_label(its_dyn_dir_ele_p->its_col_num); }else{ its_dyn_in_st.set_to_default_vec(max_ushort, its_in_nds.get_len()); } } //****************************************** VOID NODE::normalize_cum_probs() { DOUBLE sum=0.; USHORT st; for(st=0; st its_st_names; // st = state DICTIONARY * its_st_name_dict_p; VECTOR its_in_nds; // nds = nodes, in = incoming VECTOR its_in_nd_degens; // degens = numbers of states STRETCH_OR_FOLD its_in_nd_sof; TM_COL_NUM its_num_of_in_sts; VECTOR its_out_nds; // out = outgoing TRANS_MAT its_tm_amps; // amps = amplitudes SET its_active_states; SET its_tempo_active_states; // The previous data members are the static info. // The next data members are the dynamic info. // By a dynamic(static) data member we mean one that // changes repeatedly (does not change) // when we call the function QB_NET::go_forward(). // NOTE that cum_probs are not necessarily normalized, // so they are not probabilities in the strict sense. // One might call them quasi probabilities. USHORT its_dyn_st; VECTOR its_dyn_in_st; const DIR_NZ_ELE * its_dyn_dir_ele_p; VECTOR its_cum_amps; //cum = cummulative VECTOR its_cum_probs; public: NODE(); virtual ~NODE(); const STRINGY & get_name() const; VOID set_name(const STRINGY & name); USHORT get_degen() const; VOID set_degen(USHORT degen); const STRINGY & get_st_name(USHORT loc) const; VOID set_st_name(USHORT row_num, const STRINGY & new_name); virtual VOID set_st_names_to_default(); VOID set_st_names_to_monotone_seq(USHORT starting_point); VOID set_st_names(const ST_NAMES_GENERATOR_DATA & v); const DICTIONARY & get_dict() const; VOID create_dict(); VOID kill_dict(); TRANS_MAT & get_tm_amps(); VOID set_tm_amp(USHORT row, TM_COL_NUM col, const COMPLEX & z ); DOUBLE get_col_prob(TM_COL_NUM col); VOID empty_trans_mat(); TM_COL_NUM get_num_of_in_sts(); virtual VOID set_num_of_in_sts(); const VECTOR & get_in_nds() const; const STRETCH_OR_FOLD & get_in_nd_sof() const; USHORT get_num_of_in_nds() const; virtual VOID add_in_nd(USHORT nd_id, USHORT nd_degen); virtual VOID del_in_nd(USHORT nd_id); const VECTOR & get_in_nd_degens() const; virtual VOID set_in_nd_degen(USHORT nd_id, USHORT new_degen); virtual VOID renumber_in_nds(const UI_MAP & map); virtual VOID reorder_in_nds(const UI_MAP & map, BOOLEAN touch_tm); virtual VOID change_in_nd_to_compatible_one(USHORT old_nd, USHORT new_nd); const VECTOR & get_out_nds() const; VOID add_out_nd(USHORT nd_id); VOID del_out_nd(USHORT nd_id); VOID renumber_out_nds(const UI_MAP & map); VOID reorder_sts(const UI_MAP & map); VOID change_tm_as_part_of_reordering_nd_sts_of_a_pa(USHORT pa_id, const UI_MAP & map); const SET & get_active_states() const; VOID set_active_states(const SET & act_sts); VOID empty_act_st_set(); VOID fill_act_st_set(); USHORT get_num_of_active_states(); BOOLEAN is_active_state(USHORT state); VOID activate_state(USHORT state); VOID deactivate_state(USHORT state); VOID preserve_act_st_set(); VOID restore_act_st_set(); USHORT get_dyn_st() const; VOID set_dyn_st(USHORT dyn_st); VOID set_dyn_st_and_dir_ele_ptr(USHORT dyn_st); VOID advance_dyn_dir_ele_ptr(); VOID move_dyn_dir_ele_ptr_to_first_col(); BOOLEAN has_dyn_in_st() const; const VECTOR & get_dyn_in_st() const; VOID reset_dyn_in_st(); const COMPLEX & get_dyn_amp() const; DOUBLE get_cum_prob(USHORT state) const; VOID normalize_cum_probs(); VOID set_cum_info_to_default(); VOID add_to_dyn_st_entry_of_cum_amps(const COMPLEX & net_amp); VOID prepare_cum_info_for_next_ending(); #ifdef _mac_gui_app //''''''''''''''''''''''''''''''''''''''''''''\\. protected: Point its_center; BOOLEAN its_is_selected; C_ND_EFIELD * its_efield_p; // Equals max_ushort if no caption and number of state if there is: USHORT its_state_num_for_cap; Rect its_state_cap_frame; enum {default_sel_rad=16, default_mask_rad=16}; C_AMP_GEN * its_amp_gen_p; public: NODE( const Point & center); virtual const STRINGY get_class_str()=0; virtual ND_CLASS_ID get_class_id()=0; virtual VOID call_amp_gen(QB_NET * net_p, C_PI_WIND * pi_wind_p)=0; C_ND_EFIELD * get_efield_ptr() const; VOID set_efield_ptr(C_ND_EFIELD * efield_p); const Point & get_center() const; //override if different from default virtual USHORT get_sel_rad() const; virtual USHORT get_mask_rad() const; virtual C_CIRCLE get_docking_cir(USHORT sub_nd_id); virtual BOOLEAN pt_is_in_greeting_cir_of_avail_s_port(const Point & pt, USHORT & sub_nd_id); virtual BOOLEAN pt_is_in_greeting_cir_of_avail_d_port(const Point & pt, USHORT & sub_nd_id); virtual VOID add_nd_to_port_glist(USHORT g_nd_id, USHORT sub_nd_id);//glist = guest list virtual VOID remove_nd_from_all_port_glists(USHORT g_nd_id); virtual VOID renumber_nds_of_port_glists(const UI_MAP & map); BOOLEAN is_selected() const; virtual BOOLEAN pt_is_in_sel_cir(const Point & pt); virtual C_CIRCLE get_selection_cir(); virtual Boolean select(C_MAIN_VIEW * mview_p); virtual Boolean unselect(C_MAIN_VIEW * mview_p); virtual VOID toggle_select(C_MAIN_VIEW * mview_p); VOID draw_sel_handles_wkr(); virtual VOID draw_sel_handles(); virtual VOID undraw_sel_handles(); VOID draw_state_cap(); VOID undraw_state_cap(); VOID set_state_num_for_cap(USHORT state); virtual const RGBColor & get_color() const; virtual VOID set_color(const RGBColor & color); virtual BOOLEAN has_color(); virtual VOID draw(); VOID undraw(SInt16 radius); virtual VOID undraw(); virtual VOID move_by(const Point & delta); virtual VOID rotate(); virtual SInt16 get_icon_dir() const; virtual VOID set_icon_dir(SInt16 icon_dir); virtual BOOLEAN has_icon_dir(); VOID write_net_stream(LStream & net_stream); VOID read_net_stream(LStream & net_stream); #endif //_mac_gui_app \\............................................// }; #pragma mark - //****************************************** inline const STRINGY & NODE::get_name() const { return its_name; } //****************************************** inline VOID NODE::set_name( const STRINGY & name) //in { its_name = name; } //****************************************** inline USHORT NODE::get_degen() const { return its_degen; } //****************************************** inline const STRINGY & NODE::get_st_name( USHORT loc) //in const { return its_st_names[loc]; } //****************************************** inline VOID NODE::set_st_name( USHORT row_num, //in const STRINGY & new_name) //in { its_st_names[row_num]=new_name; } //****************************************** inline VOID NODE::set_st_names_to_default() { } //****************************************** inline const DICTIONARY & NODE::get_dict() const { return *its_st_name_dict_p; } //****************************************** inline TRANS_MAT & NODE::get_tm_amps() { return its_tm_amps; } //****************************************** inline VOID NODE::set_tm_amp( USHORT row, //in TM_COL_NUM col, //in const COMPLEX & z ) //in { its_tm_amps.set_ele(row, col, z); } //****************************************** inline DOUBLE NODE::get_col_prob( TM_COL_NUM col) //in { return its_tm_amps.get_col_prob(col); } //****************************************** inline VOID NODE::empty_trans_mat() { its_tm_amps.set_to_zero_mat(its_degen, its_num_of_in_sts); } //****************************************** inline TM_COL_NUM NODE::get_num_of_in_sts() { return its_num_of_in_sts; } //****************************************** inline const VECTOR & NODE::get_in_nds() const { return its_in_nds; } //****************************************** inline const STRETCH_OR_FOLD & NODE::get_in_nd_sof() const { return its_in_nd_sof; } //****************************************** inline USHORT NODE::get_num_of_in_nds() const { return its_in_nds.get_len(); } //****************************************** inline const VECTOR & NODE::get_in_nd_degens() const { return its_in_nd_degens; } //****************************************** inline const VECTOR & NODE::get_out_nds() const { return its_out_nds; } //****************************************** inline VOID NODE::add_out_nd( USHORT nd_id) //in { its_out_nds.insert_last(nd_id); } //****************************************** inline VOID NODE::del_out_nd( USHORT nd_id) //in { its_out_nds.extract_at(its_out_nds.loc_of_target(nd_id)); } //****************************************** inline const SET & NODE::get_active_states() const { return its_active_states; } //****************************************** inline VOID NODE::set_active_states( const SET & act_sts) //in { its_active_states = act_sts; } //****************************************** inline VOID NODE::empty_act_st_set() { its_active_states.empty(); } //****************************************** inline USHORT NODE::get_num_of_active_states() { return its_active_states.get_num_of_elems(); } //****************************************** inline BOOLEAN NODE::is_active_state( USHORT state) //in { return its_active_states.contains(state); } //****************************************** inline VOID NODE::activate_state( USHORT state) //in { its_active_states.insert(state); } //****************************************** inline VOID NODE::deactivate_state( USHORT state) //in { its_active_states.extract(state); } //****************************************** inline VOID NODE::preserve_act_st_set() { its_tempo_active_states = its_active_states; } //****************************************** inline USHORT NODE::get_dyn_st() const { return its_dyn_st; } //****************************************** inline VOID NODE::set_dyn_st( USHORT dyn_st) //in { its_dyn_st = dyn_st; } //****************************************** inline const VECTOR & NODE::get_dyn_in_st() const { return its_dyn_in_st; } //****************************************** inline const COMPLEX & NODE::get_dyn_amp() const { ThrowIfNil_(its_dyn_dir_ele_p); return its_dyn_dir_ele_p->its_ele; } //****************************************** inline DOUBLE NODE::get_cum_prob( USHORT state) //in const { return its_cum_probs[state]; } //****************************************** inline VOID NODE::add_to_dyn_st_entry_of_cum_amps( const COMPLEX & net_amp) //in { its_cum_amps[its_dyn_st] += net_amp; } #ifdef _mac_gui_app //''''''''''''''''''''''''''''''''''''''''''''\\. //****************************************** inline C_ND_EFIELD * NODE::get_efield_ptr() const { return its_efield_p; } //****************************************** inline VOID NODE::set_efield_ptr( C_ND_EFIELD * efield_p) //in { its_efield_p = efield_p; } //****************************************** inline const Point & NODE::get_center() const { return its_center; } //****************************************** inline USHORT NODE::get_sel_rad() const { return default_sel_rad; } //****************************************** inline USHORT NODE::get_mask_rad() const { return default_mask_rad; } //****************************************** inline C_CIRCLE NODE::get_docking_cir( USHORT sub_nd_id) //in { #pragma unused(sub_nd_id) return C_CIRCLE(its_center, get_sel_rad());; } //****************************************** inline VOID NODE::add_nd_to_port_glist( USHORT g_nd_id, //in USHORT sub_nd_id) //in { #pragma unused(g_nd_id, sub_nd_id) } //****************************************** inline VOID NODE::remove_nd_from_all_port_glists( USHORT g_nd_id) //in { #pragma unused (g_nd_id) } //****************************************** inline VOID NODE::renumber_nds_of_port_glists( const UI_MAP & map) //in {} //****************************************** inline BOOLEAN NODE::is_selected() const { return its_is_selected; } //****************************************** inline BOOLEAN NODE::pt_is_in_sel_cir( const Point & pt) //in { // sel_cir = selection circle return C_CIRCLE(its_center, get_sel_rad()).pt_is_in(pt); } //****************************************** inline C_CIRCLE NODE::get_selection_cir() { return C_CIRCLE(its_center, get_sel_rad()); } //****************************************** inline VOID NODE::set_state_num_for_cap( USHORT state) //in { its_state_num_for_cap = state; } //****************************************** inline const RGBColor & NODE::get_color() const { return C_COLORS::its_white; } //****************************************** inline VOID NODE::set_color( const RGBColor & color) //in {} //****************************************** inline BOOLEAN NODE::has_color() { return false; } //****************************************** inline VOID NODE::draw() { // this draws circle, efield and state_cap but not sel_handles } //****************************************** inline VOID NODE::undraw() { undraw(default_mask_rad); } //****************************************** inline VOID NODE::rotate() {} //****************************************** inline SInt16 NODE::get_icon_dir() const { return 0; } //****************************************** inline VOID NODE::set_icon_dir( SInt16 icon_dir) //in {} //****************************************** inline BOOLEAN NODE::has_icon_dir() { return false; } //****************************************** inline VOID NODE::write_net_stream( LStream & net_stream) //i-o { its_tm_amps.write_net_stream(net_stream); } //****************************************** inline VOID NODE::read_net_stream( LStream & net_stream) //i-o { its_tm_amps.read_net_stream(net_stream);//this assumes that the Dimensions of trans mat already correct } #endif //_mac_gui_app \\............................................// \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Ansi_Nodes/POLARIZER.cpp b/Legacy/QFog2-MachO/QFogSource/Ansi_Nodes/POLARIZER.cpp new file mode 100644 index 0000000..fe4b07a --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Ansi_Nodes/POLARIZER.cpp @@ -0,0 +1 @@ +#include "POLARIZER.h" #include "GLOBAL_FUN.h" #include "TWO_MODE_FUN.h" #ifdef _mac_gui_app //''''''''''''''''''''''''''''''''''''''''''''\\. #include "StCPTstate.h" #include "C_PHASOR_YZER_AMP_GEN.h" #endif //_mac_gui_app \\............................................// #pragma mark --creation/destruction-- //****************************************** POLARIZER::POLARIZER() {} //****************************************** POLARIZER::~POLARIZER() { } #pragma mark ----used only with macgui---- #ifdef _mac_gui_app //''''''''''''''''''''''''''''''''''''''''''''\\. #pragma mark --creation/destruction-- //****************************************** POLARIZER::POLARIZER( const Point & m_down_pt) //in :NODE(m_down_pt) { } #pragma mark --drawing-- //****************************************** VOID POLARIZER::draw() {//drawer its_efield_p->Draw(0); if(!its_efield_p->GetSuperView()->FocusDraw())return; if(its_state_num_for_cap!=max_ushort) draw_state_cap(); StCPTstate saved_st(true, true, false); saved_st.Normalize(); //first fill circular region with pattern: Rect r; ::SetRect(&r, its_center.h -default_mask_rad, its_center.v -default_mask_rad, its_center.h +default_mask_rad, its_center.v +default_mask_rad); PixPatHandle pat_h = ::GetPixPat(pol_pat_rid); //destroy_h: in this method ThrowIfNil_(pat_h); ::FillCOval(&r, pat_h ); ::DisposePixPat(pat_h); //now draw black rim: ::RGBForeColor(&C_COLORS::its_black); ::FrameOval(&r); } #pragma mark --amp gen-- //****************************************** VOID POLARIZER::call_amp_gen( QB_NET * net_p, //in C_PI_WIND * pi_wind_p) //in { if(its_amp_gen_p==0){//set to nil in NODE::NODE() and NODE::NODE(const Point & center) its_amp_gen_p = new C_PHASOR_YZER_AMP_GEN(k_pol, this, net_p, pi_wind_p); //delete: by NODE::~NODE() ThrowIfNil_(its_amp_gen_p ); //Created first time it is used, } its_amp_gen_p->talk(); } //****************************************** VOID POLARIZER::obey_amp_gen( const DOUBLE & theta, //in USHORT max_m_sum, //in const USHORT * mx_p, //in const USHORT * my_p) //in { empty_trans_mat(); TWO_MODE_FUN two_fun(theta); SHORT row = -1; COMPLEX z(0, 0); BOOLEAN tm_row_starting; for(USHORT nloss=0; nloss<= max_m_sum; nloss++){ for(USHORT n_sum=0; n_sum<=max_m_sum - nloss; n_sum++){ //n_sum = nx + ny for(USHORT ny=0; ny<= n_sum ; ny++){ USHORT nx = n_sum - ny; tm_row_starting = true; for(TM_COL_NUM in_st=0; in_st=amps_floor){ if(tm_row_starting){ row++; its_st_names[row] = STRINGY("(" ) && nx && "," && ny && ")" && nloss; tm_row_starting=false; } its_tm_amps.set_ele( row, in_st, z); } } }}} } // ********************************************* #endif //_mac_gui_app \\............................................// \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Ansi_Nodes/POLARIZER.h b/Legacy/QFog2-MachO/QFogSource/Ansi_Nodes/POLARIZER.h new file mode 100644 index 0000000..a68981c --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Ansi_Nodes/POLARIZER.h @@ -0,0 +1 @@ +#pragma once #include "QFog_constants.h" #ifdef _mac_gui_app //''''''''''''''''''''''''''''''''''''''''''''\\. #include "C_COLORS.h" class QB_NET; class C_PI_WIND; class C_PHASOR_YZER_AMP_GEN; #endif //_mac_gui_app \\............................................// #include "NODE.h" //****************************************** class POLARIZER : public NODE { public: POLARIZER(); virtual ~POLARIZER(); #ifdef _mac_gui_app //''''''''''''''''''''''''''''''''''''''''''''\\. private: public: POLARIZER(const Point & m_down_pt); STRINGY get_class_str(); ND_CLASS_ID get_class_id(); VOID draw(); VOID call_amp_gen(QB_NET * net_p, C_PI_WIND * pi_wind_p); VOID obey_amp_gen(const DOUBLE & theta, USHORT max_m_sum, const USHORT * mx_p, const USHORT * my_p); #endif //_mac_gui_app \\............................................// }; #pragma mark - #ifdef _mac_gui_app //''''''''''''''''''''''''''''''''''''''''''''\\. //****************************************** inline STRINGY POLARIZER::get_class_str() { return "POLARIZER"; } //****************************************** inline ND_CLASS_ID POLARIZER::get_class_id() { return POLARIZER_id; } #endif //_mac_gui_app \\............................................// \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Ansi_Nodes/POL_ROTATOR.cpp b/Legacy/QFog2-MachO/QFogSource/Ansi_Nodes/POL_ROTATOR.cpp new file mode 100644 index 0000000..6df398b --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Ansi_Nodes/POL_ROTATOR.cpp @@ -0,0 +1 @@ +#include "POL_ROTATOR.h" #include "GLOBAL_FUN.h" #include "TWO_MODE_FUN.h" #ifdef _mac_gui_app //''''''''''''''''''''''''''''''''''''''''''''\\. #include "StCPTstate.h" #include "C_PHASOR_YZER_AMP_GEN.h" #endif //_mac_gui_app \\............................................// #pragma mark --creation/destruction-- //****************************************** POL_ROTATOR::POL_ROTATOR() {} //****************************************** POL_ROTATOR::~POL_ROTATOR() { } #pragma mark ----used only with macgui---- #ifdef _mac_gui_app //''''''''''''''''''''''''''''''''''''''''''''\\. #pragma mark --creation/destruction-- //****************************************** POL_ROTATOR::POL_ROTATOR( const Point & m_down_pt) //in :NODE(m_down_pt) { } #pragma mark --drawing-- //****************************************** VOID POL_ROTATOR::draw() { //drawer its_efield_p->Draw(0); if(!its_efield_p->GetSuperView()->FocusDraw())return; if(its_state_num_for_cap!=max_ushort) draw_state_cap(); StCPTstate saved_st(true, true, false); saved_st.Normalize(); //first fill circular region with pattern: Rect r; ::SetRect(&r, its_center.h -default_mask_rad, its_center.v -default_mask_rad, its_center.h +default_mask_rad, its_center.v +default_mask_rad); PixPatHandle pat_h = ::GetPixPat(pol_rot_pat_rid); //destroy_h: in this method ThrowIfNil_(pat_h); ::FillCOval(&r, pat_h ); ::DisposePixPat(pat_h); //now draw black rim: ::RGBForeColor(&C_COLORS::its_black); ::FrameOval(&r); } #pragma mark --amp gen-- //****************************************** VOID POL_ROTATOR::call_amp_gen( QB_NET * net_p, //in C_PI_WIND * pi_wind_p) //in { if(its_amp_gen_p==0){//set to nil in NODE::NODE() and NODE::NODE(const Point & center) its_amp_gen_p = new C_PHASOR_YZER_AMP_GEN(k_pol_rot, this, net_p, pi_wind_p); //delete: by NODE::~NODE() ThrowIfNil_(its_amp_gen_p ); //Created first time it is used, } its_amp_gen_p->talk(); } //****************************************** VOID POL_ROTATOR::obey_amp_gen( const DOUBLE & theta, //in USHORT max_m_sum, //in const USHORT * mx_p, //in const USHORT * my_p) //in { empty_trans_mat(); TWO_MODE_FUN two_fun(theta); SHORT row = -1; COMPLEX z(0, 0); BOOLEAN tm_row_starting; for(USHORT n_sum=0; n_sum<=max_m_sum ; n_sum++){ //n_sum = nx + ny for(USHORT ny=0; ny<= n_sum ; ny++){ USHORT nx = n_sum - ny; tm_row_starting = true; for(TM_COL_NUM in_st=0; in_st=amps_floor){ if(tm_row_starting){ row++; its_st_names[row] = STRINGY("(" ) && nx && "," && ny && ")"; tm_row_starting=false; } its_tm_amps.set_ele( row, in_st, z); } } }} } // ********************************************* #endif //_mac_gui_app \\............................................// \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Ansi_Nodes/POL_ROTATOR.h b/Legacy/QFog2-MachO/QFogSource/Ansi_Nodes/POL_ROTATOR.h new file mode 100644 index 0000000..11611da --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Ansi_Nodes/POL_ROTATOR.h @@ -0,0 +1 @@ +#pragma once #include "QFog_constants.h" #ifdef _mac_gui_app //''''''''''''''''''''''''''''''''''''''''''''\\. #include "C_COLORS.h" class QB_NET; class C_PI_WIND; class C_PHASOR_YZER_AMP_GEN; #endif //_mac_gui_app \\............................................// #include "NODE.h" //****************************************** class POL_ROTATOR : public NODE { public: POL_ROTATOR(); virtual ~POL_ROTATOR(); #ifdef _mac_gui_app //''''''''''''''''''''''''''''''''''''''''''''\\. private: public: POL_ROTATOR(const Point & m_down_pt); STRINGY get_class_str(); ND_CLASS_ID get_class_id(); VOID draw(); VOID call_amp_gen(QB_NET * net_p, C_PI_WIND * pi_wind_p); VOID obey_amp_gen(const DOUBLE & theta, USHORT max_m_sum, const USHORT * mx_p, const USHORT * my_p); #endif //_mac_gui_app \\............................................// }; #pragma mark - #ifdef _mac_gui_app //''''''''''''''''''''''''''''''''''''''''''''\\. //****************************************** inline STRINGY POL_ROTATOR::get_class_str() { return "POL_ROTATOR"; } //****************************************** inline ND_CLASS_ID POL_ROTATOR::get_class_id() { return POL_ROTATOR_id; } #endif //_mac_gui_app \\............................................// \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Ansi_Nodes/QBIT_ROT.cpp b/Legacy/QFog2-MachO/QFogSource/Ansi_Nodes/QBIT_ROT.cpp new file mode 100644 index 0000000..6c2e087 --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Ansi_Nodes/QBIT_ROT.cpp @@ -0,0 +1 @@ +#include "QBIT_ROT.h" #include "STRINGY.h" #ifdef _mac_gui_app //''''''''''''''''''''''''''''''''''''''''''''\\. #include "C_QBIT_ROT_AMP_GEN.h" #endif //_mac_gui_app \\............................................// #pragma mark --creation/destruction-- //****************************************** QBIT_ROT::QBIT_ROT() {} //****************************************** QBIT_ROT::~QBIT_ROT() { } #pragma mark ----used only with macgui---- #ifdef _mac_gui_app //''''''''''''''''''''''''''''''''''''''''''''\\. #pragma mark --creation/destruction-- //****************************************** QBIT_ROT::QBIT_ROT( const Point & m_down_pt) //in :NODE( m_down_pt) { } #pragma mark --drawing-- //****************************************** VOID QBIT_ROT::draw() {//drawer its_efield_p->Draw(0); if(!its_efield_p->GetSuperView()->FocusDraw())return; if(its_state_num_for_cap!=max_ushort) draw_state_cap(); Rect r; ::SetRect(&r, its_center.h -default_mask_rad, its_center.v -default_mask_rad, its_center.h +default_mask_rad, its_center.v +default_mask_rad); ::PlotIconID(&r, atNone, ttNone, qbit_rot_icon_rid); } #pragma mark --amp gen-- //****************************************** VOID QBIT_ROT::call_amp_gen( QB_NET * net_p, //in C_PI_WIND * pi_wind_p) //in { if(its_amp_gen_p==0){//set to nil in NODE::NODE() and NODE::NODE(const Point & center) its_amp_gen_p = new C_QBIT_ROT_AMP_GEN(this, net_p, pi_wind_p); //delete: by NODE::~NODE() ThrowIfNil_(its_amp_gen_p ); //Created first time it is used, } its_amp_gen_p->talk(); } //****************************************** VOID QBIT_ROT::obey_amp_gen() { empty_trans_mat(); its_st_names[0] = "0"; its_st_names[1] = "1"; COMPLEX z(0,0); for(USHORT row=0; row< 2; row++){ z = ((C_QBIT_ROT_AMP_GEN *)its_amp_gen_p)->qbit_rot_amp(row, 0); if(abs(z)>=amps_floor){ its_tm_amps.set_ele(row, 0, z); } z = ((C_QBIT_ROT_AMP_GEN *)its_amp_gen_p)->qbit_rot_amp(row, 1); if(abs(z)>=amps_floor){ its_tm_amps.set_ele(row, 1, z); } } } #endif //_mac_gui_app \\............................................// \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Ansi_Nodes/QBIT_ROT.h b/Legacy/QFog2-MachO/QFogSource/Ansi_Nodes/QBIT_ROT.h new file mode 100644 index 0000000..88300ee --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Ansi_Nodes/QBIT_ROT.h @@ -0,0 +1 @@ +#pragma once #include "QFog_constants.h" #include "NODE.h" #ifdef _mac_gui_app //''''''''''''''''''''''''''''''''''''''''''''\\. class QB_NET; class C_PI_WIND; class C_QBIT_ROT_AMP_GEN; #endif //_mac_gui_app \\............................................// //****************************************** class QBIT_ROT: public NODE { private: public: QBIT_ROT(); virtual ~QBIT_ROT(); #ifdef _mac_gui_app //''''''''''''''''''''''''''''''''''''''''''''\\. private: // The node has one s/d port that can carry unlimited s and d loads. // loc = the center of the icon, // greeting_rad = sel_rad // docking_rad = mask_rad public: QBIT_ROT( const Point & m_down_pt); STRINGY get_class_str(); ND_CLASS_ID get_class_id(); VOID draw(); VOID call_amp_gen(QB_NET * net_p, C_PI_WIND * pi_wind_p); VOID obey_amp_gen(); #endif //_mac_gui_app \\............................................// }; #pragma mark - #ifdef _mac_gui_app //''''''''''''''''''''''''''''''''''''''''''''\\. //****************************************** inline STRINGY QBIT_ROT::get_class_str() { return "QBIT_ROT"; } //****************************************** inline ND_CLASS_ID QBIT_ROT::get_class_id() { return QBIT_ROT_id; } #endif //_mac_gui_app \\............................................// \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Ansi_Nodes/SG_MAGNET.cpp b/Legacy/QFog2-MachO/QFogSource/Ansi_Nodes/SG_MAGNET.cpp new file mode 100644 index 0000000..fde9a67 --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Ansi_Nodes/SG_MAGNET.cpp @@ -0,0 +1 @@ +#include "SG_MAGNET.h" #ifdef _mac_gui_app //''''''''''''''''''''''''''''''''''''''''''''\\. #include "C_SG_MAGNET_AMP_GEN.h" #endif //_mac_gui_app \\............................................// #pragma mark --creation/destruction-- //****************************************** SG_MAGNET::SG_MAGNET() {} //****************************************** SG_MAGNET::~SG_MAGNET() { } #pragma mark ----used only with macgui---- #ifdef _mac_gui_app //''''''''''''''''''''''''''''''''''''''''''''\\. #pragma mark --creation/destruction-- //****************************************** SG_MAGNET::SG_MAGNET( const Point & m_down_pt) //in :NODE( m_down_pt) {} #pragma mark --state names-- //****************************************** VOID SG_MAGNET::set_st_names_to_default() { VECTOR degens(2, 2); STRETCH_OR_FOLD sof(degens); for(USHORT row=0; row<4; row++){ USHORT n_neg = sof.vec_label(row)[0]; USHORT n_pos = sof.vec_label(row)[1]; its_st_names[row]= STRINGY("(") && n_neg && n_pos && ")"; } } #pragma mark --drawing-- //****************************************** VOID SG_MAGNET::draw() {//drawer its_efield_p->Draw(0); if(!its_efield_p->GetSuperView()->FocusDraw())return; if(its_state_num_for_cap!=max_ushort) draw_state_cap(); Rect r; ::SetRect(&r, its_center.h -default_mask_rad, its_center.v -default_mask_rad, its_center.h +default_mask_rad, its_center.v +default_mask_rad); ::PlotIconID(&r, atNone, ttNone, sg_magnet_icon_rid); /* //kept crashing: CIconHandle icon_h = ::GetCIcon( 128); //destroy_h: in this method ThrowIfNil_(icon_h); if(icon_h!=0){ ::LoadResource((Handle)icon_h); ::PlotCIcon(&r, icon_h); ReleaseResource_((Handle)icon_h); } */ } #pragma mark --in_nd changes-- //****************************************** VOID SG_MAGNET::add_in_nd( USHORT nd_id, //in USHORT nd_degen) //in { NODE::add_in_nd(nd_id, nd_degen); //if sg magnet params dialog has never been called, do nothing else if(its_amp_gen_p!=0){ ((C_SG_MAGNET_AMP_GEN *)its_amp_gen_p)->resize(its_in_nds.get_len()); } } //****************************************** VOID SG_MAGNET::del_in_nd( USHORT nd_id) //in { //if sg magnet params dialog has never been called, do nothing else if(its_amp_gen_p!=0){ USHORT loc= its_in_nds.loc_of_target(nd_id); ((C_SG_MAGNET_AMP_GEN *)its_amp_gen_p)->extract_at(loc); } //it's important to call this last because //it deletes nd_id from the its_in_nds vector NODE::del_in_nd(nd_id); } //****************************************** VOID SG_MAGNET::reorder_in_nds( const UI_MAP & map, //in BOOLEAN touch_tm) //in { NODE::reorder_in_nds(map, touch_tm); //if sg magnet params dialog has never been called, do nothing else if(its_amp_gen_p!=0){ ((C_SG_MAGNET_AMP_GEN *)its_amp_gen_p)->reorder(map); } } #pragma mark --amp gen-- //****************************************** VOID SG_MAGNET::call_amp_gen( QB_NET * net_p, //in C_PI_WIND * pi_wind_p) //in { if(its_amp_gen_p==0){//set to nil in NODE::NODE() and NODE::NODE(const Point & center) its_amp_gen_p = new C_SG_MAGNET_AMP_GEN(this, net_p, pi_wind_p); //delete: by NODE::~NODE() //Created first time it is used, ThrowIfNil_(its_amp_gen_p ); } its_amp_gen_p->talk(); } //****************************************** VOID SG_MAGNET::obey_amp_gen( const USHORT * in_sums_p, //in const USHORT * in_rows_p, //in const SHORT * in_spins_p) //in { empty_trans_mat(); SHORT row = -1; COMPLEX z(0, 0); BOOLEAN cur_n1_n2_pair_is_accepted;// n1 = n_neg, n2 = n_pos for(USHORT sum=0; sum<=1; sum++){ // sum = n1 + n2; for(USHORT n2=0; n2<= sum; n2++){ USHORT n1 = sum - n2; cur_n1_n2_pair_is_accepted = false; for(TM_COL_NUM in_st=0; in_stsg_magnet_amp(n1, n2, in_sums_p[in_st], in_rows_p[in_st], in_spins_p[in_st]); if(abs(z)>=amps_floor){ if(!cur_n1_n2_pair_is_accepted){ row++; its_st_names[row] = STRINGY("(") && n1 && "," && n2 && ")"; cur_n1_n2_pair_is_accepted=true; } its_tm_amps.set_ele(row, in_st, z); } } } } } #endif //_mac_gui_app \\............................................// \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Ansi_Nodes/SG_MAGNET.h b/Legacy/QFog2-MachO/QFogSource/Ansi_Nodes/SG_MAGNET.h new file mode 100644 index 0000000..209fadd --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Ansi_Nodes/SG_MAGNET.h @@ -0,0 +1 @@ +#pragma once #include "QFog_constants.h" #include "VECTOR.h" #include "STRINGY.h" #include "NODE.h" #include "STRETCH_OR_FOLD.h" #ifdef _mac_gui_app //''''''''''''''''''''''''''''''''''''''''''''\\. class QB_NET; class C_PI_WIND; class C_SG_MAGNET_AMP_GEN; #endif //_mac_gui_app \\............................................// //SG = Stern-Gerlach //****************************************** class SG_MAGNET: public NODE { private: public: SG_MAGNET(); virtual ~SG_MAGNET(); #ifdef _mac_gui_app //''''''''''''''''''''''''''''''''''''''''''''\\. private: // The node has one s/d port that can carry unlimited s and d loads. // loc = the center of the icon, // greeting_rad = sel_rad // docking_rad = mask_rad public: SG_MAGNET( const Point & m_down_pt); STRINGY get_class_str(); ND_CLASS_ID get_class_id(); VOID set_st_names_to_default(); VOID draw(); virtual VOID add_in_nd(USHORT nd_id, USHORT nd_degen); virtual VOID del_in_nd(USHORT nd_id); virtual VOID reorder_in_nds(const UI_MAP & map, BOOLEAN touch_tm); VOID call_amp_gen(QB_NET * net_p, C_PI_WIND * pi_wind_p); VOID obey_amp_gen(const USHORT * in_sums_p, const USHORT * in_rows_p, const SHORT * in_spins_p); #endif //_mac_gui_app \\............................................// }; #pragma mark - #ifdef _mac_gui_app //''''''''''''''''''''''''''''''''''''''''''''\\. //****************************************** inline STRINGY SG_MAGNET::get_class_str() { return "SG_MAGNET"; } //****************************************** inline ND_CLASS_ID SG_MAGNET::get_class_id() { return SG_MAGNET_id; } #endif //_mac_gui_app \\............................................// \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Ansi_Other/.DS_Store b/Legacy/QFog2-MachO/QFogSource/Ansi_Other/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..7385ea4854d5d7c9d44e3aa4032218c90479a40f GIT binary patch literal 12292 zcmeHM!EO^V6dXejfuw<|2YNx;BV3R;aZN%3L@G(u6bVj&1XPeJQXwjOWB-Ov;l>Z} z5qtv7v#sEGci{pm5@X4J8{6~dy;*M@ZveQ#*~`1Y9)K3B+3RgKHO0oQR?4N=vrFrU z2j+N!AzopDv&w9BNC7Dz1*Cu!kOKdL0^GB$v>NvPFsfDxNP+)S0sDR^Sk3mLEra!6 z9c=s&fOd=BzVMpo0FNo6?L}J#>!I`+P7f|ZT|8pA0OxpN(`kFrmca%%T!6zxW*1K= z&a)F&_~~%HVAV0w156%X!a=An&&=bvE8HwYslmc*ZK@;d%fabFVND-~2-r1J#P zrS~!JXANu?V~XuGU^7nlHN$n8&r@=aaIof`)pL4fKPB;Y8n8L1#hT)} zc!+&wIADhR^!k8rW+wHVKHe1DX~1TjKGttZtk>|ES{m1kc^)$IK6`$Vsk@h;w;RzJ zudSU7IpJ#ifLmld=bC$m7q}gA&DIa^%m#9I9qAG8&m+b@W!#p*l&THu^|HL($0YKd z-+HObAoZ~A^$JhnoI3RRx&8^T3{qsf7Mbz+h(9M0U*&4Br`?zi8klTFrFXZLVKNTC zihj=LHeJvG_wTTQ)0W{guUNGIdl}S7feTaMa$w%G^Z%&%{r`o<|?6`wF}ngtX6DZ8LWq}u_@N?kK?rKKMZ+Y#IatqWw0D!(GLMHgBmFy1*Cu! dkOERb3P=GdAO)m=6p#W^Knh3!Dey-X_yICTAcp_| literal 0 HcmV?d00001 diff --git a/Legacy/QFog2-MachO/QFogSource/Ansi_Other/ANSI_UDebugging.h b/Legacy/QFog2-MachO/QFogSource/Ansi_Other/ANSI_UDebugging.h new file mode 100644 index 0000000..e5f44d4 --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Ansi_Other/ANSI_UDebugging.h @@ -0,0 +1 @@ +//Mac CodeWarrior PowerPlant users can replace this by UDebugging.h //to increase functionality. #pragma once #include //********************Throw Debugging #define Throw_Err(err) throw (ExceptionCode)(err) #ifdef Debug_Throw #define SetDebugThrow_(inAction) //do nothing #define Throw_(err) \ do { \ cerr<<"Exception Thrown"< its_cum_amps; MATRIX its_cum_probs; public: VOID set_degens(USHORT degen1, USHORT degen2); VOID copy(const BI_NODE & bn); BI_NODE(); BI_NODE(USHORT nd1, USHORT degen1, USHORT nd2, USHORT degen2); BI_NODE(const BI_NODE & bn); BI_NODE & operator=( const BI_NODE & rhs ); virtual ~BI_NODE(); USHORT get_nd1() const; USHORT get_nd2() const; friend BOOLEAN operator==( const BI_NODE & bi_x, const BI_NODE & bi_y); friend BOOLEAN operator!=( const BI_NODE & bi_x, const BI_NODE & bi_y); BOOLEAN has(USHORT nd) const; BOOLEAN has(USHORT nd1, USHORT nd2) const; VOID renumber_nds(const UI_MAP & map); const DOUBLE & get_cum_prob(USHORT row, USHORT col) const; VOID normalize_cum_probs(); VOID set_cum_info_to_default(); VOID add_to_an_entry_of_cum_amps( USHORT row, USHORT col, const COMPLEX & net_amp); VOID prepare_cum_info_for_next_ending(); }; #pragma mark - //****************************************** inline USHORT BI_NODE::get_nd1() const { return its_nd1; } //****************************************** inline USHORT BI_NODE::get_nd2() const { return its_nd2; } //****************************************** inline BOOLEAN operator==( const BI_NODE & bi_x, //in const BI_NODE & bi_y) //in { return( (bi_x.its_nd1==bi_y.its_nd1 && bi_x.its_nd2==bi_y.its_nd2)|| (bi_x.its_nd1==bi_y.its_nd2 && bi_x.its_nd2==bi_y.its_nd1) ); } //****************************************** inline BOOLEAN operator!=( const BI_NODE & bi_x, //in const BI_NODE & bi_y) //in { return !(bi_x==bi_y); } //****************************************** inline BOOLEAN BI_NODE::has( USHORT nd) //in const { return (its_nd1==nd||its_nd2==nd); } //****************************************** inline BOOLEAN BI_NODE::has( USHORT nd1, //in USHORT nd2) //in const { return (its_nd1==nd1 && its_nd2==nd2)|| (its_nd1==nd2 && its_nd2==nd1) ; } //****************************************** inline const DOUBLE & BI_NODE::get_cum_prob( USHORT row, //in USHORT col) //in const { return its_cum_probs.entry(row, col); } //****************************************** inline VOID BI_NODE::add_to_an_entry_of_cum_amps( USHORT row, //in USHORT col, //in const COMPLEX & net_amp) //in { its_cum_amps.entry(row, col) += net_amp; } \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Ansi_Other/DICTIONARY.cpp b/Legacy/QFog2-MachO/QFogSource/Ansi_Other/DICTIONARY.cpp new file mode 100644 index 0000000..2a22610 --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Ansi_Other/DICTIONARY.cpp @@ -0,0 +1 @@ +#include "DICTIONARY.h" #pragma mark --creation/destruction-- //****************************************** VOID DICTIONARY::sort_vec_of_ids_by_abc() { //Ascending indirect shell sort. //Comes from page 235 of Practical Algorithms in C++ by Flamig. USHORT stringy_id; USHORT i, j, h; for (h = its_num_of_stringies; h > 1;) { if(h<5){ h= 1; }else{ h = (5*h-1)/11; } // Perform insertion sort with increment h for(i = h; i < its_num_of_stringies; i++) { stringy_id = its_ids_p[i]; j = i; while(j >= h && get_stringy(stringy_id) < get_stringy(its_ids_p[j-h]) ) { its_ids_p[j] = its_ids_p[j-h]; j = j-h; } its_ids_p[j] = stringy_id; } } } //****************************************** DICTIONARY::DICTIONARY( const STRINGY * * stringies_p_p, //in USHORT num) //in { its_stringies_p = 0; its_stringies_p_p = stringies_p_p; its_num_of_stringies = num; its_num_of_users = 1; if(its_num_of_stringies==0){ its_ids_p = 0; }else{ its_ids_p = new USHORT[its_num_of_stringies];//new[] //delete: in ~DICTIONARY(). ThrowIfNil_(its_ids_p); } for(USHORT i=0; i * stringies_p) //in { its_stringies_p = stringies_p; its_stringies_p_p = 0; its_num_of_stringies = stringies_p->get_len(); its_num_of_users = 1; if(its_num_of_stringies==0){ its_ids_p = 0; }else{ its_ids_p = new USHORT[its_num_of_stringies];//new[] //delete: in ~DICTIONARY(). ThrowIfNil_(its_ids_p); } for(USHORT i=0; icompare_with(*y_p) ); } */ \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Ansi_Other/DICTIONARY.h b/Legacy/QFog2-MachO/QFogSource/Ansi_Other/DICTIONARY.h new file mode 100644 index 0000000..f9d5622 --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Ansi_Other/DICTIONARY.h @@ -0,0 +1 @@ +//****************************************** // Purpose: To define a class that // orders a collection of stringies alpahbetically. Also, // given any stringy, it tells what is its dictionary position. //****************************************** #pragma once #include "STRINGY.h" #include "VECTOR.h" #include "UI_MAP.h" //#include //#include //****************************************** class DICTIONARY { private: // stringies ordered so ids are listed in increasing order const STRINGY * * its_stringies_p_p; VECTOR * its_stringies_p; USHORT its_num_of_stringies; USHORT its_num_of_users; // ID's ordered so stringies are listed alphabetically USHORT * its_ids_p; VOID sort_vec_of_ids_by_abc(); public: // VOID sort_vec_of_ids_by_abc(); DICTIONARY( const STRINGY * * stringies_p_p, USHORT len); DICTIONARY( VECTOR * stringies_p); virtual ~DICTIONARY(); const STRINGY & get_stringy(USHORT id) const; USHORT get_id_of_this_stringy(const STRINGY & stringy) const; VOID get_map(UI_MAP & map) const; USHORT get_num_of_stringies() const; USHORT get_num_of_users() const; VOID add_one_user(); VOID del_one_user(); }; #pragma mark - //****************************************** inline USHORT DICTIONARY::get_num_of_stringies() const { return its_num_of_stringies; } //****************************************** inline USHORT DICTIONARY::get_num_of_users() const { return its_num_of_users; } //****************************************** inline VOID DICTIONARY::add_one_user() { its_num_of_users++; } //****************************************** inline VOID DICTIONARY::del_one_user() { its_num_of_users--; } \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Ansi_Other/EXCEPTIONS.cpp b/Legacy/QFog2-MachO/QFogSource/Ansi_Other/EXCEPTIONS.cpp new file mode 100644 index 0000000..b6ba6c5 --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Ansi_Other/EXCEPTIONS.cpp @@ -0,0 +1 @@ +#include "EXCEPTIONS.h" //****************************************** VOID my_gen_alert( const STRINGY & stringy) //in { #ifdef _ansi_app //''''''''''''''''''''''''''''''''''''''''''''\\. cout<=360){ang -=360;} } //****************************************** VOID limited_degrees( DOUBLE & ang) //i-o {//(io) // nan = not a number. See fp.h. isnan(x) is a macro. if(isnan(ang))return; while(ang<0){ang +=360;} while(ang>=360){ang -=360;} } #pragma mark ----used only with macgui---- #ifdef _mac_gui_app //''''''''''''''''''''''''''''''''''''''''''''\\. //****************************************** SInt16 nearest_int16( DOUBLE x) //in { SInt16 x_int = SInt16(x); return (x- x_int > .5)? x_int + 1: x_int; } //****************************************** VOID draw_cell_frame( const Rect & rect) //in { StCPTstate saved_st(true, true, false); saved_st.Normalize(); // ::PenPat(&qd.ltGray); RGBColor my_gray = {56000, 56000, 56000}; ::RGBForeColor(&my_gray); // lines are clipped and don't show up without offsets -1, -2 : ::MoveTo(rect.left, rect.bottom-1); ::LineTo(rect.right-2, rect.bottom-1); ::LineTo(rect.right-2, rect.top); } /* //****************************************** VOID my_set_cursor( SHORT id) //in { //id = a rid or watchCursor //use UCursor::InitTheCursor() to get arrow back CursHandle cursor_h = ::GetCursor(id); //destroy_h: in this method ThrowIfNil_(cursor_h); ::HLock((Handle)cursor_h);//no need to save handle state as will be destroying handle soon ::SetCursor(*cursor_h); ReleaseResource_((Handle)cursor_h); } */ //****************************************** VOID trunc_pstr_so_it_fits( Str255 pstr, //i-o USHORT box_width, //in USHORT pixs_for_margins) //in { if((::StringWidth(pstr) + pixs_for_margins)>box_width){ while((::StringWidth(pstr) + pixs_for_margins)>box_width){ pstr[0]--; } //replace the last character by a hyphen if(pstr[0]>2){ pstr[pstr[0]] = '-';} } } //****************************************** BOOLEAN get_TEXT_scrap( Handle content_h) //out { //content_h: creation and destruction is done outside this function. //The input content_h has zero length. //The output content_h has null terminator and length >0. //This method returns false if no item of that type was found. //To use this method, you must: //(1)create a zero length handle before calling this method //(2)destroy the handle eventually after calling this method //Refs. //(1)Think Ref. under String.h //(2)Dave Oster //(3)PP SignalIf_(::GetHandleSize(content_h)!=0); //this grows content_h to scrap_len if( not UScrap::HasData('TEXT')){ //no item of that type was found return false; } UScrap::GetData('TEXT', content_h); SInt32 scrap_len = ::GetHandleSize(content_h); //Grow content_h size by one byte to add null terminator. //Add a null terminator even if you always add a //null terminator to TEXT you put in the scrap. //After all, an extra null terminator does not hurt, and //the one you add here will be the only one if the //'TEXT' clipping created by another applications doesn't have it. StHandleState saved_h(content_h);//preserve handle state //always unlock handle before growing its size ::HUnlock(content_h);//saved handle state ::SetHandleSize(content_h, scrap_len+1); ThrowIfMemFail_(content_h); ::HLock(content_h);//saved handle state (*content_h)[scrap_len] = '\0'; return true; } #endif //_mac_gui_app \\............................................// \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Ansi_Other/GLOBAL_FUN.h b/Legacy/QFog2-MachO/QFogSource/Ansi_Other/GLOBAL_FUN.h new file mode 100644 index 0000000..f940d90 --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Ansi_Other/GLOBAL_FUN.h @@ -0,0 +1 @@ +//global functions(their prototypes): #pragma once #if _do_debug extern LONG req_stack_space; #endif DOUBLE my_factorial(USHORT n); VOID limited_degrees(SHORT & ang); VOID limited_degrees(DOUBLE & ang); #ifdef _mac_gui_app //''''''''''''''''''''''''''''''''''''''''''''\\. #define ReleaseResource_(handle) \ do { \ if(handle != nil){ \ ::ReleaseResource(handle); \ handle = nil; \ } \ } while (false) #define DisposeHandle_(handle) \ do { \ if(handle != nil){ \ ::DisposeHandle(handle); \ handle = nil; \ } \ } while (false) SInt16 nearest_int16(DOUBLE x); VOID toggle(BOOLEAN & x); VOID draw_cell_frame(const Rect & rect); // VOID my_set_cursor(SHORT id); VOID trunc_pstr_so_it_fits(Str255 pstr, USHORT box_width, USHORT pixs_for_margins); BOOLEAN get_TEXT_scrap(Handle content_h); #endif //_mac_gui_app \\............................................// #ifdef _mac_gui_app //''''''''''''''''''''''''''''''''''''''''''''\\. #if _do_debug #define refresh_req_stack_space_() if(req_stack_space>::StackSpace()) req_stack_space = ::StackSpace(); #else #define refresh_req_stack_space_() #endif #else #define refresh_req_stack_space_() #endif //_mac_gui_app \\............................................// //****************************************** inline VOID toggle( BOOLEAN & x) //i-o { x=(!x); } \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Ansi_Other/MY_FSTREAMS.cpp b/Legacy/QFog2-MachO/QFogSource/Ansi_Other/MY_FSTREAMS.cpp new file mode 100644 index 0000000..b35d818 --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Ansi_Other/MY_FSTREAMS.cpp @@ -0,0 +1 @@ +#include "MY_FSTREAMS.h" #include "QFog_constants.h" //#include // dpo #include "EXCEPTIONS.h" #ifdef _mac_gui_app //''''''''''''''''''''''''''''''''''''''''''''\\. #include "STRINGY.h" #endif //_mac_gui_app \\............................................// #pragma mark --ifstream-- //****************************************** MY_IFSTREAM::MY_IFSTREAM() {} //****************************************** MY_IFSTREAM::MY_IFSTREAM(const CHAR * name) :IFSTREAM(name) {} //****************************************** MY_IFSTREAM::~MY_IFSTREAM() {} //****************************************** USHORT MY_IFSTREAM::cur_line() { // SHORT saved_state= rdstate(); clear(); LONG saved_pos = tellg_(); //seekg_(0, ios::beg);// dpo seekg_(0, ios::in); LONG pos=0; USHORT endline_counter = 1; CHAR ch; while( pos> name) will set eof()=true //if there is no visible or invisible(like \n) character after name. //With exceptions(failbit), //peek() will throw if eof()=true already //eof() first so peek() doesn't get a chance to throw if(eof()||(peek() == EOF)){ throw END_OF_FILE(); }else{ get(ch); } } //****************************************** VOID MY_IFSTREAM::my_get_line( CHAR * ch_p, //out USHORT max_len, //in CHAR last_ch) //in { if(eof()||(peek() == EOF)){ throw END_OF_FILE(); }else{ getline(ch_p, max_len, last_ch); } } #ifdef _mac_gui_app //''''''''''''''''''''''''''''''''''''''''''''\\. //****************************************** VOID MY_IFSTREAM::mac_open( const FSSpec & fs_spec, //in openmode mode /* = in */) //in { //Ref. Dave Oster's Superbrain UInt8 path[max_file_path_len]; FSRef ref; OSStatus err = ::FSpMakeFSRef(&fs_spec, &ref); if(err == fnfErr){ LStr255 pstr= "\pCould not find file \"" + LStr255(fs_spec.name) +"\p\"."; my_gen_alert(STRINGY(pstr)); ThrowIfOSStatus_(fnfErr); } ThrowIfOSStatus_(::FSRefMakePath(&ref, path, max_file_path_len)); IFSTREAM::open((char *) path, mode ) ; } #endif //_mac_gui_app \\............................................// #pragma mark --ofstream-- //****************************************** MY_OFSTREAM::MY_OFSTREAM() {} //****************************************** MY_OFSTREAM::MY_OFSTREAM(const CHAR * name) :ofstream(name) {} //****************************************** MY_OFSTREAM::~MY_OFSTREAM() {} #ifdef _mac_gui_app //''''''''''''''''''''''''''''''''''''''''''''\\. //****************************************** VOID MY_OFSTREAM::mac_open( const FSSpec & fs_spec, //in openmode mode /* = out|trunc */) //in { //Ref. Dave Oster's Superbrain UInt8 path[max_file_path_len]; FSRef ref; OSStatus err = ::FSpMakeFSRef(&fs_spec, &ref); if(err == fnfErr){ // can't make a ref to a file that doesn't exist. ThrowIfOSStatus_(::FSpCreate(&fs_spec, 'ttxt', 'TEXT', smRoman)); err = ::FSpMakeFSRef(&fs_spec, &ref); } ThrowIfOSStatus_(err); ThrowIfOSStatus_(::FSRefMakePath(&ref, path, max_file_path_len)); //open() creates files with //type = TEXT, creator = CWIE, as if the created by CodeWarrior. //I want instead: //type = TEXT, creator = ttxt, as if the created by TeachText or SimpleText. //old way: //The following globals are called inside open(), //where they are used to create fs_spec of file. //So they should be set BEFORE (preferably immediately before) //calling open(). If you call them right after open(), //any changes will not be seen on fs_spec of previously opened file. //_fcreator = 'ttxt'; //_ftype = 'TEXT'; OFSTREAM::open( (char *) path, mode ) ; //new way: //Change file's type and creator after file is created: FInfo f_info; ThrowIfOSErr_(::FSpGetFInfo(&fs_spec, &f_info) ); f_info.fdType = 'TEXT'; f_info.fdCreator = 'ttxt'; ThrowIfOSErr_(::FSpSetFInfo(&fs_spec, &f_info) ); } #endif //_mac_gui_app \\............................................// \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Ansi_Other/MY_FSTREAMS.h b/Legacy/QFog2-MachO/QFogSource/Ansi_Other/MY_FSTREAMS.h new file mode 100644 index 0000000..344290e --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Ansi_Other/MY_FSTREAMS.h @@ -0,0 +1 @@ +#pragma once #include #include #include class END_OF_FILE {}; #define seekg_(offset, base) rdbuf()->pubseekpos(offset, base) //#define tellg_() rdbuf()->pubseekoff(0, ios::cur, ios::in).offset() #define tellg_() rdbuf()->pubseekoff(0, ios_base::cur, ios_base::in) //****************************************** class MY_IFSTREAM : public IFSTREAM { public: MY_IFSTREAM(); MY_IFSTREAM(const CHAR * name); virtual ~MY_IFSTREAM(); USHORT cur_line(); VOID my_get(CHAR & ch); VOID my_get_line( CHAR * ch_p, USHORT max_len, CHAR last_ch); #ifdef _mac_gui_app //''''''''''''''''''''''''''''''''''''''''''''\\. VOID mac_open(const FSSpec & fs_spec, openmode mode = in); #endif //_mac_gui_app \\............................................// }; //****************************************** class MY_OFSTREAM : public ofstream { public: MY_OFSTREAM(); MY_OFSTREAM(const CHAR * name); virtual ~MY_OFSTREAM(); #ifdef _mac_gui_app //''''''''''''''''''''''''''''''''''''''''''''\\. VOID mac_open(const FSSpec & fs_spec, openmode mode = out|trunc); #endif //_mac_gui_app \\............................................// }; /* The new ANSI C++ standard is very strict with its file opening modes. Only certain combinations are allowed. In the draft C++ standard for the Library, the following are defined (para 17.4.8.1.4) as valid combinations of ios::openmode for opening a file---these are defined in terms of the equivalent modestr used in fopen(s, modestr) (see para 7.9.5.3 of ANSI standard for C): ios::in modestr = "r" ios::out | ios::trunc modestr = "w" ios::out | ios::app modestr = "a" ios::in | ios::binary modestr = "rb" ios::out | ios::trunc | ios::binary modestr = "wb" ios::out | ios::app | ios::binary modestr = "ab" ios::in | ios::out modestr = "r+" ios::in | ios::out | ios::trunc modestr = "w+" ios::in | ios::out | ios::app modestr = "a+" ios::in | ios::out | ios::binary modestr = "r+b" ios::in | ios::out | ios::trunc | ios::binary modestr = "w+b" ios::in | ios::out | ios::app | ios::binary modestr = "a+b" All other combinations are invalid and no file is opened and no error message is produced. With the ANSI Draft Version used by Metrowerks, you can use is_open() to check that the file has been opened properly, as in OutStream(outfile, ios::out | ios::trunc); if( !OutStream.is_open() ) { cerr << "file failed to open"; exit(1); } */ \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Ansi_Other/New(Extra).cp b/Legacy/QFog2-MachO/QFogSource/Ansi_Other/New(Extra).cp new file mode 100644 index 0000000..df7d419 --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Ansi_Other/New(Extra).cp @@ -0,0 +1 @@ +//With CWP 3 and the Old ANSI Libraries, //the project compiles but it doesn't link. //It doesn't link because it wants definitions for new[] and delete[]. //This file provides these definitions. //It is a snippet from the New.cp file found in MSL of CWP3 #include #include #include #if __MWERKS__>=0x2020 #pragma overload extern void *operator new[](size_t) throw(bad_alloc); //#pragma overload extern void *operator new[](size_t,const nothrow_t &) throw(); #pragma overload extern void operator delete[](void *) throw(); #endif //#if NEWMODE!=NEWMODE_NONE /************************************************************************/ /* Purpose..: Array allocation/deallocation functions */ /* Input....: --- */ /* Return...: --- */ /************************************************************************/ #if __MWERKS__>=0x2020 extern void *operator new[](size_t size) throw(bad_alloc) { return operator new(size); } /* extern void *operator new[](size_t size,const nothrow_t & nt) throw() { return operator new(size,nt); } */ extern void operator delete[](void *ptr) throw() { operator delete(ptr); } #endif //#endif \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Ansi_Other/STRETCH_OR_FOLD.cpp b/Legacy/QFog2-MachO/QFogSource/Ansi_Other/STRETCH_OR_FOLD.cpp new file mode 100644 index 0000000..aea5254 --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Ansi_Other/STRETCH_OR_FOLD.cpp @@ -0,0 +1 @@ +#include "STRETCH_OR_FOLD.h" // We say component vec[0] has a lower location (0) in vec than vec[1] does. // Two conventions for vec are possible: // (1)the higher the location, the more valuable the component // or (2) the lower the location, the more valuable the component // We will use (2), opposite to the decimal system: // In the decimal number 101, the left-most 1 has // a higher value than the right-most one. #pragma mark --creation/destruction-- //****************************************** VOID STRETCH_OR_FOLD::copy( const STRETCH_OR_FOLD & s) //in { its_degens = s.its_degens; its_len = s.its_len; its_num_of_vecs = s.its_num_of_vecs; } //****************************************** VOID STRETCH_OR_FOLD::init( const VECTOR & degens) //in { its_degens = degens; its_len = its_degens.get_len(); its_num_of_vecs = 1; for(USHORT i =0; i < its_len ; i++){ its_num_of_vecs *= its_degens[i]; } } //****************************************** STRETCH_OR_FOLD::STRETCH_OR_FOLD() :its_len(0), its_num_of_vecs(0) {} //****************************************** STRETCH_OR_FOLD::STRETCH_OR_FOLD( const VECTOR & degens) //in { init(degens); } //****************************************** STRETCH_OR_FOLD::STRETCH_OR_FOLD( const STRETCH_OR_FOLD & s) //in { copy(s); } //****************************************** STRETCH_OR_FOLD::~STRETCH_OR_FOLD() { } #pragma mark --const functions-- //****************************************** LONG STRETCH_OR_FOLD::int_label( const VECTOR & vec_label) //in const { // i= v[0] + pi[0]*v[1] + pi[1]*v[2] +...+ pi[L-2]*v[L-1] //where pi[x]= d[0]*d[1]*...*d[x] //i=int_label, d[]=its_degens[], v[]= vec_label[], L = its_len // Note: (d[0]-1) + pi[0]*(d[1]-1) = d[0]*d[1] - 1 LONG i = vec_label[0]; LONG pi = its_degens[0]; for(USHORT loc=1; loc < its_len ; loc++){ i = i + pi*vec_label[loc]; pi *= its_degens[loc]; } return i; } //****************************************** VECTOR STRETCH_OR_FOLD::vec_label( LONG int_label) //in const { // let pi[x] = d[0]*d[1]*...*d[x]. // i /pi[L-2] = v[L-1], i %pi[L-2] = r[L-1] // r[L-1] /pi[L-3] = v[L-2], r[L-1] %pi[L-3] = r[L-2] // r[L-2] /pi[L-4] = v[L-3], r[L-2] %pi[L-4] = r[L-3] // ... // r[2] /pi[0] = v[1], r[2] %pi[0] = r[1] // r[1] /1 = v[0], r[1] %1 = r[0] LONG remainder=int_label; LONG pi = its_num_of_vecs; VECTOR vec(0, its_len); USHORT loc; LONG s_loc; // s= signed for(s_loc = (LONG(its_len) - 1); 0<=s_loc; s_loc--){ //"comp" has a special meaning! loc = USHORT(s_loc); pi /= its_degens[loc]; vec[loc] = remainder/pi; remainder %= pi; //remainder = remainder%pi; } return vec; } #pragma mark --reordering-- //****************************************** VOID STRETCH_OR_FOLD::reorder_degens( const UI_MAP & map) //in { if(map.is_identity_map())return; VECTOR saved_degens(its_degens); for(USHORT i=0; i< its_len; i++){ its_degens[i] = saved_degens[map.its_oldfn[i]]; } } \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Ansi_Other/STRETCH_OR_FOLD.h b/Legacy/QFog2-MachO/QFogSource/Ansi_Other/STRETCH_OR_FOLD.h new file mode 100644 index 0000000..292523f --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Ansi_Other/STRETCH_OR_FOLD.h @@ -0,0 +1 @@ +//****************************************** // Purpose: To define class that translates integer labels // to vector labels (folding) or vice-versa (stretching). //****************************************** #pragma once #include "VECTOR.h" #include "UI_MAP.h" //****************************************** class STRETCH_OR_FOLD { private: VECTOR its_degens; USHORT its_len; LONG its_num_of_vecs; public: VOID copy(const STRETCH_OR_FOLD & s); VOID init(const VECTOR & degens); STRETCH_OR_FOLD(); STRETCH_OR_FOLD(const VECTOR & degens); STRETCH_OR_FOLD(const STRETCH_OR_FOLD & s); virtual ~STRETCH_OR_FOLD(); USHORT get_len() const; LONG get_num_of_vecs() const; VECTOR vec_label(LONG int_label) const; LONG int_label(const VECTOR & vec_label) const; VOID reorder_degens(const UI_MAP & map); }; #pragma mark - //****************************************** inline USHORT STRETCH_OR_FOLD::get_len() const { return its_len; } //****************************************** inline LONG STRETCH_OR_FOLD::get_num_of_vecs() const { return its_num_of_vecs; } \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Ansi_Other/TRANS_MAT.cpp b/Legacy/QFog2-MachO/QFogSource/Ansi_Other/TRANS_MAT.cpp new file mode 100644 index 0000000..a276e3b --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Ansi_Other/TRANS_MAT.cpp @@ -0,0 +1 @@ +#include "TRANS_MAT.h" #include "QFog_constants.h" #include "UI_MAP.h" #include "STRETCH_OR_FOLD.h" #pragma mark ----DIR_NZ_ELE---- #pragma mark --creation/destruction-- //****************************************** DIR_NZ_ELE::DIR_NZ_ELE() :its_next_p(0) {} //****************************************** DIR_NZ_ELE::DIR_NZ_ELE( TM_COL_NUM col_num, //in const COMPLEX & ele, //in DIR_NZ_ELE * next_p) //in :its_col_num(col_num), its_ele(ele), its_next_p(next_p) {} //****************************************** DIR_NZ_ELE::DIR_NZ_ELE( const DIR_NZ_ELE & s) //in :its_col_num(s.its_col_num), its_ele(s.its_ele), its_next_p(0) {} #pragma mark ----TRANS_MAT---- #pragma mark --creation/destruction-- //****************************************** VOID TRANS_MAT::clear_row( USHORT r) //in { // Deletes all elements in row r // and sets its_elements_p_p[r]=0. if(its_elements_p_p[r]==0) return; DIR_NZ_ELE * x_p = its_elements_p_p[r]; its_elements_p_p[r]=0; DIR_NZ_ELE * chaser_p = x_p; while(x_p){ x_p = x_p->its_next_p; delete chaser_p; chaser_p = x_p; } } //****************************************** VOID TRANS_MAT::clear_row( DIR_NZ_ELE * chaser_p) //i-o { // For a given row, deletes any elements located after the // element pointed to by chaser_p, and sets chaser_p->its_next_p=0 if(chaser_p==0)return; DIR_NZ_ELE * x_p = chaser_p->its_next_p; chaser_p->its_next_p = 0; chaser_p = x_p; while(x_p){ x_p = x_p->its_next_p; delete chaser_p; chaser_p = x_p; } } //****************************************** VOID TRANS_MAT::clear() { // Deletes all heap memory and sets both Dimensions to zero. // Equivalent to resize(0, 0). for(USHORT row=0; rowits_col_num, x_p->its_ele, 0); //delete: ThrowIfNil_(new_x_p); its_elements_p_p[r] =new_x_p; new_last_p =new_x_p; x_p = x_p->its_next_p; while(x_p){ new_x_p = new DIR_NZ_ELE(x_p->its_col_num, x_p->its_ele, 0); //delete: ThrowIfNil_(new_x_p); new_last_p->its_next_p = new_x_p; new_last_p =new_x_p; x_p = x_p->its_next_p; } next_row: ; } } //****************************************** VOID TRANS_MAT::set_to_zero_mat( USHORT num_of_rows, //in TM_COL_NUM num_of_cols) //in { // Deletes all heap memory and builds a (num_of_rows)X(num_of_cols) zero matrix. resize(num_of_rows, 0); its_num_of_cols = num_of_cols; } //****************************************** VOID TRANS_MAT::resize( USHORT new_nr, //in TM_COL_NUM new_nc) //in { //nr=number of rows, nc=number of columns if(new_nr==0){ clear(); return; } if(new_nc < its_num_of_cols){ DIR_NZ_ELE * x_p=0; DIR_NZ_ELE * chaser_p=0; for (USHORT r= 0; r< its_num_of_rows; r++){ x_p = its_elements_p_p[r]; if(x_p==0) goto next_row; if(new_nc <= x_p->its_col_num ){ clear_row(r); goto next_row; } chaser_p = x_p; x_p = x_p->its_next_p; while(x_p){ if( ( chaser_p->its_col_num < new_nc ) && (new_nc < x_p->its_col_num) ){ clear_row(chaser_p); goto next_row; } if (new_nc == x_p->its_col_num ){ clear_row(chaser_p); goto next_row; } chaser_p = x_p; x_p = x_p->its_next_p; } next_row: ; } } if(new_nr == its_num_of_rows) return; //if reach this point, new_nr != 0 DIR_NZ_ELE * * new_mat_p_p = new DIR_NZ_ELE * [new_nr]; //new[] //delete: ThrowIfNil_(new_mat_p_p); USHORT r; if(new_nr < its_num_of_rows){ for(r=0; r its_num_of_rows for(r=0; r= 0 and = O and its_col_num) return COMPLEX(0, 0); if(col == x_p->its_col_num) return x_p->its_ele; DIR_NZ_ELE * chaser_p = x_p; x_p = x_p->its_next_p; while(x_p){ if(col < x_p->its_col_num ) return COMPLEX(0, 0); if(col == x_p->its_col_num ) return x_p->its_ele; chaser_p = x_p; x_p = x_p->its_next_p; } return COMPLEX(0, 0); } //****************************************** VOID TRANS_MAT::set_ele( USHORT row, //in TM_COL_NUM col, //in const COMPLEX & ele) //in { // Set element at (row, col) to ele. ele may be COMPLEX (0, 0). // The function set_ele can be used to either modify(nz->nz) or extract(nz->z) // an existing non-zero element, or else to insert(z->nz) a new nz element, // or to do nothing(z->z) // (If ele=COMPLEX (0, 0), // and there already exists a nz element at (row, col), // this function will extract that element). // It is assumed that row is >= 0 and = O and =amps_floor){ x_p = new DIR_NZ_ELE(col, ele, 0); //delete: ThrowIfNil_(x_p); its_elements_p_p[row] = x_p; return ; }else{ return; } } if(col < x_p->its_col_num ){ if(abs_ele>=amps_floor){ x_p = new DIR_NZ_ELE(col, ele, x_p); //delete: ThrowIfNil_(x_p); its_elements_p_p[row] = x_p; return ; }else{ return; } } if (col == x_p->its_col_num ){ if(abs_ele>=amps_floor){ x_p->its_ele = ele; return ; }else{ its_elements_p_p[row] = x_p->its_next_p; delete x_p; x_p = 0; return; } } chaser_p = x_p; x_p = x_p->its_next_p; while(x_p){ if( ( chaser_p->its_col_num < col) && (col < x_p->its_col_num) ){ if(abs_ele>=amps_floor){ x_p = new DIR_NZ_ELE(col, ele, x_p); //delete: ThrowIfNil_(x_p); chaser_p->its_next_p = x_p; return; }else{ return; } } if (col == x_p->its_col_num ){ if(abs_ele>=amps_floor){ x_p->its_ele = ele; return; }else{ chaser_p->its_next_p = x_p->its_next_p; delete x_p; x_p=0; return; } } chaser_p = x_p; x_p = x_p->its_next_p; } //if you get this far, then there is no nz-element in position // (row, col), so add ele if it's non-zero. if(abs_ele>=amps_floor){ x_p = new DIR_NZ_ELE(col, ele, 0); //delete: ThrowIfNil_(x_p) ; chaser_p->its_next_p = x_p; return; } } #pragma mark --consider one col-- //****************************************** DOUBLE TRANS_MAT::get_col_prob( TM_COL_NUM col) //in { // prob = probability // prob = the sum of [the absolute value of a vec component]**2 . DOUBLE sum = 0; for(USHORT row =0; row< its_num_of_rows; row++){ sum += norm(read_ele(row, col)); //norm = modulus**2 = abs**2 = real**2 + imag**2 } return sum; } //****************************************** VECTOR TRANS_MAT::get_col( TM_COL_NUM col) //in { VECTOR vec(COMPLEX(0, 0), its_num_of_rows); for(USHORT row =0; row< its_num_of_rows; row++){ vec[row] = read_ele(row, col); } return vec; } #pragma mark --consider one row-- //****************************************** USHORT TRANS_MAT::get_num_of_nz_elems( USHORT row) //in { DIR_NZ_ELE * x_p = its_elements_p_p[row]; LONG num = 0; while(x_p){ num++; x_p = x_p->its_next_p; } ThrowIf_(num > max_ushort); return num; } #pragma mark --consider all elements-- /* COL_LABEL_TRANSLATOR no longer used //****************************************** VOID TRANS_MAT::relabel_cols( const COL_LABEL_TRANSLATOR & ator) //in { // Uses function ator.new_col_label to relabel the columns. // If ator.new_col_label says max_ushort, the element is deleted. // ator.new_col_label must have the property that: // The new elements, like the old, should be // in order of increasing column numbers. For some translators, // this ocurrs automatically. If it does not occur automatically, // you must use order_row_elems_by_increasing_col_num() // immediately after using this method. DIR_NZ_ELE * x_p=0; DIR_NZ_ELE * chaser_p=0; USHORT num; for (USHORT r= 0; r< its_num_of_rows; r++){ chaser_p =0; x_p = its_elements_p_p[r]; while(x_p){ num = ator.new_col_label(x_p->its_col_num); if( num != max_ushort){ x_p->its_col_num = num; chaser_p = x_p; x_p = x_p->its_next_p; goto nz_chaser_p; // nz = non-zero }else{ // num = max_ushort: its_elements_p_p[r]= x_p->its_next_p; delete x_p; x_p = its_elements_p_p[r]; } } nz_chaser_p: ; while(x_p){ num = ator.new_col_label(x_p->its_col_num); if( num != max_ushort){ x_p->its_col_num = num; chaser_p = x_p; x_p = x_p->its_next_p; }else{ // num = max_ushort: chaser_p->its_next_p= x_p->its_next_p; delete x_p; x_p = chaser_p->its_next_p; } } } its_num_of_cols = ator.get_new_num_of_sts(); } */ #pragma mark --consider all elements: small amps-- //****************************************** const USHORT TRANS_MAT::get_cur_finesse_of_amps() const { DOUBLE abs_lower_bd = 1; USHORT exponent = 0; DOUBLE abs_of_ele; DIR_NZ_ELE * x_p; for(USHORT row =0; row< its_num_of_rows; row++){ x_p = its_elements_p_p[row]; while(x_p){ abs_of_ele = abs(x_p->its_ele); ThrowIf_(abs_of_ele==0); //norm = abs^2 //extra amps_floor summand to drown out noise //When abs_of_ele=abs_lower_bd, get 0.1*amps_floor<0 while( (abs_of_ele + 0.1*amps_floor) its_next_p; } } return exponent; } //****************************************** VOID TRANS_MAT::filter_out_small_amps( USHORT finesse ) //in { DOUBLE amps_admit_size = 1; for(USHORT i=0; i < finesse; i++){amps_admit_size *= .1;} if(amps_admit_size < amps_floor) return; for(USHORT row =0; row< its_num_of_rows; row++){ for(TM_COL_NUM col = 0; col< its_num_of_cols; col++){ DOUBLE a = abs(read_ele(row, col)); //extra amps_floor summand to drown out noise //When a=amps_admit_size, get 0.1*amps_floor<0 if( (a + 0.1*amps_floor) < amps_admit_size)set_ele(row, col, 0); } } } #pragma mark --consider all elements: reorder-- //****************************************** VOID TRANS_MAT::reorder_rows( const UI_MAP & map) //in { if(its_num_of_rows==0)return; if(map.is_identity_map())return; USHORT i; DIR_NZ_ELE * * old_elements_p_p = new DIR_NZ_ELE * [its_num_of_rows];//new[] //delete: in this method ThrowIfNil_(old_elements_p_p); for(i=0; i old_vec(0, len); VECTOR new_vec(0, len); for (USHORT r= 0; r< its_num_of_rows; r++){ x_p = its_elements_p_p[r]; while(x_p){ old_vec = old_sof.vec_label(x_p->its_col_num); for(USHORT i = 0; iits_col_num =new_sof.int_label(new_vec); x_p = x_p->its_next_p; } } order_row_elems_by_increasing_col_num(); } //****************************************** VOID TRANS_MAT::reorder_cols_as_part_of_reordering_nd_sts_of_a_pa( USHORT pa_pos, //in const STRETCH_OR_FOLD & sof, //in const UI_MAP & map) //in { if(map.is_identity_map())return; DIR_NZ_ELE * x_p=0; VECTOR vec(0, sof.get_len()); for (USHORT r= 0; r< its_num_of_rows; r++){ x_p = its_elements_p_p[r]; while(x_p){ vec = sof.vec_label(x_p->its_col_num); vec[pa_pos] = map.its_newfo[vec[pa_pos]]; x_p->its_col_num = sof.int_label(vec); x_p = x_p->its_next_p; } } order_row_elems_by_increasing_col_num(); } //****************************************** VOID TRANS_MAT::order_row_elems_by_increasing_col_num() { TM_COL_NUM * old_col_nums_p = 0; DIR_NZ_ELE * * old_elems_p_p = 0; DIR_NZ_ELE * x_p = 0; USHORT i, len; UI_MAP map; for(USHORT r=0; rits_next_p; } map.sort_vec_of_longs_by_size(old_col_nums_p, len); its_elements_p_p[r]= old_elems_p_p[map.its_oldfn[0]]; x_p = its_elements_p_p[r]; for(i= 0; i + 1 its_next_p; } (*x_p).its_next_p = 0; delete [] old_col_nums_p; old_col_nums_p=0; delete [] old_elems_p_p; old_elems_p_p=0; } } } #pragma mark ----------mac_gui_app only---------- #ifdef _mac_gui_app //''''''''''''''''''''''''''''''''''''''''''''\\. #pragma mark --i/o-- //****************************************** VOID TRANS_MAT::write_net_stream( LStream & net_stream) //i-o { COMPLEX z; for(USHORT row=0; rowget_col_num();//write_net z = x_p->get_ele(); //store machine indep doubles net_stream<its_next_p; } } } //****************************************** VOID TRANS_MAT::read_net_stream( LStream & net_stream) //i-o { //this assumes that the Dimensions of trans mat are already correct set_to_zero_mat(its_num_of_rows, its_num_of_cols); USHORT num_of_nz_elems_for_this_row; TM_COL_NUM col; COMPLEX z; DOUBLE64 x, y;//store machine indep doubles for(USHORT row=0; row>num_of_nz_elems_for_this_row;//read_net DIR_NZ_ELE * x_p = 0; DIR_NZ_ELE * prev_p=0; for(USHORT i=0; i>col;//read_net net_stream>>x>>y;//read_net z = COMPLEX(x, y); if(x_p==0){ x_p = new DIR_NZ_ELE(col, z, 0); //delete: ThrowIfNil_(x_p); its_elements_p_p[row]= x_p; }else{ prev_p = x_p; x_p = new DIR_NZ_ELE(col, z, 0); //delete: ThrowIfNil_(x_p); prev_p->its_next_p = x_p; } } } } #endif //_mac_gui_app \\............................................// \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Ansi_Other/TRANS_MAT.h b/Legacy/QFog2-MachO/QFogSource/Ansi_Other/TRANS_MAT.h new file mode 100644 index 0000000..ebbb82b --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Ansi_Other/TRANS_MAT.h @@ -0,0 +1 @@ +//****************************************** // Purpose: To define a sparse transition matrix. // The matrix will be stored as an array of pointers to linked-lists. // The matrix dwell in the heap. //****************************************** #pragma once #include "VECTOR.h" //#include "COL_LABEL_TRANSLATOR.h" #include "UI_MAP.h" class STRETCH_OR_FOLD; typedef long TM_COL_NUM; //IMP: For the transition matrix, //We assume //num_of_cols<=max_ushort and //num_of_cols<=max_long. //However, we assume that //the number of non-zero elements in any row is <= max_ushort //****************************************** class DIR_NZ_ELE // dir_nz_ele = directed non-zero element { public: // data TM_COL_NUM its_col_num; // col = column, num = number COMPLEX its_ele; DIR_NZ_ELE * its_next_p; DIR_NZ_ELE(); DIR_NZ_ELE (TM_COL_NUM col_num, const COMPLEX & ele, DIR_NZ_ELE * next_p); DIR_NZ_ELE (const DIR_NZ_ELE & s); const TM_COL_NUM get_col_num() const; const COMPLEX & get_ele() const; const DIR_NZ_ELE * get_next_p() const; }; // Except for the gets, the class DIR_NZ_ELE // will be used only by the class TRANS_MAT. Thus, it // has only those four horsemen that will be used // by the class TRANS_MAT. In particular, the assigner not will be used. // Also, there is no need for an explicit destructor as // DIR_NZ_ELE never calls "new". //****************************************** class TRANS_MAT //trans_mat = transition matrix { private: USHORT its_num_of_rows; TM_COL_NUM its_num_of_cols; // cols = columns DIR_NZ_ELE * * its_elements_p_p; public: VOID clear_row(USHORT r); VOID clear_row(DIR_NZ_ELE * x_p); VOID clear(); VOID copy(const TRANS_MAT & mat); VOID set_to_zero_mat(USHORT num_of_rows, TM_COL_NUM num_of_cols); VOID resize(USHORT new_nr, TM_COL_NUM new_nc); VOID set_num_of_rows(USHORT nr); VOID set_num_of_cols(TM_COL_NUM nc); TRANS_MAT(); TRANS_MAT(USHORT num_of_rows, TM_COL_NUM num_of_cols); TRANS_MAT(const TRANS_MAT & mat); TRANS_MAT & operator=(const TRANS_MAT & rhs); virtual ~TRANS_MAT(); VOID set_ele(USHORT row, TM_COL_NUM col, const COMPLEX & ele); COMPLEX read_ele(USHORT row, TM_COL_NUM col) const; BOOLEAN is_col_valid(TM_COL_NUM c) const; DOUBLE get_col_prob(TM_COL_NUM col); VECTOR get_col(TM_COL_NUM col); BOOLEAN is_row_valid(USHORT r) const; USHORT get_num_of_nz_elems(USHORT row); const DIR_NZ_ELE * get_row_ptr(USHORT row) const; TM_COL_NUM get_num_of_cols() const; USHORT get_num_of_rows() const; // VOID relabel_cols( const COL_LABEL_TRANSLATOR & ator); const USHORT get_cur_finesse_of_amps() const; VOID filter_out_small_amps(USHORT finesse ); VOID reorder_rows(const UI_MAP & map); VOID reorder_cols_as_part_of_reordering_in_nds( const STRETCH_OR_FOLD & old_sof, const STRETCH_OR_FOLD & new_sof, const UI_MAP & map); VOID reorder_cols_as_part_of_reordering_nd_sts_of_a_pa( USHORT pa_pos, const STRETCH_OR_FOLD & sof, const UI_MAP & map); VOID order_row_elems_by_increasing_col_num(); #ifdef _mac_gui_app //''''''''''''''''''''''''''''''''''''''''''''\\. VOID write_net_stream(LStream & net_stream); VOID read_net_stream(LStream & net_stream); #endif //_mac_gui_app \\............................................// }; #pragma mark - #pragma mark ----DIR_NZ_ELE---- //****************************************** inline const TM_COL_NUM DIR_NZ_ELE::get_col_num() const { return its_col_num; } //****************************************** inline const COMPLEX & DIR_NZ_ELE::get_ele() const { return its_ele; } //****************************************** inline const DIR_NZ_ELE * DIR_NZ_ELE::get_next_p() const { return its_next_p; } #pragma mark ----TRANS_MAT---- //****************************************** inline VOID TRANS_MAT::set_num_of_cols( TM_COL_NUM nc) //in { resize(its_num_of_rows, nc); } //****************************************** inline VOID TRANS_MAT::set_num_of_rows( USHORT nr) //in { resize(nr, its_num_of_cols); } //****************************************** inline BOOLEAN TRANS_MAT::is_col_valid( TM_COL_NUM c) //in const { return ( (0<=c)&&(c<=its_num_of_cols) ); } //****************************************** inline BOOLEAN TRANS_MAT::is_row_valid( USHORT r) //in const { return ( (0<=r)&&(r<=its_num_of_rows) ); } //****************************************** inline const DIR_NZ_ELE * TRANS_MAT::get_row_ptr( USHORT row) const { return its_elements_p_p[row]; } //****************************************** inline TM_COL_NUM TRANS_MAT::get_num_of_cols() const { return its_num_of_cols; } //****************************************** inline USHORT TRANS_MAT::get_num_of_rows() const { return its_num_of_rows; } \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Ansi_Other/UI_MAP.cpp b/Legacy/QFog2-MachO/QFogSource/Ansi_Other/UI_MAP.cpp new file mode 100644 index 0000000..0319585 --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Ansi_Other/UI_MAP.cpp @@ -0,0 +1 @@ +#include "UI_MAP.h" #include "STRINGY.h" #include "DICTIONARY.h" //****************************************** UI_MAP::UI_MAP() { } //****************************************** VOID UI_MAP::set_to_default_map( USHORT len) //in { //default is the identity map of Dimension = len. its_newfo.set_to_default_vec(0, len); its_oldfn.set_to_default_vec(0, len); for(USHORT i=0; iget_map(*this); delete dict_p; dict_p=0; } //****************************************** VOID UI_MAP::sort_vec_of_longs_by_size( const LONG * items_p, //in USHORT len) //in { //items_p must of size len //initially, map = the identity map set_to_default_map(len); //Ascending indirect shell sort. //Comes from page 235 of Practical Algorithms in C++ by Flamig. USHORT old_i; USHORT i, j, h; for (h = len; h > 1;) { if(h<5){ h= 1; }else{ h = (5*h-1)/11; } // Perform insertion sort with increment h for(i = h; i < len; i++) { old_i = its_oldfn[i]; j = i; while(j >= h && items_p[old_i] < items_p[its_oldfn[j-h]] ) { its_oldfn[j] = its_oldfn[j-h]; j = j-h; } its_oldfn[j] = old_i; } } set_newfo(); } \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Ansi_Other/UI_MAP.h b/Legacy/QFog2-MachO/QFogSource/Ansi_Other/UI_MAP.h new file mode 100644 index 0000000..f39195e --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Ansi_Other/UI_MAP.h @@ -0,0 +1 @@ +#pragma once #include "VECTOR.h" class STRINGY; //UI_MAP = unsigned integers map //****************************************** class UI_MAP { public: //newfo_map =new from old //oldfn_map =old from new VECTOR its_newfo; VECTOR its_oldfn; UI_MAP(); VOID set_to_default_map(USHORT len); UI_MAP(USHORT len); virtual ~UI_MAP(); VOID set_newfo(); VOID set_oldfn(); BOOLEAN is_identity_map() const; VOID get_inverse(UI_MAP & inv); VOID sort_vec_of_stringies_by_name( const STRINGY * * stringies_p_p, USHORT len); VOID sort_vec_of_longs_by_size( const LONG * items_p, USHORT len); }; \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Ansi_QBNet/.DS_Store b/Legacy/QFog2-MachO/QFogSource/Ansi_QBNet/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..a28ae773c4bba89dcc7c80af9b4e62ac795bd913 GIT binary patch literal 6148 zcmeHKJxjzu5Pjoa5fqLquiR1_!G93KU11}LRyImbIE#Z^W1oM1zWGoRjh%?d49vXA z?#yiRAiFyNqDnGLQ@; z13$z7&uo?I%rR{;kPIXP9}MXJP^gM^VDD&K2aUA=#5spe=<79Eb4p+x*gJBDBA!b0 zREZWtJe}hu;_ATO(bFN(d`PVP-n@vd&ici|A+=-LWFQ$BGoZaMWvS=?hQG{YlW!qu zl7VF4zcL{6_1(JR*TvcT1OQ184 literal 0 HcmV?d00001 diff --git a/Legacy/QFog2-MachO/QFogSource/Ansi_QBNet/QB_NET(go).cpp b/Legacy/QFog2-MachO/QFogSource/Ansi_QBNet/QB_NET(go).cpp new file mode 100644 index 0000000..6cd4270 --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Ansi_QBNet/QB_NET(go).cpp @@ -0,0 +1 @@ +#include "QB_NET.h" #include "EXCEPTIONS.h" #include "MY_FSTREAMS.h" #include #include "BEAM_SPL.h" #include "CUSTOM_ND.h" #include "DET_ND.h" #include "POL_ROTATOR.h" #include "POLARIZER.h" #include "QBIT_ROT.h" #include "SG_MAGNET.h" #ifdef _mac_gui_app //''''''''''''''''''''''''''''''''''''''''''''\\. #include "C_MAIN_VIEW.h" #endif //_mac_gui_app \\............................................// #if _do_debug extern LONG req_stack_space; #endif #pragma mark --go_forward() related-- //****************************************** VOID QB_NET::set_cum_info_to_default() { for(USHORT nd=0; ndset_cum_info_to_default(); } DIR_DATA * dir_bi_nd_p = its_bi_nds.get_first_p(); while(dir_bi_nd_p){ dir_bi_nd_p->its_data.set_cum_info_to_default(); dir_bi_nd_p = dir_bi_nd_p->its_next_p; } } //****************************************** VOID QB_NET::fill_final_era_degens( VECTOR & final_era_degens) //out { for(USHORT i = 0; iget_degen(); } } //****************************************** VOID QB_NET::set_all_dyn_sts_to_max_ushort() { for(USHORT i =0; iset_dyn_st(max_ushort); } } //****************************************** BOOLEAN QB_NET::external_nds_accept_ending( const VECTOR & ending_vec) //in { for(USHORT i = 0; iis_active_state(ending_vec[i]))return false; nd_p->set_dyn_st_and_dir_ele_ptr(ending_vec[i]); } return true; } //****************************************** BOOLEAN QB_NET::dyn_in_st_is_consistent( USHORT nd_id) //in { //This method checks for consistency with the its_dyn_st of other nodes, //for those nodes that have been assigned one already. //It also checks for consistency with evidence. NODE * nd_p = its_nds_p_p[nd_id]; for(USHORT i=0; iget_in_nds().get_len(); i++){ NODE * in_nd_p = its_nds_p_p[nd_p->get_in_nds()[i]]; if(in_nd_p->get_dyn_st()!=max_ushort){ if(in_nd_p->get_dyn_st()!=nd_p->get_dyn_in_st()[i])return false; } if(!in_nd_p->is_active_state(nd_p->get_dyn_in_st()[i]))return false; } return true; } //****************************************** VOID QB_NET::send_dyn_in_st_to_nds( USHORT nd_id) //in { NODE * nd_p = its_nds_p_p[nd_id]; for(USHORT i=0; iget_in_nds().get_len(); i++){ NODE * in_nd_p = its_nds_p_p[nd_p->get_in_nds()[i]]; if(in_nd_p->get_dyn_st()==max_ushort){ in_nd_p->set_dyn_st_and_dir_ele_ptr(nd_p->get_dyn_in_st()[i]); } } } //****************************************** VOID QB_NET::use_dyn_in_sts_to_reconstruct_dyn_sts_for_times_larger_than( USHORT limit_time) //in { USHORT time; USHORT first_time_of_final_era = its_num_of_nds -its_final_era_len; for(time = 0; time< first_time_of_final_era; time++){ its_nds_p_p[its_nd_chronology[time]]->set_dyn_st(max_ushort); } for(time=limit_time + 1; timeget_in_nds().get_len(); i++){ NODE * in_nd_p = its_nds_p_p[nd_p->get_in_nds()[i]]; in_nd_p->set_dyn_st(nd_p->get_dyn_in_st()[i]); } } } //****************************************** VOID QB_NET::set_dyn_net_story_and_amp() { its_dyn_amp = COMPLEX(1, 0); for(USHORT i=0; iget_dyn_st(); its_dyn_amp *= its_nds_p_p[i]->get_dyn_amp(); } } //****************************************** VOID QB_NET::add_story_to_cum_amps() { for(USHORT i=0; iadd_to_dyn_st_entry_of_cum_amps(its_dyn_amp); } USHORT nd1, nd2, nd1_st, nd2_st; DIR_DATA * dir_bi_nd_p = its_bi_nds.get_first_p(); while(dir_bi_nd_p){ nd1 = dir_bi_nd_p->its_data.get_nd1(); nd2 = dir_bi_nd_p->its_data.get_nd2(); nd1_st = its_dyn_story[nd1]; nd2_st = its_dyn_story[nd2]; dir_bi_nd_p->its_data.add_to_an_entry_of_cum_amps(nd1_st, nd2_st, its_dyn_amp); dir_bi_nd_p = dir_bi_nd_p->its_next_p; } } //****************************************** VOID QB_NET::prepare_cum_info_for_next_ending() { for(USHORT nd=0;ndprepare_cum_info_for_next_ending(); } DIR_DATA * dir_bi_nd_p = its_bi_nds.get_first_p(); while(dir_bi_nd_p){ dir_bi_nd_p->its_data.prepare_cum_info_for_next_ending(); dir_bi_nd_p = dir_bi_nd_p->its_next_p; } } //****************************************** VOID QB_NET::normalize_cum_probs() { for(USHORT nd=0;ndnormalize_cum_probs(); } DIR_DATA * dir_bi_nd_p = its_bi_nds.get_first_p(); while(dir_bi_nd_p){ dir_bi_nd_p->its_data.normalize_cum_probs(); dir_bi_nd_p = dir_bi_nd_p->its_next_p; } } //****************************************** VOID QB_NET::add_story_to_anthology( USHORT ending) //in { // net_story_count and ending are both one based. // This function does nothing for ansi_app. #ifdef _mac_gui_app //''''''''''''''''''''''''''''''''''''''''''''\\. C_ANTHOLOGY_ITEM item( its_dyn_story, its_dyn_amp, ending); its_anthology.insert_last(item); #endif //_mac_gui_app \\............................................// refresh_req_stack_space_(); } //****************************************** VOID QB_NET::multi_mode_go( BOOLEAN is_mini_run, //in //go forward variables const CHAR * ecase_name_cstr, //in MY_OFSTREAM * nd_probs_stream_p, //i-o MY_OFSTREAM * bi_nd_probs_stream_p, //i-o MY_OFSTREAM * stories_stream_p, //i-o BOOLEAN illustrate_stories, //in //mini_run variables DOUBLE & out_prob, //out USHORT & num_of_stories) //out { if(its_num_of_nds==0)return; //go_forward variables USHORT net_story_ctr = 1; USHORT happy_ending = 1; USHORT prev_ending = max_ushort; USHORT extra_story_steps = illustrate_stories||(stories_stream_p!=0); //mini_run variables DOUBLE cum_prob = 0; COMPLEX cum_amp = 0; if(!is_mini_run){//go_forward if(stories_stream_p!=0){ *stories_stream_p << "**********ecase = " << ecase_name_cstr < final_era_degens(0, its_final_era_len); fill_final_era_degens(final_era_degens); STRETCH_OR_FOLD endings_sof(final_era_degens); USHORT nd_id; NODE * nd_p; for(USHORT ending=0; endinghas_dyn_in_st()){ if(need_to_reconstruct){ use_dyn_in_sts_to_reconstruct_dyn_sts_for_times_larger_than(time); need_to_reconstruct = false; } if(dyn_in_st_is_consistent(nd_id) ){ send_dyn_in_st_to_nds(nd_id); time--; }else{ nd_p->advance_dyn_dir_ele_ptr(); } }else{ nd_p->move_dyn_dir_ele_ptr_to_first_col(); if(time!=its_num_of_nds-1){ its_nds_p_p[its_nd_chronology[time + 1]]->advance_dyn_dir_ele_ptr(); need_to_reconstruct = true; } time++; } }else{ // if time ==0 nd_id = its_nd_chronology[0]; nd_p = its_nds_p_p[nd_id]; if(nd_p->has_dyn_in_st()){ if(dyn_in_st_is_consistent(nd_id) ){ set_dyn_net_story_and_amp(); if(!is_mini_run){//go_forward add_story_to_cum_amps(); if(extra_story_steps){ // Not all endings make it to here, // so we number the possible endings with the counter happy_ending. // happy_ending is 1 based. if(prev_ending!=ending){ if(prev_ending!=max_ushort)happy_ending++; prev_ending= ending; } if(illustrate_stories){ add_story_to_anthology(happy_ending); } if(stories_stream_p!=0){ write_one_story_into_file(stories_stream_p, net_story_ctr, happy_ending); } net_story_ctr++; } }else{//mini_run cum_amp += its_dyn_amp; net_story_ctr++; } nd_p->advance_dyn_dir_ele_ptr(); }else{ nd_p->advance_dyn_dir_ele_ptr(); } }else{ if(its_num_of_nds!=1){ nd_p->move_dyn_dir_ele_ptr_to_first_col(); its_nds_p_p[its_nd_chronology[1]]->advance_dyn_dir_ele_ptr(); use_dyn_in_sts_to_reconstruct_dyn_sts_for_times_larger_than(1); } time++; } } refresh_req_stack_space_(); }//times if(!is_mini_run){//go_forward prepare_cum_info_for_next_ending(); }else{//mini_run //norm = modulus**2 = abs**2 = real**2 + imag**2 cum_prob += norm(cum_amp); cum_amp = 0; } next_ending: ; refresh_req_stack_space_(); }//endings num_of_stories = net_story_ctr - 1; //net_story_ctr starts at 1 so this is always >=0 if(!is_mini_run){//go_forward normalize_cum_probs(); if(nd_probs_stream_p!=0){ write_nd_probs_into_file(ecase_name_cstr, nd_probs_stream_p ); } if(bi_nd_probs_stream_p!=0){ write_bi_nd_probs_into_file( ecase_name_cstr, bi_nd_probs_stream_p ); } }else{//mini_run restore_act_st_sets_of_all_nds(); out_prob = cum_prob; } refresh_req_stack_space_(); } //****************************************** VOID QB_NET::go_forward( const CHAR * ecase_name_cstr, //in MY_OFSTREAM * nd_probs_stream_p, //i-o MY_OFSTREAM * bi_nd_probs_stream_p, //i-o MY_OFSTREAM * stories_stream_p, //i-o BOOLEAN illustrate_stories ) //in { DOUBLE out_prob=0; USHORT num_of_stories=0; multi_mode_go( false,//is_mini_run ecase_name_cstr, nd_probs_stream_p, bi_nd_probs_stream_p, stories_stream_p, illustrate_stories, out_prob, num_of_stories); } \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Ansi_QBNet/QB_NET.cpp b/Legacy/QFog2-MachO/QFogSource/Ansi_QBNet/QB_NET.cpp new file mode 100644 index 0000000..bcd973d --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Ansi_QBNet/QB_NET.cpp @@ -0,0 +1 @@ +#include "QB_NET.h" #include "EXCEPTIONS.h" #include "MY_FSTREAMS.h" #include #include "BEAM_SPL.h" #include "CUSTOM_ND.h" #include "DET_ND.h" #include "POL_ROTATOR.h" #include "POLARIZER.h" #include "QBIT_ROT.h" #include "SG_MAGNET.h" #ifdef _mac_gui_app //''''''''''''''''''''''''''''''''''''''''''''\\. #include "C_MAIN_VIEW.h" #endif //_mac_gui_app \\............................................// #pragma mark --creation/destruction-- //****************************************** VOID QB_NET::clear_nds() { for(USHORT i=0; iget_name().get_len(); if(len>max) max = len; } return max; } #pragma mark --state names-- //****************************************** USHORT QB_NET::get_len_of_longest_st_name( USHORT nd_id) //in { USHORT max = 0; USHORT len; NODE * nd_p = its_nds_p_p[nd_id]; for(USHORT i = 0; i< nd_p->get_degen(); i++){ len = nd_p->get_st_name(i).get_len(); if(len>max) max = len; } return max; } #pragma mark --small amps-- //****************************************** const USHORT QB_NET::get_cur_finesse_of_amps() const { USHORT prec, max_prec=0; for(USHORT i=0; iget_tm_amps().get_cur_finesse_of_amps(); if(prec > max_prec) max_prec = prec; } return max_prec; } //****************************************** VOID QB_NET::filter_out_small_amps( USHORT finesse ) //in { for(USHORT i=0; iget_tm_amps().filter_out_small_amps( finesse ); } } #pragma mark --active states-- //****************************************** VOID QB_NET::empty_act_st_sets_of_all_nds() { for(USHORT nd=0;ndempty_act_st_set(); } } //****************************************** VOID QB_NET::fill_act_st_sets_of_all_nds() { for(USHORT nd=0;ndfill_act_st_set(); } } //****************************************** VOID QB_NET::preserve_act_st_sets_of_all_nds() { for(USHORT i=0;ipreserve_act_st_set(); } } //****************************************** VOID QB_NET::restore_act_st_sets_of_all_nds() { for(USHORT i=0;irestore_act_st_set(); } } #pragma mark --add nodes and arrows-- //****************************************** BOOLEAN QB_NET::sort_into_layers_of_external_nds( VECTOR & era_of, //out USHORT & num_of_eras) //out { //Returns true(1) if can sort (no cycles), false(0) if can't. //We won't be grouping nodes into eras of this type. //This function will never be used. It's just presented for completeness. if(its_num_of_nds==0){ num_of_eras=0; return true; } VECTOR out_degrees(0, its_num_of_nds); USHORT i; for(i=0; iget_out_nds().get_len(); } VECTOR rel_era_of(0, its_num_of_nds); L_LIST queue; for(i=0; i nds_entering_x; while( queue.extract_first(x) ){ // i.e., loop continues while there are nodes left in the queue nd_counter++; nds_entering_x = its_nds_p_p[x]->get_in_nds(); for(i= 0; i & era_of, //out USHORT & num_of_eras) //out { //Returns true if can sort (iff no cycles), false if can't. if(its_num_of_nds==0){ num_of_eras=0; return true; } VECTOR rel_era_of(0, its_num_of_nds); SHORT num_of_zero_comps = its_num_of_nds; USHORT i; USHORT cur_era_size = 0; for(i=0; iget_out_nds().get_len()==0){ //Eras start at 0 and end at num_of_eras-1. //At this point, we don't know how many eras there will be, //so we temporarily translate era ids so that last one is max_ushort. rel_era_of[i]=max_ushort; num_of_zero_comps--; cur_era_size++; } } if(cur_era_size==0)return false; //pure cycle USHORT cur_rel_era=max_ushort; NODE * nd_p; while(num_of_zero_comps!=-1){ //For cycle detection, its important to go through loop once for root nodes //i.e., once with num_of_zero_comps == 0 if(num_of_zero_comps==0){ num_of_zero_comps=-1; } if(cur_era_size==0)return false; cur_era_size = 0; for(i=0; iget_in_nds().get_len(); j++){ USHORT in_nd = nd_p->get_in_nds()[j]; if(rel_era_of[in_nd]>cur_rel_era){ return false;//can't sort, a cycle is present } else if (rel_era_of[in_nd]==cur_rel_era){ //Do nothing. //If the node has already been assigned to the era cur_rel_era, //don't assign it to the era cur_rel_era-1. //This takes care of era self-interaction //i.e., arrows connecting nodes in the same era. }else if(rel_era_of[in_nd]==0){ rel_era_of[in_nd]=cur_rel_era-1; num_of_zero_comps--; cur_era_size++; } } } } cur_rel_era--; } //the smallest era ever assigned is: USHORT smallest_rel_era = (cur_rel_era==max_ushort? max_ushort:cur_rel_era+1); //parenthesis important because dealing with ushorts: num_of_eras = (max_ushort - smallest_rel_era) + 1; for(i=0;i era_of(0, its_num_of_nds); USHORT num_of_eras; if(!sort_into_layers_of_external_nds(era_of, num_of_eras))return false; its_nd_chronology.set_to_default_vec(0, its_num_of_nds); its_final_era_len = 0; USHORT time=0; for(USHORT e=0; eadd_out_nd(d); d_p->add_in_nd(s, s_p->get_degen()); if(try_to_sort){ if(!chrono_sort() ){ warn_user_about_cycle(); return false; } } return true; } //****************************************** USHORT QB_NET::add_nd( const STRINGY & nd_class_str, //in BOOLEAN try_to_sort) //in { // used only by ansi_app. See mac_add_nd(). if( its_num_of_nds == its_num_of_nd_ptrs ) grow_num_of_nd_ptrs(); its_num_of_nds++; NODE * nd_p=0; if(nd_class_str=="BEAM_SPL"){ nd_p = new BEAM_SPL(); //delete: in QB_NET::clear_nds(). }else if(nd_class_str=="CUSTOM_ND"){ nd_p = new CUSTOM_ND(); //delete: in QB_NET::clear_nds(). }else if(nd_class_str=="DET_ND"){ nd_p = new DET_ND(); //delete: in QB_NET::clear_nds(). }else if(nd_class_str=="POL_ROTATOR"){ nd_p = new POL_ROTATOR(); //delete: in QB_NET::clear_nds(). }else if(nd_class_str=="POLARIZER"){ nd_p = new POLARIZER(); //delete: in QB_NET::clear_nds(). }else if(nd_class_str=="QBIT_ROT"){ nd_p = new QBIT_ROT(); //delete: in QB_NET::clear_nds(). }else if(nd_class_str=="SG_MAGNET"){ nd_p = new SG_MAGNET(); //delete: in QB_NET::clear_nds(). } ThrowIfNil_(nd_p); its_nds_p_p[its_num_of_nds-1] = nd_p; if(try_to_sort){ chrono_sort(); its_dyn_story.set_to_default_vec(0, its_num_of_nds); } return its_num_of_nds-1; // the returned number will become the node id. //// IMPORTANT: the return value was off by one!!!!! } #pragma mark --degen-- //****************************************** VOID QB_NET::set_degen_of_a_nd( USHORT nd_id, //in USHORT degen) //in { NODE * nd_p = its_nds_p_p[nd_id]; //this is important because don't want to empty trans mat //of out nds unless it's necessary if(nd_p->get_degen()==degen || degen==0)return; nd_p->set_degen(degen); VECTOR out_nds = nd_p->get_out_nds(); for(USHORT i= 0; i< out_nds.get_len(); i++){ its_nds_p_p[out_nds[i]]->set_in_nd_degen(nd_id, degen); } USHORT nd1, nd2, degen1, degen2; BI_NODE * bi_nd_p; DIR_DATA * dir_bi_nd_p = its_bi_nds.get_first_p(); while(dir_bi_nd_p){ bi_nd_p = &(dir_bi_nd_p->its_data); nd1 = bi_nd_p->get_nd1(); nd2 = bi_nd_p->get_nd2(); if(nd_id==nd1 || nd_id==nd2){ degen1 = its_nds_p_p[nd1]->get_degen(); degen2 = its_nds_p_p[nd2]->get_degen(); bi_nd_p->set_degens(degen1, degen2); } dir_bi_nd_p = dir_bi_nd_p->its_next_p; } } //****************************************** USHORT QB_NET::get_max_degen() { USHORT candidate, max=0; for(USHORT nd=0; ndget_degen(); max = ( (max>candidate)? max:candidate ); } return max; } #pragma mark --bi-nodes-- //****************************************** STRINGY QB_NET::get_bi_nd_name( USHORT loc) //in { BI_NODE * bi_nd_p = &(its_bi_nds[loc]); USHORT nd1 = bi_nd_p->get_nd1(); STRINGY namey1 = its_nds_p_p[nd1]->get_name(); USHORT nd2 = bi_nd_p->get_nd2(); STRINGY namey2 = its_nds_p_p[nd2]->get_name(); //need two \s because first \ signals to take second \ literally STRINGY namey = namey1 && " \\ " && namey2; return namey; } //****************************************** VOID QB_NET::get_bi_nd( USHORT loc, //in USHORT & nd1, //out USHORT & nd2) //out {//loc is input and nd1, nd2 are outputs nd1 = its_bi_nds[loc].get_nd1(); nd2 = its_bi_nds[loc].get_nd2(); } //****************************************** BOOLEAN QB_NET::add_bi_nd( USHORT nd1, //in USHORT nd2) //in { //This function checks to see if //(1)the bi-node has been added before, //(2)the bi_node is degenerate (i.e., nd1==nd2) //If either (1) or (2) are true, the function returns "false" and flashes an alert message. //Otherwise, the function returns "true", creates a new bi-node, and inserts //it into the net's list of bi-nodes. if(nd1==nd2){ warn_user_about_degenerate_bi_nd(); return false; } BI_NODE * bi_nd_p; DIR_DATA * dir_bi_nd_p = its_bi_nds.get_first_p(); while(dir_bi_nd_p!=0){ bi_nd_p = &(dir_bi_nd_p->its_data); if(bi_nd_p->has(nd1, nd2)){ warn_user_about_repeated_bi_nd(); return false; } dir_bi_nd_p = dir_bi_nd_p->its_next_p; } USHORT degen1 = its_nds_p_p[nd1]->get_degen(); USHORT degen2 = its_nds_p_p[nd2]->get_degen(); BI_NODE new_bi_nd(nd1, degen1, nd2, degen2); its_bi_nds.insert_last(new_bi_nd); return true; } //****************************************** VOID QB_NET::warn_user_about_degenerate_bi_nd() { my_gen_alert("Your last node choice is inadmissible because the two nodes of a bi-node must be different."); #ifdef _ansi_app //''''''''''''''''''''''''''''''''''''''''''''\\. exit(1); #endif //_ansi_app \\............................................// } //****************************************** VOID QB_NET::warn_user_about_repeated_bi_nd() { my_gen_alert("Your last node choice is inadmissible because it would add to the list a bi-node that is already listed."); #ifdef _ansi_app //''''''''''''''''''''''''''''''''''''''''''''\\. exit(1); #endif //_ansi_app \\............................................// } #pragma mark --dictionaries-- //****************************************** VOID QB_NET::create_nd_name_dictionary() { if(its_num_of_nds==0)return; //check that it doesn't already exist if(its_nd_name_dict_p==0){ its_nd_names_p_p = new const STRINGY * [its_num_of_nds];//new[] //delete: in QB_NET::kill_nd_name_dictionary(). ThrowIfNil_(its_nd_names_p_p); for(USHORT i=0; i< its_num_of_nds; i++){ its_nd_names_p_p[i] = &get_nd_name(i); } its_nd_name_dict_p = new DICTIONARY(its_nd_names_p_p, its_num_of_nds ); //delete: in QB_NET::kill_nd_name_dictionary(). ThrowIfNil_(its_nd_name_dict_p); }else{ its_nd_name_dict_p->add_one_user(); } } //****************************************** VOID QB_NET::create_nd_st_dictionaries() { for(USHORT i=0; i< its_num_of_nds;i++){ its_nds_p_p[i]->create_dict(); } } //****************************************** VOID QB_NET::create_dictionaries() { create_nd_name_dictionary(); create_nd_st_dictionaries(); } //****************************************** VOID QB_NET::kill_nd_name_dictionary() { if(its_nd_name_dict_p->get_num_of_users()<=1){ delete [] its_nd_names_p_p; its_nd_names_p_p = 0; delete its_nd_name_dict_p; its_nd_name_dict_p = 0; }else{ its_nd_name_dict_p->del_one_user(); } } //****************************************** VOID QB_NET::kill_nd_st_dictionaries() { for(USHORT i=0; i< its_num_of_nds;i++){ its_nds_p_p[i]->kill_dict(); } } //****************************************** VOID QB_NET::kill_dictionaries() { kill_nd_name_dictionary(); kill_nd_st_dictionaries(); } #pragma mark --import from TEXT files-- //****************************************** VOID QB_NET::read_topology_file( MY_IFSTREAM & istream) //i-o { istream.ignore(500, my_endline); USHORT num_of_nds; istream>> num_of_nds; // istream.ignore(500, my_endline);istream.ignore(500, my_endline); STRINGY nd_name, nd_class_str; USHORT nd_id, i; for(i=0;i> nd_id>> nd_name >> nd_class_str; add_nd(nd_class_str, false); set_nd_name(nd_id, nd_name); } // istream.ignore(500, my_endline);istream.ignore(500, my_endline); USHORT num_of_arrows; istream>> num_of_arrows; // istream.ignore(500, my_endline);istream.ignore(500, my_endline); USHORT source, dest; for(i=0;i> source >> dest; add_int_arrow(source, dest, false); } chrono_sort(); its_dyn_story.set_to_default_vec(0, its_num_of_nds); // istream.ignore(500, my_endline);istream.ignore(500, my_endline); USHORT num_of_bi_nds; istream>> num_of_bi_nds; // istream.ignore(500, my_endline);istream.ignore(500, my_endline); USHORT nd1, nd2; for(i=0;i>nd1>>nd2; add_bi_nd(nd1, nd2); } } //****************************************** BOOLEAN QB_NET::good_nd_sts_file( MY_IFSTREAM & istream) //i-o { STRINGY nd_name, st_name; USHORT nd_id, degen; USHORT nd_counter = 0; CHAR ch ; BOOLEAN file_is_ok = true; //this function assumes that a node name dictionary is currently available //bad = fatal error //fail = fatal or not fatal error //IMP: Do use exceptions(failbit) because //it alerts you to cases such as if x is an int and //cin>>x fails because cin doesn't have an int next. //IMP: (istream >> name) will set eof()=true //if there is no visible or invisible(like \n) character after name. //Therefore, try to test name immediately after //(istream >> name), and before you call my_get() again. //IMP: Do not use exceptions(eofbit) or else //for example, in // istream>>st_name; // if(!st_name.is_legal_name())throw ILLEGAL_NAME(st_name); //>> may throw before I test st_name.is_legal_name() //IMP: A very important stress test for this and //all other methods that read text files is to delete the last invisible //character of the file and to make the last thing read illegal. //For example, if the file should end with a double, //replace the double by //(1)1a (with no invisible after 1a) //(2)1a\n //(3)1 (with no invisible after 1) //(4)1\n istream.exceptions(ios::badbit | ios::failbit); //RP = reading position try{ //skip header: ch = my_endline; while( ch!='#' ){ istream.my_get(ch); } //AT THIS POINT, RP = ch = # while(ch =='#'){ istream>>nd_name>>degen; nd_counter++; nd_id = its_nd_name_dict_p->get_id_of_this_stringy(nd_name); if(nd_id==max_ushort) throw UNLISTED_NODE(nd_name); if(degen==0)throw ZERO_DEGEN(nd_name); for(USHORT r=0; r>st_name; if(!st_name.is_legal_name())throw ILLEGAL_NAME(st_name); } //AT THIS POINT, RP is on last character of st_name istream.my_get(ch); //AT THIS POINT, RP = ch = first character after st_name //go to #: while(ch!='#'){ //isspace includes \r, \n, \t, space bar if( !isspace(ch) )throw WRONG_PATTERN(); istream.my_get(ch); } //AT THIS POINT, RP = ch = # } } catch(END_OF_FILE){} catch(const IO_EXCEPTION & exc){ exc.print_error("with names of node states", istream.cur_line() ); file_is_ok = false; #ifdef _ansi_app //''''''''''''''''''''''''''''''''''''''''''''\\. exit(1); #endif //_ansi_app \\............................................// } //The class failure is defined INSIDE the class ios so //one must use "ios::failure" to access it. catch(const ios::failure & io_exc){ //STRINGY stringy = io_exc.what();//pretty useless my_gen_alert( STRINGY("Bad Input: Check file ") && "with names of node states" && ", line " && istream.cur_line() && ". " ); file_is_ok = false; #ifdef _ansi_app //''''''''''''''''''''''''''''''''''''''''''''\\. exit(1); #endif //_ansi_app \\............................................// } #ifdef _ansi_app //''''''''''''''''''''''''''''''''''''''''''''\\. //In ansi-app case, exit if the list is partial if(nd_counter!=its_num_of_nds){ cerr << "You forgot some nodes in your list of names of node states."; exit(1); } #endif //_ansi_app \\............................................// //stops istream from throwing any more exceptions istream.exceptions(ios::goodbit); //rewinds istream. //istream.seekg_(0, ios::beg); // dpo istream.seekg_(0, ios::in); // clears eof bit flag istream.clear(); return file_is_ok; } //****************************************** BOOLEAN QB_NET::read_nd_sts_file( MY_IFSTREAM & istream) //i-o { STRINGY nd_name, st_name; USHORT nd_id, degen; USHORT nd_counter = 0; CHAR ch; //this function assumes that a node name dictionary is currently available if(!good_nd_sts_file(istream)){ return false; } try{ ch = my_endline; while( ch!='#' ){ istream.my_get(ch); } while(ch =='#'){ istream>>nd_name>>degen; nd_counter++; nd_id = its_nd_name_dict_p->get_id_of_this_stringy(nd_name); set_degen_of_a_nd(nd_id, degen); for(USHORT r=0; r>st_name; set_state_name(nd_id, r, st_name); } istream.my_get(ch); while(ch!='#'){istream.my_get(ch);} } } catch(END_OF_FILE){} return true; } //****************************************** BOOLEAN QB_NET::good_amps_file( MY_IFSTREAM & istream) //i-o { CHAR ch; USHORT in_nd_loc; USHORT nd_id, in_nd_id, in_nd_st_id, nd_st_id; STRINGY nd_name, in_nd_name, in_nd_st_name, nd_st_name; DOUBLE x, y; NODE * nd_p; VECTOR in_st_vec; TM_COL_NUM in_st; Boolean more_in_sts; //this function assumes that node and nd_st dictionaries are available!! BOOLEAN file_is_ok = true; istream.exceptions(ios::badbit | ios::failbit); //RP = reading position try{ //skip header: ch = my_endline; while( ch!='#' ){ istream.my_get(ch); } //AT THIS POINT, RP = ch = # while(ch =='#'){ istream >> nd_name; nd_id = its_nd_name_dict_p->get_id_of_this_stringy(nd_name); if(nd_id==max_ushort)throw UNLISTED_NODE(nd_name); nd_p= its_nds_p_p[nd_id]; if(nd_p->get_num_of_in_nds()==0){ //deal with root nodes for(USHORT s=0; sget_degen(); s++){ istream>> nd_st_name>> x>> y; nd_st_id = nd_p->get_dict().get_id_of_this_stringy(nd_st_name); if(nd_st_id==max_ushort)throw UNLISTED_STATE(nd_name, nd_st_name); //if(norm(COMPLEX(x, y))>1)throw ILLEGAL_AMP(x, y); //norm = abs**2 } //AT THIS POINT, RP is on last character of y istream.my_get(ch); //AT THIS POINT, RP = ch = first character after y //go to #: while(ch!='#'){ if( !isspace(ch) )throw WRONG_PATTERN(); istream.my_get(ch); } //AT THIS POINT, RP = ch = # }else{ in_st_vec.set_to_default_vec(0, nd_p->get_num_of_in_nds()); more_in_sts=true; while(more_in_sts){ for(USHORT r=0; rget_num_of_in_nds(); r++){ istream >> in_nd_name>>in_nd_st_name; in_nd_id = its_nd_name_dict_p->get_id_of_this_stringy(in_nd_name); if(in_nd_id==max_ushort)throw UNLISTED_NODE(in_nd_name); in_nd_loc = nd_p->get_in_nds().loc_of_target(in_nd_id); if(in_nd_loc==max_ushort)throw UNLISTED_IN_NODE(nd_name, in_nd_name); in_nd_st_id = its_nds_p_p[in_nd_id]->get_dict().get_id_of_this_stringy(in_nd_st_name); if(in_nd_st_id==max_ushort)throw UNLISTED_STATE(in_nd_name, in_nd_st_name); in_st_vec[in_nd_loc]=in_nd_st_id; } in_st = nd_p->get_in_nd_sof().int_label(in_st_vec); for(USHORT s=0; sget_degen(); s++){ istream>> nd_st_name>> x>> y; nd_st_id = nd_p->get_dict().get_id_of_this_stringy(nd_st_name); if(nd_st_id==max_ushort)throw UNLISTED_STATE(nd_name, nd_st_name); //if(norm(COMPLEX(x, y))>1)throw ILLEGAL_AMP(x, y); } //AT THIS POINT, RP is on last character of y istream.my_get(ch); //AT THIS POINT, RP = ch = first character after y //go to end of line: while(ch!=my_endline){ if( !isspace(ch) )throw WRONG_PATTERN(); istream.my_get(ch); } //AT THIS POINT, RP = ch = my_endline //file may end before this reaches a non-blank space: while(isspace(ch)){istream.my_get(ch);} //AT THIS POINT, RP = ch = first non-white ch after last my_endline. if(ch=='#'){ more_in_sts = false; }else{ more_in_sts = true; istream.putback(ch); } }//end of loop over in_sts }//endif (root node or not) //AT THIS POINT, RP = ch = # }//end of loop over nodes }//end of try{} catch(END_OF_FILE){} catch(const IO_EXCEPTION & exc){ exc.print_error("with amplitudes", istream.cur_line()); file_is_ok = false; #ifdef _ansi_app //''''''''''''''''''''''''''''''''''''''''''''\\. exit(1); #endif //_ansi_app \\............................................// } //The class failure is defined INSIDE the class ios so //one must use "ios::failure" to access it. catch(const ios::failure & io_exc){ //STRINGY stringy = io_exc.what();//pretty useless my_gen_alert( STRINGY("Bad Input: Check file ") && "with amplitudes" && ", line " && istream.cur_line() && ". " ); file_is_ok = false; #ifdef _ansi_app //''''''''''''''''''''''''''''''''''''''''''''\\. exit(1); #endif //_ansi_app \\............................................// } //stops istream from throwing any more exceptions istream.exceptions(ios::goodbit); //rewinds istream. //istream.seekg_(0, ios::beg); //dpo istream.seekg_(0, ios::in); // clears eof bit flag istream.clear(); return file_is_ok; } //****************************************** BOOLEAN QB_NET::read_amps_file( MY_IFSTREAM & istream) //i-o { CHAR ch; USHORT in_nd_loc; USHORT nd_id, in_nd_id, in_nd_st_id, nd_st_id; STRINGY nd_name, in_nd_name, in_nd_st_name, nd_st_name; DOUBLE x, y; NODE * nd_p; VECTOR in_st_vec; Boolean more_in_sts; TM_COL_NUM in_st; //this function assumes that node and nd_st dictionaries are available!! if( !good_amps_file(istream) ){ return false; } try{ ch = my_endline; while(ch!='#'){ istream.my_get(ch); } while(ch =='#'){ istream >> nd_name; nd_id = its_nd_name_dict_p->get_id_of_this_stringy(nd_name); nd_p= its_nds_p_p[nd_id]; nd_p->empty_trans_mat(); if(nd_p->get_num_of_in_nds()==0){ //deal with root nodes for(USHORT s=0; sget_degen(); s++){ istream>> nd_st_name>> x>> y; nd_st_id = nd_p->get_dict().get_id_of_this_stringy(nd_st_name); nd_p->set_tm_amp(nd_st_id, 0, COMPLEX(x, y)); } istream.my_get(ch); while(ch!='#'){istream.my_get(ch);} }else{ in_st_vec.set_to_default_vec(0, nd_p->get_num_of_in_nds()); more_in_sts=true; while(more_in_sts){ for(USHORT r=0; rget_num_of_in_nds(); r++){ istream >> in_nd_name>>in_nd_st_name; in_nd_id = its_nd_name_dict_p->get_id_of_this_stringy(in_nd_name); in_nd_loc = nd_p->get_in_nds().loc_of_target(in_nd_id); in_nd_st_id = its_nds_p_p[in_nd_id]->get_dict().get_id_of_this_stringy(in_nd_st_name); in_st_vec[in_nd_loc]=in_nd_st_id; } in_st = nd_p->get_in_nd_sof().int_label(in_st_vec); for(USHORT s=0; sget_degen(); s++){ istream>> nd_st_name>> x>> y; nd_st_id = nd_p->get_dict().get_id_of_this_stringy(nd_st_name); nd_p->set_tm_amp(nd_st_id, in_st, COMPLEX(x, y)); } istream.my_get(ch); while(isspace(ch)){istream.my_get(ch);} if(ch=='#'){ more_in_sts = false; }else{ more_in_sts = true; istream.putback(ch); } } } } } catch(END_OF_FILE){} return true; } #pragma mark --TEXT files use during run-- //****************************************** BOOLEAN QB_NET::good_ecases_file( MY_IFSTREAM & istream) //i-o { CHAR ecase_name_cstr[64]; STRINGY nd_name; STRINGY nd_st_name; USHORT nd_id; USHORT nd_st_id; CHAR ch; BOOLEAN more_nodes; //this function assumes that node and nd_st dictionaries are available!! BOOLEAN file_is_ok = true; BOOLEAN know_cur_ecase_name = false; istream.exceptions(ios::badbit | ios::failbit); //RP = reading position try{ //skip header: ch=my_endline; while( ch!='#' ){ istream.my_get(ch); } //AT THIS POINT, RP = ch= # while(ch=='#'){//loop over ecases istream >> ecase_name_cstr; if(!STRINGY(ecase_name_cstr).is_legal_name())throw ILLEGAL_NAME(ecase_name_cstr); know_cur_ecase_name = true; //AT THIS POINT, RP is on last character of ecase name istream.my_get(ch); //AT THIS POINT, RP = ch = first character after ecase name //go to end of ecase_name line: while(ch!=my_endline){ if( !isspace(ch) )throw WRONG_PATTERN(); istream.my_get(ch); } //AT THIS POINT, RP = ch = my_endline //file may end before this reaches a non-blank space: while(isspace(ch)){istream.my_get(ch);} //AT THIS POINT, RP = ch = first non-white ch after last my_endline. if(ch=='#'){ more_nodes = false; }else{ more_nodes = true; istream.putback(ch); } while(more_nodes){ //loop over nodes with non default active-state set istream >> nd_name; nd_id = get_dict().get_id_of_this_stringy(nd_name); if(nd_id==max_ushort)throw UNLISTED_NODE(nd_name); //AT THIS POINT, RP is on last character of nd_name istream.my_get(ch); //AT THIS POINT, RP = ch = first character after nd_name //go to end of nd_name line: while(ch!=my_endline){ //loop over the active-state names of a single node if(isspace(ch)){ //if ch is blank, advance carefully, just one character at a time istream.my_get(ch); }else{//if ch is not blank, advance less carefully, gobble up a whole name istream.putback(ch); istream >> nd_st_name; nd_st_id = get_nd_ptr(nd_id)->get_dict().get_id_of_this_stringy(nd_st_name); if(nd_st_id==max_ushort)throw UNLISTED_STATE(nd_name, nd_st_name); //AT THIS POINT, RP is on last character of nd_st_name istream.my_get(ch); //AT THIS POINT, RP = ch = first character after nd_st_name } }//end of loop over state names // AT THIS POINT, RP = ch = my_endline //file may end before this reaches a non-blank space: while(isspace(ch)){istream.my_get(ch);} //AT THIS POINT, RP = ch = first non-white ch after last my_endline. if(ch=='#'){ more_nodes = false; }else{ more_nodes = true; istream.putback(ch); } }//end of loop over nodes with non default active-state set //AT THIS POINT, RP = ch = # know_cur_ecase_name = false; }//end of loop over ecases }// end of try{} catch(END_OF_FILE){ if(!know_cur_ecase_name){ my_gen_alert( STRINGY("Bad Input: Check file ") && "with ecases" && ", line " && istream.cur_line() && ". " && "File should not end here. Something is missing." ); file_is_ok = false; #ifdef _ansi_app //''''''''''''''''''''''''''''''''''''''''''''\\. exit(1); #endif //_ansi_app \\............................................// } } catch(const IO_EXCEPTION & exc){ exc.print_error("with ecases", istream.cur_line()); file_is_ok = false; #ifdef _ansi_app //''''''''''''''''''''''''''''''''''''''''''''\\. exit(1); #endif //_ansi_app \\............................................// } //The class failure is defined INSIDE the class ios so //one must use "ios::failure" to access it. catch(const ios::failure & io_exc){ //STRINGY stringy = io_exc.what();//pretty useless my_gen_alert( STRINGY("Bad Input: Check file ") && "with ecases" && ", line " && istream.cur_line() && ". " ); file_is_ok = false; #ifdef _ansi_app //''''''''''''''''''''''''''''''''''''''''''''\\. exit(1); #endif //_ansi_app \\............................................// } //stops istream from throwing any more exceptions istream.exceptions(ios::goodbit); //rewinds istream. istream.seekg_(0, ios::in); //clears eof bit flag istream.clear(); return file_is_ok; } //****************************************** VOID QB_NET::write_one_story_into_file( MY_OFSTREAM * fstream_p, //i-o USHORT net_story_count, //in USHORT ending) //in { *fstream_p<get_st_name(its_dyn_story[i]) <<", \t"; } i = its_num_of_nds - 1; *fstream_p << its_nds_p_p[i]->get_name() <<" = " << its_nds_p_p[i]->get_st_name(its_dyn_story[i]) << my_endline ; } //****************************************** VOID QB_NET::write_header_of_nd_probs_file( MY_OFSTREAM * nd_probs_stream_p) //i-o { *nd_probs_stream_p <<"node: its states"<get_num_of_sel_nds(); Boolean do_all = (num==0||num==its_num_of_nds); #endif //_mac_gui_app \\............................................// for(USHORT nd_id=0;nd_idis_selected())) goto next_nd; #endif //_mac_gui_app \\............................................// *nd_probs_stream_p <get_name() <<": \t"; for(USHORT st=0; stget_degen(); st++){ *nd_probs_stream_p <<(st+1) <<'#' <get_st_name(st) <<" \t"; } *nd_probs_stream_p << my_endline; next_nd:; } } //****************************************** VOID QB_NET::write_nd_probs_into_file( const CHAR * ecase_name_cstr, //in MY_OFSTREAM * nd_probs_stream_p) //i-o { *nd_probs_stream_p<get_num_of_sel_nds(); Boolean do_all = (num==0||num==its_num_of_nds); #endif //_mac_gui_app \\............................................// for(USHORT nd_id=0;nd_idis_selected())) goto next_nd; #endif //_mac_gui_app \\............................................// *nd_probs_stream_p <get_name() <<" \t"; for(st=0; stget_degen(); st++){ *nd_probs_stream_p <get_cum_prob(st) <<" \t"; } *nd_probs_stream_p << my_endline; next_nd:; } } //****************************************** VOID QB_NET::write_bi_nd_probs_into_file( const CHAR * ecase_name_cstr, //in MY_OFSTREAM * bi_nd_probs_stream_p) //i-o { *bi_nd_probs_stream_p<get_name(); x = top_str.get_len(); y = get_len_of_longest_st_name(nd1); len_of_col_1 = 15; if( len_of_col_1 < x) len_of_col_1 = x; if( len_of_col_1 < y) len_of_col_1 = y; *bi_nd_probs_stream_p <get_degen();nd2_st++){ top_str = its_nds_p_p[nd2]->get_st_name(nd2_st); x = top_str.get_len(); col_len= 8; if(col_lenget_degen();nd1_st++){ *bi_nd_probs_stream_p <get_st_name(nd1_st) <<" \t"; for(nd2_st=0; nd2_st< its_nds_p_p[nd2]->get_degen();nd2_st++){ x = its_nds_p_p[nd2]->get_st_name(nd2_st).get_len(); col_len= 8; if(col_lenget_cum_prob(nd1_st, nd2_st) <<" \t"; } *bi_nd_probs_stream_p <its_next_p; } } \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Ansi_QBNet/QB_NET.h b/Legacy/QFog2-MachO/QFogSource/Ansi_QBNet/QB_NET.h new file mode 100644 index 0000000..c10c252 --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Ansi_QBNet/QB_NET.h @@ -0,0 +1 @@ +#pragma once #include "QFog_constants.h" #ifdef _mac_gui_app //''''''''''''''''''''''''''''''''''''''''''''\\. class C_DOC; class C_MAIN_VIEW; #include "C_ARROW.h" #include "C_ANTHOLOGY_ITEM.h" // a run is composed of one or more go_forward()'s enum RUN_STATE{bef_run, dur_run, aft_run}; //dur= during #endif //_mac_gui_app \\............................................// #include #include #include "NODE.h" #include "VECTOR.h" #include "STRINGY.h" #include "L_LIST.h" #include "UI_MAP.h" #include "BI_NODE.h" #include "MY_FSTREAMS.h" //QB_NET = quantum bayesian net //****************************************** class QB_NET { private: NODE * * its_nds_p_p; // nds = nodes // a NODE object X will have id-number nd_id if its_nds_p_p[nd_id] points to X // num = number, ptrs = pointers USHORT its_num_of_nd_ptrs; USHORT its_num_of_nds; L_LIST its_bi_nds; const STRINGY * * its_nd_names_p_p; DICTIONARY * its_nd_name_dict_p; VECTOR its_nd_chronology; USHORT its_final_era_len; //dynamic COMPLEX its_dyn_amp; VECTOR its_dyn_story; #ifdef _mac_gui_app //''''''''''''''''''''''''''''''''''''''''''''\\. C_DOC * its_doc_p; C_MAIN_VIEW * its_mview_p; L_LIST its_arrows; L_LIST its_anthology; RUN_STATE its_run_state; #endif //_mac_gui_app \\............................................// public: VOID clear_nds(); VOID clear(); VOID init(); QB_NET(); virtual ~QB_NET(); NODE * get_nd_ptr(USHORT nd_id); USHORT get_num_of_nds() const; const STRINGY & get_nd_name(USHORT nd_id) const; VOID set_nd_name(USHORT nd_id, const STRINGY & name); USHORT get_len_of_longest_nd_name(); USHORT get_len_of_longest_st_name(USHORT nd_id); VOID set_state_name(USHORT nd_id, USHORT row_num, const STRINGY & new_name); const USHORT get_cur_finesse_of_amps() const; VOID filter_out_small_amps(USHORT finesse ); VOID set_act_sts_of_a_nd(USHORT nd_id, const SET & act_sts); VOID activate_a_nd_state(USHORT nd_id, USHORT st_id); VOID empty_act_st_sets_of_all_nds(); VOID fill_act_st_sets_of_all_nds(); VOID preserve_act_st_sets_of_all_nds(); VOID restore_act_st_sets_of_all_nds(); BOOLEAN sort_into_layers_of_external_nds(VECTOR & era_of, USHORT & num_of_eras); // BOOLEAN sort_into_layers_of_parents(VECTOR & era_of, USHORT & num_of_eras); BOOLEAN chrono_sort(); VOID grow_num_of_nd_ptrs(); VOID warn_user_about_cycle(); BOOLEAN add_int_arrow(USHORT s, USHORT d, BOOLEAN try_to_sort); USHORT add_nd(const STRINGY & nd_class_str, BOOLEAN try_to_sort); VOID set_degen_of_a_nd(USHORT nd_id, USHORT degen); USHORT get_degen_of_a_nd(USHORT nd_id); USHORT get_max_degen(); USHORT get_num_of_bi_nds(); BI_NODE * get_bi_nd_ptr(USHORT loc); STRINGY get_bi_nd_name(USHORT loc); VOID get_bi_nd(USHORT loc, USHORT & nd1, USHORT & nd2); BOOLEAN add_bi_nd(USHORT nd1, USHORT nd2); VOID warn_user_about_repeated_bi_nd(); VOID warn_user_about_degenerate_bi_nd(); const DICTIONARY & get_dict() const; VOID create_nd_name_dictionary(); VOID create_nd_st_dictionaries(); VOID create_dictionaries(); VOID kill_nd_name_dictionary(); VOID kill_nd_st_dictionaries(); VOID kill_dictionaries(); VOID read_topology_file(MY_IFSTREAM & istream); BOOLEAN good_nd_sts_file(MY_IFSTREAM & istream); BOOLEAN read_nd_sts_file(MY_IFSTREAM & istream); BOOLEAN good_amps_file(MY_IFSTREAM & istream); BOOLEAN read_amps_file(MY_IFSTREAM & istream); BOOLEAN good_ecases_file(MY_IFSTREAM & istream); VOID write_one_story_into_file( MY_OFSTREAM * fstream_p, USHORT net_story_count, USHORT ending); VOID write_header_of_nd_probs_file( MY_OFSTREAM * nd_probs_stream_p); VOID write_nd_probs_into_file( const CHAR * ecase_name_cstr, MY_OFSTREAM * nd_probs_stream_p); VOID write_bi_nd_probs_into_file( const CHAR * ecase_name_cstr, MY_OFSTREAM * bi_nd_probs_stream_p); VOID set_cum_info_to_default(); VOID fill_final_era_degens(VECTOR & final_era_degens); VOID set_all_dyn_sts_to_max_ushort(); BOOLEAN external_nds_accept_ending(const VECTOR & ending_vec); BOOLEAN dyn_in_st_is_consistent(USHORT nd_id); VOID send_dyn_in_st_to_nds(USHORT nd_id); VOID use_dyn_in_sts_to_reconstruct_dyn_sts_for_times_larger_than(USHORT limit_time); VOID set_dyn_net_story_and_amp(); VOID add_story_to_cum_amps(); VOID prepare_cum_info_for_next_ending(); VOID normalize_cum_probs(); VOID add_story_to_anthology( USHORT ending); VOID multi_mode_go( BOOLEAN is_mini_run, const CHAR * ecase_name_cstr, MY_OFSTREAM * nd_probs_stream_p, MY_OFSTREAM * bi_nd_probs_stream_p, MY_OFSTREAM * stories_stream_p, BOOLEAN illustrate_stories, DOUBLE & out_prob, USHORT & num_of_stories); VOID go_forward( const CHAR * ecase_name_cstr, MY_OFSTREAM * nd_probs_stream_p, MY_OFSTREAM * bi_nd_probs_stream_p, MY_OFSTREAM * stories_stream_p, BOOLEAN illustrate_stories); VOID do_mini_run(DOUBLE & out_prob, USHORT & num_of_stories); #ifdef _mac_gui_app //''''''''''''''''''''''''''''''''''''''''''''\\. ND_CLASS_ID get_nd_class_id(USHORT nd_id) const; STRINGY get_nd_class_str(USHORT nd_id) const; VOID set_doc_and_mview_ptrs(C_DOC * doc_p, C_MAIN_VIEW * view_p); DIR_DATA * get_arrows_first_p(); USHORT get_num_of_arrows(); VOID reorder_nds(const UI_MAP & map); VOID reorder_nd_sts(USHORT nd_id, const UI_MAP & map); VOID del_int_arrow(USHORT s, USHORT d, BOOLEAN try_to_sort); VOID del_nd(USHORT nd_id, BOOLEAN try_to_sort); VOID del_bi_nd(USHORT xed_position); VOID del_all_bi_nds_with_this_nd(USHORT nd_id); BOOLEAN calc_closest_pts( const C_CIRCLE & cir1, const C_CIRCLE & cir2, Point & pt1, Point & pt2); C_ARROW * mac_add_int_arrow( const C_PORT_NAME & s_port_name, const C_PORT_NAME & d_port_name, BOOLEAN try_to_sort); USHORT mac_add_nd( ND_CLASS_ID nd_class_id, const Point & m_down_pt, BOOLEAN try_to_sort); BOOLEAN nodes_have_same_state_set(USHORT nd1, USHORT nd2); BOOLEAN change_source_nd_of_ar(C_ARROW * ar_p, const C_PORT_NAME & new_s_port_name); const RUN_STATE get_run_state() const; VOID set_run_state( RUN_STATE state); DIR_DATA * get_anthology_first_p(); USHORT get_anthology_len(); VOID write_net_stream(LStream & net_stream, NET_STREAM_TYPE stream_type); VOID read_net_stream(LStream & net_stream, NET_STREAM_TYPE stream_type); VOID write_topology_file(MY_OFSTREAM & strm); VOID write_nd_sts_file(MY_OFSTREAM & strm); VOID write_amps_file(MY_OFSTREAM & strm); #endif //_mac_gui_app \\............................................// }; #pragma mark - //****************************************** inline NODE * QB_NET::get_nd_ptr( USHORT nd_id) //in { return its_nds_p_p[nd_id]; } //****************************************** inline USHORT QB_NET::get_num_of_nds() const { return its_num_of_nds; } //****************************************** inline const STRINGY & QB_NET::get_nd_name( USHORT nd_id) //in const { return its_nds_p_p[nd_id]->get_name(); } //****************************************** inline VOID QB_NET::set_nd_name( USHORT nd_id, //in const STRINGY & name) //in { its_nds_p_p[nd_id]->set_name(name); } //****************************************** inline VOID QB_NET::set_state_name( USHORT nd_id, //in USHORT row_num, //in const STRINGY & new_name) //in { its_nds_p_p[nd_id]->set_st_name(row_num, new_name); } //****************************************** inline VOID QB_NET::set_act_sts_of_a_nd( USHORT nd_id, //in const SET & act_sts) //in { its_nds_p_p[nd_id]->set_active_states(act_sts); } //****************************************** inline VOID QB_NET::activate_a_nd_state( USHORT nd_id, //in USHORT st_id) //in { its_nds_p_p[nd_id]->activate_state(st_id); } //****************************************** inline USHORT QB_NET::get_degen_of_a_nd( USHORT nd_id) //in { return its_nds_p_p[nd_id]->get_degen(); } //****************************************** inline USHORT QB_NET::get_num_of_bi_nds() { return its_bi_nds.get_len(); } //****************************************** inline BI_NODE * QB_NET::get_bi_nd_ptr(USHORT loc) { return &(its_bi_nds[loc]); } //****************************************** inline const DICTIONARY & QB_NET::get_dict() const { return *its_nd_name_dict_p; } //****************************************** inline VOID QB_NET::do_mini_run( DOUBLE & out_prob, //out USHORT & num_of_stories) //out { //Calculates total probability of all stories and //number of stories, assuming all states are active. multi_mode_go( true,//is_mini_run 0,//ecase_name_cstr 0,//nd_probs_stream_p 0,//bi_nd_probs_stream_p 0,//stories_stream_p false,//illustrate_stories out_prob, num_of_stories); } #ifdef _mac_gui_app //''''''''''''''''''''''''''''''''''''''''''''\\. //****************************************** inline ND_CLASS_ID QB_NET::get_nd_class_id( USHORT nd_id) //in const { return its_nds_p_p[nd_id]->get_class_id(); } //****************************************** inline STRINGY QB_NET::get_nd_class_str( USHORT nd_id) //in const { return its_nds_p_p[nd_id]->get_class_str(); } //****************************************** inline DIR_DATA * QB_NET::get_arrows_first_p() { return its_arrows.get_first_p(); } //****************************************** inline USHORT QB_NET::get_num_of_arrows() { return its_arrows.get_len(); } //****************************************** inline const RUN_STATE QB_NET::get_run_state() const { return its_run_state; } //****************************************** inline VOID QB_NET::set_run_state( RUN_STATE state) { // used by C_DOC its_run_state = state; } //****************************************** inline DIR_DATA * QB_NET::get_anthology_first_p() { return its_anthology.get_first_p(); } //****************************************** inline USHORT QB_NET::get_anthology_len() { return its_anthology.get_len(); } #endif //_mac_gui_app \\............................................// \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Headers/.DS_Store b/Legacy/QFog2-MachO/QFogSource/Headers/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..39b14102ce60c74016c06828cb9c75054e5ef7f5 GIT binary patch literal 12292 zcmeI1!AcxK5QhKWD6E9w9)#?1?vg<6ISghM_8>{{0gSszG-TZgx(j-8-oQ(4$)n^U z^prR76v!i(zp9&IhS7rrToe9Uy8oV@uIlM;hN)>5K-ieSe*yFWbXiP0E39rXJ8z|B zoz$~T4IZPw6x-Ot7zeG<>Uf9*?B1>66$%{kSHFMH@EUJ$gb(&hSYD@Zoagq7;y9mbL>}7K|9J9e>&E&-i+4y%ot~lXj`0j%BN{^_h|UdXqUBU zPq?~M>@r?~8Dq{E+g96N)mM7{s(JSC7F!&*KaRV*^(;e;&$2KmFvNAa*{`G52F{eRO* zMH{tZB_{xD=aOXu>WWmKM_ zEg=7AK5@L#pKN~z&VK+eFXF#8tJSspI8`Db0wN#+A|L`HAOa#F0wN#+A|L`HAOa%r H4-)tT9cFWf literal 0 HcmV?d00001 diff --git a/Legacy/QFog2-MachO/QFogSource/Headers/ANSI_QFogDeb-prefix.h b/Legacy/QFog2-MachO/QFogSource/Headers/ANSI_QFogDeb-prefix.h new file mode 100644 index 0000000..89c5b44 --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Headers/ANSI_QFogDeb-prefix.h @@ -0,0 +1 @@ +#pragma once #define _do_debug 1 //NONTRIVIAL EXCERPT FROM PP //see DebugSample_PCH.cp // _do_debug corresponds to __PP_SAMPLE_DEBUG__ in CDebugApp sample project #ifndef _do_debug #error "_do_debug is not yet #defined" #endif #if !(_do_debug==0 || _do_debug==1) #error "_do_debug is not zero or one" #endif #if _do_debug //for UDebugging and UException which give Throw_() and Signal_() capabilities: #define Debug_Throw #define Debug_Signal #else #endif #include #include //c language math #include //must be after #include , both necessary #include #include #include #include "ANSI_UDebugging.h" #include "ANSI_UException.h" /* The ansi application and the mac gui application each has parts that are not in the other. The overlapping code will have no preprocessor conditionals bracketing it. The parts that are in the ansi_app minus the mac_gui_app will be bracketed by #ifdef _ansi_app. The parts that are in the mac_gui_app minus the ansi_app will be bracketed by #ifdef _mac_gui_app. The ansi app is non-graphical and ANSI compatible. It can run on any platform. */ #define _ansi_app #include "my_notation.h" \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Headers/CommonMach-OPrefix.h b/Legacy/QFog2-MachO/QFogSource/Headers/CommonMach-OPrefix.h new file mode 100644 index 0000000..fc16ba7 --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Headers/CommonMach-OPrefix.h @@ -0,0 +1,201 @@ +// =========================================================================== +// CommonMach-OPrefix.h ©1999-2003 Metrowerks Corporation. All rights reserved. +// =========================================================================== +// Common options for a Mach-O Target + +// --------------------------------------------------------------------------- +// Mach-O Target + +#define PP_Target_Carbon 1 + +#define PP_Target_Classic (!PP_Target_Carbon) + +#define TARGET_API_MAC_CARBON PP_Target_Carbon +#define TARGET_API_MAC_OS8 PP_Target_Classic +#define TARGET_API_MAC_OSX PP_Target_Carbon + + +// --------------------------------------------------------------------------- +// Options + +#define PP_Uses_PowerPlant_Namespace 0 +#define PP_Supports_Pascal_Strings 1 +#define PP_StdDialogs_Option PP_StdDialogs_NavServicesOnly + +#define PP_Uses_Old_Integer_Types 0 +#define PP_Obsolete_AllowTargetSwitch 0 +#define PP_Obsolete_ThrowExceptionCode 0 +#define PP_Warn_Obsolete_Classes 1 + +#define PP_Suppress_Notes_221 1 + +#include + +#include //c language math +#include //must be after #include , both necessary +#include +//FIXEDDECIMAL or FLOATDECIMAL are used +//as the second argument of LString::Assign ( double, char, SInt16 ) +//Definition in fp.h but not loaded? +#ifndef FIXEDDECIMAL + #define FIXEDDECIMAL 1 +#endif + + +//see MacTypes.h header, linker couldn't find memmove and bzero +#define NO_BLOCKMOVE_INLINE 1 + + +//----------------------------------------------------------------- +//NONTRIVIAL EXCERPT FROM PP +//see DebugSample_PrefixCommon.h + +// _do_debug corresponds to __PP_SAMPLE_DEBUG__ in CDebugApp sample project +#ifndef _do_debug +#error "_do_debug is not yet #defined" +#endif + +#if !(_do_debug==0 || _do_debug==1) +#error "_do_debug is not zero or one" +#endif + + +// MacOS Macros + +#define OLDROUTINENAMES 0 +#define OLDROUTINELOCATIONS 0 +#define SystemSevenOrLater 1 + +// use new PP API + +#define PP_Obsolete_Constants 0 +#define PP_Obsolete_Stream_Creators 0 +#define PP_Obsolete_Array_API 0 + +// for MSL + +#if 0 // already defined in ansi_prefix.mach.h +#define __dest_os __mac_os +#endif + +#if _do_debug + + //for UDebugging and UException which give Throw_() and Signal_() capabilities: + #define Debug_Throw + #define Debug_Signal + + //these debugging macros must be #defined to desired value + + #define PP_DEBUG 1 +// #define PP_USE_MOREFILES + #define PP_SPOTLIGHT_SUPPORT 1 + #define PP_QC_SUPPORT 0 + #define PP_DEBUGNEW_SUPPORT 0 + + //set DebugNew to full strength + //could also be set to DEBUG_NEW_BASIC + +// #define DEBUG_NEW DEBUG_NEW_LEAKS + +#else + + // when not debugging, turn everything is off + // (only used for final builds) + + #define PP_DEBUG 0 + // we don't need MoreFiles in the final build, but if we + // did, it would be safe to leave this #defined in. +// #define PP_USE_MOREFILES + #define PP_SPOTLIGHT_SUPPORT 0 + #define PP_QC_SUPPORT 0 + #define PP_DEBUGNEW_SUPPORT 0 + + //since we're not supporting DebugNew, no need to define DEBUG_NEW + #define DEBUG_NEW DEBUG_NEW_OFF + +#endif +//After defining all the debugging macros, +//we are ready for this header +#include + +#if _do_debug + + + // A nifty DebugNew feature is the ability to generate a "leaks.log" + // file detailing the leaks that it found. The way it does this is + // through some preprocessor "magic" turning "new" into "NEW". This + // is a hack, basically, but it can generally work. However, DebugNew + // cannot work with array operator new (new[]). So if you use array + // operator new anywhere, this trick will NOT work for you (in fact + // it could cause trouble). About your only solution then is to + // manually replace "new" with "NEW" throughout your code. + // + // new[] doesn't work because the MW C/C++ compiler (up until CWP3) + // did not support overriding/overloading new[]. And DebugNew needs + // to be updated to suit this (at the time of this writing, it was + // not). + // + // Also, if you have your own operator new anywhere (or really any + // use of the word "new" that's in source and not in a comment), the + // preprocessor will replace "new" with "NEW". This could cause all + // sorts of havoc (e.g. try this with LThread or LReentrantMemoryPool + // (and it's LRMPObject class)). + // + // If you cannot utilize DebugNew's DEBUG_NEW_LEAKS functionality + // then your best bet would probably be to use DebugNew at the + // DEBUG_NEW_BASIC level and rely upon something like Spotlight + // for your C++ leak checking. + + #if PP_DEBUGNEW_SUPPORT && DEBUG_NEW == DEBUG_NEW_LEAKS + #include + // NEW is only useful for leaks + #define new NEW + #endif + +#endif +//----------------------------------------------------------------- + + +//in addition to what is in PP_ClassHeaders.cp +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + + + +#include "my_notation.h" + +#define _mac_gui_app +/* +The ansi application and the mac gui application each has parts that +are not in the other. + +The overlapping code will have no preprocessor +conditionals bracketing it. + +The parts that are in the ansi_app minus +the mac_gui_app will be bracketed by #ifdef _ansi_app. + +The parts that are in the mac_gui_app minus +the ansi_app will be bracketed by #ifdef _mac_gui_app. + +The ansi_app is non-graphical and ANSI compatible. +It can run on any platform. + +*/ + + + + + + + diff --git a/Legacy/QFog2-MachO/QFogSource/Headers/QFog_constants.h b/Legacy/QFog2-MachO/QFogSource/Headers/QFog_constants.h new file mode 100644 index 0000000..d63a0ca --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Headers/QFog_constants.h @@ -0,0 +1 @@ +#pragma once const USHORT pix_per_in = 72; const USHORT max_ushort = 65535; const LONG max_long = 0x7FFFFFFF; const DOUBLE my_pi = 3.14159265358979323846; const DOUBLE nat_log_of_2 = .69314718056; //With Symantec 8 compiler, use my_endline='\r' //The ansi endl is used with cout only, I think. //It forces the text preceeding endl to be printed immediately on the console. const CHAR my_endline = '\n'; const USHORT max_file_path_len = 1024; //we allow the user to write "-0." + 12 other characters for a total of 15 characters const DOUBLE amps_floor = 1e-11; const DOUBLE probs_floor = 1e-11; enum COORD_SYSTEM {polar_cs, rect_cs}; #pragma mark ---------used only with macgui-------- #ifdef _mac_gui_app //''''''''''''''''''''''''''''''''''''''''''''\\. #pragma mark --general constants:-- const Rect the_zero_rect = {0x0000, 0x0000, 0x0000, 0x0000}; const OSType my_creator_id = 'QFog'; const OSType my_file_type_id = 'QNet'; //undel_reco = long record of selection, used to del and then undel //paste_reco = short record of selection, used to copy and then paste enum NET_STREAM_TYPE {open_reco, paste_reco, undel_reco}; #pragma mark --version constants:-- /* from ************************* struct NumVersion { UInt8 majorRev;//1st part of version number in BCD UInt8 minorAndBugRev;//2nd & 3rd part of version number share a byte UInt8 stage;//stage code: dev, alpha, beta, final UInt8 nonRelRev;//revision level of non-released version }; developStage = 0x20, alphaStage = 0x40 betaStage = 0x60, finalStage = 0x80, */ const SInt32 k_vers_100 = 0x01008001; // 1.0.0, fin, release 1 const SInt32 k_vers_150 = 0x01508001; // 1.5.0, fin, release 1 const SInt32 k_vers_160 = 0x01608000; // 1.6.0, fin, release 0 const SInt32 k_vers_200 = 0x02008000; // 2.0.0, fin, release 0 const SInt32 k_vers_app = k_vers_200; #pragma mark --uaction related-- const USHORT max_num_of_act_types = 2; //mview const USHORT mview_num_of_act_types = 1; const USHORT mview_del = 0; //etable const USHORT etable_num_of_act_types = 2; const USHORT etable_del = 0; const USHORT etable_paste = 1; // SInt32: PaneIDT, CommandT, MessageT // SInt16: ResIDT //rid = resource (object) id #pragma mark --toolbox resources-- #pragma mark 'ALRT' rids const ResIDT gen_alert_rid = 129; const ResIDT cannot_undo_alert_rid = 131; #pragma mark 'cicn' rids const ResIDT fog_horn_icon_rid = 128; #pragma mark 'CURS' rids const ResIDT pointing_hand_rid = 200; const ResIDT open_hand_rid = 205; const ResIDT closed_hand_rid = 206; const ResIDT explosion_rid = 207; const ResIDT clockwise_rot_rid = 211; const ResIDT paint_brush_rid = 212; const ResIDT eye_dropper_rid = 213; const ResIDT bow_and_arrow_rid = 215; const ResIDT arrow_source_rid = 216; const ResIDT bi_node_and_pointing_hand_rid = 400; #pragma mark 'ICN#' rids const ResIDT qbit_rot_icon_rid = 200; const ResIDT sg_magnet_icon_rid = 201; #pragma mark 'inc#' rids // tools: const ResIDT selection_tool_rid = 1110; const ResIDT drag_tool_rid = 1120; const ResIDT open_tool_rid = 1130; const ResIDT rotation_tool_rid = 1140; const ResIDT paint_tool_rid = 1150; const ResIDT copy_color_tool_rid = 1160; const ResIDT arrow_tool_rid = 1170; const ResIDT arrow_source_tool_rid = 1180; const ResIDT beam_spl_tool_rid = 1190; const ResIDT custom_node_tool_rid = 1200; const ResIDT determ_node_tool_rid = 1210; const ResIDT pol_rot_tool_rid = 1220; const ResIDT pol_tool_rid = 1230; const ResIDT qbit_rot_tool_rid = 1240; const ResIDT sg_magnet_tool_rid = 1250; const ResIDT bi_nd_selector_tool_rid = 1300; #pragma mark 'MENU' rids const ResIDT project_menu_rid = 255; #pragma mark 'ppat' rids const ResIDT pol_rot_pat_rid = 200; const ResIDT pol_pat_rid = 250; #pragma mark 'PICT' rids const ResIDT ggate_pict_rid = 128; #pragma mark 'snd ' rids const ResIDT fog_horn_snd_rid = 3001; #pragma mark 'STR#' rids const ResIDT my_redo_rid = 250; const ResIDT my_undo_rid = 251; const ResIDT undel_ind = 1; const ResIDT uncut_ind = 2; const ResIDT unpaste_ind = 3; #pragma mark --PP specific resources-- #pragma mark 'Txtr' rids //old fonts (see Fonts.h and Think Ref.) //systemFont = 0 (Chicago or Charcoal 12-pt, bold looking, as in menus) //applFont = 1 (Geneva 12-pt) //Aliasing makes Geneva look very bad in Carbon MacOSX so I won't use it anymore; //will use Verdana instead. //MacOSX systemFont is Lucida Grande bold? //MacOSX applFont is Lucida Grande plain? const ResIDT sysFont12_rid = 201; const ResIDT sysFont12_c_rid = 202; const ResIDT node_txt_rid = sysFont12_c_rid; const ResIDT sysFont12_ul_rid = 203; const ResIDT Verdana9_rid = 300; const ResIDT Verdana12_rid = 311; #pragma mark 'PPob' rids //ata = about this application const ResIDT ata_window_rid = 1000; const ResIDT ata_fog_horn_but_rid = 1002; //main const ResIDT main_window_rid = 1050; const ResIDT main_scroller_rid = 1051; const ResIDT mview_rid = 1052; const ResIDT main_wind_cap_rid = 1053; //pal = palette const ResIDT pal_rid = 1100; const ResIDT pal_icon_table_rid = 1101; const ResIDT pal_swatch_rid = 1151; const ResIDT pal_nd_tool_popup_rid = 1190; // 1110- 1300 reserved for tool static caption rids //printing const ResIDT printout_rid = 1400; const ResIDT placeholder_rid = 1401; //other_fsize = other font size const ResIDT other_fsize_window_rid = 1500; const ResIDT other_fsize_efield_rid = 1504; //ds = drawing size const ResIDT ds_window_rid = 1600; const ResIDT ds_horiz_efield_rid = 1606; const ResIDT ds_vert_efield_rid = 1607; const ResIDT ds_page_setup_but_rid= 1608; //tf = text files const ResIDT tf_folder_but_rid= 1703; const ResIDT tf_folder_cap_rid= 1704; const ResIDT tf_prefix_efield_rid= 1705; const ResIDT tf_window_rid= 1700; const ResIDT tf_ecases_cbox_rid= 1711;//cbox=check box const ResIDT tf_nd_probs_cbox_rid= 1712; const ResIDT tf_bi_nd_probs_cbox_rid= 1713; const ResIDT tf_stories_cbox_rid= 1714; //af = amplitudes filter const ResIDT af_wind_rid= 1780; const ResIDT af_des_finesse_efield_rid= 1783; const ResIDT af_cur_finesse_cap_rid= 1784; //pi= prior information const ResIDT pi_wind_rid= 1800; //1800=small pi_wind, 1801=large pi_wind //so pane rid 1801 in use. const ResIDT pi_owner_cap_rid= 1805; const ResIDT pi_nd_efield_rid= 1811; const ResIDT pi_nd_popup_rid= 1812; const ResIDT pi_first_nd_but_rid= 1813; const ResIDT pi_next_nd_but_rid= 1814; const ResIDT pi_reorder_nds_but_rid= 1815; const ResIDT pi_first_in_st_but_rid= 1830; const ResIDT pi_prev_in_st_but_rid= 1831; const ResIDT pi_next_in_st_but_rid= 1832; const ResIDT pi_parents_table_rid= 1836; const ResIDT pi_reorder_in_nds_but_rid= 1837; const ResIDT pi_all_act_but_rid= 1842; const ResIDT pi_none_act_but_rid= 1843; const ResIDT pi_polar_radio_rid= 1844; const ResIDT pi_rect_radio_rid= 1845; const ResIDT pi_rad_re_cap_rid= 1848; const ResIDT pi_ang_im_cap_rid= 1849; const ResIDT pi_amps_table_rid= 1851; const ResIDT pi_reorder_nd_sts_but_rid= 1852; const ResIDT pi_num_of_rows_cap_rid= 1860; const ResIDT pi_num_of_rows_but_rid= 1861; const ResIDT pi_total_prob_but_rid= 1870; const ResIDT pi_total_prob_cap_rid= 1871; const ResIDT pi_gen_st_names_but_rid= 1881; const ResIDT pi_gen_amps_but_rid= 1882; //bi_nd = bi-nodes of interest const ResIDT bi_nd_wind_rid = 1900; const ResIDT bi_nd_list_box_rid = 1910; const ResIDT bi_nd_check_box_rid = 1920; const ResIDT bi_nd_owner_cap_rid = 1940; //nd_probs = node probs const ResIDT nd_probs_wind_rid= 2000; const ResIDT nd_probs_owner_cap_rid= 2001; const ResIDT nd_probs_popup_rid= 2010; const ResIDT nd_probs_first_but_rid= 2011; const ResIDT nd_probs_next_but_rid= 2012; const ResIDT nd_probs_info_cap_rid= 2016; const ResIDT nd_probs_table_rid= 2021; //bi_nd_probs = bi-nodes probs const ResIDT bi_nd_probs_wind_rid= 2100; const ResIDT bi_nd_probs_owner_cap_rid= 2101; const ResIDT bi_nd_probs_popup_rid= 2110; const ResIDT bi_nd_probs_first_but_rid= 2111; const ResIDT bi_nd_probs_next_but_rid= 2112; const ResIDT bi_nd_probs_state_cap_rid= 2115; const ResIDT bi_nd_probs_info_cap_rid= 2117; const ResIDT bi_nd_probs_scroller_rid= 2120; const ResIDT bi_nd_probs_table_rid= 2121; const ResIDT bi_nd_probs_lmargin_rid= 2122; const ResIDT bi_nd_probs_tmargin_rid= 2123; //sto = stories const ResIDT sto_wind_rid= 2200; const ResIDT sto_wind_owner_cap_rid= 2201; const ResIDT sto_wind_cs_cap_rid= 2203; const ResIDT sto_wind_popup_rid= 2204; const ResIDT sto_wind_polar_radio_rid= 2211; const ResIDT sto_wind_rect_radio_rid= 2212; const ResIDT sto_wind_first_but_rid= 2213; const ResIDT sto_wind_next_but_rid= 2214; //det= deterministic node const ResIDT det_wind_rid= 2300; const ResIDT det_nd_type_popup_rid= 2311; const ResIDT det_host_view_rid= 2312; const ResIDT cnot_pane_rid= 2320; const ResIDT cnot_pa1_radio_rid= 2322; const ResIDT cnot_pa2_radio_rid= 2323; const ResIDT cnot_0fires_radio_rid= 2325; const ResIDT cnot_1fires_radio_rid= 2326; const ResIDT marg_pane_rid= 2340; const ResIDT marg_pos_efield_rid= 2342; const ResIDT marg_len_efield_rid= 2344; const ResIDT pshifter_pane_rid= 2360; const ResIDT pshifter_theta_efield_rid= 2362; const ResIDT pshifter_check_box_rid= 2364; //sg_magnet = Stern Gerlach magnet const ResIDT sg_magnet_window_rid= 2400; const ResIDT sg_magnet_theta_efield_rid= 2413; const ResIDT sg_magnet_phi_efield_rid= 2415; const ResIDT sg_magnet_table_rid= 2426; //bs = beam splitter const ResIDT bs_window_rid= 2500; const ResIDT bs_tau_mag_sq_efield_rid= 2512; const ResIDT bs_tau_ang_efield_rid= 2514; const ResIDT bs_rho_ang_efield_rid= 2516; const ResIDT bs_max_n_sum_efield_rid= 2518; //pol = polarizer const ResIDT pol_window_rid= 2600; const ResIDT pol_efield_rid= 2612; //pol_rot = polarization rotator const ResIDT pol_rot_window_rid= 2700; const ResIDT pol_rot_efield_rid= 2712; //qbit_rot = qbit rotation const ResIDT qbit_rot_window_rid= 2800; const ResIDT qbit_rot_theta0_efield_rid= 2820; const ResIDT qbit_rot_theta1_efield_rid= 2821; const ResIDT qbit_rot_theta2_efield_rid= 2822; const ResIDT qbit_rot_theta3_efield_rid= 2823; //rows = number of rows const ResIDT rows_wind_rid= 4000; const ResIDT rows_wind_ok_but_rid= 4001; const ResIDT rows_wind_cancel_but_rid= 4002; const ResIDT rows_wind_efield_rid= 4003; //q = queue const ResIDT q_wind_rid= 4100; const ResIDT q_abc_but_rid= 4103; const ResIDT qtable_rid= 4112; //gn = generate names const ResIDT gn_wind_rid= 4200; const ResIDT gn_num_of_comps_efield_rid= 4212; const ResIDT gn_min_char_efield_rid= 4222; const ResIDT gn_max_char_efield_rid= 4224; const ResIDT gn_commas_check_box_rid = 4231; //pv = preview const ResIDT pv_window_rid = 4300; const ResIDT pv_total_prob_rid = 4310; const ResIDT pv_num_of_stories_rid = 4311; //dynamically allocated panes const PaneIDT first_nd_efield_rid = 10001; const PaneIDT first_pi_pa_st_popup_PPob_rid = 20001; //permission dialog const ResIDT per_dial_rid = 4400; const ResIDT per_dial_cap_rid = 4410; #pragma mark 'RidL' rids const ResIDT pal_ridl = pal_rid; const ResIDT pi_wind_ridl = pi_wind_rid; const ResIDT bi_nd_wind_ridl = bi_nd_wind_rid; const ResIDT nd_probs_wind_ridl = nd_probs_wind_rid; const ResIDT bi_nd_probs_wind_ridl = bi_nd_probs_wind_rid; const ResIDT sto_wind_ridl = sto_wind_rid; #pragma mark commands const CommandT cmd_import = 2001; const CommandT cmd_import_nd_sts = 20011; const CommandT cmd_import_amps = 20012; const CommandT cmd_export = 2002; const CommandT cmd_export_topology = 20021; const CommandT cmd_export_nd_sts = 20022; const CommandT cmd_export_amps = 20023; const CommandT cmd_drawing_size= 3001; const CommandT cmd_grid_lines= 3002; const CommandT cmd_choose_color= 3003; const CommandT cmd_filter_out_small_amps= 3005; const CommandT cmd_preview= 4002; const CommandT cmd_text_files= 4003; const CommandT cmd_do_one_ecase_at_a_time= 4004; const CommandT cmd_illustrate_stories= 4005; const CommandT cmd_initial_run_state= 5001; const CommandT cmd_go_forward= 5002; const CommandT cmd_active_project= 6001; const CommandT cmd_show_main_wind= 6002; const CommandT cmd_show_palette= 6003; const CommandT cmd_show_pi_wind= 6004; const CommandT cmd_show_bi_nd_wind= 6005; const CommandT cmd_show_nd_probs_wind= 6006; const CommandT cmd_show_bi_nd_probs_wind= 6007; const CommandT cmd_show_stories_wind= 6008; const CommandT cmd_close_all_non_main_winds = 6100; const CommandT cmd_doc_SetModified = 6101; #pragma mark messages //ata = about this application const MessageT msg_ata_fog_horn_but= ata_fog_horn_but_rid; //pal = palette const MessageT msg_pal_nd_tool_popup = pal_nd_tool_popup_rid; //tf = text files const MessageT msg_tf_folder_but= tf_folder_but_rid; //mv = main view const MessageT msg_mv_nd_efield= mview_rid; //pi = prior info const MessageT msg_pi_refresh_num_of_rows_cap= pi_amps_table_rid; const MessageT msg_pi_nd_efield= pi_nd_efield_rid; const MessageT msg_pi_nd_popup= pi_nd_popup_rid; const MessageT msg_pi_first_nd_but= pi_first_nd_but_rid; const MessageT msg_pi_next_nd_but= pi_next_nd_but_rid; const MessageT msg_pi_reorder_nds_but= pi_reorder_nds_but_rid; const MessageT msg_pi_reorder_in_nds_but= pi_reorder_in_nds_but_rid; const MessageT msg_pi_reorder_nd_sts_but= pi_reorder_nd_sts_but_rid; const MessageT msg_pi_first_in_st_but= pi_first_in_st_but_rid; const MessageT msg_pi_prev_in_st_but= pi_prev_in_st_but_rid; const MessageT msg_pi_next_in_st_but= pi_next_in_st_but_rid; const MessageT msg_pi_all_act_but= pi_all_act_but_rid; const MessageT msg_pi_none_act_but= pi_none_act_but_rid; const MessageT msg_pi_polar_radio= pi_polar_radio_rid; const MessageT msg_pi_clear_total_prob_cap= pi_total_prob_cap_rid; const MessageT msg_pi_total_prob_but = pi_total_prob_but_rid; const MessageT msg_pi_num_of_rows_but= pi_num_of_rows_but_rid; const MessageT msg_pi_gen_st_names_but= pi_gen_st_names_but_rid; const MessageT msg_pi_gen_amps_but= pi_gen_amps_but_rid; //bi_nd = bi-nodes of interest const MessageT msg_bi_nd_check_box = bi_nd_check_box_rid; //nd_probs = node probs const MessageT msg_nd_probs_popup= nd_probs_popup_rid; const MessageT msg_nd_probs_first_but= nd_probs_first_but_rid; const MessageT msg_nd_probs_next_but= nd_probs_next_but_rid; //bi_nd_probs = bi-nodes probs const MessageT msg_bi_nd_probs_popup= bi_nd_probs_popup_rid; const MessageT msg_bi_nd_probs_first_but= bi_nd_probs_first_but_rid; const MessageT msg_bi_nd_probs_next_but= bi_nd_probs_next_but_rid; //sto = stories const MessageT msg_sto_wind_popup= sto_wind_popup_rid; const MessageT msg_sto_wind_polar_radio= sto_wind_polar_radio_rid; const MessageT msg_sto_wind_first_but= sto_wind_first_but_rid; const MessageT msg_sto_wind_next_but= sto_wind_next_but_rid; //det= deterministic node const MessageT msg_det_nd_type_popup = det_nd_type_popup_rid; //q = queue const MessageT msg_q_abc_but = q_abc_but_rid; #endif //_mac_gui_app \\............................................// \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Headers/my_notation.h b/Legacy/QFog2-MachO/QFogSource/Headers/my_notation.h new file mode 100644 index 0000000..129acae --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Headers/my_notation.h @@ -0,0 +1 @@ +//my_notation: //I capitalize all class names. // _p = pointer // _h = handle //I sometimes use: //pstr ending for Pascal string (like Str255) (unsigned char *) or LStr255 //cstr ending for C string (char *) or STRINGY //buf_p indeterminate sex (either C or Pascal) //global variables(often prototyped with extern): no distiguishing mark or g_ //constants (defined with "const" or "define"): no distiguishing mark or k_ #pragma once #define VOID void //#define INT int //I won't use int #define SHORT short //16bits #define LONG long //32bits typedef unsigned short USHORT; typedef unsigned long ULONG; #define CHAR char //8bits #define FLOAT float //32bits //according to Universal Headers/Types.h //double 64bits //double_t=extended, fastest //68K: 80 bits //68K with 68881 on: 96 bits //PowerPC: 64 bits #define DOUBLE64 double //can't use double_t due to a bug in MSL def of polar() #define DOUBLE double #define COMPLEX std::complex //according to Universal Headers/Types.h //old : Boolean = unsigned char (8 bits) //new : Boolean = bool = its own type, still 8 bits #define BOOLEAN Boolean #define STREAMBUF streambuf #define IOS ios #define OSTREAM ostream #define ISTREAM istream #define IOSTREAM iostream #define IFSTREAM ifstream #define OFSTREAM ofstream // 4 horsemen of the Apocalypse (War, Famine, Plague, Death), // Also 4: constructors (with various combinations of // data-member inputs), copy constructor, destructor and assigner (=). \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Mac_AmpGens/.DS_Store b/Legacy/QFog2-MachO/QFogSource/Mac_AmpGens/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..5008ddfcf53c02e82d7eee2e57c38e5672ef89f6 GIT binary patch literal 6148 zcmeH~Jr2S!425mzP>H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0get_num_of_in_sts(); USHORT degen = 0; COMPLEX zx(0, 0); COMPLEX zy(0, 0); USHORT n1x, n2x, n1y, n2y; TM_COL_NUM in_st; if(m1y_p==0){ //scalar field case for(n1x=0; n1x<= its_max_n_sum; n1x++){ for(n2x=0; n2x<= its_max_n_sum - n1x; n2x++){ for(in_st=0; in_st=amps_floor){ degen++; goto next_n1_n2_pair; } } next_n1_n2_pair:; }} }else{ //vector field case for(n1x=0; n1x<= its_max_n_sum; n1x++){ for(n1y=0; n1y<= its_max_n_sum - n1x; n1y++){ for(n2x=0; n2x<= (its_max_n_sum - n1y) - n1x; n2x++){ for(n2y=0; n2y<= ((its_max_n_sum - n2x) - n1y) - n1x; n2y++){ for(in_st=0; in_st=amps_floor){ zy = two_fun.get_bs_amp(n1y, n2y, m1y_p[in_st], m2y_p[in_st]); if(abs(zy)>=amps_floor){ degen++; goto next_n_set; } } } next_n_set:; }}}} } return degen; } //****************************************** BOOLEAN C_BEAM_SPL_AMP_GEN::parents_are_canonical() { if(!its_pi_wind_p->focus_nd_has_this_many_parents(2))return false; enum {enter_st=0, likes1_st, likes2_st, reject_st}; //finite state machine for each in_nd // likes1_st <---enter_st--->likes2_st // | // V // reject_st STRINGY stringy; USHORT state = enter_st; for(USHORT r=0; r<2; r++){ USHORT in_nd = its_nd_p->get_in_nds()[r]; NODE * in_nd_p = its_net_p->get_nd_ptr(in_nd); for(USHORT s=0; sget_degen(); s++){ stringy = in_nd_p->get_st_name(s); switch(state){ case enter_st: if(stringy.is_ushort()){ state = likes1_st; }else if(stringy.is_ushort_pair()){ state = likes2_st; }else{ state = reject_st; goto stop_looking; } break; case likes1_st: if(stringy.is_ushort()){ //state = likes1_st; }else{ state = reject_st; goto stop_looking; } break; case likes2_st: if(stringy.is_ushort_pair()){ //state = likes2_st; }else{ state = reject_st; goto stop_looking; } break; } } stop_looking:; if(state==reject_st){ //my_gen_alert can take a string of at most 255 characters!!!! my_gen_alert("Inadmissible parents. This button works only if parents of focus node are all of Type_1 or all of Type_2. If n1 and n2 are non-neg. integers, Type_1 nodes have states n1, Type_2 have states (n1, n2)."); return false; } } its_type = (state==likes1_st?scalar_bs:vector_bs); return true; } //****************************************** BOOLEAN C_BEAM_SPL_AMP_GEN::dialog_entries_are_legal( Str255 tau_mag_sq_pstr, //in Str255 tau_ang_pstr, //in Str255 rho_ang_pstr, //in Str255 max_n_sum_pstr) //in { DOUBLE db; if(!STRINGY(tau_mag_sq_pstr).is_double(db)){ //couldn't get the character ^ to print my_gen_alert("Your entry for |t| must be a real number."); return false; }else{ if(db>1 || db<0){ my_gen_alert("Must have 0 <= |t| <= 1."); return false; } } if(!STRINGY(tau_ang_pstr).is_double()){ my_gen_alert("Your entry for phase(t) must be a real number."); return false; } if(!STRINGY(rho_ang_pstr).is_double()){ my_gen_alert("Your entry for phase(r) must be a real number."); return false; } if(!STRINGY(max_n_sum_pstr).is_ushort()){ my_gen_alert("Your entry for maximum output number must be a non-negative integer."); return false; } return true; } //****************************************** VOID C_BEAM_SPL_AMP_GEN::fill_trans_mat_and_st_names_of_nd() { /* notation: transition element < n1, n2 || m1, m2> where n1 scalar or n1 = (n1x, n1y), etc. m1->/--\->n2 | | m2->\--/->n1 counter-clockwise: n1, n2, m1, m2 mnemonic: n1 and n2 are the new beams, hence the n. 0 1 nw ne m2 m1 | | V V /-----\ | X | \-----/ | | V V n1 n2 sw se 3 2 */ USHORT in_row, port; USHORT in_row_of_port[2]; for(in_row=0; in_row<2; in_row++){ for(port=0; port<2; port++){ if(((BEAM_SPL *)its_nd_p)->get_port_guest(port)==its_nd_p->get_in_nds()[in_row]){ in_row_of_port[port] = in_row; } } } TM_COL_NUM in_st, num_of_in_sts; USHORT in_nd, nd_st; STRINGY sgy; USHORT m1x, m2x, m1y, m2y; STRETCH_OR_FOLD sof_in(its_nd_p->get_in_nd_degens()); //can't use VECTOR class for next vectors //because VECTOR can have at most max_ushort elements. num_of_in_sts = its_nd_p->get_num_of_in_sts(); ThrowIf_(num_of_in_sts==0); USHORT * m1x_p = new USHORT[num_of_in_sts];//new[] //delete: in this method ThrowIfNil_(m1x_p); USHORT * m2x_p = new USHORT[num_of_in_sts];//new[] //delete: in this method ThrowIfNil_(m2x_p); USHORT * m1y_p = 0; USHORT * m2y_p = 0; if(its_type==vector_bs){ m1y_p = new USHORT[num_of_in_sts];//new[] //delete: in this method ThrowIfNil_(m1y_p); m2y_p = new USHORT[num_of_in_sts];//new[] //delete: in this method ThrowIfNil_(m2y_p); } for(in_st = 0; in_st< its_nd_p->get_num_of_in_sts(); in_st++){ for(in_row=0; in_row<2; in_row++){ in_nd = its_nd_p->get_in_nds()[in_row]; nd_st = sof_in.vec_label(in_st)[in_row]; sgy = its_net_p->get_nd_ptr(in_nd)->get_st_name(nd_st); if(its_type==scalar_bs){ if(in_row==in_row_of_port[1]){ sgy.is_ushort(m1x); m1x_p[in_st] = m1x; }else{ sgy.is_ushort(m2x); m2x_p[in_st] = m2x; } }else{ if(in_row==in_row_of_port[1]){ sgy.is_ushort_pair(m1x, m1y); m1x_p[in_st] = m1x; m1y_p[in_st] = m1y; }else{ sgy.is_ushort_pair(m2x, m2y); m2x_p[in_st] = m2x; m2y_p[in_st] = m2y; } } } } USHORT expected_degen = get_expected_degen(m1x_p, m2x_p, m1y_p, m2y_p); if(expected_degen!=0){ its_net_p->set_degen_of_a_nd(its_pi_wind_p->get_nd(), expected_degen); TWO_MODE_FUN two_fun(its_tau_mag, its_tau_ang, its_rho_ang); ((BEAM_SPL *)its_nd_p)->obey_amp_gen(its_max_n_sum, two_fun, m1x_p, m2x_p, m1y_p, m2y_p); }else{ amp_generator_found_no_states_alert(); } delete [] m1x_p; m1x_p=0; delete [] m2x_p; m2x_p=0; if(its_type==vector_bs){ delete [] m1y_p; m1y_p=0; delete [] m2y_p; m2y_p=0; } } //****************************************** BOOLEAN C_BEAM_SPL_AMP_GEN::talk() { // this is a trivial generalization of UModalDialogs::AskForOneNumber if(!parents_are_canonical()){ return false; } StDialogHandler d_handler(bs_window_rid, its_pi_wind_p);//SuperCommander declared LWindow * dialog_p = d_handler.GetDialog(); LEditField * tau_mag_sq_efield_p = (LEditField *)dialog_p->FindPaneByID(bs_tau_mag_sq_efield_rid); LEditField * tau_ang_efield_p = (LEditField *)dialog_p->FindPaneByID(bs_tau_ang_efield_rid); LEditField * rho_ang_efield_p = (LEditField *)dialog_p->FindPaneByID(bs_rho_ang_efield_rid); LEditField * max_n_sum_efield_p = (LEditField *)dialog_p->FindPaneByID(bs_max_n_sum_efield_rid); //SetValue() only works for efields with integer values LStr255 x_str; x_str.Assign( pow( get_tau_mag(), 2), FIXEDDECIMAL, 6); tau_mag_sq_efield_p->SetDescriptor(x_str); x_str.Assign( get_tau_ang(), FIXEDDECIMAL, 6); tau_ang_efield_p->SetDescriptor(x_str); x_str.Assign( get_rho_ang(), FIXEDDECIMAL, 6); rho_ang_efield_p->SetDescriptor(x_str); max_n_sum_efield_p->SetValue(get_max_n_sum()); tau_mag_sq_efield_p->SelectAll(); dialog_p->SetLatentSub(tau_mag_sq_efield_p); dialog_p->Show(); while (true) { MessageT hit_message = d_handler.DoDialog(); switch(hit_message){ case msg_Cancel: return false; break; case msg_OK: LStr255 tau_mag_sq_str; LStr255 tau_ang_str; LStr255 rho_ang_str; LStr255 max_n_sum_str; tau_mag_sq_efield_p->GetDescriptor(tau_mag_sq_str); tau_ang_efield_p->GetDescriptor(tau_ang_str); rho_ang_efield_p->GetDescriptor(rho_ang_str); //It's important to check max_n_sum_str. //Something illegal could be pasted into the max_n_sum field. //Key filters won't prevent this, but //checking max_n_sum_str can detect it. max_n_sum_efield_p->GetDescriptor(max_n_sum_str); if(!dialog_entries_are_legal(tau_mag_sq_str, tau_ang_str, rho_ang_str, max_n_sum_str)){ // don't return yet break; } set_tau_mag(sqrt(double_t(tau_mag_sq_str))); set_tau_ang(double_t(tau_ang_str)); set_rho_ang(double_t(rho_ang_str)); set_max_n_sum(SInt32(max_n_sum_str)); UCursor::SetTheCursor(watchCursor); fill_trans_mat_and_st_names_of_nd(); UCursor::InitTheCursor(); its_pi_wind_p->ListenToMessage(msg_pi_all_act_but, nil); its_pi_wind_p->set_nd_always(its_pi_wind_p->get_nd()); return true; break; } } } \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Mac_AmpGens/C_BEAM_SPL_AMP_GEN.h b/Legacy/QFog2-MachO/QFogSource/Mac_AmpGens/C_BEAM_SPL_AMP_GEN.h new file mode 100644 index 0000000..1fd0d8b --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Mac_AmpGens/C_BEAM_SPL_AMP_GEN.h @@ -0,0 +1 @@ +#pragma once #include "C_AMP_GEN.h" #include "BEAM_SPL.h" #include "TWO_MODE_FUN.h" class QB_NET; class C_PI_WIND; enum BS_TYPE{scalar_bs, vector_bs}; //****************************************** class C_BEAM_SPL_AMP_GEN: public C_AMP_GEN { private: DOUBLE its_tau_mag; DOUBLE its_tau_ang;//phase angle in degrees DOUBLE its_rho_ang;//phase angle in degrees USHORT its_max_n_sum; BS_TYPE its_type; public: C_BEAM_SPL_AMP_GEN(BEAM_SPL * nd_p, QB_NET * net_p, C_PI_WIND * pi_wind_p); const DOUBLE & get_tau_mag() const; VOID set_tau_mag(const DOUBLE & mag); const DOUBLE & get_tau_ang() const; VOID set_tau_ang(const DOUBLE & ang); const DOUBLE & get_rho_ang() const; VOID set_rho_ang(const DOUBLE & ang); USHORT get_max_n_sum() const; VOID set_max_n_sum(USHORT max); USHORT get_expected_degen(const USHORT * m1x_p, const USHORT * m2x_p, const USHORT * m1y_p, const USHORT * m2y_p); BOOLEAN parents_are_canonical(); BOOLEAN dialog_entries_are_legal( Str255 tau_mag_sq_pstr, Str255 tau_ang_pstr, Str255 rho_ang_pstr, Str255 max_n_sum_pstr); VOID fill_trans_mat_and_st_names_of_nd(); BOOLEAN talk(); }; #pragma mark - //****************************************** inline const DOUBLE & C_BEAM_SPL_AMP_GEN::get_tau_mag() const { return its_tau_mag; } //****************************************** inline VOID C_BEAM_SPL_AMP_GEN::set_tau_mag( const DOUBLE & mag) //in { its_tau_mag = mag; } //****************************************** inline const DOUBLE & C_BEAM_SPL_AMP_GEN::get_tau_ang() const { return its_tau_ang; } //****************************************** inline const DOUBLE & C_BEAM_SPL_AMP_GEN::get_rho_ang() const { return its_rho_ang; } //****************************************** inline USHORT C_BEAM_SPL_AMP_GEN::get_max_n_sum() const { return its_max_n_sum; } //****************************************** inline VOID C_BEAM_SPL_AMP_GEN::set_max_n_sum( USHORT max) //in { its_max_n_sum = max; } \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Mac_AmpGens/C_DET_ND_AMP_GEN.cpp b/Legacy/QFog2-MachO/QFogSource/Mac_AmpGens/C_DET_ND_AMP_GEN.cpp new file mode 100644 index 0000000..508dbc2 --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Mac_AmpGens/C_DET_ND_AMP_GEN.cpp @@ -0,0 +1 @@ +#include "C_DET_ND_AMP_GEN.h" #include "QB_NET.h" #include "C_PI_WIND.h" #include "EXCEPTIONS.h" //****************************************** DET_ND_AMP_GEN_ENTRIES::DET_ND_AMP_GEN_ENTRIES() :its_nd_type(k_cnot), its_cnot_pa1_is_control(true), its_cnot_1fires(true), its_marg_pos(1), its_marg_len(1), its_pshifter_theta(0), its_pshifter_do_multiples(true) { } //****************************************** C_DET_ND_AMP_GEN::C_DET_ND_AMP_GEN( DET_ND * nd_p, //in QB_NET * net_p, //in C_PI_WIND * pi_wind_p) //in :C_AMP_GEN(nd_p, net_p, pi_wind_p), its_host_view_p(0) { } //****************************************** VOID C_DET_ND_AMP_GEN::reset_subpane( const DET_ND_AMP_GEN_ENTRIES & entries) //in { //This method does not check whether //the new and the old subpanes are the same. //It's up to you to check this and prevent the method from being called //when they are the same, if that is what is best. //SetValue() only works for efields with integer values ThrowIfNil_(its_host_view_p); switch(entries.its_nd_type){ case k_cnot: its_host_view_p->ResetSubPane(cnot_pane_rid, true); LStdRadioButton * cnot_pa1_radio_p = (LStdRadioButton *)its_host_view_p->FindPaneByID(cnot_pa1_radio_rid); LStdRadioButton * cnot_pa2_radio_p = (LStdRadioButton *)its_host_view_p->FindPaneByID(cnot_pa2_radio_rid); LStdRadioButton * cnot_0fires_radio_p = (LStdRadioButton *)its_host_view_p->FindPaneByID(cnot_0fires_radio_rid); LStdRadioButton * cnot_1fires_radio_p = (LStdRadioButton *)its_host_view_p->FindPaneByID(cnot_1fires_radio_rid); if(entries.its_cnot_pa1_is_control){ cnot_pa1_radio_p->SetValue(1); }else{ cnot_pa2_radio_p->SetValue(1); } if(entries.its_cnot_1fires){ cnot_1fires_radio_p->SetValue(1); }else{ cnot_0fires_radio_p->SetValue(1); } break; case k_marg: its_host_view_p->ResetSubPane(marg_pane_rid, true); LEditField * marg_pos_efield_p = (LEditField *)its_host_view_p->FindPaneByID(marg_pos_efield_rid); LEditField * marg_len_efield_p = (LEditField *)its_host_view_p->FindPaneByID(marg_len_efield_rid); marg_pos_efield_p->SetValue(entries.its_marg_pos); marg_len_efield_p->SetValue(entries.its_marg_len); break; case k_pshifter: its_host_view_p->ResetSubPane(pshifter_pane_rid, true); LEditField * pshifter_theta_efield_p = (LEditField *)its_host_view_p->FindPaneByID(pshifter_theta_efield_rid); LStdCheckBox * pshifter_check_box_p = (LStdCheckBox *)its_host_view_p->FindPaneByID(pshifter_check_box_rid); LStr255 x_str; x_str.Assign( entries.its_pshifter_theta, FIXEDDECIMAL, 6); pshifter_theta_efield_p->SetDescriptor(x_str); pshifter_check_box_p->SetValue(entries.its_pshifter_do_multiples?1:0); break; } } //****************************************** BOOLEAN C_DET_ND_AMP_GEN::parents_are_canonical( DET_ND_TYPE nd_type) { switch(nd_type){ case k_cnot: return its_pi_wind_p->focus_nd_has_this_many_parents(2) && its_pi_wind_p->focus_nd_parents_are_binary(); break; case k_marg: return its_pi_wind_p->focus_nd_has_this_many_parents(1); break; case k_pshifter: //will check that names are ushort when do_multiples is true //in C_DET_ND_AMP_GEN::det_nd_dialog_entries_are_legal() return its_pi_wind_p->focus_nd_has_this_many_parents(1); break; } return false; } //****************************************** BOOLEAN C_DET_ND_AMP_GEN::get_wind_entries( DET_ND_AMP_GEN_ENTRIES & entries) //out { USHORT in_nd, in_nd_degen, j; NODE * in_nd_p ; STRINGY sgy; ThrowIfNil_(its_host_view_p); switch(entries.its_nd_type){ case k_cnot: LStdRadioButton * cnot_pa1_radio_p = (LStdRadioButton *)its_host_view_p->FindPaneByID(cnot_pa1_radio_rid); LStdRadioButton * cnot_1fires_radio_p = (LStdRadioButton *)its_host_view_p->FindPaneByID(cnot_1fires_radio_rid); entries.its_cnot_pa1_is_control = cnot_pa1_radio_p->GetValue(); entries.its_cnot_1fires = cnot_1fires_radio_p->GetValue(); break; case k_marg: LEditField * marg_pos_efield_p = (LEditField *)its_host_view_p->FindPaneByID(marg_pos_efield_rid); LEditField * marg_len_efield_p = (LEditField *)its_host_view_p->FindPaneByID(marg_len_efield_rid); entries.its_marg_pos = marg_pos_efield_p->GetValue(); entries.its_marg_len = marg_len_efield_p->GetValue(); if(entries.its_marg_pos==0){ my_gen_alert("Must have (position of first projected character) >=1."); return false; } if(entries.its_marg_len==0){ my_gen_alert("Must have (length of projected sub-string) >=1."); return false; } in_nd = its_nd_p->get_in_nds()[0]; in_nd_p = its_net_p->get_nd_ptr(in_nd); in_nd_degen = in_nd_p->get_degen(); USHORT avail_len = max_ushort; for(j=0; jget_st_name(j); if(sgy.get_len() avail_len_plus_1){ sgy = STRINGY("Must have (position of first projected character) + (length of projected sub-string) <= ") && avail_len_plus_1 && " ."; my_gen_alert(sgy); return false; } break; case k_pshifter: LEditField * pshifter_theta_efield_p = (LEditField *)its_host_view_p->FindPaneByID(pshifter_theta_efield_rid); LStdCheckBox * pshifter_check_box_p = (LStdCheckBox *)its_host_view_p->FindPaneByID(pshifter_check_box_rid); LStr255 pshifter_theta_pstr; pshifter_theta_efield_p->GetDescriptor(pshifter_theta_pstr); if(!STRINGY(pshifter_theta_pstr).is_double()){ my_gen_alert("Your entry for theta must be a real number."); return false; } entries.its_pshifter_theta = double_t(pshifter_theta_pstr); limited_degrees(entries.its_pshifter_theta); entries.its_pshifter_do_multiples = pshifter_check_box_p->GetValue(); if(entries.its_pshifter_do_multiples){ in_nd = its_nd_p->get_in_nds()[0]; in_nd_p = its_net_p->get_nd_ptr(in_nd); in_nd_degen = in_nd_p->get_degen(); for(j=0; jget_st_name(j); if(!sgy.is_ushort()){ my_gen_alert("Inadmissible parents. When the \"Multiply Theta by occupation number\" option is set to Yes, the states of the parent node must be non-negative integers."); return false; } } } break; }//switch return true; } //****************************************** VOID C_DET_ND_AMP_GEN::fill_trans_mat_and_st_names_of_nd() { its_nd_p->empty_trans_mat(); switch(its_entries.its_nd_type){ case k_cnot:{ its_net_p->set_degen_of_a_nd(its_pi_wind_p->get_nd(), 4); its_nd_p->set_st_name(0, "00"); its_nd_p->set_st_name(1, "01"); its_nd_p->set_st_name(2, "10"); its_nd_p->set_st_name(3, "11"); enum {k_00=0, k_01, k_10, k_11}; USHORT in_st, control_st, flipper_st, nd_st; VECTOR vec(2,2); STRETCH_OR_FOLD sof_in(vec); for(in_st=0; in_st<4; in_st++){ if(its_entries.its_cnot_pa1_is_control){ control_st = sof_in.vec_label(in_st)[0]; flipper_st = sof_in.vec_label(in_st)[1]; if(its_entries.its_cnot_1fires){ if(control_st==0 && flipper_st==0){ nd_st=k_00; }else if(control_st==0 && flipper_st==1){ nd_st=k_01; }else if(control_st==1 && flipper_st==0){ nd_st=k_11; }else if(control_st==1 && flipper_st==1){ nd_st=k_10; } }else{//0fires if(control_st==0 && flipper_st==0){ nd_st=k_01; }else if(control_st==0 && flipper_st==1){ nd_st=k_00; }else if(control_st==1 && flipper_st==0){ nd_st=k_10; }else if(control_st==1 && flipper_st==1){ nd_st=k_11; } } }else{//pa2 is control control_st = sof_in.vec_label(in_st)[1]; flipper_st = sof_in.vec_label(in_st)[0]; if(its_entries.its_cnot_1fires){ if(flipper_st==0 && control_st==0){ nd_st=k_00; }else if(flipper_st==0 && control_st==1){ nd_st=k_11; }else if(flipper_st==1 && control_st==0){ nd_st=k_10; }else if(flipper_st==1 && control_st==1){ nd_st=k_01; } }else{//0fires if(flipper_st==0 && control_st==0){ nd_st=k_10; }else if(flipper_st==0 && control_st==1){ nd_st=k_01; }else if(flipper_st==1 && control_st==0){ nd_st=k_00; }else if(flipper_st==1 && control_st==1){ nd_st=k_11; } } } its_nd_p->set_tm_amp(nd_st, in_st, 1); //row, col, amp } break;} case k_marg:{ USHORT in_nd = its_nd_p->get_in_nds()[0]; NODE * in_nd_p = its_net_p->get_nd_ptr(in_nd); USHORT in_nd_degen = in_nd_p->get_degen(); VECTOR sub_sgy_ids(max_ushort, in_nd_degen);//default_value, len SET prev_sub_sgy_ids_set(in_nd_degen); STRINGY sub_sgy; USHORT max_id=0; USHORT in_st, prev_in_st; for(in_st=0; in_stget_st_name(in_st).get_sub_stringy(its_entries.its_marg_pos-1, its_entries.its_marg_len); prev_sub_sgy_ids_set.empty(); for(prev_in_st=0; prev_in_stget_st_name(prev_in_st).get_sub_stringy(its_entries.its_marg_pos-1, its_entries.its_marg_len)){ sub_sgy_ids[in_st] = sub_sgy_ids[prev_in_st]; goto next_in_st; } } } sub_sgy_ids[in_st] = max_id; max_id++; next_in_st:; } its_net_p->set_degen_of_a_nd(its_pi_wind_p->get_nd(), max_id); SET named_set(max_id); for(in_st=0; in_stset_tm_amp(sub_sgy_ids[in_st], in_st, 1); //row, col, amp if(!named_set.contains(sub_sgy_ids[in_st])){ its_nd_p->set_st_name(sub_sgy_ids[in_st], in_nd_p->get_st_name(in_st).get_sub_stringy(its_entries.its_marg_pos-1, its_entries.its_marg_len)); named_set.insert(sub_sgy_ids[in_st]); } } break;} case k_pshifter:{ USHORT in_nd = its_nd_p->get_in_nds()[0]; NODE * in_nd_p = its_net_p->get_nd_ptr(in_nd); USHORT in_nd_degen = in_nd_p->get_degen(); its_net_p->set_degen_of_a_nd(its_pi_wind_p->get_nd(), in_nd_degen); STRINGY sgy; USHORT in_st, num; DOUBLE ang; for(in_st=0; in_stget_st_name(in_st); if(its_entries.its_pshifter_do_multiples){ sgy.is_ushort(num); }else{ num=1; } its_nd_p->set_st_name(in_st, sgy); ang = num*its_entries.its_pshifter_theta; limited_degrees(ang); ang *= my_pi/180; its_nd_p->set_tm_amp(in_st, in_st, COMPLEX(cos(ang), sin(ang))); } break;} }//switch } //****************************************** BOOLEAN C_DET_ND_AMP_GEN::talk() { //This is a trivial generalization of UModalDialogs::AskForOneNumber StDialogHandlerPlus d_handler(det_wind_rid, (LCommander *)its_pi_wind_p);//SuperCommander declared LWindow * dialog_p = d_handler.GetDialog(); its_host_view_p = (C_HOST_VIEW *)dialog_p->FindPaneByID(det_host_view_rid); LPopupButton * popup_p = (LPopupButton *)dialog_p->FindPaneByID(det_nd_type_popup_rid); DET_ND_AMP_GEN_ENTRIES entries; DET_ND_TYPE nd_type; popup_p->StopBroadcasting(); popup_p->SetValue(its_entries.its_nd_type); popup_p->StartBroadcasting(); reset_subpane(its_entries); entries = its_entries; while(true){ MessageT hit_message; SInt32 param; d_handler.DoDialogPlus(hit_message, param); switch(hit_message){ case msg_det_nd_type_popup: nd_type = (DET_ND_TYPE)param; if(entries.its_nd_type != nd_type){ entries.its_nd_type = nd_type; reset_subpane(entries); } // don't return yet break; case msg_Cancel: return false; break; case msg_OK: if(!parents_are_canonical(entries.its_nd_type)){ // don't return yet break; } if(!get_wind_entries(entries)){ // don't return yet break; } its_entries = entries; UCursor::SetTheCursor(watchCursor); fill_trans_mat_and_st_names_of_nd(); UCursor::InitTheCursor(); its_pi_wind_p->ListenToMessage(msg_pi_all_act_but, nil); its_pi_wind_p->set_nd_always(its_pi_wind_p->get_nd()); return true; break; } } } \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Mac_AmpGens/C_DET_ND_AMP_GEN.h b/Legacy/QFog2-MachO/QFogSource/Mac_AmpGens/C_DET_ND_AMP_GEN.h new file mode 100644 index 0000000..322cd82 --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Mac_AmpGens/C_DET_ND_AMP_GEN.h @@ -0,0 +1 @@ +#pragma once #include "C_AMP_GEN.h" #include "DET_ND.h" class QB_NET; class C_PI_WIND; class C_HOST_VIEW; //AMP_GEN = amplitude generator //****************************************** class DET_ND_AMP_GEN_ENTRIES { public: DET_ND_TYPE its_nd_type; BOOLEAN its_cnot_pa1_is_control; //pa1 = first parent BOOLEAN its_cnot_1fires; USHORT its_marg_pos;//marg = marginalizer USHORT its_marg_len; DOUBLE its_pshifter_theta; BOOLEAN its_pshifter_do_multiples; DET_ND_AMP_GEN_ENTRIES(); }; //****************************************** class C_DET_ND_AMP_GEN: public C_AMP_GEN { private: DET_ND_AMP_GEN_ENTRIES its_entries; C_HOST_VIEW * its_host_view_p; public: C_DET_ND_AMP_GEN(DET_ND * nd_p, QB_NET * net_p, C_PI_WIND * pi_wind_p); VOID get_entries(DET_ND_AMP_GEN_ENTRIES & entries);//different from get_wind_entries() VOID set_entries(const DET_ND_AMP_GEN_ENTRIES & entries); VOID reset_subpane(const DET_ND_AMP_GEN_ENTRIES & entries); BOOLEAN parents_are_canonical(DET_ND_TYPE nd_type); BOOLEAN get_wind_entries(DET_ND_AMP_GEN_ENTRIES & entries); VOID fill_trans_mat_and_st_names_of_nd(); BOOLEAN talk(); }; #pragma mark - //****************************************** inline VOID C_DET_ND_AMP_GEN::get_entries( DET_ND_AMP_GEN_ENTRIES & entries) { entries = its_entries; } //****************************************** inline VOID C_DET_ND_AMP_GEN::set_entries( const DET_ND_AMP_GEN_ENTRIES & entries) { ThrowIf_(entries.its_nd_type!=its_entries.its_nd_type); its_entries = entries; } \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Mac_AmpGens/C_PHASOR_YZER_AMP_GEN.cpp b/Legacy/QFog2-MachO/QFogSource/Mac_AmpGens/C_PHASOR_YZER_AMP_GEN.cpp new file mode 100644 index 0000000..f99ecc6 --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Mac_AmpGens/C_PHASOR_YZER_AMP_GEN.cpp @@ -0,0 +1 @@ +#include "C_PHASOR_YZER_AMP_GEN.h" #include "QB_NET.h" #include "C_PI_WIND.h" #include "EXCEPTIONS.h" //****************************************** C_PHASOR_YZER_AMP_GEN::C_PHASOR_YZER_AMP_GEN( PHASOR_ANALYZER type, //in NODE * nd_p, //in QB_NET * net_p, //in C_PI_WIND * pi_wind_p) //in :C_AMP_GEN(nd_p, net_p, pi_wind_p), its_type(type), its_theta(0), its_max_m_sum(0) { } //****************************************** VOID C_PHASOR_YZER_AMP_GEN::set_theta( const DOUBLE & theta) //in { its_theta = theta; limited_degrees(its_theta); } //****************************************** USHORT C_PHASOR_YZER_AMP_GEN::get_expected_degen( const USHORT * mx_p, //in const USHORT * my_p) //in { USHORT num_of_in_sts = its_nd_p->get_num_of_in_sts(); TWO_MODE_FUN two_fun(its_theta); TM_COL_NUM in_st; USHORT sum, nx, ny; its_max_m_sum=0; USHORT degen = 0; COMPLEX z(0, 0); switch(its_type){ case k_pol: for(in_st=0; in_st its_max_m_sum) its_max_m_sum = sum; } for(nx=0; nx<= its_max_m_sum; nx++){ for(ny=0; ny<= its_max_m_sum - nx; ny++){ for(USHORT nloss=0; nloss<= its_max_m_sum - nx - ny; nloss++){ for(in_st=0; in_st=amps_floor){ degen++; break; } } }}} break; case k_pol_rot: for(in_st=0; in_st its_max_m_sum) its_max_m_sum = sum; } for(nx=0; nx<= its_max_m_sum; nx++){ for(ny=0; ny<= its_max_m_sum - nx; ny++){ for(in_st=0; in_st=amps_floor){ degen++; break; } } }} break; }//switch return degen; } //****************************************** BOOLEAN C_PHASOR_YZER_AMP_GEN::parents_are_canonical() { if(!its_pi_wind_p->focus_nd_has_this_many_parents(1))return false; USHORT in_nd = its_nd_p->get_in_nds()[0]; NODE * in_nd_p = its_net_p->get_nd_ptr(in_nd); for(USHORT s=0; sget_degen(); s++){ if(!in_nd_p->get_st_name(s).is_ushort_pair()){ my_gen_alert("Inadmissible parents. This button works only if parents of focus node are all of Type_2. If nx and ny are non-negative integers, Type_2 nodes have states (nx, ny)."); return false; } } return true; } //****************************************** BOOLEAN C_PHASOR_YZER_AMP_GEN::dialog_entries_are_legal( Str255 theta) //in { DOUBLE db; if(!STRINGY(theta).is_double(db)){ my_gen_alert("Your entry for theta must be a real number."); return false; } return true; } //****************************************** VOID C_PHASOR_YZER_AMP_GEN::fill_trans_mat_and_st_names_of_nd() { /* notation: transition element < nx, ny, nloss || mx, my> */ USHORT in_nd = its_nd_p->get_in_nds()[0]; NODE * in_nd_p = its_net_p->get_nd_ptr(in_nd); USHORT in_nd_degen = in_nd_p->get_degen(); USHORT in_nd_st; ThrowIf_(in_nd_degen==0); USHORT * mx_p = new USHORT[in_nd_degen];//new[] //delete: in this method ThrowIfNil_(mx_p); USHORT * my_p = new USHORT[in_nd_degen];//new[] //delete: in this method ThrowIfNil_(my_p); for(in_nd_st = 0; in_nd_st< in_nd_degen; in_nd_st++){ in_nd_p->get_st_name(in_nd_st).is_ushort_pair(mx_p[in_nd_st], my_p[in_nd_st]); } USHORT expected_degen = get_expected_degen(mx_p, my_p); if(expected_degen!=0){ its_net_p->set_degen_of_a_nd(its_pi_wind_p->get_nd(), expected_degen); switch(its_type){ case k_pol: ((POLARIZER *)its_nd_p)->obey_amp_gen(its_theta, its_max_m_sum, mx_p, my_p); break; case k_pol_rot: ((POL_ROTATOR *)its_nd_p)->obey_amp_gen(its_theta, its_max_m_sum, mx_p, my_p); break; } }else{ amp_generator_found_no_states_alert(); } delete [] mx_p; delete [] my_p; } //****************************************** BOOLEAN C_PHASOR_YZER_AMP_GEN::talk() { // this is a trivial generalization of UModalDialogs::AskForOneNumber if(!parents_are_canonical()){ return false; } ResIDT wind_rid, efield_rid; switch(its_type){ case k_pol_rot: wind_rid = pol_rot_window_rid; efield_rid = pol_rot_efield_rid; break; case k_pol: wind_rid = pol_window_rid; efield_rid = pol_efield_rid; break; } StDialogHandler d_handler(wind_rid, its_pi_wind_p);//SuperCommander declared LWindow * dialog_p = d_handler.GetDialog(); LEditField * efield_p = (LEditField *)dialog_p->FindPaneByID(efield_rid); //SetValue() only works for efields with integer values LStr255 x_str; x_str.Assign( its_theta, FIXEDDECIMAL, 6); efield_p->SetDescriptor(x_str); efield_p->SelectAll(); dialog_p->SetLatentSub(efield_p); dialog_p->Show(); while (true) { MessageT hit_message = d_handler.DoDialog(); switch(hit_message){ case msg_Cancel: return false; break; case msg_OK: LStr255 theta_str; efield_p->GetDescriptor(theta_str); if(!dialog_entries_are_legal(theta_str)){ // don't return yet break; } set_theta(double_t(theta_str)); UCursor::SetTheCursor(watchCursor); fill_trans_mat_and_st_names_of_nd(); UCursor::InitTheCursor(); its_pi_wind_p->ListenToMessage(msg_pi_all_act_but, nil); its_pi_wind_p->set_nd_always(its_pi_wind_p->get_nd()); return true; break; } } } \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Mac_AmpGens/C_PHASOR_YZER_AMP_GEN.h b/Legacy/QFog2-MachO/QFogSource/Mac_AmpGens/C_PHASOR_YZER_AMP_GEN.h new file mode 100644 index 0000000..f55a79e --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Mac_AmpGens/C_PHASOR_YZER_AMP_GEN.h @@ -0,0 +1 @@ +#pragma once #include "C_AMP_GEN.h" #include "POL_ROTATOR.h" #include "POLARIZER.h" class QB_NET; class C_PI_WIND; enum PHASOR_ANALYZER { k_pol, k_pol_rot}; //****************************************** class C_PHASOR_YZER_AMP_GEN: public C_AMP_GEN { private: PHASOR_ANALYZER its_type; DOUBLE its_theta;//angle in degrees between pol axis and x axis USHORT its_max_m_sum; //m_sum = mx + my public: C_PHASOR_YZER_AMP_GEN(PHASOR_ANALYZER type, NODE * nd_p, QB_NET * net_p, C_PI_WIND * pi_wind_p); const DOUBLE & get_theta() const; VOID set_theta(const DOUBLE & theta); USHORT get_expected_degen(const USHORT * mx_p, const USHORT * my_p); BOOLEAN parents_are_canonical(); BOOLEAN dialog_entries_are_legal(Str255 theta); VOID fill_trans_mat_and_st_names_of_nd(); BOOLEAN talk(); }; #pragma mark - //****************************************** inline const DOUBLE & C_PHASOR_YZER_AMP_GEN::get_theta() const { return its_theta; } \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Mac_AmpGens/C_QBIT_ROT_AMP_GEN.cpp b/Legacy/QFog2-MachO/QFogSource/Mac_AmpGens/C_QBIT_ROT_AMP_GEN.cpp new file mode 100644 index 0000000..d98e03f --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Mac_AmpGens/C_QBIT_ROT_AMP_GEN.cpp @@ -0,0 +1 @@ +#include "C_QBIT_ROT_AMP_GEN.h" #include "QB_NET.h" #include "EXCEPTIONS.h" //notation: transition element //****************************************** C_QBIT_ROT_AMP_GEN::C_QBIT_ROT_AMP_GEN( QBIT_ROT * nd_p, //in QB_NET * net_p, //in C_PI_WIND * pi_wind_p) //in :C_AMP_GEN(nd_p, net_p, pi_wind_p) { for(USHORT j=0; j<4; j++){ its_thetas[j] = 0; } } //****************************************** VOID C_QBIT_ROT_AMP_GEN::set_theta( USHORT j, //in const DOUBLE & theta) //in { its_thetas[j]=theta; limited_degrees(its_thetas[j]); } //****************************************** COMPLEX C_QBIT_ROT_AMP_GEN::qbit_rot_amp( USHORT n, //in USHORT m) //in { // notation USHORT j; DOUBLE theta_mag = 0; for(j=1; j<4; j++){ //note: j=0 not included!! theta_mag += pow(its_thetas[j], 2); } theta_mag = sqrt(theta_mag)*my_pi/180; //theta_mag in rads DOUBLE theta_hat[4]; if( theta_mag>amps_floor){ for(j=1; j<4; j++){ //note: j=0 not included!! theta_hat[j] = (its_thetas[j]*my_pi/180)/theta_mag; } }else{ for(j=1; j<4; j++){ //note: j=0 not included!! theta_hat[j] = 0; } } //theta_hat[j] in rads. //theta_hat[0] will never be used DOUBLE x, y; DOUBLE s = sin(theta_mag); DOUBLE c = cos(theta_mag); if(n==0 && m==0){ x = c; y = theta_hat[3]*s; }else if(n==1 && m==1){ x = c; y = -theta_hat[3]*s; }else if(n==0 && m==1){ x = theta_hat[2]*s; y = theta_hat[1]*s; }else if(n==1 && m==0){ x = -theta_hat[2]*s; y = theta_hat[1]*s; }else{ x = 0; y = 0; } s = sin(its_thetas[0]*my_pi/180); c = cos(its_thetas[0]*my_pi/180); return COMPLEX(c*x - s*y, c*y + s*x); } //****************************************** BOOLEAN C_QBIT_ROT_AMP_GEN::parents_are_canonical() { return its_pi_wind_p->focus_nd_has_this_many_parents(1) && its_pi_wind_p->focus_nd_parents_are_binary(); } //****************************************** BOOLEAN C_QBIT_ROT_AMP_GEN::dialog_entries_are_legal( Str255 theta_p_p[]) //in { DOUBLE db; for(USHORT j=0; j<4; j++){ if(!STRINGY(theta_p_p[j]).is_double(db)){ my_gen_alert("One of your theta entries is not a real number."); return false; } } return true; } //****************************************** VOID C_QBIT_ROT_AMP_GEN::fill_trans_mat_and_st_names_of_nd() //in { its_net_p->set_degen_of_a_nd(its_pi_wind_p->get_nd(), 2); ((QBIT_ROT *)its_nd_p)->obey_amp_gen(); } //****************************************** BOOLEAN C_QBIT_ROT_AMP_GEN::talk() { // this is a trivial generalization of UModalDialogs::AskForOneNumber if(!parents_are_canonical()){ return false; } StDialogHandler d_handler(qbit_rot_window_rid, its_pi_wind_p);//SuperCommander declared LWindow * dialog_p = d_handler.GetDialog(); LEditField * theta_efield_p[4]; theta_efield_p[0] = (LEditField *)dialog_p->FindPaneByID(qbit_rot_theta0_efield_rid); theta_efield_p[1] = (LEditField *)dialog_p->FindPaneByID(qbit_rot_theta1_efield_rid); theta_efield_p[2] = (LEditField *)dialog_p->FindPaneByID(qbit_rot_theta2_efield_rid); theta_efield_p[3] = (LEditField *)dialog_p->FindPaneByID(qbit_rot_theta3_efield_rid); //SetValue() only works for efields with integer values Str255 str_p_p[4]; LStr255 x_str; USHORT j; for(j=0; j<4; j++){ x_str.Assign(get_theta(j), FIXEDDECIMAL, 6); theta_efield_p[j]->SetDescriptor(x_str); } theta_efield_p[0]->SelectAll(); dialog_p->SetLatentSub(theta_efield_p[0]); dialog_p->Show(); while (true) { MessageT hit_message = d_handler.DoDialog(); switch(hit_message){ case msg_Cancel: return false; break; case msg_OK: for(j=0; j<4; j++){ theta_efield_p[j]->GetDescriptor(str_p_p[j]); } if(!dialog_entries_are_legal(str_p_p))break; for(j=0; j<4; j++){ x_str = str_p_p[j]; set_theta(j, double_t(x_str)); } //step too quick to put up watch cursor //UCursor::SetTheCursor(watchCursor); fill_trans_mat_and_st_names_of_nd(); //UCursor::InitTheCursor(); its_pi_wind_p->ListenToMessage(msg_pi_all_act_but, nil); its_pi_wind_p->set_nd_always(its_pi_wind_p->get_nd()); return true; break; } } } \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Mac_AmpGens/C_QBIT_ROT_AMP_GEN.h b/Legacy/QFog2-MachO/QFogSource/Mac_AmpGens/C_QBIT_ROT_AMP_GEN.h new file mode 100644 index 0000000..868ae1e --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Mac_AmpGens/C_QBIT_ROT_AMP_GEN.h @@ -0,0 +1 @@ +#pragma once #include "C_AMP_GEN.h" #include "QBIT_ROT.h" class QB_NET; #include "C_PI_WIND.h" //notation: transition element //****************************************** class C_QBIT_ROT_AMP_GEN: public C_AMP_GEN { private: DOUBLE its_thetas[4];//thetas in degrees public: C_QBIT_ROT_AMP_GEN(QBIT_ROT * nd_p, QB_NET * net_p, C_PI_WIND * pi_wind_p); const DOUBLE & get_theta(USHORT j) const; VOID set_theta(USHORT j, const DOUBLE & theta); COMPLEX qbit_rot_amp(USHORT n, USHORT m); BOOLEAN parents_are_canonical(); BOOLEAN dialog_entries_are_legal(Str255 theta_p_p[]); VOID fill_trans_mat_and_st_names_of_nd(); BOOLEAN talk(); }; #pragma mark - //****************************************** inline const DOUBLE & C_QBIT_ROT_AMP_GEN::get_theta( USHORT j) const //in { return its_thetas[j]; } \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Mac_AmpGens/C_SG_MAGNET_AMP_GEN.cpp b/Legacy/QFog2-MachO/QFogSource/Mac_AmpGens/C_SG_MAGNET_AMP_GEN.cpp new file mode 100644 index 0000000..e5b7343 --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Mac_AmpGens/C_SG_MAGNET_AMP_GEN.cpp @@ -0,0 +1 @@ +#include "C_SG_MAGNET_AMP_GEN.h" #include "C_SG_MAGNET_TABLE.h" #include "QB_NET.h" #include "C_PI_WIND.h" #include "EXCEPTIONS.h" //****************************************** C_SG_MAGNET_AMP_GEN::C_SG_MAGNET_AMP_GEN( SG_MAGNET * nd_p, //in QB_NET * net_p, //in C_PI_WIND * pi_wind_p) //in :C_AMP_GEN(nd_p, net_p, pi_wind_p), its_magnetic_theta(0), its_magnetic_phi(0) { } //****************************************** C_SG_MAGNET_AMP_GEN::~C_SG_MAGNET_AMP_GEN() { } //****************************************** VOID C_SG_MAGNET_AMP_GEN::set_magnetic_theta( const DOUBLE & theta) //in { its_magnetic_theta=theta; limited_degrees(its_magnetic_theta); } //****************************************** VOID C_SG_MAGNET_AMP_GEN::set_magnetic_phi( const DOUBLE & phi) //in { its_magnetic_phi=phi; limited_degrees(its_magnetic_phi); } //****************************************** VOID C_SG_MAGNET_AMP_GEN::resize( USHORT len) { its_spins.resize(0, len); its_thetas.resize(0, len); its_phis.resize(0, len); } //****************************************** VOID C_SG_MAGNET_AMP_GEN::resize( const VECTOR & in_nd_types) //in { USHORT len = in_nd_types.get_len(); its_spins.resize(0, len); //spins +1, -1 are only possible for type 1 nodes //and spin 0 is only possible for type 2 nodes. for(USHORT in_row=0; in_row saved_spins(its_spins); VECTOR saved_thetas(its_thetas); VECTOR saved_phis(its_phis); for(i=0; i< num_of_in_nds; i++){ old_i = map.its_oldfn[i]; its_spins[i] = saved_spins[old_i]; its_thetas[i] = saved_thetas[old_i]; its_phis[i] = saved_phis[old_i]; } } //****************************************** COMPLEX C_SG_MAGNET_AMP_GEN::sg_magnet_amp( USHORT n_neg, //in USHORT n_pos, //in USHORT in_sum, //in USHORT in_row, //in SHORT in_spin) //in { //notation: transition element < (n_neg, n_pos) | in_sum, in_row, in_spin> //in_sum = the number of incoming particles. //Only matrix elements with in_sum=1 are non-zero. //in_row = when in_sum=1, the row of the in node with the particle. //in_spin = when in_sum=1, the spin (+1 or -1) of the particle. //The outgoing arrow has 2 occupation numbers: n_neg and n_pos //All occupation numbers are either 0 or 1. //States with n_neg + n_pos>1 are given zero amplitude. //The outgoing states are (n-, n+) = (0, 0), (0, 1), (1, 0) if( (n_pos + n_neg==0)&&(in_sum==0) ) return COMPLEX(1, 0); if( (n_pos + n_neg==1)&&(in_sum==1) ){ SHORT out_spin=(n_pos==1?1:-1); DOUBLE cp = cos(my_pi/180*its_magnetic_theta/2); DOUBLE sp = sin(my_pi/180*its_magnetic_theta/2); DOUBLE c = cos(my_pi/180*its_thetas[in_row]/2); DOUBLE s = sin(my_pi/180*its_thetas[in_row]/2); DOUBLE delta_phi = my_pi/180*(its_magnetic_phi - its_phis[in_row]); COMPLEX ph_fac = exp(COMPLEX(0, delta_phi/2) ); if(out_spin==1 && in_spin==1){ return cp*c*ph_fac + sp*s*conj(ph_fac); }else if(out_spin==-1 && in_spin==-1){ return sp*s*ph_fac + cp*c*conj(ph_fac); }else if(out_spin==1 && in_spin==-1){ return -cp*s*ph_fac + sp*c*conj(ph_fac); }else if(out_spin==-1 && in_spin==1){ return -sp*c*ph_fac + cp*s*conj(ph_fac); } } return COMPLEX(0, 0); } //****************************************** USHORT C_SG_MAGNET_AMP_GEN::get_expected_degen( const USHORT * in_sums_p, //in const USHORT * in_rows_p, //in const SHORT * in_spins_p) //in { USHORT num_of_in_sts = its_nd_p->get_num_of_in_sts(); USHORT degen = 0; COMPLEX z(0, 0); for(USHORT n1=0; n1<= 1; n1++){ // n1 = n_neg, n2 = n_pos for(USHORT n2=0; n2<= 1 - n1; n2++){ for(TM_COL_NUM in_st=0; in_st=amps_floor){ degen++; goto next_n1_n2_pair; } } next_n1_n2_pair:; } } return degen; } //****************************************** BOOLEAN C_SG_MAGNET_AMP_GEN::parents_are_canonical( VECTOR & in_nd_types) //out { if(!its_pi_wind_p->focus_nd_has_this_many_parents(max_ushort))return false; enum {enter_st=0, likes1_st, likes2_st, reject_st}; //finite state machine for each in_nd // likes1_st <---enter_st--->likes2_st // | // V // reject_st //can also go from //likes1_st -> reject_st //likes2_st -> reject_st STRINGY stringy; for(USHORT r=0; rget_num_of_in_nds(); r++){ USHORT in_nd = its_nd_p->get_in_nds()[r]; NODE * in_nd_p = its_net_p->get_nd_ptr(in_nd); USHORT state = enter_st; USHORT n1, n2; USHORT in_nd_degen = in_nd_p->get_degen(); for(USHORT s=0; sget_st_name(s); switch(state){ case enter_st: if(stringy=="0" || stringy=="1"){ state = likes1_st; }else if(stringy.is_ushort_pair(n1, n2) && (n1+n2)<=1){ state = likes2_st; }else{ state = reject_st; goto stop_looking; } break; case likes1_st: if(stringy=="0" || stringy=="1"){ //state = likes1_st; }else{ state = reject_st; goto stop_looking; } break; case likes2_st: if(stringy.is_ushort_pair(n1, n2) && (n1+n2)<=1){ //state = likes2_st; }else{ state = reject_st; goto stop_looking; } break; } } in_nd_types[r]= (state==likes1_st?1:2); stop_looking:; if(state==reject_st){ my_gen_alert("Inadmissible parents. This button works only if each parent node of the magnet is of Type_1 or Type_2. Type_1 nodes have 2 states: 0, 1. Type_2 nodes have 3 states: (0, 0), (0, 1), (1, 0)."); return false; } } return true; } //****************************************** BOOLEAN C_SG_MAGNET_AMP_GEN::dialog_entries_are_legal( Str255 theta, //in Str255 phi) //in { DOUBLE db; if(!STRINGY(theta).is_double(db)){ my_gen_alert("Your entry for theta must be a real number."); return false; } if(!STRINGY(phi).is_double(db)){ my_gen_alert("Your entry for phi must be a real number."); return false; } return true; } //****************************************** VOID C_SG_MAGNET_AMP_GEN::fill_trans_mat_and_st_names_of_nd() { TM_COL_NUM num_of_in_sts = its_nd_p->get_num_of_in_sts(); USHORT num_of_in_nds = its_nd_p->get_num_of_in_nds(); STRETCH_OR_FOLD sof_in(its_nd_p->get_in_nd_degens()); TM_COL_NUM in_st; USHORT in_row; USHORT in_nd, nd_st; STRINGY stringy; USHORT m1, m2; //can't use VECTOR class for next vectors //because VECTOR can have at most max_ushort elements. ThrowIf_(num_of_in_sts==0); USHORT * in_sums_p = new USHORT [num_of_in_sts];//new[] //delete: in this method ThrowIfNil_(in_sums_p); USHORT * in_rows_p = new USHORT [num_of_in_sts];//new[] //delete: in this method ThrowIfNil_(in_rows_p); SHORT * in_spins_p = new SHORT [num_of_in_sts];//new[] //delete: in this method ThrowIfNil_(in_spins_p); for(in_st = 0; in_stget_in_nds()[in_row]; nd_st = sof_in.vec_label(in_st)[in_row]; stringy = its_net_p->get_nd_ptr(in_nd)->get_st_name(nd_st); if(stringy.is_ushort(m1)){ in_sums_p[in_st] += m1; if(m1==1){ in_rows_p[in_st]=in_row; in_spins_p[in_st] = get_spin(in_row); } } if(stringy.is_ushort_pair(m1, m2)){ in_sums_p[in_st] += (m1+m2); if( (m1+m2)==1){ in_rows_p[in_st]=in_row; in_spins_p[in_st] = (m2==1?1:-1); } } } } USHORT expected_degen = get_expected_degen(in_sums_p, in_rows_p, in_spins_p); if(expected_degen!=0){ its_net_p->set_degen_of_a_nd(its_pi_wind_p->get_nd(), expected_degen); ((SG_MAGNET *)its_nd_p)->obey_amp_gen(in_sums_p, in_rows_p, in_spins_p); }else{ amp_generator_found_no_states_alert(); } delete [] in_sums_p; in_sums_p=0; delete [] in_rows_p; in_rows_p=0; delete [] in_spins_p; in_spins_p=0; } //****************************************** BOOLEAN C_SG_MAGNET_AMP_GEN::talk() { // this is a trivial generalization of UModalDialogs::AskForOneNumber VECTOR in_nd_types(0, its_nd_p->get_num_of_in_nds()); if(!parents_are_canonical(in_nd_types)){ return false; } resize(in_nd_types); StDialogHandler d_handler(sg_magnet_window_rid, its_pi_wind_p);//SuperCommander declared LWindow * dialog_p = d_handler.GetDialog(); LEditField * theta_efield_p = (LEditField *)dialog_p->FindPaneByID(sg_magnet_theta_efield_rid); LEditField * phi_efield_p = (LEditField *)dialog_p->FindPaneByID(sg_magnet_phi_efield_rid); C_SG_MAGNET_TABLE * sg_magnet_table_p = (C_SG_MAGNET_TABLE *)dialog_p->FindPaneByID(sg_magnet_table_rid); //SetValue() only works for efields with integer values LStr255 x_str; x_str.Assign( its_magnetic_theta, FIXEDDECIMAL, 6); theta_efield_p->SetDescriptor(x_str); x_str.Assign( its_magnetic_phi, FIXEDDECIMAL, 6); phi_efield_p->SetDescriptor(x_str); sg_magnet_table_p->init(its_pi_wind_p->get_nd(), its_net_p, this); dialog_p->Show(); while (true) { MessageT hit_message = d_handler.DoDialog(); switch(hit_message){ case msg_Cancel: return false; break; case msg_OK: LStr255 theta_str; LStr255 phi_str; theta_efield_p->GetDescriptor(theta_str); phi_efield_p->GetDescriptor(phi_str); if(!dialog_entries_are_legal(theta_str, phi_str))break; if(!sg_magnet_table_p->unload_editor())break; its_magnetic_theta = double_t(theta_str); its_magnetic_phi = double_t(phi_str); sg_magnet_table_p->get_spin_theta_phi_vecs(its_spins, its_thetas, its_phis); //step too quick to put up watch cursor //UCursor::SetTheCursor(watchCursor); fill_trans_mat_and_st_names_of_nd(); //UCursor::InitTheCursor(); its_pi_wind_p->ListenToMessage(msg_pi_all_act_but, nil); its_pi_wind_p->set_nd_always(its_pi_wind_p->get_nd()); return true; break; } } } \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Mac_AmpGens/C_SG_MAGNET_AMP_GEN.h b/Legacy/QFog2-MachO/QFogSource/Mac_AmpGens/C_SG_MAGNET_AMP_GEN.h new file mode 100644 index 0000000..57d7be4 --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Mac_AmpGens/C_SG_MAGNET_AMP_GEN.h @@ -0,0 +1 @@ +#pragma once #include "C_AMP_GEN.h" #include "SG_MAGNET.h" class QB_NET; class C_PI_WIND; //notation: transition element < (n_neg, n_pos) | in_sum, in_row, in_spin> //in_sum = the number of incoming particles. //Only matrix elements with in_sum=1 are non-zero. //in_row = when in_sum=1, the row of the in node with the particle. //in_spin = when in_sum=1, the spin (+1 or -1) of the particle. //The outgoing arrow has 2 occupation numbers: n_neg and n_pos //All occupation numbers are either 0 or 1. //States with n_neg + n_pos>1 are given zero amplitude. //The outgoing states are (n-, n+) = (0, 0), (0, 1), (1, 0) //****************************************** class C_SG_MAGNET_AMP_GEN: public C_AMP_GEN { private: DOUBLE its_magnetic_theta;//theta in degrees for magnet DOUBLE its_magnetic_phi;//phi in degreees for magnet //these vectors are initially of zero length: VECTOR its_spins;// 0 for -+, 1 for +, -1 for -; in 1-1 correspodence with its_in_nds VECTOR its_thetas;// in degrees; in 1-1 correspodence with its_in_nds VECTOR its_phis;// in degrees; in 1-1 correspodence with its_in_nds public: C_SG_MAGNET_AMP_GEN(SG_MAGNET * nd_p, QB_NET * net_p, C_PI_WIND * pi_wind_p); ~C_SG_MAGNET_AMP_GEN(); const DOUBLE & get_magnetic_theta() const; const DOUBLE & get_magnetic_phi() const; VOID set_magnetic_theta(const DOUBLE & theta); VOID set_magnetic_phi(const DOUBLE & phi); SHORT get_spin(USHORT pos) const; const DOUBLE & get_theta(USHORT pos) const; const DOUBLE & get_phi(USHORT pos) const; VOID set_spin(USHORT pos, SHORT spin); VOID set_theta(USHORT pos, const DOUBLE & theta); VOID set_phi(USHORT pos, const DOUBLE & phi); const VECTOR & get_spins() const; const VECTOR & get_thetas() const; const VECTOR & get_phis() const; VOID set_spins(const VECTOR & spins); VOID set_thetas(const VECTOR & thetas); VOID set_phis(const VECTOR & phis); BOOLEAN param_vecs_are_empty(); VOID resize(USHORT len); VOID resize(const VECTOR & in_nd_types); VOID extract_at(USHORT loc); VOID reorder(const UI_MAP & map); COMPLEX sg_magnet_amp(USHORT n_neg, USHORT n_pos, USHORT in_sum, USHORT in_row, SHORT in_spin); USHORT get_expected_degen(const USHORT * in_sums, const USHORT * in_rows,const SHORT * in_spins); BOOLEAN parents_are_canonical(VECTOR & in_nd_types); BOOLEAN dialog_entries_are_legal(Str255 theta, Str255 phi); VOID fill_trans_mat_and_st_names_of_nd(); BOOLEAN talk(); }; #pragma mark - //****************************************** inline const DOUBLE & C_SG_MAGNET_AMP_GEN::get_magnetic_theta() const { return its_magnetic_theta; } //****************************************** inline const DOUBLE & C_SG_MAGNET_AMP_GEN::get_magnetic_phi() const { return its_magnetic_phi; } //****************************************** inline SHORT C_SG_MAGNET_AMP_GEN::get_spin( USHORT pos) //in const { return its_spins[pos]; } //****************************************** inline const DOUBLE & C_SG_MAGNET_AMP_GEN::get_theta( USHORT pos) //in const { return its_thetas[pos]; } //****************************************** inline const DOUBLE & C_SG_MAGNET_AMP_GEN::get_phi( USHORT pos) //in const { return its_phis[pos]; } //****************************************** inline VOID C_SG_MAGNET_AMP_GEN::set_spin( USHORT pos, //in SHORT spin) //in { its_spins[pos]=spin; } //****************************************** inline VOID C_SG_MAGNET_AMP_GEN::set_theta( USHORT pos, //in const DOUBLE & theta) //in { its_thetas[pos]=theta; } //****************************************** inline VOID C_SG_MAGNET_AMP_GEN::set_phi( USHORT pos, //in const DOUBLE & phi) //in { its_phis[pos]=phi; } //****************************************** inline const VECTOR & C_SG_MAGNET_AMP_GEN::get_spins() const { return its_spins; } //****************************************** inline const VECTOR & C_SG_MAGNET_AMP_GEN::get_thetas() const { return its_thetas; } //****************************************** inline const VECTOR & C_SG_MAGNET_AMP_GEN::get_phis() const { return its_phis; } //****************************************** inline VOID C_SG_MAGNET_AMP_GEN::set_spins( const VECTOR & spins) //in { its_spins=spins; } //****************************************** inline VOID C_SG_MAGNET_AMP_GEN::set_thetas( const VECTOR & thetas) //in { its_thetas=thetas; } //****************************************** inline VOID C_SG_MAGNET_AMP_GEN::set_phis( const VECTOR & phis) //in { its_phis=phis; } //****************************************** inline BOOLEAN C_SG_MAGNET_AMP_GEN::param_vecs_are_empty() { return its_spins.get_len()==0; } \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Mac_AmpGens/C_SG_MAGNET_TABLE.cpp b/Legacy/QFog2-MachO/QFogSource/Mac_AmpGens/C_SG_MAGNET_TABLE.cpp new file mode 100644 index 0000000..c971cf4 --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Mac_AmpGens/C_SG_MAGNET_TABLE.cpp @@ -0,0 +1 @@ +#include "C_SG_MAGNET_TABLE.h" #include "C_SG_MAGNET_AMP_GEN.h" #include "SG_MAGNET.h" #include "EXCEPTIONS.h" #include "C_EDIT_TABLE.h" #include "QB_NET.h" #include "StCPTstate.h" #pragma mark --creation/destruction-- //****************************************** C_SG_MAGNET_TABLE::C_SG_MAGNET_TABLE( LStream * inStream) //in :C_EDIT_TABLE(inStream), its_net_p(0), its_amp_gen_p(0) { LTableMultiGeometry * geo_p = new LTableMultiGeometry(this, 70 /* cell width */, 20/*cell height*/); //delete: in ~LTableView(). ThrowIfNil_(geo_p); SetTableGeometry(geo_p); // total width = 310 = 150 + 20 + 2(70) InsertCols( 4, //how many 0, //after which col 0, //data pointer 0, //data size false); //refresh SetColWidth( 150,//width 1, //from this col 1);//to this col SetColWidth( 20,//width 2, //from this col 2);//to this col } //****************************************** C_SG_MAGNET_TABLE::~C_SG_MAGNET_TABLE() {} //****************************************** VOID C_SG_MAGNET_TABLE::init( USHORT nd_id, //in QB_NET * net_p, //in C_SG_MAGNET_AMP_GEN * amp_gen_p) //in { //its_xxxx are used to keep temporary values, //that won't be passed into the SG_MAGNET object until //the user presses OK. They won't be passed at all if the user //presses Cancel. its_nd = nd_id; its_net_p = net_p; its_amp_gen_p = amp_gen_p; SG_MAGNET * nd_p = (SG_MAGNET *)its_net_p->get_nd_ptr(its_nd); its_spins = its_amp_gen_p->get_spins(); its_thetas = its_amp_gen_p->get_thetas(); its_phis = its_amp_gen_p->get_phis(); InsertRows( nd_p->get_num_of_in_nds(), //how many 0, //after which row 0, //data pointer 0, //data size true); //refresh } #pragma mark --about one cell-- //****************************************** VOID C_SG_MAGNET_TABLE::get_cell_data( const STableCell & cell, //in LStr255 & str) //out { USHORT r = cell.row -1; ThrowIf_(cell.col==1); switch(cell.col){ //case 1: won't be called case 2: if(its_spins[r] == -1)str = "\p-"; if(its_spins[r] == 0)str = "\p-+"; if(its_spins[r] == 1)str = "\p+"; break; case 3: str.Assign(its_thetas[r], FIXEDDECIMAL, 15); str[0] = 15; break; case 4: str.Assign(its_phis[r], FIXEDDECIMAL, 15); str[0] = 15; break; } } //****************************************** VOID C_SG_MAGNET_TABLE::set_cell_data( const STableCell & cell, //in const LStr255 & str) //in { // This method changes cell storage and appearance. // This method won't be called for col=1. ThrowIf_(cell.col==1); USHORT r = cell.row -1; DOUBLE ang; switch(cell.col){ case 2: if(str == "\p-"){ its_spins[r] = -1; }else if(str == "\p-+"){ its_spins[r] = 0; }else if(str == "\p+"){ its_spins[r] = 1; } break; case 3: ang = double_t(str); limited_degrees(ang); its_thetas[r] = ang; break; case 4: ang = double_t(str); limited_degrees(ang); its_phis[r] = ang; break; } RefreshCell(cell); } //****************************************** VOID C_SG_MAGNET_TABLE::DrawCell( const STableCell & inCell, //in const Rect & inLocalRect) //in {//drawer StCPTstate saved_st(true, false, true); saved_st.Normalize(); ::TextSize(its_font_size); ::TextFont(its_font_num); ::MoveTo(inLocalRect.left + 4, inLocalRect.bottom - 4); LStr255 str; USHORT r = inCell.row -1; switch(inCell.col){ case 1: SG_MAGNET * nd_p=(SG_MAGNET *)its_net_p->get_nd_ptr(its_nd); USHORT in_nd = nd_p->get_in_nds()[r]; its_net_p->get_nd_ptr(in_nd)->get_name().fill_LStr255(str); trunc_pstr_so_it_fits(str, GetColWidth(1), 8); break; case 2: get_cell_data(inCell, str); break; case 3: case 4: get_cell_data(inCell, str); str[0] = 8; break; } ::DrawString(str); draw_cell_frame(inLocalRect);//see GLOBAL_FUN.h } //****************************************** BOOLEAN C_SG_MAGNET_TABLE::str_is_valid_cell_entry( const STableCell & cell, //in Str255 pstr) //in { if(cell.col>=3){ if(!STRINGY(pstr).is_double()){ my_gen_alert("Illegal table-entry. The entry should be a real number but isn't. Please fix before continuing."); return false; } } return true; } //****************************************** VOID C_SG_MAGNET_TABLE::ClickCell( const STableCell & inCell, //in const SMouseDownEvent & inMouseDown) //in { //MONITOR_THE_CHANGE_HERE //If click on a cell out of bounds for the editor //editor's cell is set to nullcell. //If the editor's cell is null, //unload_editor() does nothing and returns true LStr255 str; switch(inCell.col){ case 1: if(its_editor_p->get_cell()==inCell)break; if(!unload_editor())break; nullify_editor(); break; case 2: //Can't have this: //if(its_editor_p->get_cell()==inCell)return; //because clicking a second time on the same cell //should toggle the spin of the state. if(!unload_editor())break; nullify_editor(); get_cell_data(inCell, str); if(str[0]==1){ if(str[1]=='-'){// spin = - set_cell_data(inCell, "\p+"); }else{//spin = + set_cell_data(inCell, "\p-"); } } //do nothing for str = - + break; case 3: case 4: C_EDIT_TABLE::ClickCell(inCell, inMouseDown); //Note that C_EDIT_TABLE::ClickCell() //sets to 31 //the max num of characters that //the cell editor will accept. //In the case of columns 3 and 4, //we don't want the default value //so we change it. set_max_chars_of_cell_editor(15); break; } } #pragma mark --about many cells-- //****************************************** VOID C_SG_MAGNET_TABLE::get_spin_theta_phi_vecs( VECTOR & spins, //out VECTOR & thetas, //out VECTOR & phis) //out { spins = its_spins; thetas = its_thetas; phis = its_phis; } \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Mac_AmpGens/C_SG_MAGNET_TABLE.h b/Legacy/QFog2-MachO/QFogSource/Mac_AmpGens/C_SG_MAGNET_TABLE.h new file mode 100644 index 0000000..bd06f09 --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Mac_AmpGens/C_SG_MAGNET_TABLE.h @@ -0,0 +1 @@ +#pragma once #include "QFog_constants.h" #include "C_EDIT_TABLE.h" #include "VECTOR.h" class QB_NET; class C_SG_MAGNET_AMP_GEN; //****************************************** class C_SG_MAGNET_TABLE : public C_EDIT_TABLE { protected: USHORT its_nd; QB_NET * its_net_p; C_SG_MAGNET_AMP_GEN * its_amp_gen_p; //these vectors are initially of zero length: VECTOR its_spins; // 0 for -+, 1 for +, -1 for -; in 1-1 correspodence with its_in_nds VECTOR its_thetas;// in degrees; in 1-1 correspodence with its_in_nds VECTOR its_phis; // in degrees; in 1-1 correspodence with its_in_nds public: C_SG_MAGNET_TABLE(LStream * inStream); virtual ~C_SG_MAGNET_TABLE(); VOID init(USHORT nd_id, QB_NET * net_p, C_SG_MAGNET_AMP_GEN * amp_gen); VOID get_cell_data(const STableCell & cell, LStr255 & str); VOID set_cell_data(const STableCell & cell, const LStr255 & str); VOID DrawCell(const STableCell & inCell, const Rect & inLocalRect); BOOLEAN str_is_valid_cell_entry(const STableCell & cell, Str255 pstr); VOID ClickCell(const STableCell & inCell, const SMouseDownEvent & inMouseDown); VOID get_spin_theta_phi_vecs(VECTOR & spins, VECTOR & thetas, VECTOR & phis); //out }; \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Mac_AmpGens/TWO_MODE_FUN.cpp b/Legacy/QFog2-MachO/QFogSource/Mac_AmpGens/TWO_MODE_FUN.cpp new file mode 100644 index 0000000..1cb9e63 --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Mac_AmpGens/TWO_MODE_FUN.cpp @@ -0,0 +1 @@ +#include "TWO_MODE_FUN.h" #include "GLOBAL_FUN.h" #include "QFog_constants.h" //****************************************** TWO_MODE_FUN::TWO_MODE_FUN( const DOUBLE & tau_mag, //in const DOUBLE & tau_ang, //in const DOUBLE & rho_ang) //in :its_tau_mag(tau_mag), its_tau_ang(tau_ang), its_rho_ang(rho_ang) { its_tau = (its_tau_mag)*exp( COMPLEX(0, its_tau_ang*my_pi/180) ); its_rho = DOUBLE(sqrt(1-pow(its_tau_mag, 2)))*exp( COMPLEX(0, its_rho_ang*my_pi/180) ); //its_cos, its_sin and its_theta won't be used its_cos=0; its_sin=0; its_theta=0; } //****************************************** TWO_MODE_FUN::TWO_MODE_FUN( const DOUBLE & theta) //in :its_theta(theta) { its_cos = cos(its_theta*my_pi/180); its_sin = sin(its_theta*my_pi/180); its_tau_mag = abs(its_cos); its_tau_ang = its_cos>0?0:180; its_rho_ang = its_sin>0?0:180; its_tau = its_cos; its_rho = its_sin; } //****************************************** COMPLEX TWO_MODE_FUN::get_bs_amp( USHORT n1, //in USHORT n2, //in USHORT m1, //in USHORT m2) //in const { //calculates beam splitter amp //be very careful when subtracting USHORTs! 0-1 is not -1 for ushorts. // no incomming photons if( (n1+n2+m1+m2) == 0) { return COMPLEX(1, 0); } //zero amp cases SHORT up_lim, lo_lim; if (n1 <= m1){ up_lim = n1; }else{ up_lim = m1; } if (m1 <= n2){ //m1-n2<=0 will not work! because using USHORTs lo_lim = 0; }else{ lo_lim = m1-n2; } if ( ((n1+n2) != (m1+m2)) || (lo_lim > up_lim) ) { return COMPLEX(0, 0); } // tau_mag=1 case SHORT n_dif = SHORT(n1) - SHORT(n2); if(abs(its_tau_mag-1)^#*Kxl<@DJ8?g9J2@Bp`T+Bpy5jl8c`AgZv7AOsl&Gv)MdY zFA}61W@>hNy0)jn%+i7jKN?tn0N$oj4s#^KxtimU=Ds!Fe%xcM1 z$w_Bd<}t0xzgI_h<01J6=u;Qk)hYF zfGgk%{3sy%L&74MMl1|<>tLl<0AiEfYHZ6Vfy5*c(};y3J+xqget_bi_nd(its_bi_nd_id, nd1, nd2); if(its_side==top_sd){ NODE * nd2_p = its_net_p->get_nd_ptr(nd2); USHORT nd2_st=inCell.col-1; nd2_p->get_st_name(nd2_st).fill_LStr255(pstr); trunc_pstr_so_it_fits(pstr, GetColWidth(inCell.col), 8); ::DrawString(pstr); // ::MoveTo(inLocalRect.right, inLocalRect.top); // ::LineTo(inLocalRect.right, inLocalRect.bottom); cell_rect = inLocalRect; cell_rect.right++; ::FrameRect(&cell_rect); }else{//its_side = left_sd NODE * nd1_p = its_net_p->get_nd_ptr(nd1); USHORT nd1_st = inCell.row -1; nd1_p->get_st_name(nd1_st).fill_LStr255(pstr); trunc_pstr_so_it_fits(pstr, GetColWidth(inCell.col), 8); ::DrawString(pstr); // ::MoveTo(inLocalRect.left, inLocalRect.bottom); // ::LineTo(inLocalRect.right, inLocalRect.bottom); cell_rect= inLocalRect; cell_rect.bottom++; ::FrameRect(&cell_rect); } } //****************************************** BOOLEAN C_BI_ND_PROBS_MARGIN::get_touched_cell( STableCell & t_cell) //out { FocusDraw(); Point local_coords; ::GetMouse( &local_coords ); SPoint32 image_coords; LocalToImagePoint(local_coords, image_coords); return GetCellHitBy(image_coords, t_cell) && ImagePointIsInFrame(image_coords.h, image_coords.v); } //****************************************** /*VOID C_BI_ND_PROBS_MARGIN::DrawSelf() {//drawer LTableView::DrawSelf(); Rect frame; // didn't work: // CalcLocalFrameRect(frame); // ::FrameRect(&frame); // ::InsetRect(&frame, 1, 1); // ::EraseRect(&frame); Rect frame; CalcPortFrameRect(frame); ::InsetRect(&frame, -1, -1); GetSuperView()->FocusDraw(); ::FrameRect(&frame); FocusDraw(); } */ #pragma mark --about many cells-- //****************************************** VOID C_BI_ND_PROBS_MARGIN::set_bi_nd_always( USHORT new_id) //in { USHORT nd1, nd2; its_net_p->get_bi_nd(new_id, nd1, nd2); its_bi_nd_id =new_id; UInt32 num_of_rows, num_of_cols; GetTableSize(num_of_rows, num_of_cols); if(its_side==top_sd){ if(num_of_cols != 0 ){ RemoveCols( num_of_cols, //how many 1, //starting with col true);//refresh } num_of_cols = its_net_p->get_nd_ptr(nd2)->get_degen(); InsertCols( num_of_cols,//how many 0, //after which row 0, //data pointer 0, //data size true); //refresh }else{//its_side = left_sd if(num_of_rows != 0){ RemoveRows( num_of_rows, //how many 1, //starting with row true);//refresh } num_of_rows = its_net_p->get_nd_ptr(nd1)->get_degen(); InsertRows( num_of_rows,//how many 0, //after which row 0, //data pointer 0, //data size true); //refresh } Refresh(); } \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Mac_BiNdProbs/C_BI_ND_PROBS_MARGIN.h b/Legacy/QFog2-MachO/QFogSource/Mac_BiNdProbs/C_BI_ND_PROBS_MARGIN.h new file mode 100644 index 0000000..07e0c53 --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Mac_BiNdProbs/C_BI_ND_PROBS_MARGIN.h @@ -0,0 +1 @@ +#pragma once #include "C_TOP_PTRS.h" enum MARGIN_SIDE{top_sd, left_sd}; //****************************************** class C_BI_ND_PROBS_MARGIN : public LTableView, public C_TOP_PTRS { protected: USHORT its_bi_nd_id; MARGIN_SIDE its_side; public: C_BI_ND_PROBS_MARGIN(LStream * inStream); C_BI_ND_PROBS_MARGIN(); virtual ~C_BI_ND_PROBS_MARGIN(); VOID DrawCell( const STableCell & inCell, const Rect & inLocalRect); BOOLEAN get_touched_cell(STableCell & t_cell); VOID set_side(MARGIN_SIDE side); VOID set_bi_nd_always(USHORT new_id); }; #pragma mark - //****************************************** inline VOID C_BI_ND_PROBS_MARGIN::set_side( MARGIN_SIDE side) //in { its_side = side; } \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Mac_BiNdProbs/C_BI_ND_PROBS_TABLE.cpp b/Legacy/QFog2-MachO/QFogSource/Mac_BiNdProbs/C_BI_ND_PROBS_TABLE.cpp new file mode 100644 index 0000000..e132d9d --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Mac_BiNdProbs/C_BI_ND_PROBS_TABLE.cpp @@ -0,0 +1 @@ +#include "C_BI_ND_PROBS_TABLE.h" #include "QB_NET.h" #include "BI_NODE.h" #include "STRINGY.h" #include "StCPTstate.h" #pragma mark --creation/destruction-- //****************************************** C_BI_ND_PROBS_TABLE::C_BI_ND_PROBS_TABLE( LStream * inStream) //in :LTableView(inStream) {} //****************************************** C_BI_ND_PROBS_TABLE::C_BI_ND_PROBS_TABLE() {} //****************************************** C_BI_ND_PROBS_TABLE::~C_BI_ND_PROBS_TABLE() {} #pragma mark --about one cell-- //****************************************** BOOLEAN C_BI_ND_PROBS_TABLE::get_touched_cell( STableCell & t_cell) //out { FocusDraw(); Point local_coords; ::GetMouse( &local_coords ); SPoint32 image_coords; LocalToImagePoint(local_coords, image_coords); return GetCellHitBy(image_coords, t_cell) && ImagePointIsInFrame(image_coords.h, image_coords.v); } //****************************************** VOID C_BI_ND_PROBS_TABLE::DrawCell( const STableCell & inCell, //in const Rect & inLocalRect) //in {//drawer StCPTstate saved_st(true, false, true); saved_st.Normalize(); ::TextFont(systemFont); ::MoveTo(inLocalRect.left + 2, inLocalRect.bottom - 4); LStr255 str; USHORT nd1_st = inCell.row -1 ; USHORT nd2_st = inCell.col -1 ; DOUBLE num = its_net_p->get_bi_nd_ptr(its_bi_nd_id)->get_cum_prob(nd1_st, nd2_st); str.Assign(num, FIXEDDECIMAL, 6); ::DrawString(str); draw_cell_frame(inLocalRect);//see GLOBAL_FUN.h } #pragma mark --about many cells-- //****************************************** VOID C_BI_ND_PROBS_TABLE::set_bi_nd_always( USHORT new_id) //in { its_bi_nd_id =new_id; UInt32 num_of_rows, num_of_cols; GetTableSize(num_of_rows, num_of_cols); if(num_of_rows != 0){ RemoveRows( num_of_rows, //how many 1, //starting with row true);//refresh } if(num_of_cols != 0){ RemoveCols( num_of_cols, //how many 1, //starting with col true);//refresh } USHORT nd1, nd2; its_net_p->get_bi_nd(new_id, nd1, nd2); num_of_rows = its_net_p->get_nd_ptr(nd1)->get_degen(); num_of_cols = its_net_p->get_nd_ptr(nd2)->get_degen(); InsertRows( num_of_rows,//how many 0, //after which row 0, //data pointer 0, //data size true); //refresh InsertCols( num_of_cols,//how many 0, //after which row 0, //data pointer 0, //data size true); //refresh Refresh(); } \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Mac_BiNdProbs/C_BI_ND_PROBS_TABLE.h b/Legacy/QFog2-MachO/QFogSource/Mac_BiNdProbs/C_BI_ND_PROBS_TABLE.h new file mode 100644 index 0000000..292d5f1 --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Mac_BiNdProbs/C_BI_ND_PROBS_TABLE.h @@ -0,0 +1 @@ +#pragma once #include "QFog_constants.h" #include "C_TOP_PTRS.h" //****************************************** class C_BI_ND_PROBS_TABLE : public LTableView, public C_TOP_PTRS { private: // this is the location of the bi-node in the list. (zero based) USHORT its_bi_nd_id; public: C_BI_ND_PROBS_TABLE(LStream * inStream); C_BI_ND_PROBS_TABLE(); virtual ~C_BI_ND_PROBS_TABLE(); BOOLEAN get_touched_cell(STableCell & t_cell); VOID DrawCell(const STableCell & inCell, const Rect & inLocalRect); VOID set_bi_nd_always(USHORT loc); }; \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Mac_BiNdProbs/C_BI_ND_PROBS_WIND.cpp b/Legacy/QFog2-MachO/QFogSource/Mac_BiNdProbs/C_BI_ND_PROBS_WIND.cpp new file mode 100644 index 0000000..a944267 --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Mac_BiNdProbs/C_BI_ND_PROBS_WIND.cpp @@ -0,0 +1 @@ +#include "C_BI_ND_PROBS_WIND.h" #include "C_MAIN_VIEW.h" #include "QB_NET.h" #include "C_BI_ND_PROBS_TABLE.h" #include "C_MARGINED_SCROLLER.h" #include "C_BI_ND_PROBS_MARGIN.h" #include "EXCEPTIONS.h" #pragma mark --creation/destruction-- //****************************************** C_BI_ND_PROBS_WIND::C_BI_ND_PROBS_WIND( LStream * inStream) //in :LWindow(inStream), its_bi_nd_id(0) {} //****************************************** C_BI_ND_PROBS_WIND::C_BI_ND_PROBS_WIND() :its_bi_nd_id(0) {} //****************************************** C_BI_ND_PROBS_WIND::~C_BI_ND_PROBS_WIND() { its_mview_p->finish_bi_nd_probs_wind_closing(); } //****************************************** VOID C_BI_ND_PROBS_WIND::init_popup() { MenuHandle menu_h = its_popup_p->GetMacMenuH(); //destroy_h: by PP ThrowIfNil_(menu_h); // dummy item must be cleared SInt16 num_of_items = ::CountMenuItems(menu_h); for(SInt16 menu_item =1; menu_item<= num_of_items; menu_item++){ ::DeleteMenuItem(menu_h, 1); } for(USHORT loc=0; loc < its_net_p->get_num_of_bi_nds(); loc++){ // Add the item // Insert a dummy item, then rename it so special chars are not a problem ::AppendMenu(menu_h, "\pdummy"); LStr255 descriptor_pstr; its_net_p->get_bi_nd_name(loc).fill_LStr255(descriptor_pstr); if(descriptor_pstr[0]!=0)::SetMenuItemText( menu_h, loc+1 , descriptor_pstr ); } its_popup_p->SetMinValue(1); its_popup_p->SetMaxValue(its_net_p->get_num_of_bi_nds()); its_popup_p->StopBroadcasting(); its_popup_p->SetValue(1); its_popup_p->StartBroadcasting(); } //****************************************** VOID C_BI_ND_PROBS_WIND::show_owner( const LStr255 & file_name) //in { LStr255 cap = "\pProject: "; cap += (LStr255)file_name; its_owner_cap_p->SetDescriptor(cap); } //****************************************** VOID C_BI_ND_PROBS_WIND::special_finish_create( const LStr255 & file_name, //in USHORT bi_nd_id) //in { its_owner_cap_p =(LCaption *)FindPaneByID(bi_nd_probs_owner_cap_rid); its_info_cap_p = (LCaption *)FindPaneByID(bi_nd_probs_info_cap_rid); its_popup_p = (LPopupButton *)FindPaneByID(bi_nd_probs_popup_rid); its_first_but_p =(LStdButton *)FindPaneByID(bi_nd_probs_first_but_rid); its_next_but_p =(LStdButton *)FindPaneByID(bi_nd_probs_next_but_rid); its_bi_nd_state_cap_p =(LCaption *)FindPaneByID(bi_nd_probs_state_cap_rid); C_MARGINED_SCROLLER * scroller_p =(C_MARGINED_SCROLLER *)FindPaneByID(bi_nd_probs_scroller_rid); its_table_p =(C_BI_ND_PROBS_TABLE *)FindPaneByID(bi_nd_probs_table_rid); its_left_margin_p =(C_BI_ND_PROBS_MARGIN *)FindPaneByID(bi_nd_probs_lmargin_rid); its_top_margin_p =(C_BI_ND_PROBS_MARGIN *)FindPaneByID(bi_nd_probs_tmargin_rid); // Activate RidL resource. UReanimator::LinkListenerToControls(this, this, bi_nd_probs_wind_ridl); //its SuperCommander defined in C_MAIN_VIEW::create_bi_nd_probs_wind() ((C_MAIN_VIEW *)GetSuperCommander())->get_top_ptrs(its_doc_p, its_mview_p, its_net_p); // sub-pane initializations that do not depend on bi_nd_id show_owner(file_name); init_popup(); its_bi_nd_state_cap_p->SetDescriptor("\p"); USHORT cell_width = 80; USHORT cell_height = 20; LTableMonoGeometry * geo_p; its_table_p->set_top_ptrs(its_doc_p, its_mview_p, its_net_p); geo_p = new LTableMonoGeometry(its_table_p, cell_width, cell_height); //delete: in ~LTableView(). ThrowIfNil_(geo_p); its_table_p->SetTableGeometry(geo_p); its_top_margin_p->set_top_ptrs(its_doc_p, its_mview_p, its_net_p); its_top_margin_p->set_side(top_sd); geo_p = new LTableMonoGeometry(its_top_margin_p, cell_width, cell_height); //delete: in ~LTableView(). ThrowIfNil_(geo_p); its_top_margin_p->SetTableGeometry(geo_p); its_top_margin_p->InsertRows(1, 0, 0, 0, true); its_left_margin_p->set_top_ptrs(its_doc_p, its_mview_p, its_net_p); its_left_margin_p->set_side(left_sd); geo_p = new LTableMonoGeometry(its_left_margin_p, cell_width, cell_height); //delete: in ~LTableView(). ThrowIfNil_(geo_p); its_left_margin_p->SetTableGeometry(geo_p); its_left_margin_p->InsertCols(1, 0, 0, 0, true); scroller_p->set_top_margin_ptr((LView *)its_top_margin_p); scroller_p->set_left_margin_ptr((LView *)its_left_margin_p); // StartIdling(); // initializations that depend on bi_nd_id set_bi_nd_always(bi_nd_id); // function does no diff checking. Show();//necessary! } #pragma mark --focus bi-node-- //****************************************** VOID C_BI_ND_PROBS_WIND::refresh_info_cap() { BI_NODE * bi_nd_p = its_net_p->get_bi_nd_ptr(its_bi_nd_id); USHORT nd1, nd2; its_net_p->get_bi_nd(its_bi_nd_id, nd1, nd2); USHORT num_of_rows = its_net_p->get_nd_ptr(nd1)->get_degen(); USHORT num_of_cols = its_net_p->get_nd_ptr(nd2)->get_degen(); DOUBLE prob = 0; DOUBLE info = 0; for(USHORT r=0; rget_cum_prob(r, c); if(prob>probs_floor) info -= prob*log(prob)/nat_log_of_2; } } LStr255 str; str.Assign(info, FIXEDDECIMAL, 6); its_info_cap_p->SetDescriptor(str); } //****************************************** VOID C_BI_ND_PROBS_WIND::set_bi_nd_always( USHORT new_id) //in { its_bi_nd_id =new_id; its_popup_p->StopBroadcasting(); its_popup_p->SetValue(new_id + 1); its_popup_p->StartBroadcasting(); refresh_info_cap(); its_table_p->set_bi_nd_always(new_id); its_left_margin_p->set_bi_nd_always(new_id); its_top_margin_p->set_bi_nd_always(new_id); } #pragma mark --buttons: message center-- //****************************************** VOID C_BI_ND_PROBS_WIND::ListenToMessage( MessageT inMessage, //in VOID * ioParam ) //i-o { //MONITOR_THE_CHANGE_HERE USHORT new_item_num; USHORT num_of_items = its_net_p->get_num_of_bi_nds(); switch ( inMessage ) { case msg_bi_nd_probs_popup: // for nd_popup: inMessage = pane id, *ioParam = current item new_item_num = *((SInt32 *)ioParam); set_bi_nd_if_diff(new_item_num - 1); break; case msg_bi_nd_probs_first_but: set_bi_nd_if_diff(0); break; case msg_bi_nd_probs_next_but: if(its_bi_nd_id + 1< num_of_items){ set_bi_nd_if_diff(its_bi_nd_id + 1); }else{ ::SysBeep(0); } break; } } #pragma mark --bi-node state cap-- //****************************************** VOID C_BI_ND_PROBS_WIND::refresh_bi_nd_state_cap( const WHICH_TABLE & table) //in { USHORT nd1, nd2; its_net_p->get_bi_nd(its_bi_nd_id, nd1, nd2); STRINGY namey1 = ""; STRINGY namey2 = ""; STRINGY mid_stringy = ""; switch(table){ case main_ta: namey1 = its_net_p->get_nd_ptr(nd1)->get_st_name(its_t_cell[main_ta].row - 1); namey2 = its_net_p->get_nd_ptr(nd2)->get_st_name(its_t_cell[main_ta].col - 1); mid_stringy = " \\ "; break; case left_ta: namey1 = its_net_p->get_nd_ptr(nd1)->get_st_name(its_t_cell[left_ta].row - 1); break; case top_ta: namey2 = its_net_p->get_nd_ptr(nd2)->get_st_name(its_t_cell[top_ta].col - 1); break; } LStr255 name1; LStr255 name2; LStr255 mid; namey1.fill_LStr255(name1); namey2.fill_LStr255(name2); mid_stringy.fill_LStr255(mid); LStr255 name = name1 + mid + name2; its_bi_nd_state_cap_p->SetDescriptor(name); } //****************************************** VOID C_BI_ND_PROBS_WIND::SpendTime( const EventRecord & inMacEvent ) //in { #pragma unused(inMacEvent) STableCell t_cell[3]; Str255 pstr; if(its_table_p->get_touched_cell(t_cell[main_ta])){ its_t_cell[left_ta].SetCell(0, 0); its_t_cell[top_ta].SetCell(0, 0); if(its_t_cell[main_ta] != t_cell[main_ta]){ its_t_cell[main_ta] = t_cell[main_ta]; refresh_bi_nd_state_cap(main_ta); } }else if(its_left_margin_p->get_touched_cell(t_cell[left_ta])){ its_t_cell[main_ta].SetCell(0, 0); its_t_cell[top_ta].SetCell(0, 0); if(its_t_cell[left_ta] != t_cell[left_ta]){ its_t_cell[left_ta] = t_cell[left_ta]; refresh_bi_nd_state_cap(left_ta); } }else if(its_top_margin_p->get_touched_cell(t_cell[top_ta])){ its_t_cell[main_ta].SetCell(0, 0); its_t_cell[left_ta].SetCell(0, 0); if(its_t_cell[top_ta] != t_cell[top_ta]){ its_t_cell[top_ta] = t_cell[top_ta]; refresh_bi_nd_state_cap(top_ta); } }else{ its_t_cell[top_ta].SetCell(0, 0); its_t_cell[left_ta].SetCell(0, 0); its_t_cell[main_ta].SetCell(0, 0); its_bi_nd_state_cap_p->GetDescriptor(pstr); if(pstr[0]!=0)its_bi_nd_state_cap_p->SetDescriptor("\p"); } } //****************************************** /*VOID C_BI_ND_PROBS_WIND::DrawSelf() {//drawer LWindow::DrawSelf(); Rect frame; its_left_margin_p->CalcPortFrameRect(frame); ::InsetRect(&frame, 1, 1); ::FrameRect(&frame); its_top_margin_p->CalcPortFrameRect(frame); ::InsetRect(&frame, 1, 1); ::FrameRect(&frame); } */ \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Mac_BiNdProbs/C_BI_ND_PROBS_WIND.h b/Legacy/QFog2-MachO/QFogSource/Mac_BiNdProbs/C_BI_ND_PROBS_WIND.h new file mode 100644 index 0000000..112059f --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Mac_BiNdProbs/C_BI_ND_PROBS_WIND.h @@ -0,0 +1 @@ +#pragma once #include "QFog_constants.h" #include "C_TOP_PTRS.h" class C_BI_ND_PROBS_TABLE; class C_BI_ND_PROBS_MARGIN; //****************************************** class C_BI_ND_PROBS_WIND : public LWindow, public LListener, public LPeriodical, public C_TOP_PTRS { private: USHORT its_bi_nd_id; // this is the location selected in the list. It's zero based LCaption * its_owner_cap_p; LCaption * its_info_cap_p; LPopupButton * its_popup_p; LStdButton * its_first_but_p; LStdButton * its_next_but_p; LCaption * its_bi_nd_state_cap_p; C_BI_ND_PROBS_TABLE * its_table_p; C_BI_ND_PROBS_MARGIN * its_left_margin_p; C_BI_ND_PROBS_MARGIN * its_top_margin_p; STableCell its_t_cell[3]; //t= touched enum WHICH_TABLE{left_ta, top_ta, main_ta}; public: C_BI_ND_PROBS_WIND(LStream * inStream); C_BI_ND_PROBS_WIND(); virtual ~C_BI_ND_PROBS_WIND(); VOID init_popup(); VOID show_owner( const LStr255 & file_name); VOID special_finish_create(const LStr255 & file_name, USHORT sel_loc); VOID refresh_info_cap(); VOID set_bi_nd_always(USHORT new_loc); VOID set_bi_nd_if_diff(USHORT new_loc); VOID ListenToMessage(MessageT inMessage, VOID * ioParam ); VOID refresh_bi_nd_state_cap(const WHICH_TABLE & table); VOID SpendTime(const EventRecord & inMacEvent ); }; #pragma mark - //****************************************** inline VOID C_BI_ND_PROBS_WIND::set_bi_nd_if_diff( USHORT new_id) //in { if(its_bi_nd_id !=new_id)set_bi_nd_always(new_id); } \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Mac_BiNdProbs/C_MARGINED_SCROLLER.cpp b/Legacy/QFog2-MachO/QFogSource/Mac_BiNdProbs/C_MARGINED_SCROLLER.cpp new file mode 100644 index 0000000..80f88a9 --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Mac_BiNdProbs/C_MARGINED_SCROLLER.cpp @@ -0,0 +1 @@ +#include "C_MARGINED_SCROLLER.h" #pragma mark --creation/destruction-- //****************************************** C_MARGINED_SCROLLER::C_MARGINED_SCROLLER( LStream * inStream) //in :LScroller(inStream) {} //****************************************** C_MARGINED_SCROLLER::C_MARGINED_SCROLLER() {} //****************************************** C_MARGINED_SCROLLER::~C_MARGINED_SCROLLER() {} #pragma mark --scrolling-- //****************************************** VOID C_MARGINED_SCROLLER::VertScroll( SInt16 inPart) //in {//NONTRIVIAL EXCERPT FROM PP // same as PP method except for lines marked "diff" long startTicks = ::TickCount();//diff SPoint32 scrollUnit; SDimension16 scrollFrameSize; SInt16 vertUnits = 0; mScrollingView->GetScrollUnit(scrollUnit); mScrollingView->GetFrameSize(scrollFrameSize); switch (inPart) { // Determine how much to scroll case kControlUpButtonPart: // Scroll up one unit vertUnits = -1; break; case kControlDownButtonPart: // Scroll down one unit vertUnits = 1; break; case kControlPageUpPart: // Scroll up by Frame height // less one unit of overlap vertUnits = 1 - (scrollFrameSize.height / scrollUnit.v); if (vertUnits >= 0) { vertUnits = -1; } break; case kControlPageDownPart: // Scroll down by Frame height // less one unit of overlap vertUnits = (scrollFrameSize.height / scrollUnit.v) - 1; if (vertUnits <= 0) { vertUnits = 1; } break; } if (vertUnits != 0) { mVerticalBar->IncrementValue(vertUnits); mScrollingView->ScrollPinnedImageBy(0, vertUnits * scrollUnit.v, true); // Scrolling changes the focus. The // Mac Control Manager will be very // unhappy if we don't restore focus // to the ScrollBar its_left_margin_p->ScrollPinnedImageBy(0, vertUnits * scrollUnit.v, true);//diff mVerticalBar->FocusDraw(); } // this puts an upper speed limit on scroll rate.//diff while (startTicks + 10>=::TickCount()){}//diff } //****************************************** VOID C_MARGINED_SCROLLER::HorizScroll( SInt16 inPart) //in {//NONTRIVIAL EXCERPT FROM PP // same as PP method except for lines marked "diff" long startTicks = ::TickCount();//diff SPoint32 scrollUnit; SDimension16 scrollFrameSize; SInt16 horizUnits = 0; mScrollingView->GetScrollUnit(scrollUnit); mScrollingView->GetFrameSize(scrollFrameSize); switch (inPart) { // Determine how much to scroll case kControlUpButtonPart: // Scroll left one unit horizUnits = -1; break; case kControlDownButtonPart: // Scroll right one unit horizUnits = 1; break; case kControlPageUpPart: // Scroll left by Frame width // less one unit of overlap horizUnits = 1 - (scrollFrameSize.width / scrollUnit.h); if (horizUnits >= 0) { horizUnits = -1; } break; case kControlPageDownPart: // Scroll right by Frame width // less one unit of overlap horizUnits = (scrollFrameSize.width / scrollUnit.h) - 1; if (horizUnits <= 0) { horizUnits = 1; } break; } if (horizUnits != 0) { mHorizontalBar->IncrementValue(horizUnits); mScrollingView->ScrollPinnedImageBy(horizUnits * scrollUnit.h, 0, true); // Scrolling changes the focus, the // Mac Control Manager will be very // unhappy if we don't restore focus // to the ScrollBar its_top_margin_p->ScrollPinnedImageBy(horizUnits * scrollUnit.h, 0, true);//diff mHorizontalBar->FocusDraw(); } // this puts an upper speed limit on scroll rate.//diff while (startTicks + 10>=::TickCount()){}//diff } //****************************************** VOID C_MARGINED_SCROLLER::ListenToMessage( MessageT inMessage, //in VOID * ioParam) //i-o { //MONITOR_THE_CHANGE_HERE //NONTRIVIAL EXCERPT FROM PP // same as PP method except for lines marked "diff" if (inMessage == msg_ThumbDragged) { LStdControl * theSBar = static_cast(ioParam); SInt32 scrollValue = theSBar->GetValue(); SPoint32 scrollUnit; mScrollingView->GetScrollUnit(scrollUnit); SPoint32 scrollPosition; mScrollingView->GetScrollPosition(scrollPosition); if (theSBar == mVerticalBar) { scrollPosition.v = scrollValue * scrollUnit.v; its_left_margin_p->ScrollPinnedImageTo(0, scrollPosition.v, true);//diff } else if (theSBar == mHorizontalBar) { scrollPosition.h = scrollValue * scrollUnit.h; its_top_margin_p->ScrollPinnedImageTo(scrollPosition.h, 0, true);//diff } mScrollingView->ScrollPinnedImageTo(scrollPosition.h, scrollPosition.v, true); AdjustScrollBars(); } } \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Mac_BiNdProbs/C_MARGINED_SCROLLER.h b/Legacy/QFog2-MachO/QFogSource/Mac_BiNdProbs/C_MARGINED_SCROLLER.h new file mode 100644 index 0000000..7166dd8 --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Mac_BiNdProbs/C_MARGINED_SCROLLER.h @@ -0,0 +1 @@ +#pragma once //****************************************** class C_MARGINED_SCROLLER : public LScroller { protected: LView * its_left_margin_p; LView * its_top_margin_p; public: C_MARGINED_SCROLLER(LStream * inStream); C_MARGINED_SCROLLER(); virtual ~C_MARGINED_SCROLLER(); VOID set_top_margin_ptr( LView * margin_p); VOID set_left_margin_ptr( LView * margin_p); VOID VertScroll(SInt16 inPart); VOID HorizScroll(SInt16 inPart); VOID ListenToMessage( MessageT inMessage, VOID * ioParam); }; #pragma mark - //****************************************** inline VOID C_MARGINED_SCROLLER::set_top_margin_ptr( LView * margin_p) //in { its_top_margin_p = margin_p; } //****************************************** inline VOID C_MARGINED_SCROLLER::set_left_margin_ptr( LView * margin_p) //in { its_left_margin_p = margin_p; } \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Mac_BiNds/.DS_Store b/Legacy/QFog2-MachO/QFogSource/Mac_BiNds/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..dc147afb84ab966f22e360821a605b1c90c2ca4b GIT binary patch literal 6148 zcmeHKJxjzu5PfrAaUe*_E7w0D_zyyi#eryHq1c?{EGzHP$=I`3@|QjS zIQD`6HTDC!O^<8IM->W$0--=C@b47hnXR@sc8od{2n9lcPX%;;NGytF#?H~U4p#OA zAnG;RjBR~OC?{nsGj@)gp@~z8PL=$`5T|oIWxq0G=je2ZMdms=^2g&vEIP-NxkF0F zs6&BJV5q>6cMCoLFZs(%KJtf@=!F8Iz#mgU=Jjn|@uTwDI{G|4YZJ>Oi<get_num_of_bi_nds(); USHORT nd1, nd2; for(USHORT loc =0; loc get_bi_nd(loc, nd1, nd2); fill_first(its_net_p->get_nd_ptr(nd1)->get_name()); fill_second(its_net_p->get_nd_ptr(nd2)->get_name()); } } //****************************************** VOID C_BI_ND_LBOX::delete_row_and_tell_net_about_it( USHORT xed_row) //in { if(its_num_of_rows==0)return; ::LDelRow(1, xed_row, mMacListH); if(xed_row != its_num_of_rows-1){ its_net_p->del_bi_nd(xed_row); }else{ //xed_row == its_num_of_rows-1 if(its_occupancy_of_last_row==1){ its_occupancy_of_last_row=2; }else{//its_occupancy_of_last_row==2 its_net_p->del_bi_nd(xed_row); } } its_num_of_rows--; } //****************************************** VOID C_BI_ND_LBOX::delete_all_rows() { if(its_num_of_rows==0)return; ::LDelRow(0, 1, mMacListH);//deletes all rows its_occupancy_of_last_row = 2; its_num_of_rows = 0; } #pragma mark --command center-- //****************************************** VOID C_BI_ND_LBOX::Click( SMouseDownEvent & inMouseDown) //in { //MONITOR_THE_CHANGE_HERE its_doc_p->SetModified(true); LListBox::Click(inMouseDown); } //****************************************** BOOLEAN C_BI_ND_LBOX::HandleKeyPress( const EventRecord & in_key_event) //in { //MONITOR_THE_CHANGE_HERE //doc: see below if( ((in_key_event.message &keyCodeMask)>>8) == 0x33){//delete key was pressed //This is like a combination of ObeyCommand() and FindCommandStatus() if(GetValue()!=-1){ //doc: marked modified in C_BI_ND_LBOX::ObeyCommand() return ProcessCommand(cmd_Clear); }else{ return true; } }else{ return LListBox::HandleKeyPress(in_key_event); } } //****************************************** BOOLEAN C_BI_ND_LBOX::ObeyCommand( CommandT inCommand, //in VOID * ioParam) //i-o { //MONITOR_THE_CHANGE_HERE //doc: see below BOOLEAN obeyed = true; BOOLEAN needs_refresh = true; switch (inCommand) { case cmd_Clear: its_doc_p->SetModified(true); SInt16 row_num = GetValue(); if(row_num!=-1)delete_row_and_tell_net_about_it(row_num); break; default: obeyed = LListBox::ObeyCommand(inCommand, ioParam); needs_refresh = false; break; } if (needs_refresh) Refresh(); return obeyed; } //****************************************** VOID C_BI_ND_LBOX::FindCommandStatus( CommandT inCommand, //in BOOLEAN & outEnabled, //out BOOLEAN & outUsesMark, //out UInt16 & outMark, //out Str255 outName_pstr) //out { outEnabled = false; outUsesMark = false; outMark = noMark; switch (inCommand) { case cmd_Clear: if(GetValue()!=-1)outEnabled = true; break; default: LListBox::FindCommandStatus(inCommand, outEnabled, outUsesMark, outMark, outName_pstr); break; } } \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Mac_BiNds/C_BI_ND_LBOX.h b/Legacy/QFog2-MachO/QFogSource/Mac_BiNds/C_BI_ND_LBOX.h new file mode 100644 index 0000000..e9a3590 --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Mac_BiNds/C_BI_ND_LBOX.h @@ -0,0 +1 @@ +#pragma once #include "QFog_constants.h" #include "STRINGY.h" #include "C_TOP_PTRS.h" //****************************************** class C_BI_ND_LBOX : public LListBox, public C_TOP_PTRS { protected: USHORT its_occupancy_of_last_row;//either 1 or 2 USHORT its_num_of_rows; public: C_BI_ND_LBOX(LStream * inStream); virtual ~C_BI_ND_LBOX(); USHORT get_occupancy_of_last_row() const; VOID refresh_a_row(USHORT row, Str255 new_name_pstr); VOID fill_first( const STRINGY & namey); VOID fill_second( const STRINGY & namey); VOID refill(); VOID delete_row_and_tell_net_about_it(USHORT xed_row); VOID delete_all_rows(); VOID Click(SMouseDownEvent & inMouseDown); BOOLEAN HandleKeyPress(const EventRecord & in_key_event); BOOLEAN ObeyCommand(CommandT inCommand, VOID * ioParam); VOID FindCommandStatus( CommandT inCommand, BOOLEAN & outEnabled, BOOLEAN & outUsesMark, UInt16 & outMark, Str255 outName_pstr); }; #pragma mark - //****************************************** inline USHORT C_BI_ND_LBOX::get_occupancy_of_last_row() const { return its_occupancy_of_last_row; } \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Mac_BiNds/C_BI_ND_WIND.cpp b/Legacy/QFog2-MachO/QFogSource/Mac_BiNds/C_BI_ND_WIND.cpp new file mode 100644 index 0000000..a4e19f4 --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Mac_BiNds/C_BI_ND_WIND.cpp @@ -0,0 +1 @@ +#include "C_BI_ND_WIND.h" #include "C_MAIN_VIEW.h" #include "QB_NET.h" #pragma mark --creation/destruction-- //****************************************** C_BI_ND_WIND::C_BI_ND_WIND( LStream * inStream) //in :LWindow(inStream), its_selector_state(0), its_last_touched_nd(max_ushort), its_owner_cap_p(0), its_check_box_p(0), its_list_box_p(0) {} //****************************************** C_BI_ND_WIND::~C_BI_ND_WIND() { its_mview_p->finish_bi_nd_wind_closing(); } //****************************************** VOID C_BI_ND_WIND::show_owner( const LStr255 & file_name) //in { LStr255 cap = "\pProject: "; cap += (LStr255)file_name; its_owner_cap_p->SetDescriptor(cap); } //****************************************** VOID C_BI_ND_WIND::special_finish_create( const LStr255 & file_name) //in { its_owner_cap_p =(LCaption *)FindPaneByID(bi_nd_owner_cap_rid); show_owner(file_name); its_check_box_p =(LStdCheckBox *)FindPaneByID(bi_nd_check_box_rid); its_check_box_p->AddListener(this); its_list_box_p =(C_BI_ND_LBOX *)FindPaneByID(bi_nd_list_box_rid); //its SuperCommander defined in C_MAIN_VIEW::create_bi_nd_wind() ((C_MAIN_VIEW *)GetSuperCommander())->get_top_ptrs(its_doc_p, its_mview_p, its_net_p); its_list_box_p->set_top_ptrs(its_doc_p, its_mview_p, its_net_p); USHORT num_of_bi_nds = its_net_p->get_num_of_bi_nds(); USHORT nd1, nd2; for(USHORT loc =0; loc get_bi_nd(loc, nd1, nd2); its_list_box_p->fill_first(its_net_p->get_nd_ptr(nd1)->get_name()); its_list_box_p->fill_second(its_net_p->get_nd_ptr(nd2)->get_name()); } Show();//necessary! } #pragma mark --selector state-- //****************************************** VOID C_BI_ND_WIND::ListenToMessage( MessageT inMessage, //in VOID * ioParam ) //i-o { //MONITOR_THE_CHANGE_HERE //doc: no change switch ( inMessage ) { case msg_bi_nd_check_box: its_selector_state = *((SInt32 *)ioParam);// either 0 or 1 break; } } #pragma mark --list box-- //****************************************** VOID C_BI_ND_WIND::respond_to_bi_nd_selector( USHORT touched_nd) //in { if(its_list_box_p->get_occupancy_of_last_row() == 2){ its_list_box_p->fill_first(its_net_p->get_nd_ptr(touched_nd)->get_name()); its_last_touched_nd = touched_nd; }else{//occupancy==1 if(its_net_p->add_bi_nd(its_last_touched_nd, touched_nd)){ //add_bi_nd checks whether //(1)this bi-node has been added before, and //(2)the bi_node is degenerate (i.e., nd1==nd2). //It returns true if (1) and (2) are both false. its_list_box_p->fill_second(its_net_p->get_nd_ptr(touched_nd)->get_name()); its_last_touched_nd = touched_nd; }// if we found the bi-node repeated or degenerate //then DON'T want to reset its_last_touched_nd to touched_nd; } } //****************************************** VOID C_BI_ND_WIND::rename_a_nd( USHORT nd, //in Str255 new_name_pstr) //in { USHORT num_of_bi_nds = its_net_p->get_num_of_bi_nds(); USHORT nd1, nd2; LStr255 name; for(USHORT loc =0; loc get_bi_nd(loc, nd1, nd2); if(nd==nd1){ its_net_p->get_nd_ptr(nd2)->get_name().fill_LStr255(name); name = (LStr255)new_name_pstr +(LStr255)"\p \\ " + name; its_list_box_p->refresh_a_row(loc, name); } if(nd==nd2){ its_net_p->get_nd_ptr(nd1)->get_name().fill_LStr255(name); name = name +(LStr255)"\p \\ " + (LStr255)new_name_pstr; its_list_box_p->refresh_a_row(loc, name); } } } \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Mac_BiNds/C_BI_ND_WIND.h b/Legacy/QFog2-MachO/QFogSource/Mac_BiNds/C_BI_ND_WIND.h new file mode 100644 index 0000000..aed27f2 --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Mac_BiNds/C_BI_ND_WIND.h @@ -0,0 +1 @@ +#pragma once #include "QFog_constants.h" #include "C_BI_ND_LBOX.h" #include "C_TOP_PTRS.h" //****************************************** class C_BI_ND_WIND : public LWindow, public LListener, public C_TOP_PTRS { private: USHORT its_selector_state; // either 0 or 1 USHORT its_last_touched_nd; LCaption * its_owner_cap_p; LStdCheckBox * its_check_box_p; C_BI_ND_LBOX * its_list_box_p; public: BOOLEAN is_selector_ON(); VOID ListenToMessage(MessageT inMessage, VOID * ioParam ); C_BI_ND_WIND(LStream * inStream); virtual ~C_BI_ND_WIND(); VOID show_owner( const LStr255 & file_name); VOID special_finish_create(const LStr255 & file_name); VOID respond_to_bi_nd_selector(USHORT touched_nd); VOID refill_list_box(); VOID rename_a_nd(USHORT nd, Str255 new_name_pstr); }; #pragma mark - //****************************************** inline BOOLEAN C_BI_ND_WIND::is_selector_ON() { return its_selector_state; } //****************************************** inline VOID C_BI_ND_WIND::refill_list_box() { its_list_box_p->refill(); } \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Mac_MainView/.DS_Store b/Legacy/QFog2-MachO/QFogSource/Mac_MainView/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..5008ddfcf53c02e82d7eee2e57c38e5672ef89f6 GIT binary patch literal 6148 zcmeH~Jr2S!425mzP>H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0FocusDraw() C_ARROW_DRAWER cupid(its_mview_p, arrowhead_len, arrowhead_halfwidth); StCPTstate saved_st(true, true, false); saved_st.Normalize(); ::RGBForeColor(&C_COLORS::its_white); cupid.sketch(its_init_pt, its_fin_pt); } #pragma mark --draw sel handles-- //****************************************** VOID C_ARROW::draw_sel_handles_wkr() { //drawer //This is a private function used only by //C_ARROW::draw_sel_handles() and C_ARROW::undraw_sel_handles() //These 2 functions call its_mview_p->FocusDraw(); //They also preserve the cpt state. DOUBLE x1 = DOUBLE(its_init_pt.h), y1 = DOUBLE(its_init_pt.v); DOUBLE x2 = DOUBLE(its_fin_pt.h), y2 = DOUBLE(its_fin_pt.v); DOUBLE x_av = (x1 + x2)/2; DOUBLE y_av = (y1 + y2)/2; DOUBLE arrow_len = sqrt( pow(x1-x2, 2) + pow(y1-y2, 2) ); if(arrow_len <= arrowhead_len)return; DOUBLE ss = (y2-y1)/arrow_len; DOUBLE cc = (x2-x1)/arrow_len; Point pix1 , pix2; DOUBLE perp_dist=6; // perp_dist= the perpendicular distance from either handle center to the arrow. ::SetPt( &pix1, nearest_int16(x_av - perp_dist*ss), nearest_int16(y_av + perp_dist*cc)); ::SetPt( &pix2, nearest_int16(x_av + perp_dist*ss), nearest_int16(y_av - perp_dist*cc)); Rect r1, r2; ::SetRect(&r1, pix1.h-2, pix1.v-2, pix1.h+2, pix1.v+2); ::SetRect(&r2, pix2.h-2, pix2.v-2, pix2.h+2, pix2.v+2); ::PaintRect(&r1); ::PaintRect(&r2); } //****************************************** VOID C_ARROW::draw_sel_handles() { //drawer if(!its_mview_p->FocusDraw())return; StCPTstate saved_st(true, true, false); saved_st.Normalize(); ::RGBForeColor(&C_COLORS::its_red); draw_sel_handles_wkr(); } //****************************************** VOID C_ARROW::undraw_sel_handles() { //drawer if(!its_mview_p->FocusDraw())return; StCPTstate saved_st(true, true, false); saved_st.Normalize(); ::RGBForeColor(&C_COLORS::its_white); draw_sel_handles_wkr(); } //****************************************** Boolean C_ARROW::select( C_MAIN_VIEW * mview_p) //in { if(its_is_selected) return false; its_is_selected = true; draw_sel_handles(); mview_p->num_of_sel_arrows_pp(); return true; } //****************************************** Boolean C_ARROW::unselect( C_MAIN_VIEW * mview_p) //in { if(!its_is_selected) return false; its_is_selected = false; undraw_sel_handles(); mview_p->num_of_sel_arrows_mm(); return true; } //****************************************** VOID C_ARROW::toggle_select( C_MAIN_VIEW * mview_p) //in { if(its_is_selected){ unselect(mview_p); }else{ select(mview_p); } } #pragma mark --draw arrow and handles-- //****************************************** VOID C_ARROW::move_by( const Point & delta) //in { undraw(); if(its_is_selected) undraw_sel_handles(); its_init_pt.h += delta.h; its_init_pt.v += delta.v; its_fin_pt.h += delta.h; its_fin_pt.v += delta.v; draw(); if(its_is_selected) draw_sel_handles(); } #pragma mark --no-drawing calls-- //****************************************** BOOLEAN C_ARROW::pt_is_in_sel_dom( const Point & pt) //in //pt=point, sel_dom = selection domain { if(::EqualPt(its_init_pt, its_fin_pt))return false; DOUBLE cyl_rad = 6; // the radius in pixels // of the cylinder sheathing the arrow, // such that we will admit that the arrow was // touched (selected or unselected) // if pt fell inside this cylinder. // cross , len_sq are used in //the single cross-product condition for the outern rim of the cylinder. DOUBLE pt_x = DOUBLE(pt.h); DOUBLE pt_y = DOUBLE(pt.v); DOUBLE its_init_pt_x = DOUBLE(its_init_pt.h); DOUBLE its_init_pt_y = DOUBLE(its_init_pt.v); DOUBLE its_fin_pt_x = DOUBLE(its_fin_pt.h); DOUBLE its_fin_pt_y = DOUBLE(its_fin_pt.v); DOUBLE cross= -(pt_x - its_init_pt_x)*(its_fin_pt_y - its_init_pt_y) +(its_fin_pt_x - its_init_pt_x)*(pt_y - its_init_pt_y); DOUBLE len_sq= (its_fin_pt_x - its_init_pt_x)*(its_fin_pt_x - its_init_pt_x) +(its_fin_pt_y - its_init_pt_y)*(its_fin_pt_y - its_init_pt_y); // dot1 and dot 2 are used in //the two dot-product conditions for the two endcaps of the cylinder. DOUBLE dot1= (pt_x - its_init_pt_x)*(its_fin_pt_x - its_init_pt_x) +(pt_y - its_init_pt_y)*(its_fin_pt_y - its_init_pt_y); DOUBLE dot2= (pt_x - its_fin_pt_x)*(its_init_pt_x - its_fin_pt_x) +(pt_y - its_fin_pt_y)*(its_init_pt_y - its_fin_pt_y); if( ( fabs( cross ) <= cyl_rad*sqrt( len_sq ) )&& (dot1>=0)&& (dot2>=0) ){ return true; }else{ return false; } } //****************************************** VOID C_ARROW::renumber_nds( const UI_MAP & map) //in { its_s_port_name.its_nd_id = map.its_newfo[its_s_port_name.its_nd_id]; its_d_port_name.its_nd_id = map.its_newfo[its_d_port_name.its_nd_id]; } //****************************************** BOOLEAN operator==( const C_ARROW & ar1, //in const C_ARROW & ar2) //in { return( (ar1.its_mview_p == ar2.its_mview_p) && (ar1.its_s_port_name == ar2.its_s_port_name) && (ar1.its_d_port_name == ar2.its_d_port_name) && ::EqualPt(ar1.its_init_pt, ar2.its_init_pt) && ::EqualPt(ar1.its_fin_pt, ar2.its_fin_pt) && (ar1.its_is_selected==ar2.its_is_selected) ); } \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Mac_MainView/C_ARROW.h b/Legacy/QFog2-MachO/QFogSource/Mac_MainView/C_ARROW.h new file mode 100644 index 0000000..2da2fe0 --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Mac_MainView/C_ARROW.h @@ -0,0 +1 @@ +#pragma once #include "QFog_constants.h" #include "C_PORT_RELATED.h" #include "C_ARROW_DRAWER.h" #include "C_COLORS.h" #include "GLOBAL_FUN.h" #include "UI_MAP.h" class C_MAIN_VIEW; //****************************************** class C_ARROW { private: LView * its_mview_p; C_PORT_NAME its_s_port_name; C_PORT_NAME its_d_port_name; Point its_init_pt, its_fin_pt; BOOLEAN its_is_selected; enum {arrowhead_len=16, arrowhead_halfwidth=25}; public: C_ARROW(); C_ARROW(LView * view_p, const C_PORT_NAME & s_port_name, const C_PORT_NAME & d_port_name, const Point & init_pt, const Point & fin_pt); virtual ~C_ARROW(); C_PORT_NAME get_s_port_name() const; C_PORT_NAME get_d_port_name() const; const Point & get_init_pt() const; VOID set_init_pt(const Point & init_pt); const Point & get_fin_pt() const; VOID set_fin_pt(const Point & fin_pt); VOID change_source_nd(const C_PORT_NAME & s_port_name, const Point & init_pt, const Point & fin_pt); VOID draw(); VOID undraw(); VOID draw_sel_handles_wkr(); VOID draw_sel_handles(); VOID undraw_sel_handles(); Boolean select(C_MAIN_VIEW * mview_p); Boolean unselect(C_MAIN_VIEW * mview_p); VOID toggle_select(C_MAIN_VIEW * mview_p); VOID move_by(const Point & delta); BOOLEAN is_selected() const; BOOLEAN pt_is_in_sel_dom(const Point & pt); VOID renumber_nds(const UI_MAP & map); friend BOOLEAN operator==(const C_ARROW & ar1, const C_ARROW & ar2); friend BOOLEAN operator!=(const C_ARROW & ar1, const C_ARROW & ar2); }; #pragma mark - //****************************************** inline C_PORT_NAME C_ARROW::get_s_port_name() const { return its_s_port_name; } //****************************************** inline C_PORT_NAME C_ARROW::get_d_port_name() const { return its_d_port_name; } //****************************************** inline const Point & C_ARROW::get_init_pt() const { return its_init_pt; } //****************************************** inline VOID C_ARROW::set_init_pt( const Point & init_pt) //in { its_init_pt = init_pt; } //****************************************** inline const Point & C_ARROW::get_fin_pt() const { return its_fin_pt; } //****************************************** inline VOID C_ARROW::set_fin_pt( const Point & fin_pt) //in { its_fin_pt = fin_pt; } //****************************************** inline BOOLEAN C_ARROW::is_selected() const { return its_is_selected; } //****************************************** inline BOOLEAN operator!=( const C_ARROW & ar1, //in const C_ARROW & ar2) //in { return !(ar1==ar2); } \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Mac_MainView/C_ARROW_DRAWER.cpp b/Legacy/QFog2-MachO/QFogSource/Mac_MainView/C_ARROW_DRAWER.cpp new file mode 100644 index 0000000..85f55de --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Mac_MainView/C_ARROW_DRAWER.cpp @@ -0,0 +1 @@ +#include "C_ARROW_DRAWER.h" //****************************************** C_ARROW_DRAWER::C_ARROW_DRAWER( LView * view_p, //in SInt16 len, //in SInt16 width) //in :its_mview_p(view_p), its_arrowhead_len(len), its_arrowhead_halfwidth(width) {} //****************************************** /* VOID C_ARROW_DRAWER::draw( const Point & init_pt, //in const Point & fin_pt) //in { //drawer if(!its_mview_p->FocusDraw())return; // This function is based on article in MacTech (Aug 1985) Rect arrowhead_rect; //the Rect that the arrowhead wedge is drawn in Rect init_rect; //initial Rect used in PtToAngle to determine the arrow's direction SInt16 arrow_direction; // arrow_direction, in degrees, measured clockwise from upward axis if(::EqualPt(init_pt, fin_pt) ) return; ::MoveTo(init_pt.h, init_pt.v); ::SetRect(&init_rect, //output init_pt.h-30, init_pt.v-30, init_pt.h+30, init_pt.v+30);//input ::PtToAngle(&init_rect, fin_pt, &arrow_direction); // SInt16 ss = nearest_int16(its_arrowhead_len*sin(my_pi/180*(arrow_direction-180))); // SInt16 cc = nearest_int16(its_arrowhead_len*cos(my_pi/180*(arrow_direction-180))); // ::LineTo(fin_pt.h + ss, fin_pt.v - cc); ::LineTo(fin_pt.h , fin_pt.v ); //in next call, the one pixel horizontal displacement fixes glitch in downward-arrows ::SetRect(&arrowhead_rect,//output fin_pt.h - its_arrowhead_len +1, fin_pt.v - its_arrowhead_len,//input fin_pt.h + its_arrowhead_len +1, fin_pt.v + its_arrowhead_len);//input ::PaintArc(&arrowhead_rect, arrow_direction - 180 - its_arrowhead_halfwidth, 2*its_arrowhead_halfwidth); } */ //****************************************** VOID C_ARROW_DRAWER::sketch( const Point & init_pt, //in const Point & fin_pt) //in { //drawer //Sketch vs. draw //We use the word sketch (draw) if the cpt state is imposed externally (internally) //init = initial, fin = final if(!its_mview_p->FocusDraw())return; if(::EqualPt(init_pt, fin_pt) ) return; DOUBLE arrow_len = sqrt( pow(DOUBLE(init_pt.h - fin_pt.h), 2) + pow(DOUBLE(init_pt.v - fin_pt.v), 2) ); DOUBLE scale_factor = its_arrowhead_len/arrow_len; DOUBLE rho_zero_h = (init_pt.h - fin_pt.h)*scale_factor; DOUBLE rho_zero_v = (init_pt.v - fin_pt.v)*scale_factor; DOUBLE tt = tan(its_arrowhead_halfwidth * my_pi/180.); DOUBLE rho_plus_h = rho_zero_h -tt*rho_zero_v; DOUBLE rho_plus_v = tt*rho_zero_h +rho_zero_v; DOUBLE rho_minus_h = rho_zero_h +tt*rho_zero_v; DOUBLE rho_minus_v = -tt*rho_zero_h +rho_zero_v; Point r_zero, r_plus, r_minus; r_plus.h = nearest_int16(rho_plus_h + fin_pt.h); r_plus.v = nearest_int16(rho_plus_v + fin_pt.v); r_minus.h = nearest_int16(rho_minus_h + fin_pt.h); r_minus.v = nearest_int16(rho_minus_v + fin_pt.v); // r_zero.h = nearest_int16(rho_zero_h + fin_pt.h); // r_zero.v = nearest_int16(rho_zero_v + fin_pt.v); r_zero.h = nearest_int16((rho_plus_h + rho_minus_h)*0.5 + fin_pt.h); r_zero.v = nearest_int16((rho_plus_v + rho_minus_v)*0.5 + fin_pt.v); RgnHandle rgn_h = ::NewRgn(); //destroy_h: in this method ThrowIfNil_(rgn_h); ::OpenRgn(); ::MoveTo(fin_pt.h, fin_pt.v); ::LineTo(r_plus.h, r_plus.v); ::LineTo(r_minus.h, r_minus.v); ::LineTo(fin_pt.h, fin_pt.v); ::CloseRgn(rgn_h); ::PaintRgn(rgn_h); ::DisposeRgn(rgn_h); /* PolyHandle poly_h; poly_h = ::OpenPoly(); //destroy_h: in this method ThrowIfNil_(poly_h); ::MoveTo(fin_pt.h, fin_pt.v); ::LineTo(r_plus.h, r_plus.v); ::LineTo(r_minus.h, r_minus.v); ::LineTo(fin_pt.h, fin_pt.v); ::ClosePoly(); ::PaintPoly(poly_h); ::KillPoly(poly_h); */ //Draw shaft. //Drawing a pixel an even number of times screws up patXor. //Don't draw twice pixels where the arrowhead overlaps with the shaft. /* ::MoveTo(init_pt.h, init_pt.v); ::LineTo(r_zero.h, r_zero.v); */ ::MoveTo(r_zero.h, r_zero.v); ::LineTo(init_pt.h, init_pt.v); } \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Mac_MainView/C_ARROW_DRAWER.h b/Legacy/QFog2-MachO/QFogSource/Mac_MainView/C_ARROW_DRAWER.h new file mode 100644 index 0000000..1292e87 --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Mac_MainView/C_ARROW_DRAWER.h @@ -0,0 +1 @@ +#pragma once #include "QFog_constants.h" #include "GLOBAL_FUN.h" //****************************************** class C_ARROW_DRAWER { private: SInt16 its_arrowhead_len; //in pixels SInt16 its_arrowhead_halfwidth; // in degrees LView * its_mview_p; public: C_ARROW_DRAWER(LView * view_p, SInt16 len, SInt16 width); VOID sketch(const Point & init_pt, const Point & fin_pt); }; \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Mac_MainView/C_EFIELD_PASTE_ATMENT.cpp b/Legacy/QFog2-MachO/QFogSource/Mac_MainView/C_EFIELD_PASTE_ATMENT.cpp new file mode 100644 index 0000000..408b96f --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Mac_MainView/C_EFIELD_PASTE_ATMENT.cpp @@ -0,0 +1 @@ +#include "C_EFIELD_PASTE_ATMENT.h" #include "EXCEPTIONS.h" //****************************************** C_EFIELD_PASTE_ATMENT::C_EFIELD_PASTE_ATMENT() { } //****************************************** VOID C_EFIELD_PASTE_ATMENT::ExecuteSelf( MessageT inMessage, //in void * ioParam) //i-o { #pragma unused(ioParam) mExecuteHost = true; if(inMessage == cmd_Paste){ if(!clipping_is_valid()){ my_gen_alert("Can't paste current Clipboard contents into this field. They are an illegal entry for the field."); mExecuteHost = false; } } } //****************************************** BOOLEAN C_EFIELD_PASTE_ATMENT::clipping_is_valid() { Handle content_h= ::NewHandle( 0L ); //destroy_h: in this method ThrowIfMemFail_(content_h); BOOLEAN is_valid; if(get_TEXT_scrap(content_h)){ //GLOBAL_FUN.h ::HLock(content_h);//no need to save handle state as will be destroying handle soon const CHAR * cstr = *content_h; is_valid = cstr_is_valid(cstr); }else{ is_valid = false; } DisposeHandle_(content_h); return is_valid; } \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Mac_MainView/C_EFIELD_PASTE_ATMENT.h b/Legacy/QFog2-MachO/QFogSource/Mac_MainView/C_EFIELD_PASTE_ATMENT.h new file mode 100644 index 0000000..dceb2f3 --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Mac_MainView/C_EFIELD_PASTE_ATMENT.h @@ -0,0 +1 @@ +#pragma once #include "STRINGY.h" //atment = attachment //****************************************** class C_EFIELD_PASTE_ATMENT : public LAttachment { public: C_EFIELD_PASTE_ATMENT(); protected: virtual void ExecuteSelf(MessageT inMessage, VOID * ioParam); virtual BOOLEAN clipping_is_valid(); virtual BOOLEAN cstr_is_valid(const CHAR * cstr); }; //****************************************** class C_ND_NAME_PASTE_ATMENT : public C_EFIELD_PASTE_ATMENT { public: protected: virtual BOOLEAN cstr_is_valid(const CHAR * cstr); }; #pragma mark - //****************************************** inline BOOLEAN C_EFIELD_PASTE_ATMENT::cstr_is_valid(const CHAR * cstr) { //should override this return false; } //****************************************** inline BOOLEAN C_ND_NAME_PASTE_ATMENT::cstr_is_valid(const CHAR * cstr) { return STRINGY(cstr).is_legal_name(); } \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Mac_MainView/C_MAIN_VIEW.cpp b/Legacy/QFog2-MachO/QFogSource/Mac_MainView/C_MAIN_VIEW.cpp new file mode 100644 index 0000000..a481463 --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Mac_MainView/C_MAIN_VIEW.cpp @@ -0,0 +1 @@ +#include "C_MAIN_VIEW.h" #include "C_APP.h" #include "C_KEYS.h" #include "C_DOC.h" #include "C_WIND_BDS_RECO.h" #include "C_MVIEW_ACTIONS.h" #include "C_EFIELD_PASTE_ATMENT.h" #include "StCPTstate.h" #include "SET.h" #include "EXCEPTIONS.h" #pragma mark --creation/destruction-- //****************************************** C_MAIN_VIEW::C_MAIN_VIEW( LStream * inStream) //in :LView(inStream), C_ACTION_FLAGS(mview_num_of_act_types), its_doc_p(0), its_net_p(0), its_num_of_sel_nds(0), its_num_of_sel_arrows(0), its_image_horiz_inches(10), its_image_vert_inches(8), its_has_grid_lines(true), its_pane_counter(0), its_pi_wind_p(0), its_bi_nd_wind_p(0), its_nd_probs_wind_p(0), its_bi_nd_probs_wind_p(0), its_stories_wind_p(0) { its_pasting_center.h=0; its_pasting_center.v=0; } //****************************************** C_MAIN_VIEW::~C_MAIN_VIEW() { //the following avoids a bug in PP CW11 //whereby the windows are destroyed in such an order that //we can end up with all windows closed //(but the app and doc still alive) and a //corrupted value for sTarget. //It occurred in particular if I //(1) opened stories and nd_probs window, //(2)clicked on the close box of the main window, //(Now the app and doc are still alive but sTarget is corrupted.) //(3)pressed on Quit or New, both of which use sTarget. ProcessCommand(cmd_close_all_non_main_winds); } //****************************************** VOID C_MAIN_VIEW::FinishCreateSelf() { //command chain: //main view <- main window <- doc <- app //main view SuperCommander is defined as main window automatically when main window is created //main window SuperCommander is defined in C_DOC::C_DOC() its_main_wind_p = (LWindow *)GetSuperCommander(); its_doc_p= (C_DOC *)(this->GetSuperCommander()->GetSuperCommander()); ResizeImageTo(pix_per_in*its_image_horiz_inches, pix_per_in*its_image_vert_inches, false); set_min_max_and_std_of_wind(true); // %%%%%%% font stuff from CSampleText (PP cookbook example): TextTraitsH text_traits_h = UTextTraits::LoadTextTraits(node_txt_rid);//not destroyed by PP //create_h: PP creates text_traits_h with a call to ::GetResource(). //throwif_h: PP calls SignalIfNil immediately after creation. //destroy_h: PP does NOT release text_traits_h resource. // I delete it below, in this method. ThrowIfNil_(text_traits_h); its_fsize = (**text_traits_h).size; its_fnum = (**text_traits_h).fontNumber; ReleaseResource_((Handle)text_traits_h); check_fsize_and_fnum(); its_fname_item_num = UFontMenu::GetFontItemNumber(its_fnum); LUndoer * undoer_p = new LUndoer; //delete: PP deletes undoer_p via // ~C_MAIN_VIEW()->LView()->~LPane() // ->~LAttachable()->LAttachable::RemoveAllAttachments(). ThrowIfNil_(undoer_p); AddAttachment(undoer_p); } #pragma mark --doc pointers-- //****************************************** VOID C_MAIN_VIEW::get_top_ptrs( C_DOC * & doc_p, //out C_MAIN_VIEW * & mview_p, //out QB_NET * & net_p) //out { doc_p = its_doc_p; mview_p = this; net_p = its_net_p; } #pragma mark --bounds records-- //****************************************** VOID C_MAIN_VIEW::set_pal_bds_reco() { //if pal is closed but it was open before, don't do anything to pal_bds_reco ((C_APP *)GetTopCommander())->get_pal_bds(its_pal_bds_reco); } //****************************************** VOID C_MAIN_VIEW::read_bounds_res_of_satellite_winds() { //don't do anything if file hasn't been created yet if(its_doc_p->GetFile()==0)return; its_pal_bds_reco.read_res(its_doc_p, pal_rid); its_pi_wind_bds_reco.read_res(its_doc_p, pi_wind_rid); its_bi_nd_wind_bds_reco.read_res(its_doc_p, bi_nd_wind_rid); its_nd_probs_wind_bds_reco.read_res(its_doc_p, nd_probs_wind_rid); its_bi_nd_probs_wind_bds_reco.read_res(its_doc_p, bi_nd_probs_wind_rid); its_stories_wind_bds_reco.read_res(its_doc_p, sto_wind_rid); } //****************************************** VOID C_MAIN_VIEW::write_bounds_res_of_satellite_winds() { //don't do anything if file hasn't been created yet if(its_doc_p->GetFile()==0)return; //make sure that bounds records reflect current bounds //set_reco does nothing is zero window pointer set_pal_bds_reco(); its_pi_wind_bds_reco.set_reco(its_pi_wind_p); its_bi_nd_wind_bds_reco.set_reco(its_bi_nd_wind_p); its_nd_probs_wind_bds_reco.set_reco(its_nd_probs_wind_p); its_bi_nd_probs_wind_bds_reco.set_reco(its_bi_nd_probs_wind_p); its_stories_wind_bds_reco.set_reco(its_stories_wind_p); its_pal_bds_reco.write_res(its_doc_p, pal_rid); its_pi_wind_bds_reco.write_res(its_doc_p, pi_wind_rid); its_bi_nd_wind_bds_reco.write_res(its_doc_p, bi_nd_wind_rid); its_nd_probs_wind_bds_reco.write_res(its_doc_p, nd_probs_wind_rid); its_bi_nd_probs_wind_bds_reco.write_res(its_doc_p, bi_nd_probs_wind_rid); its_stories_wind_bds_reco.write_res(its_doc_p, sto_wind_rid); } #pragma mark --create/update/destroy satellite windows-- //****************************************** BOOLEAN C_MAIN_VIEW::save_pi() { BOOLEAN obeyed; if(its_pi_wind_p!=0){ obeyed = its_pi_wind_p->save_pi(); }else{ obeyed = true; } return obeyed; } //****************************************** VOID C_MAIN_VIEW::create_pi_wind( USHORT sel_nd) //in //sel_nd = selected node { LStr255 file_name; its_main_wind_p->GetDescriptor(file_name); USHORT screen_size = 0; //12 in monitor: 384 X 512 //14 in monitor: 480 X 640 //menu bar ~ 40 //small pi wind height= 338+40 //large pi wind height= 430+40 BitMap screenBits; GetQDGlobalsScreenBits(&screenBits); if(screenBits.bounds.bottom > 475) screen_size = 1; its_pi_wind_p = (C_PI_WIND *)LWindow::CreateWindow(pi_wind_rid + screen_size, this);//SuperCommander declared its_pi_wind_bds_reco.change_wind(its_pi_wind_p); its_pi_wind_p->special_finish_create(file_name, sel_nd); //This is an LCommander inline that just changes the needs-update data member. //It does not itself do the menu updating. LCommander::SetUpdateCommandStatus( true ); } //****************************************** VOID C_MAIN_VIEW::finish_pi_wind_closing() { its_pi_wind_bds_reco.set_reco(its_pi_wind_p); its_pi_wind_p = 0; //This is an LCommander inline that just changes the needs-update data member. //It does not itself do the menu updating. LCommander::SetUpdateCommandStatus( true ); } //****************************************** VOID C_MAIN_VIEW::create_bi_nd_wind() { LStr255 file_name; its_main_wind_p->GetDescriptor(file_name); its_bi_nd_wind_p = (C_BI_ND_WIND *)LWindow::CreateWindow(bi_nd_wind_rid, this);//SuperCommander declared its_bi_nd_wind_bds_reco.change_wind(its_bi_nd_wind_p); its_bi_nd_wind_p->special_finish_create(file_name); //This is an LCommander inline that just changes the needs-update data member. //It does not itself do the menu updating. LCommander::SetUpdateCommandStatus( true ); } //****************************************** VOID C_MAIN_VIEW::finish_bi_nd_wind_closing() { its_bi_nd_wind_bds_reco.set_reco(its_bi_nd_wind_p); its_bi_nd_wind_p = 0; //This is an LCommander inline that just changes the needs-update data member. //It does not itself do the menu updating. LCommander::SetUpdateCommandStatus( true ); } //****************************************** VOID C_MAIN_VIEW::create_nd_probs_wind( USHORT sel_nd) //in //sel_nd = selected node { LStr255 file_name; its_main_wind_p->GetDescriptor(file_name); its_nd_probs_wind_p = (C_ND_PROBS_WIND *)LWindow::CreateWindow(nd_probs_wind_rid, this);//SuperCommander declared its_nd_probs_wind_bds_reco.change_wind(its_nd_probs_wind_p); its_nd_probs_wind_p->special_finish_create( file_name, sel_nd); //This is an LCommander inline that just changes the needs-update data member. //It does not itself do the menu updating. LCommander::SetUpdateCommandStatus( true ); } //****************************************** VOID C_MAIN_VIEW::finish_nd_probs_wind_closing() { its_nd_probs_wind_bds_reco.set_reco(its_nd_probs_wind_p); its_nd_probs_wind_p = 0; //This is an LCommander inline that just changes the needs-update data member. //It does not itself do the menu updating. LCommander::SetUpdateCommandStatus( true ); } //****************************************** VOID C_MAIN_VIEW::create_bi_nd_probs_wind( USHORT sel_loc) //in //sel_loc = selected location in bi_nds list. Zero based { LStr255 file_name; its_main_wind_p->GetDescriptor(file_name); its_bi_nd_probs_wind_p = (C_BI_ND_PROBS_WIND *)LWindow::CreateWindow(bi_nd_probs_wind_rid, this);//SuperCommander declared its_bi_nd_probs_wind_bds_reco.change_wind(its_bi_nd_probs_wind_p); its_bi_nd_probs_wind_p->special_finish_create( file_name, sel_loc); //This is an LCommander inline that just changes the needs-update data member. //It does not itself do the menu updating. LCommander::SetUpdateCommandStatus( true ); } //****************************************** VOID C_MAIN_VIEW::finish_bi_nd_probs_wind_closing() { its_bi_nd_probs_wind_bds_reco.set_reco(its_bi_nd_probs_wind_p); its_bi_nd_probs_wind_p = 0; //This is an LCommander inline that just changes the needs-update data member. //It does not itself do the menu updating. LCommander::SetUpdateCommandStatus( true ); } //****************************************** VOID C_MAIN_VIEW::create_stories_wind() { LStr255 file_name; its_main_wind_p->GetDescriptor(file_name); its_stories_wind_p = (C_STORIES_WIND *)LWindow::CreateWindow(sto_wind_rid, this);//SuperCommander declared its_stories_wind_bds_reco.change_wind(its_stories_wind_p); its_stories_wind_p->special_finish_create(file_name); //This is an LCommander inline that just changes the needs-update data member. //It does not itself do the menu updating. LCommander::SetUpdateCommandStatus( true ); } //****************************************** VOID C_MAIN_VIEW::finish_stories_wind_closing() { its_stories_wind_bds_reco.set_reco(its_stories_wind_p); its_stories_wind_p = 0; //This is an LCommander inline that just changes the needs-update data member. //It does not itself do the menu updating. LCommander::SetUpdateCommandStatus( true ); } #pragma mark --font-- //****************************************** VOID C_MAIN_VIEW::check_fsize_and_fnum() { //from CSampleText (PP cookbook example): //See also CTextOptionsDialog and CDynamicCaption if (its_fsize == 0) its_fsize = ::GetDefFontSize(); //systemFont=0 (by definition), //applFont=1 (by definition), //System may have been altered so that //0 and 1 are no longer font numbers. //Font number zero can mean //system font or missing font!! if (its_fnum == systemFont){ its_fnum = ::GetSysFont(); }else if (its_fnum == applFont){ its_fnum = ::GetAppFont(); } if(!::RealFont(its_fnum, its_fsize)){ its_fnum = ::GetSysFont(); its_fsize = ::GetDefFontSize(); } } #pragma mark --size of image and window-- //****************************************** VOID C_MAIN_VIEW::shift_wind_to_top_left_corner_of_desktop() { Rect bds; its_main_wind_p->CalcPortFrameRect(bds); bds.left += 4; bds.right += 4; bds.top += 40; bds.bottom += 40; BitMap screenBits; GetQDGlobalsScreenBits(&screenBits); if (bds.right > screenBits.bounds.right-4) bds.right = screenBits.bounds.right-4; if (bds.bottom > screenBits.bounds.bottom-4) bds.bottom = screenBits.bounds.bottom-4; its_main_wind_p->DoSetBounds(bds); } //****************************************** VOID C_MAIN_VIEW::set_min_max_and_std_of_wind( BOOLEAN set_bds_to_std) //in { //For a window, image and pane size are set equal by DoSetBounds(). //Image size of window is NOT the same as image size of main view! //In this class, when we refer to the image, without any qualifications, //we mean the main view image. SDimension16 size_mwind, size_mview; its_main_wind_p->GetFrameSize(size_mwind); GetFrameSize(size_mview); SDimension16 std_size; std_size.width = pix_per_in*its_image_horiz_inches +(size_mwind.width - size_mview.width); std_size.height = pix_per_in*its_image_vert_inches +(size_mwind.height - size_mview.height); its_main_wind_p->SetStandardSize(std_size);//Doesn't draw. An inline that just changes data member Rect std_bds; its_main_wind_p->CalcStandardBounds(std_bds); std_size.width = std_bds.right -std_bds.left; std_size.height = std_bds.bottom -std_bds.top; its_main_wind_p->SetStandardSize(std_size); Rect min_max_rect; min_max_rect.left = 265;//horiz_min min_max_rect.top = 200;//vert_min min_max_rect.right = std_size.width; min_max_rect.bottom = std_size.height; its_main_wind_p->SetMinMaxSize(min_max_rect);//Doesn't draw. An inline that just changes data member if(set_bds_to_std){ its_main_wind_p->DoSetBounds(std_bds); } } //****************************************** BOOLEAN C_MAIN_VIEW::handle_drawing_size_dialog() { // this is a trivial generalization of UModalDialogs::AskForOneNumber //if this function returns true, SetModified(true) called in ObeyCommand() StDialogHandler d_handler(ds_window_rid, this);//SuperCommander declared LWindow * dialog_p = d_handler.GetDialog(); LEditField * horiz_efield_p = (LEditField *)dialog_p->FindPaneByID(ds_horiz_efield_rid); LEditField * vert_efield_p = (LEditField *)dialog_p->FindPaneByID(ds_vert_efield_rid); horiz_efield_p->SetValue(its_image_horiz_inches); vert_efield_p->SetValue(its_image_vert_inches); horiz_efield_p->SelectAll(); dialog_p->SetLatentSub(horiz_efield_p); dialog_p->Show(); USHORT count; Str255 pstr; while (true) { MessageT hit_message = d_handler.DoDialog(); switch(hit_message){ case msg_Cancel: return false; break; case msg_OK: horiz_efield_p->GetDescriptor(pstr); if((!STRINGY(pstr).is_ushort(count))|| count==0){ my_gen_alert("Your entry must be a positive integer."); break; } its_image_horiz_inches = count; vert_efield_p->GetDescriptor(pstr); if((!STRINGY(pstr).is_ushort(count))|| count==0){ my_gen_alert("Your entry must be a positive integer."); break; } its_image_vert_inches = count; ResizeImageTo(pix_per_in*its_image_horiz_inches, pix_per_in*its_image_vert_inches, false); set_min_max_and_std_of_wind(true); return true; break; } } } #pragma mark --drawing-- //****************************************** VOID C_MAIN_VIEW::DrawSelf() {//drawer if(its_has_grid_lines){ SDimension32 image_size; GetImageSize(image_size); StCPTstate saved_st(true, true, false); saved_st.Normalize(); // Pattern gray; // ::PenPat(::GetQDGlobalsGray(&gray)); // ::PenMode(patXor); RGBColor my_graph_paper_blue = {39321, 65535, 65535};//cyan like ::RGBForeColor(&my_graph_paper_blue); SInt16 i; for(i=1;i * dir_arrow_p = its_net_p->get_arrows_first_p(); while(dir_arrow_p){ ar_p = &(dir_arrow_p->its_data); ar_p->draw(); if(ar_p->is_selected())ar_p->draw_sel_handles(); dir_arrow_p = dir_arrow_p->its_next_p; } NODE * nd_p; for(USHORT nd=0; nd < its_net_p->get_num_of_nds(); nd++){ nd_p = its_net_p->get_nd_ptr(nd); nd_p->draw();// this draws circle, efield and state_cap but not sel_handles if(nd_p->is_selected())nd_p->draw_sel_handles(); } } #pragma mark --node efield/story cap-- //****************************************** VOID C_MAIN_VIEW::disable_nd_efields() { for(USHORT i = 0; iget_num_of_nds(); i++){ its_net_p->get_nd_ptr(i)->get_efield_ptr()->Disable(); } } //****************************************** VOID C_MAIN_VIEW::enable_nd_efields() { for(USHORT i = 0; iget_num_of_nds(); i++){ its_net_p->get_nd_ptr(i)->get_efield_ptr()->Enable(); } }//****************************************** VOID C_MAIN_VIEW::create_nd_efield( const Point & m_down_pt, //in USHORT nd_id) //in { its_pane_counter++; Str255 name_pstr= "\pnode_"; Str255 pane_counter_pstr; ::NumToString(its_pane_counter, pane_counter_pstr); LString::AppendPStr(name_pstr, pane_counter_pstr); STRINGY namey(name_pstr); its_net_p->get_nd_ptr(nd_id)->set_name(namey); NODE * nd_p = its_net_p->get_nd_ptr(nd_id); SInt16 sel_rad = nd_p->get_selection_cir().its_radius; SPaneInfo pane_info; //its_pane_counter starts at 0 pane_info.paneID = its_pane_counter + first_nd_efield_rid ; pane_info.width = 100; pane_info.height = 30; pane_info.enabled = true; pane_info.bindings.left = false; pane_info.bindings.top = false; pane_info.bindings.right = false; pane_info.bindings.bottom = false; pane_info.left = m_down_pt.h -50; pane_info.top = m_down_pt.v + sel_rad + 3; pane_info.superView = this; C_ND_EFIELD * efield_p = new C_ND_EFIELD( pane_info,//pane_info name_pstr,//initial caption node_txt_rid,// 'Txtr' resource id 16,// maximum number of characters true,// has box false,// has word wrap C_KEYS::my_PrintingCharField,// key filter function this);// super commander //delete: I destroy efield_p via // QB_NET::del_nd()->C_MAIN_VIEW::destroy_nd_efield() ThrowIfNil_(efield_p); efield_p->FinishCreate(); efield_p->set_nd_always(nd_id); efield_p->AddListener(this); efield_p->AddAttachment(new C_ND_NAME_PASTE_ATMENT());//= new //delete: SwitchTarget((LCommander *) efield_p); efield_p->Show(); nd_p->set_efield_ptr(efield_p); } //****************************************** VOID C_MAIN_VIEW::destroy_nd_efield( USHORT nd_id) //in { NODE * nd_p = its_net_p->get_nd_ptr(nd_id); C_ND_EFIELD * efield_p = nd_p->get_efield_ptr(); delete efield_p; efield_p = 0; } //****************************************** VOID C_MAIN_VIEW::ListenToMessage( MessageT inMessage, //in VOID * ioParam ) //i-o { //MONITOR_THE_CHANGE_HERE //Calling its_doc_p->SetModified(true) here is a bad thing //because of periodical nd_efields. //Luckily, it's unnecessary since C_MAIN_VIEW::Click() //and C_PI_WIND::Click() make the call. // the main view will be responsible for ALL steps necessary to respond // to msg_mv_nd_efield and msg_pi_nd_efield LStr255 descriptor; C_ND_EFIELD * mv_nd_efield_p; C_PI_ND_EFIELD * pi_nd_efield_p; USHORT nd_id; switch ( inMessage ) { case msg_mv_nd_efield: mv_nd_efield_p = (C_ND_EFIELD *)ioParam; mv_nd_efield_p->GetDescriptor(descriptor); if(descriptor[0]==0)descriptor="\p?"; nd_id = mv_nd_efield_p->get_nd(); its_net_p->get_nd_ptr(nd_id)->set_name(STRINGY(descriptor)); if(its_pi_wind_p!=0 ){ its_pi_wind_p->rename_a_nd(nd_id, descriptor);//call this only AFTER tell its_net of node name change! } if(its_bi_nd_wind_p!=0 ){ its_bi_nd_wind_p->rename_a_nd(nd_id, descriptor); } break; case msg_pi_nd_efield: pi_nd_efield_p = (C_PI_ND_EFIELD *)ioParam; pi_nd_efield_p->GetDescriptor(descriptor); if(descriptor[0]==0)descriptor="\p?"; nd_id = pi_nd_efield_p->get_nd(); its_net_p->get_nd_ptr(nd_id)->set_name(STRINGY(descriptor)); mv_nd_efield_p = its_net_p->get_nd_ptr(nd_id)->get_efield_ptr(); mv_nd_efield_p->SetDescriptor(descriptor); mv_nd_efield_p->UserChangedText(); if(its_bi_nd_wind_p!=0 ){ its_bi_nd_wind_p->rename_a_nd(nd_id, descriptor); } break; } } //****************************************** VOID C_MAIN_VIEW::show_story_caps( const VECTOR * net_story_p) //in { if(net_story_p==0){ for(USHORT nd=0; nd< its_net_p->get_num_of_nds(); nd++){ // its_net_p->get_nd_ptr(nd)->undraw_state_cap(); its_net_p->get_nd_ptr(nd)->set_state_num_for_cap(max_ushort); } }else{ for(USHORT nd=0; nd< its_net_p->get_num_of_nds(); nd++){ its_net_p->get_nd_ptr(nd)->set_state_num_for_cap((*net_story_p)[nd]); // its_net_p->get_nd_ptr(nd)->draw_state_cap(); } } Refresh(); } #pragma mark --get_touched-- //****************************************** C_PORT_NAME C_MAIN_VIEW::get_touched_avail_s_port( const Point & pt) //in { C_PORT_NAME port_name(max_ushort, max_ushort); USHORT sub_nd_id; for(USHORT nd_id=0; nd_id < its_net_p->get_num_of_nds(); nd_id++){ if(its_net_p->get_nd_ptr(nd_id)->pt_is_in_greeting_cir_of_avail_s_port(pt, sub_nd_id)){ port_name.its_nd_id = nd_id; port_name.its_sub_nd_id = sub_nd_id; return port_name; } } return port_name; } //****************************************** C_PORT_NAME C_MAIN_VIEW::get_touched_avail_d_port( const Point & pt) //in { C_PORT_NAME port_name(max_ushort, max_ushort); USHORT sub_nd_id; for(USHORT nd_id=0; nd_id < its_net_p->get_num_of_nds(); nd_id++){ if(its_net_p->get_nd_ptr(nd_id)->pt_is_in_greeting_cir_of_avail_d_port(pt, sub_nd_id)){ port_name.its_nd_id = nd_id; port_name.its_sub_nd_id = sub_nd_id; return port_name; } } return port_name; } //****************************************** USHORT C_MAIN_VIEW::get_touched_nd( const Point & pt) //in { // more specifically, get FIRST node touched. for(USHORT nd=0; nd < its_net_p->get_num_of_nds(); nd++){ if( its_net_p->get_nd_ptr(nd)->pt_is_in_sel_cir(pt) )return nd; } return max_ushort; } //****************************************** C_ARROW * C_MAIN_VIEW::get_touched_ar( const Point & pt) //in {// more specifically, get FIRST arrow touched. C_ARROW * ar_p; DIR_DATA * dir_arrow_p = its_net_p->get_arrows_first_p(); while(dir_arrow_p){ ar_p = &(dir_arrow_p->its_data); if( ar_p->pt_is_in_sel_dom(pt) ){ return ar_p; } dir_arrow_p = dir_arrow_p->its_next_p; } return 0; } #pragma mark --selection-- //****************************************** VOID C_MAIN_VIEW::select_all() { for(USHORT nd=0; nd< its_net_p->get_num_of_nds(); nd++){ its_net_p->get_nd_ptr(nd)->select(this); } DIR_DATA * dir_arrow_p = its_net_p->get_arrows_first_p(); while(dir_arrow_p){ dir_arrow_p->its_data.select(this); dir_arrow_p = dir_arrow_p->its_next_p; } } //****************************************** Boolean C_MAIN_VIEW::unselect_all() { Boolean changed = false; for(USHORT nd=0; nd< its_net_p->get_num_of_nds(); nd++){ if(its_net_p->get_nd_ptr(nd)->unselect(this)) changed = true; } DIR_DATA * dir_arrow_p = its_net_p->get_arrows_first_p(); while(dir_arrow_p){ if(dir_arrow_p->its_data.unselect(this)) changed = true; dir_arrow_p = dir_arrow_p->its_next_p; } return changed; } //****************************************** VOID C_MAIN_VIEW::select_nd_and_its_entourage( USHORT nd_id) //in //used in select_rect_contents { its_net_p->get_nd_ptr(nd_id)->select(this); C_ARROW * ar_p; DIR_DATA * dir_arrow_p = its_net_p->get_arrows_first_p(); while(dir_arrow_p){ ar_p = &(dir_arrow_p->its_data); if( (ar_p->get_s_port_name().its_nd_id==nd_id)|| (ar_p->get_d_port_name().its_nd_id==nd_id)){ ar_p->select(this); } dir_arrow_p = dir_arrow_p->its_next_p; } } //****************************************** VOID C_MAIN_VIEW::select_rect_contents( const Rect & rect) //in { C_CIRCLE cir; for(USHORT nd_id=0; nd_id< its_net_p->get_num_of_nds(); nd_id++){ cir = its_net_p->get_nd_ptr(nd_id)->get_selection_cir(); if(cir.intersects_rect(rect)) select_nd_and_its_entourage(nd_id); } } //****************************************** VOID C_MAIN_VIEW::move_selection_by( const Point & delta) //in { NODE * nd_p; for(USHORT nd=0; nd< its_net_p->get_num_of_nds(); nd++){ nd_p =its_net_p->get_nd_ptr(nd); if(nd_p->is_selected()){ nd_p->move_by(delta); } } C_ARROW * ar_p; NODE * s_nd_p; NODE * d_nd_p; C_CIRCLE s_cir, d_cir; Point init_pt, fin_pt; DIR_DATA * dir_arrow_p = its_net_p->get_arrows_first_p(); while(dir_arrow_p){ ar_p = &(dir_arrow_p->its_data); s_nd_p = its_net_p->get_nd_ptr(ar_p->get_s_port_name().its_nd_id); d_nd_p = its_net_p->get_nd_ptr(ar_p->get_d_port_name().its_nd_id); if( s_nd_p->is_selected() || d_nd_p->is_selected() ){ if( s_nd_p->is_selected() && d_nd_p->is_selected() ){ ar_p->move_by(delta); }else{ s_cir = s_nd_p->get_docking_cir(ar_p->get_s_port_name().its_sub_nd_id); d_cir = d_nd_p->get_docking_cir(ar_p->get_d_port_name().its_sub_nd_id); if(its_net_p->calc_closest_pts(s_cir, d_cir, init_pt, fin_pt)){ ar_p->undraw(); if(ar_p->is_selected())ar_p->undraw_sel_handles(); ar_p->set_init_pt(init_pt); ar_p->set_fin_pt(fin_pt); ar_p->draw(); if(ar_p->is_selected())ar_p->draw_sel_handles(); } } } dir_arrow_p = dir_arrow_p->its_next_p; } //this prevents the state captions from erasing stuff they move over //It does NOT erase the main view before drawing on it Draw(0); } //****************************************** VOID C_MAIN_VIEW::respond_to_selection_tool( const Point & m_down_pt, //in Boolean pal_open) //in {//drawer FocusDraw(); C_ARROW * ar_p = get_touched_ar(m_down_pt); USHORT nd_id = get_touched_nd(m_down_pt); NODE * nd_p=0; if(nd_id!=max_ushort)nd_p = its_net_p->get_nd_ptr(nd_id); if(pal_open){ if(C_KEYS::KeyIsDown(0x3A)||C_KEYS::KeyIsDown(0x38)){//shift or option key is down if(nd_id != max_ushort || ar_p != 0){//node or arrow was touched select_all(); }else{//nothing touched if(unselect_all()) Refresh(); //undrawing handles may leave gaps in arrowheads so refresh. } return; }else{//neither shift or option key is down if(nd_id != max_ushort){ //node was touched nd_p->toggle_select(this); if(!nd_p->is_selected())Refresh(); }else if(ar_p!=0){ //arrow was touched ar_p->toggle_select(this); if(!ar_p->is_selected())Refresh(); } } }else{//pal closed if(C_KEYS::KeyIsDown(0x38)){//shift key is down if(nd_id != max_ushort){ //node was touched nd_p->toggle_select(this); if(!nd_p->is_selected())Refresh(); }else if(ar_p!=0){ //arrow was touched ar_p->toggle_select(this); if(!ar_p->is_selected())Refresh(); } }else{//shift key is not down if(nd_id == max_ushort && ar_p ==0){//nothing touched unselect_all(); }else if(nd_id != max_ushort){ //node was touched if(nd_p->is_selected()){ //do nothing }else{ unselect_all(); nd_p->select(this); } }else if(ar_p!=0){ //arrow was touched if(ar_p->is_selected()){ //do nothing }else{ unselect_all(); ar_p->select(this); } } } } Point old_pt, new_pt; Rect sel_rect; if(nd_id == max_ushort && ar_p==0){ //no node or arrow was touched StCPTstate saved_st(true, true, false); saved_st.Normalize(); Pattern gray; ::GetQDGlobalsGray(&gray); Pattern black; ::GetQDGlobalsBlack(&black); ::PenPat(&gray); ::PenMode(patXor); new_pt = m_down_pt; old_pt = m_down_pt; ::SetRect(&sel_rect, m_down_pt.h, m_down_pt.v, new_pt.h, new_pt.v); while(::StillDown()){ ::GetMouse(&new_pt); if(!::EqualPt(new_pt, old_pt)){ ::FrameRect(&sel_rect); if(AutoScrollImage(new_pt)){ //autoscroll normalizes the pen ::PenPat(&gray); ::PenMode(patXor); } ::SetRect(&sel_rect, m_down_pt.h, m_down_pt.v, new_pt.h, new_pt.v); ::FrameRect(&sel_rect); old_pt =new_pt; } } ::FrameRect(&sel_rect); ::PenPat(&black); ::PenMode(patCopy); select_rect_contents(sel_rect); return; } } //****************************************** Rect C_MAIN_VIEW::get_sel_rect() { //2^15 = 32768; SInt16 min_hor = 32767; SInt16 min_ver = 32767; SInt16 max_hor = -32767; //actually it goes as low as -32768 SInt16 max_ver = -32767; Point center; Rect sel_rect; USHORT num_of_nds = its_net_p->get_num_of_nds(); for(USHORT i = 0; iget_nd_ptr(i); if(nd_p->is_selected()){ center = nd_p->get_center(); if(min_hor>center.h)min_hor = center.h; if(min_ver>center.h)min_ver = center.v; if(max_horis_selected() && its_net_p->get_nd_ptr(ar_p->get_d_port_name().its_nd_id)->is_selected() && its_net_p->get_nd_ptr(ar_p->get_s_port_name().its_nd_id)->is_selected() ); } //****************************************** BOOLEAN C_MAIN_VIEW::s_or_d_or_ar_selected( const C_ARROW * ar_p) //in { return ( ar_p->is_selected() || its_net_p->get_nd_ptr(ar_p->get_d_port_name().its_nd_id)->is_selected() || its_net_p->get_nd_ptr(ar_p->get_s_port_name().its_nd_id)->is_selected() ); } //****************************************** VOID C_MAIN_VIEW::get_map_with_sel_last( UI_MAP & map_with_sel_last) //out { USHORT num_of_nds = its_net_p->get_num_of_nds(); USHORT i_unsel_nds = 0; USHORT i_sel_nds = num_of_nds - its_num_of_sel_nds; map_with_sel_last.set_to_default_map(num_of_nds); for(USHORT i=0; iget_nd_ptr(i)->is_selected()){ map_with_sel_last.its_newfo[i]=i_unsel_nds; i_unsel_nds++; }else{ map_with_sel_last.its_newfo[i]=i_sel_nds; i_sel_nds++; } } map_with_sel_last.set_oldfn(); } //****************************************** VOID C_MAIN_VIEW::make_only_last_nds_selected( USHORT num_of_sel_nds) //in { USHORT num_of_nds = its_net_p->get_num_of_nds(); ThrowIf_(num_of_nds < num_of_sel_nds); USHORT num_of_unsel_nds = num_of_nds - num_of_sel_nds; USHORT nd; for(nd=0; nd< num_of_unsel_nds; nd++){ its_net_p->get_nd_ptr(nd)->unselect(this); } for(nd=num_of_unsel_nds ; nd< num_of_nds; nd++){ its_net_p->get_nd_ptr(nd)->select(this); } } /* //****************************************** VOID C_MAIN_VIEW::get_selected_arrows( SET & sel_ars) //out { sel_ars.empty(); sel_ars.resize(its_net_p->get_num_of_arrows()); USHORT ar_id=0; C_ARROW * ar_p; DIR_DATA * dir_arrow_p = its_net_p->get_arrows_first_p(); while(dir_arrow_p){ ar_p = &(dir_arrow_p->its_data); if(ar_p->is_selected())sel_ars.insert(ar_id); dir_arrow_p = dir_arrow_p->its_next_p; ar_id++; } } //****************************************** VOID C_MAIN_VIEW::set_selected_arrows( const SET & sel_ars) //in { USHORT ar_id=0; C_ARROW * ar_p; DIR_DATA * dir_arrow_p = its_net_p->get_arrows_first_p(); while(dir_arrow_p){ ar_p = &(dir_arrow_p->its_data); if(sel_ars.contains(ar_id)){ if(!ar_p->is_selected()) ar_p->select(this); }else{//sel_ars does not contain ar_id if(ar_p->is_selected()) ar_p->unselect(this); } dir_arrow_p = dir_arrow_p->its_next_p; ar_id++; } } */ //****************************************** VOID C_MAIN_VIEW::make_only_first_arrows_selected( USHORT num_of_sel_ars) //in { USHORT pos=0; C_ARROW * ar_p; DIR_DATA * dir_arrow_p = its_net_p->get_arrows_first_p(); while(dir_arrow_p){ ar_p = &(dir_arrow_p->its_data); if(posis_selected()) ar_p->select(this); }else{ if(ar_p->is_selected()) ar_p->unselect(this); } dir_arrow_p = dir_arrow_p->its_next_p; pos++; } } #pragma mark --tool behavior-- //****************************************** VOID C_MAIN_VIEW::respond_to_bi_nd_selector( const Point & m_down_pt) //in { USHORT touched_nd = get_touched_nd(m_down_pt); if(touched_nd==max_ushort)return; its_bi_nd_wind_p->respond_to_bi_nd_selector(touched_nd); } //****************************************** VOID C_MAIN_VIEW::respond_to_drag_tool( const Point & m_down_pt) //in { // can't use get_(first)_touched_nd here. //What is needed is get_first_touched_selected_nd FocusDraw(); Point new_pt = m_down_pt; Point old_pt = m_down_pt; Point delta; NODE * nd_p; for(USHORT nd=0; nd < its_net_p->get_num_of_nds(); nd++){ nd_p = its_net_p->get_nd_ptr(nd); if( nd_p->pt_is_in_sel_cir(m_down_pt) && nd_p->is_selected() ){ while(::StillDown()){ ::GetMouse(&new_pt); if(!::EqualPt(new_pt, old_pt)){ delta.h =new_pt.h - old_pt.h; delta.v =new_pt.v - old_pt.v; move_selection_by(delta); old_pt =new_pt; } AutoScrollImage(new_pt); } Refresh(); return; } } return; } //****************************************** VOID C_MAIN_VIEW::respond_to_open_tool( const Point & m_down_pt) //in { USHORT touched_nd = get_touched_nd(m_down_pt); if( GetClickCount()==2 && touched_nd!=max_ushort){ if(its_net_p->get_run_state()==bef_run){ if(its_pi_wind_p==0){ create_pi_wind(touched_nd); }else{ //It's not always necessary, //but sometimes, like now, it's useful to //unload editor of amps table before changing node. //If don't unload it, changes made to //last cell touched of the amps table //will not be remembered. //This would not be a fatal error. if(!its_pi_wind_p->save_pi())return; its_pi_wind_p->set_nd_if_diff(touched_nd); its_pi_wind_p->Select(); } }else{ if(its_nd_probs_wind_p==0){ create_nd_probs_wind(touched_nd); }else{ its_nd_probs_wind_p->set_nd_if_diff(touched_nd); its_nd_probs_wind_p->Select(); } } } } //****************************************** VOID C_MAIN_VIEW::respond_to_no_tool( const Point & m_down_pt) //in { if( GetClickCount()==2){ respond_to_open_tool(m_down_pt); }else{ //does mouse tracking iff node or arrow NOT touched: respond_to_selection_tool(m_down_pt, false); //does mouse tracking iff node touched: respond_to_drag_tool(m_down_pt); Refresh(); } } //****************************************** VOID C_MAIN_VIEW::rotate_nd( const Point & m_down_pt) //in { USHORT nd_id = get_touched_nd(m_down_pt); if(nd_id==max_ushort)return; C_ARROW * ar_p; NODE * s_nd_p; NODE * d_nd_p; C_CIRCLE s_cir, d_cir; Point init_pt, fin_pt; C_PORT_NAME s_port_name, d_port_name; DIR_DATA * dir_arrow_p; its_net_p->get_nd_ptr(nd_id)->rotate(); dir_arrow_p = its_net_p->get_arrows_first_p(); while(dir_arrow_p){ ar_p = &(dir_arrow_p->its_data); s_port_name = ar_p->get_s_port_name(); d_port_name = ar_p->get_d_port_name(); if( (s_port_name.its_nd_id==nd_id)|| (d_port_name.its_nd_id==nd_id) ){ // ar_p->undraw(); //not necessary because of refresh at the end s_nd_p = its_net_p->get_nd_ptr(s_port_name.its_nd_id); d_nd_p = its_net_p->get_nd_ptr(d_port_name.its_nd_id); s_cir = s_nd_p->get_docking_cir(s_port_name.its_sub_nd_id); d_cir = d_nd_p->get_docking_cir(d_port_name.its_sub_nd_id); if(its_net_p->calc_closest_pts(s_cir, d_cir, init_pt, fin_pt)){ ar_p->set_init_pt(init_pt); ar_p->set_fin_pt(fin_pt); // ar_p->draw(); //not necessary because of refresh at the end } } dir_arrow_p = dir_arrow_p->its_next_p; } Refresh(); } //****************************************** VOID C_MAIN_VIEW::paint_nd( const Point & pt) //in { // get_(first)_touched_nd not good enough. Want first touched, colored node. NODE * nd_p; for(USHORT nd=0; nd < its_net_p->get_num_of_nds(); nd++){ nd_p = its_net_p->get_nd_ptr(nd); if( nd_p->has_color() && nd_p->pt_is_in_sel_cir(pt)){ C_APP * app_p=(C_APP *)LCommander::GetTopCommander(); nd_p->set_color(app_p->get_cur_color()); nd_p->draw(); return; } } } //****************************************** VOID C_MAIN_VIEW::copy_nd_color( const Point & pt) //in { // get_(first)_touched_nd not good enough. Want first touched, colored node. NODE * nd_p; for(USHORT nd=0; nd < its_net_p->get_num_of_nds(); nd++){ nd_p = its_net_p->get_nd_ptr(nd); if( nd_p->has_color() && nd_p->pt_is_in_sel_cir(pt)){ C_APP * app_p=(C_APP *)LCommander::GetTopCommander(); app_p->set_cur_color(nd_p->get_color()); return; } } } //****************************************** VOID C_MAIN_VIEW::maybe_add_arrow( const Point & m_down_pt) //in {//drawer FocusDraw(); StCPTstate saved_st(true, true, false); saved_st.Normalize(); // m_down_pt = mouse down point C_PORT_NAME s_port_name = get_touched_avail_s_port(m_down_pt); USHORT s_nd = s_port_name.its_nd_id; if(s_nd ==max_ushort) return; C_ARROW_DRAWER cupid((LView *)this, 16, 25); // (view, arrowhead length, halfwidth) Point old_pt = m_down_pt; Point new_pt; ::PenMode(patXor); while(::StillDown()){ ::GetMouse(&new_pt); if(!::EqualPt(new_pt, old_pt)){ cupid.sketch(m_down_pt, old_pt);// on the first pass, this does nothing //because m_down_pt = old_pt if(AutoScrollImage(new_pt)){ //autoscroll normalizes the pen ::PenMode(patXor); } cupid.sketch(m_down_pt, new_pt); old_pt =new_pt; } } // We erase the last arrow: // it's no good because m_down_pt and m_up_pt //do not dock properly on the s and d ports. cupid.sketch(m_down_pt, new_pt); ::PenMode(patCopy); Point m_up_pt; // m_up_pt = mouse up point ::GetMouse(&m_up_pt); C_PORT_NAME d_port_name = get_touched_avail_d_port(m_up_pt); USHORT d_nd = d_port_name.its_nd_id; if((d_nd != max_ushort)&&(d_nd !=s_nd)){ if(its_net_p->mac_add_int_arrow(s_port_name, d_port_name, true)){ if(its_pi_wind_p!=0){ if(d_nd==its_pi_wind_p->get_nd()){ //must refresh pi_wind in this case its_pi_wind_p->set_nd_always(d_nd); } } } } Refresh(); } //****************************************** VOID C_MAIN_VIEW::maybe_change_source_nd_of_ar( const Point & m_down_pt) //in {//drawer //this function is similar to C_MAIN_VIEW::maybe_add_arrow() FocusDraw(); StCPTstate saved_st(true, true, false); saved_st.Normalize(); C_ARROW * ar_p = get_touched_ar(m_down_pt); if(ar_p==0) return; Point old_fin_pt = ar_p->get_fin_pt(); Point old_init_pt = ar_p->get_init_pt(); C_ARROW_DRAWER cupid((LView *)this, 16, 25); // (view, arrowhead length, halfwidth) Point old_pt = old_init_pt; Point new_pt; ar_p->unselect(this); ::PenMode(patXor); while(::StillDown()){ ::GetMouse(&new_pt);//initially new_pt = m_down_pt if(!::EqualPt(new_pt, old_pt)){ cupid.sketch(old_pt, old_fin_pt); if(AutoScrollImage(new_pt)){ //autoscroll normalizes the pen ::PenMode(patXor); } cupid.sketch(new_pt, old_fin_pt); old_pt =new_pt; } } //We erase the last arrow: //it's no good because m_down_pt and m_up_pt //do not dock properly on the s and d ports. cupid.sketch(new_pt, old_fin_pt); ::PenMode(patCopy); Point m_up_pt; // m_up_pt = mouse up point ::GetMouse(&m_up_pt); C_PORT_NAME d_port_name = ar_p->get_d_port_name(); USHORT d_nd = d_port_name.its_nd_id; C_PORT_NAME s_port_name = get_touched_avail_s_port(m_up_pt); USHORT s_nd = s_port_name.its_nd_id; if((s_nd != max_ushort)&&(s_nd !=d_nd)){ if(its_net_p->change_source_nd_of_ar(ar_p, s_port_name)){ if(its_pi_wind_p!=0){ if(d_nd==its_pi_wind_p->get_nd()){ //must refresh pi_wind in this case its_pi_wind_p->set_nd_always(d_nd); } } } } Refresh(); } //****************************************** VOID C_MAIN_VIEW::Click( SMouseDownEvent & inMouseDown) //in { //MONITOR_THE_CHANGE_HERE //if call its_doc_p->SetModified(true) inside ClickSelf() rather than Click(), //then it won't be called if I click on subpanes like nd edit fields its_doc_p->SetModified(true); its_pasting_center.h = inMouseDown.whereLocal.h; its_pasting_center.v = inMouseDown.whereLocal.v; LView::Click(inMouseDown); } //****************************************** VOID C_MAIN_VIEW::ClickSelf( const SMouseDownEvent & in_mouse_down) //in { //MONITOR_THE_CHANGE_HERE //doc: marked modified in C_MAIN_VIEW::Click() Point m_down_pt = in_mouse_down.whereLocal; //if( FindSubPaneHitBy(m_down_pt.h, m_down_pt.v)!=0) return;//this is redundant SwitchTarget(this); // makes main view the target as soon as click outside editfields USHORT touched_nd; if(its_bi_nd_wind_p!=0 && its_bi_nd_wind_p->is_selector_ON()){ respond_to_bi_nd_selector(m_down_pt);//calculates touched nd internally return; } C_APP * app_p=(C_APP *)LCommander::GetTopCommander(); SInt16 cur_tool = app_p->get_cur_tool(); ND_CLASS_ID nd_class_id(NO_NODE_id); switch(cur_tool){ case no_tool: respond_to_no_tool(m_down_pt);//calculates touched nd internally break; case selection_tool: respond_to_selection_tool(m_down_pt, true);//calculates touched nd internally break; case drag_tool: respond_to_drag_tool(m_down_pt);//DOESN'T calculate touched nd internally, but calculates something similar break; case open_tool: respond_to_open_tool(m_down_pt);//calculates touched nd internally break; case rotation_tool: rotate_nd(m_down_pt);//calculates touched nd internally break; case paint_tool: paint_nd(m_down_pt);//DOESN'T calculate touched nd internally, but calculates something similar break; case copy_color_tool: copy_nd_color(m_down_pt);//DOESN'T calculate touched nd internally, but calculates something similar break; case arrow_tool: if(its_net_p->get_run_state()!=bef_run){only_allowed_in_initial_run_state_alert(); return;} maybe_add_arrow(m_down_pt);//DOESN'T calculate touched nd internally, but calculates something similar break; case arrow_source_tool: if(its_net_p->get_run_state()!=bef_run){only_allowed_in_initial_run_state_alert(); return;} maybe_change_source_nd_of_ar(m_down_pt);//DOESN'T calculate touched nd internally, but calculates something similar break; case beam_spl_tool: nd_class_id = BEAM_SPL_id; break; case custom_nd_tool: nd_class_id = CUSTOM_ND_id; break; case det_nd_tool: nd_class_id = DET_ND_id; break; case pol_rot_tool: nd_class_id = POL_ROTATOR_id; break; case polarizer_tool: nd_class_id = POLARIZER_id; break; case qbit_rot_tool: nd_class_id = QBIT_ROT_id; break; case sg_magnet_tool: nd_class_id = SG_MAGNET_id; break; }//cur_tool switch if(nd_class_id!=NO_NODE_id){ if(its_net_p->get_run_state()!=bef_run){only_allowed_in_initial_run_state_alert(); return;} touched_nd = get_touched_nd(m_down_pt); if(touched_nd==max_ushort){ its_net_p->mac_add_nd(nd_class_id, m_down_pt, true); } } /* //autoscroll code from Muscle Demo, CBigView::ClickSelf() //This doesn't work for me because respond_to_drag_tool //has its own while(::StillDown()) while (::StillDown()) { FocusDraw(); Point localMouse; ::GetMouse(&localMouse); AutoScrollImage(localMouse); } */ } //****************************************** VOID C_MAIN_VIEW::AdjustMouseSelf( Point in_port_pt, //in const EventRecord & in_mac_event, //in RgnHandle outMouseRgn) //out { #pragma unused(in_mac_event, outMouseRgn) /* LPane * hit_pane = FindSubPaneHitBy(in_port_pt.h, in_port_pt.v); if( hit_pane !=0){ hit_pane->AdjustCursor(in_port_pt, in_mac_event); return; } */ if(its_bi_nd_wind_p!=0 && its_bi_nd_wind_p->is_selector_ON()){ UCursor::SetTheCursor(bi_node_and_pointing_hand_rid); return; } C_APP * app_p=(C_APP *)LCommander::GetTopCommander(); SInt16 cur_tool = app_p->get_cur_tool(); ResIDT cursor_rid; switch(cur_tool){ case no_tool: UCursor::SetArrow(); //arrow break; case selection_tool: UCursor::SetTheCursor(pointing_hand_rid); break; case drag_tool: cursor_rid = open_hand_rid; if(::StillDown()){//this is NOT a while(::StillDown()) loop NODE * nd_p; for(USHORT nd=0; nd < its_net_p->get_num_of_nds(); nd++){ nd_p = its_net_p->get_nd_ptr(nd); if( nd_p->pt_is_in_sel_cir(in_port_pt) && nd_p->is_selected() ){ cursor_rid = closed_hand_rid; } } } UCursor::SetTheCursor(cursor_rid); break; case open_tool: UCursor::SetTheCursor(explosion_rid); break; case rotation_tool: UCursor::SetTheCursor(clockwise_rot_rid); break; case paint_tool: UCursor::SetTheCursor(paint_brush_rid); break; case copy_color_tool: UCursor::SetTheCursor(eye_dropper_rid); break; case arrow_tool: UCursor::SetTheCursor(bow_and_arrow_rid); break; case arrow_source_tool: UCursor::SetTheCursor(arrow_source_rid); break; case beam_spl_tool: case custom_nd_tool: case det_nd_tool: case pol_rot_tool: case polarizer_tool: case qbit_rot_tool: case sg_magnet_tool: UCursor::SetTheCursor(crossCursor); break; default: // same as LPane::AdjustCursorSelf(in_port_pt, in_mac_event); UCursor::InitTheCursor(); //arrow break; } } #pragma mark --write/read net-- //****************************************** VOID C_MAIN_VIEW::translate_pt_from_sel_to_pasting_rect( Point & pt, //i-o const Rect & sel_rect) //in { Point delta; delta.h = 8; delta.v = 8; if(its_pasting_center.h!=0 && its_pasting_center.v!=0){ Point sel_center; sel_center.h = sel_rect.left + (sel_rect.right -sel_rect.left)/2; sel_center.v = sel_rect.top + (sel_rect.bottom -sel_rect.top)/2; delta.h = its_pasting_center.h - sel_center.h; delta.v = its_pasting_center.v - sel_center.v; } pt.h += delta.h; pt.v += delta.v; } //****************************************** BOOLEAN C_MAIN_VIEW::pasting_should_restore_amps_of( USHORT nd_id) //in { NODE * nd_p = its_net_p->get_nd_ptr(nd_id); //false if node is not selected if(!nd_p->is_selected()) return false; //false if at least one of the node's parents is NOT selected USHORT num_of_in_nds = nd_p->get_in_nds().get_len(); for(USHORT i=0; iget_nd_ptr(nd_p->get_in_nds()[i])->is_selected())return false; } return true; } //****************************************** BOOLEAN C_MAIN_VIEW::undeleting_should_restore_amps_of( USHORT nd_id) //in { NODE * nd_p = its_net_p->get_nd_ptr(nd_id); //true if node is selected if(nd_p->is_selected())return true; //true if at least one of the node's parents is selected USHORT num_of_in_nds = nd_p->get_in_nds().get_len(); for(USHORT i=0; iget_nd_ptr(nd_p->get_in_nds()[i])->is_selected())return true; } //true if some incoming arrow is selected C_ARROW * ar_p; DIR_DATA * dir_arrow_p = its_net_p->get_arrows_first_p(); while(dir_arrow_p){ ar_p = &(dir_arrow_p->its_data); if(ar_p->is_selected() && ar_p->get_d_port_name().its_nd_id==nd_id)return true; dir_arrow_p = dir_arrow_p->its_next_p; } return false; } //****************************************** VOID C_MAIN_VIEW::write_net_stream( LStream & net_stream, //i-o NET_STREAM_TYPE stream_type) //in { if(stream_type==open_reco){ net_stream<CalcPortFrameRect(bds); its_main_wind_p->PortToGlobalPoint(topLeft(bds)); its_main_wind_p->PortToGlobalPoint(botRight(bds)); net_stream<get_vers_int32()<= k_vers_160){ net_stream<write_net_stream(net_stream, stream_type);//write_net } //****************************************** VOID C_MAIN_VIEW::read_net_stream( LStream & net_stream, //i-o NET_STREAM_TYPE stream_type) //in { if(stream_type==open_reco){ net_stream>>its_image_horiz_inches;//read_net net_stream>>its_image_vert_inches;//read_net Rect bds; net_stream>> bds;//read_net //C_MAIN_VIEW::FinishCreate() called default values //need to update ResizeImageTo(pix_per_in*its_image_horiz_inches, pix_per_in*its_image_vert_inches, false); set_min_max_and_std_of_wind(false); its_main_wind_p->DoSetBounds(bds); net_stream>>its_has_grid_lines;//read_net net_stream>>its_fnum;//read_net if(its_doc_p->get_vers_int32()<= k_vers_160){ net_stream>>its_fname_item_num;//read_net } net_stream>>its_fsize;//read_net check_fsize_and_fnum(); its_fname_item_num = UFontMenu::GetFontItemNumber(its_fnum); } its_net_p->read_net_stream(net_stream, stream_type);//read_net } #pragma mark --copy, del, cut, paste-- //****************************************** VOID C_MAIN_VIEW::copy_selection() { //this function is analogous to C_DOC::DoSave() //sel = net selection //Checks for selected nodes. //If finds none: //zeros scrap, //kills any L_MAIN_VIEW's uactions, //and then returns. if(!at_least_one_nd_is_sel()){ UScrap::ClearData(); PostAction(0); return; } UI_MAP map_with_sel_last(its_net_p->get_num_of_nds()); get_map_with_sel_last(map_with_sel_last); its_net_p->reorder_nds(map_with_sel_last); LHandleStream net_stream; write_net_stream(net_stream, paste_reco);//write_net UI_MAP inv_map; map_with_sel_last.get_inverse(inv_map); its_net_p->reorder_nds(inv_map); Handle data_h = net_stream.GetDataHandle(); //create_h: PP creates data_h in LHandleStream() with call to ::NewHandle(). //throwif_h: PP calls ThrowIfMemFail_(mDataH) immediately after creation. //destroy_h: PP destroys data_h inside ~LHandleStream(). ThrowIfNil_(data_h); //NSel = net selection UScrap::SetData('NSel', data_h); //zero pasting center immediately after copy its_pasting_center.h = 0; its_pasting_center.v = 0; } //****************************************** VOID C_MAIN_VIEW::delete_selection( BOOLEAN sel_is_last) //i-o { USHORT num_of_nds = its_net_p->get_num_of_nds(); if(num_of_nds==0)return; USHORT init_num_of_sel_nds = its_num_of_sel_nds; if(!sel_is_last){ UI_MAP map_with_sel_last(num_of_nds); get_map_with_sel_last(map_with_sel_last); its_net_p->reorder_nds(map_with_sel_last); } //The following will also delete unselected arrows //if they are connected to a selected node. //By deleting the last node each time, we avoid //reordering operation in del_nd() if nodes have //already been reordered so that selected ones are last. for(USHORT i = 0; idel_nd(num_of_nds- 1, false); num_of_nds--; } C_ARROW * ar_p; DIR_DATA * dir_arrow_p = its_net_p->get_arrows_first_p(); while(dir_arrow_p){ ar_p = &(dir_arrow_p->its_data); if( ar_p->is_selected() ){ its_net_p->del_int_arrow( ar_p->get_s_port_name().its_nd_id, ar_p->get_d_port_name().its_nd_id, false); dir_arrow_p = its_net_p->get_arrows_first_p(); }else{ dir_arrow_p = dir_arrow_p->its_next_p; } } its_net_p->chrono_sort(); Refresh(); //at this point, num_of_nds= num of nodes after selection has been deleted. if(num_of_nds!=0){ if(its_pi_wind_p!=0){ its_pi_wind_p->set_nd_always(0); } if(its_bi_nd_wind_p!=0){ its_bi_nd_wind_p->refill_list_box(); } }else{ if(its_pi_wind_p!=0){ its_pi_wind_p->ProcessCommand(cmd_Close); its_pi_wind_p=0; } if(its_bi_nd_wind_p!=0){ its_bi_nd_wind_p->ProcessCommand(cmd_Close); its_bi_nd_wind_p=0; } } //Go from some nodes selected to no nodes selected //(may even have zero nodes at this point) so //must update menus (from enabled to disabled). //This is an LCommander inline that just changes the needs-update data member. //It does not itself do the menu updating: LCommander::SetUpdateCommandStatus( true ); } //****************************************** VOID C_MAIN_VIEW::paste_clipping() { //this function is analogous to C_DOC::open_file() SInt32 len; Handle data_h = ::NewHandle( 0L ); //create_h: I create data_h with call to ::NewHandle(). //throwif_h: I call ThrowIfMemFail_ above. // I also call ThrowOSErr_ immediately after call to GetScrap, // which allocates more space for data_h //destroy_h: PP destroys data_h inside ~LHandleStream(). ThrowIfMemFail_(data_h); len = UScrap::GetData('NSel', data_h); if(len == noTypeErr){ //no data of this type was found DisposeHandle_(data_h); return; } if(len < 0) ThrowOSErr_(len); LHandleStream net_stream(data_h); read_net_stream(net_stream, paste_reco);//read_net Refresh(); //May go from no nodes selected to some nodes selected so //must update menu (from disabled to enabled). //This is an LCommander inline that just changes the needs-update data member. //It does not itself do the menu updating: LCommander::SetUpdateCommandStatus( true ); SwitchTarget(this); //edit field is target if don't include this. } #pragma mark --command center-- //****************************************** BOOLEAN C_MAIN_VIEW::HandleKeyPress( const EventRecord & in_key_event) //in { //MONITOR_THE_CHANGE_HERE //doc marked modified in C_MAIN_VIEW::ObeyCommand() if( ((in_key_event.message &keyCodeMask)>>8) == 0x33){//delete key was pressed //This is like a combination of ObeyCommand() and FindCommandStatus() if(at_least_one_nd_is_sel()||at_least_one_arrow_is_sel()){ return ProcessCommand(cmd_Clear); }else{ return true; } }else{ return LCommander::HandleKeyPress(in_key_event); } } //****************************************** BOOLEAN C_MAIN_VIEW::ObeyCommand( CommandT inCommand, //in VOID * ioParam) //i-o { //MONITOR_THE_CHANGE_HERE //When C_MAIN_VIEW is the target commander, //UNDO or REDO commands are enabled //iff an LAction object exists for C_MAIN_VIEW. //We will always mark a doc //modified as soon such an LAction is created ("posted"). BOOLEAN mark_doc_modified = true; BOOLEAN obeyed = true; BOOLEAN needs_refresh = true; ResIDT menuID; SInt16 menuItem; RUN_STATE run_st = its_net_p->get_run_state(); if (IsSyntheticCommand(inCommand, menuID, menuItem)) { if (menuID == MENU_Font) { its_fnum = UFontMenu::GetFontNumber(menuItem); its_fname_item_num = menuItem; for(USHORT nd=0; nd < its_net_p->get_num_of_nds(); nd++){ its_net_p->get_nd_ptr(nd)->get_efield_ptr()->set_fnum(its_fnum); } }else if (menuID == MENU_Size){ its_fsize = USizeMenu::GetFontSize(menuItem); for(USHORT nd=0; nd < its_net_p->get_num_of_nds(); nd++){ its_net_p->get_nd_ptr(nd)->get_efield_ptr()->set_fsize(its_fsize); } }else { //let super commander decide if the menus items it's //resposible for modify document mark_doc_modified = false; obeyed = LCommander::ObeyCommand(inCommand, ioParam); needs_refresh = false; } } else { switch (inCommand) { case cmd_Cut: if(run_st!=bef_run){ mark_doc_modified = false; only_allowed_in_initial_run_state_alert(); }else{ PostAction(new C_NET_DEL_OR_CUT_ACTION(1, its_doc_p, this, its_net_p));//= new //delete: } break; case cmd_Copy: mark_doc_modified = false; if(run_st!=bef_run){ only_allowed_in_initial_run_state_alert(); }else{ copy_selection(); } break; case cmd_Paste: if(run_st!=bef_run){ mark_doc_modified = false; only_allowed_in_initial_run_state_alert(); }else{ paste_clipping(); } break; case cmd_Clear: if(run_st!=bef_run){ mark_doc_modified = false; only_allowed_in_initial_run_state_alert(); }else{ PostAction(new C_NET_DEL_OR_CUT_ACTION(0, its_doc_p, this, its_net_p));//= new //delete: } break; case cmd_SelectAll: mark_doc_modified = false; select_all(); break; case cmd_drawing_size: if(!handle_drawing_size_dialog())mark_doc_modified = false; break; case cmd_grid_lines: toggle(its_has_grid_lines); break; case cmd_FontOther: // When the user chooses "Other" from the Size menu, we // display the Other Size dialog box using a single // function call. UModalDialogs::AskForOneNumber() handles // all user interaction until the user dismisses the // dialog box. It returns true if the user clicked OK, // and false if the user clicked Cancel. SInt32 newSize = its_fsize; needs_refresh = UModalDialogs::AskForOneNumber(this, other_fsize_window_rid, other_fsize_efield_rid, newSize); // 6 is min font size (see CSampleText::SetSize() in cookbook examples) its_fsize = (newSize>=6?newSize:6); for(USHORT nd=0; nd < its_net_p->get_num_of_nds(); nd++){ its_net_p->get_nd_ptr(nd)->get_efield_ptr()->set_fsize(its_fsize); } break; case cmd_show_pi_wind: mark_doc_modified = false; if(its_pi_wind_p==0){ create_pi_wind(0);//open prior info wind for the first node }else{ if(C_KEYS::KeyIsDown(0X3A)){ //option_key=0x3A its_pi_wind_bds_reco.move_to_top_right_corner_of_screen(its_pi_wind_p); } its_pi_wind_p->Select(); } break; case cmd_show_bi_nd_wind: mark_doc_modified = false; if(its_bi_nd_wind_p==0){ create_bi_nd_wind(); }else{ if(C_KEYS::KeyIsDown(0X3A)){ //option_key=0x3A its_bi_nd_wind_bds_reco.move_to_top_right_corner_of_screen(its_bi_nd_wind_p); } its_bi_nd_wind_p->Select(); } break; case cmd_show_nd_probs_wind: mark_doc_modified = false; if(its_nd_probs_wind_p==0){ create_nd_probs_wind(0); }else{ if(C_KEYS::KeyIsDown(0X3A)){ //option_key=0x3A its_nd_probs_wind_bds_reco.move_to_top_right_corner_of_screen(its_nd_probs_wind_p); } its_nd_probs_wind_p->Select(); } break; case cmd_show_bi_nd_probs_wind: mark_doc_modified = false; if(its_bi_nd_probs_wind_p==0){ create_bi_nd_probs_wind(0); }else{ if(C_KEYS::KeyIsDown(0X3A)){ //option_key=0x3A its_bi_nd_probs_wind_bds_reco.move_to_top_right_corner_of_screen(its_bi_nd_probs_wind_p); } its_bi_nd_probs_wind_p->Select(); } break; case cmd_show_stories_wind: mark_doc_modified = false; if(its_stories_wind_p==0){ create_stories_wind(); }else{ if(C_KEYS::KeyIsDown(0X3A)){ //option_key=0x3A its_stories_wind_bds_reco.move_to_top_right_corner_of_screen(its_stories_wind_p); } its_stories_wind_p->Select(); } break; case cmd_close_all_non_main_winds: mark_doc_modified = false; if(its_pi_wind_p!=0){ if(!its_pi_wind_p->save_pi()){ obeyed=false; break; }else{ its_pi_wind_p->ProcessCommand(cmd_Close); finish_pi_wind_closing(); } } if(its_bi_nd_wind_p!=0){ its_bi_nd_wind_p->ProcessCommand(cmd_Close); finish_bi_nd_wind_closing(); } if(its_nd_probs_wind_p!=0){ its_nd_probs_wind_p->ProcessCommand(cmd_Close); finish_nd_probs_wind_closing(); } if(its_bi_nd_probs_wind_p!=0){ its_bi_nd_probs_wind_p->ProcessCommand(cmd_Close); finish_bi_nd_probs_wind_closing(); } if(its_stories_wind_p!=0){ its_stories_wind_p->set_item_if_diff(1); its_stories_wind_p->ProcessCommand(cmd_Close); finish_stories_wind_closing(); } // pass it up chain of command so palette is also closed: obeyed = LCommander::ObeyCommand(inCommand, ioParam); needs_refresh = false; break; default: //let super commander decide if the menus items it's //resposible for modify document mark_doc_modified = false; obeyed = LCommander::ObeyCommand(inCommand, ioParam); needs_refresh = false; break; } } if(mark_doc_modified) its_doc_p->SetModified(true); if (needs_refresh) Refresh(); return obeyed; } //****************************************** VOID C_MAIN_VIEW::FindCommandStatus( CommandT inCommand, //in BOOLEAN & outEnabled, //out BOOLEAN & outUsesMark, //out UInt16 & outMark, //out Str255 outName_pstr) //out { outEnabled = false; outUsesMark = false; outMark = noMark; USHORT num_of_nds = its_net_p->get_num_of_nds(); RUN_STATE run_st = its_net_p->get_run_state(); ResIDT menuID; SInt16 menuItem; if (IsSyntheticCommand(inCommand, menuID, menuItem)) { if (menuID == MENU_Font){ // The Font menu doesn't have a corresponding Mcmd resource, // so FindCommandStatus() only handles the case where we're // updating the entire menu. UFontMenu::AdjustMenu() enables // all the menu items and places a check mark next to the // name of the current font. outEnabled=true;// a small bug in Adjust menu(): it expects this initial condition UFontMenu::AdjustMenu(its_fname_item_num); }else if (menuID == MENU_Size){ // The commands in the Size menu that specify a particular // font size are specified with cmd_UseMenuItem in the Size // menu's corresponding Mcmd. That means that we'll get // synthetic command numbers for these items and that // UpdateMenus() will call FindCommandStatus() for each // one of those items. USizeMenu::AdjustMenu(menuItem, its_fsize, its_fnum, outEnabled, outUsesMark, outMark); }else{ LCommander::FindCommandStatus(inCommand, outEnabled, outUsesMark, outMark, outName_pstr); } }else{ switch (inCommand) { case cmd_Cut: if(at_least_one_nd_is_sel())outEnabled = true; break; case cmd_Copy: outEnabled = true; break; case cmd_Paste: if(UScrap::HasData('NSel'))outEnabled = true; break; case cmd_Clear: if( at_least_one_nd_is_sel()||at_least_one_arrow_is_sel() )outEnabled = true; break; case cmd_SelectAll: if(num_of_nds!=0)outEnabled = true; break; case cmd_PageSetup: outEnabled = true; break; case cmd_drawing_size: outEnabled = true; break; case cmd_grid_lines: outEnabled = true; outUsesMark = true; outMark = its_has_grid_lines?checkMark:noMark; break; case cmd_FontMenu: if(num_of_nds!=0)outEnabled = true; break; case cmd_SizeMenu: if(num_of_nds!=0)outEnabled = true; break; case cmd_FontOther: outEnabled = true; break; case cmd_show_pi_wind: if(num_of_nds!=0 && run_st==bef_run){ outEnabled=true; } if ( its_pi_wind_p==0 ) { LString::CopyPStr( "\pOpen Node Prior-Info", outName_pstr ); } else { LString::CopyPStr( "\pSELECT Node Prior-Info", outName_pstr ); } break; case cmd_show_bi_nd_wind: if(num_of_nds!=0 && run_st==bef_run){ outEnabled=true; } if ( its_bi_nd_wind_p==0 ) { LString::CopyPStr( "\pOpen Bi-nodes Of Interest", outName_pstr ); } else { LString::CopyPStr( "\pSELECT Bi-nodes Of Interest", outName_pstr ); } break; case cmd_show_nd_probs_wind: if(num_of_nds!=0 && run_st!=bef_run){ outEnabled=true; } if ( its_nd_probs_wind_p==0 ) { LString::CopyPStr( "\pOpen Node Probs.", outName_pstr ); } else { LString::CopyPStr( "\pSELECT Node Probs.", outName_pstr ); } break; case cmd_show_bi_nd_probs_wind: if(num_of_nds!=0 && run_st!=bef_run && its_net_p->get_num_of_bi_nds()!=0){ outEnabled=true; } if ( its_bi_nd_probs_wind_p==0 ) { LString::CopyPStr( "\pOpen Bi-node Probs.", outName_pstr ); } else { LString::CopyPStr( "\pSELECT Bi-node Probs.", outName_pstr ); } break; case cmd_show_stories_wind: if(num_of_nds!=0 && run_st!=bef_run && its_net_p->get_anthology_len()!=0){ outEnabled=true; } if ( its_stories_wind_p==0 ) { LString::CopyPStr( "\pOpen Stories", outName_pstr ); } else { LString::CopyPStr( "\pSELECT Stories", outName_pstr ); } break; default: LCommander::FindCommandStatus(inCommand, outEnabled, outUsesMark, outMark, outName_pstr); break; } } } \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Mac_MainView/C_MAIN_VIEW.h b/Legacy/QFog2-MachO/QFogSource/Mac_MainView/C_MAIN_VIEW.h new file mode 100644 index 0000000..0559afe --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Mac_MainView/C_MAIN_VIEW.h @@ -0,0 +1 @@ +#pragma once #include "QFog_constants.h" #include "C_COLORS.h" #include "QB_NET.h" #include "GLOBAL_FUN.h" #include "C_PORT_RELATED.h" #include "C_PI_WIND.h" #include "C_BI_ND_WIND.h" #include "C_ND_PROBS_WIND.h" #include "C_BI_ND_PROBS_WIND.h" #include "C_STORIES_WIND.h" #include "C_ND_EFIELD.h" #include "UTextMenus.h" #include "C_WIND_BDS_RECO.h" #include "C_ACTION_FLAGS.h" class C_DOC; class C_PALETTE; class SET; //****************************************** class C_MAIN_VIEW : public LView, public LCommander, public LListener, public C_ACTION_FLAGS { protected: C_DOC * its_doc_p; QB_NET * its_net_p; USHORT its_num_of_sel_nds; USHORT its_num_of_sel_arrows; SInt16 its_image_horiz_inches; SInt16 its_image_vert_inches; BOOLEAN its_has_grid_lines; SInt16 its_fnum; //font number SInt16 its_fname_item_num; //font name's item number SInt16 its_fsize; //font size SInt32 its_pane_counter; Point its_pasting_center; LWindow * its_main_wind_p; C_PI_WIND * its_pi_wind_p; C_BI_ND_WIND * its_bi_nd_wind_p; C_ND_PROBS_WIND * its_nd_probs_wind_p; C_BI_ND_PROBS_WIND * its_bi_nd_probs_wind_p; C_STORIES_WIND * its_stories_wind_p; //the document does not possess its own palette but it //does possess its preferred palette bounds C_WIND_BDS_RECO its_pal_bds_reco; C_WIND_BDS_RECO its_pi_wind_bds_reco; C_WIND_BDS_RECO its_bi_nd_wind_bds_reco; C_WIND_BDS_RECO its_nd_probs_wind_bds_reco; C_WIND_BDS_RECO its_bi_nd_probs_wind_bds_reco; C_WIND_BDS_RECO its_stories_wind_bds_reco; public: C_MAIN_VIEW(LStream * inStream); virtual ~C_MAIN_VIEW(); VOID FinishCreateSelf(); VOID set_net_ptr(QB_NET * net_p); VOID get_top_ptrs(C_DOC * & doc_p, C_MAIN_VIEW * & mview_p, QB_NET * & net_p); const C_WIND_BDS_RECO & get_pal_bds_reco() const; VOID set_pal_bds_reco(); VOID read_bounds_res_of_satellite_winds(); VOID write_bounds_res_of_satellite_winds(); BOOLEAN save_pi(); VOID refresh_pi_wind(); VOID refresh_pi_wind(USHORT nd_id); VOID create_pi_wind(USHORT sel_nd); VOID finish_pi_wind_closing(); VOID create_bi_nd_wind(); VOID finish_bi_nd_wind_closing(); VOID create_nd_probs_wind(USHORT sel_nd); VOID finish_nd_probs_wind_closing(); VOID create_bi_nd_probs_wind(USHORT sel_loc); VOID finish_bi_nd_probs_wind_closing(); VOID create_stories_wind(); VOID finish_stories_wind_closing(); SInt16 get_fnum() const; SInt16 get_fsize() const; VOID check_fsize_and_fnum(); SInt16 get_image_horiz_inches(); VOID set_image_horiz_inches(SInt16 num); SInt16 get_image_vert_inches(); VOID set_image_vert_inches(SInt16 num); VOID shift_wind_to_top_left_corner_of_desktop(); VOID set_min_max_and_std_of_wind(BOOLEAN set_bds_to_std); BOOLEAN handle_drawing_size_dialog(); virtual VOID DrawSelf(); VOID disable_nd_efields(); VOID enable_nd_efields(); VOID create_nd_efield(const Point & m_down_pt, USHORT nd_id); VOID destroy_nd_efield( USHORT nd_id); VOID ListenToMessage(MessageT inMessage, VOID * ioParam ); VOID show_story_caps(const VECTOR * net_story_p); C_PORT_NAME get_touched_avail_s_port(const Point & pt); C_PORT_NAME get_touched_avail_d_port(const Point & pt); USHORT get_touched_nd(const Point & pt); C_ARROW * get_touched_ar(const Point & pt); USHORT get_num_of_sel_nds(); BOOLEAN at_least_one_nd_is_sel(); VOID num_of_sel_nds_pp(); VOID num_of_sel_nds_mm(); USHORT get_num_of_sel_arrows(); BOOLEAN at_least_one_arrow_is_sel(); VOID num_of_sel_arrows_pp(); VOID num_of_sel_arrows_mm(); BOOLEAN s_and_d_and_ar_selected(const C_ARROW * ar_p); BOOLEAN s_or_d_or_ar_selected(const C_ARROW * ar_p); VOID select_all(); Boolean unselect_all(); VOID select_nd_and_its_entourage(USHORT nd_id); VOID select_rect_contents(const Rect & rect); VOID move_selection_by(const Point & delta); VOID respond_to_selection_tool(const Point & m_down_pt, Boolean pal_open); Rect get_sel_rect(); VOID get_map_with_sel_last(UI_MAP & map_with_sel_last); VOID make_only_last_nds_selected(USHORT num_of_sel_nds); // VOID get_selected_arrows(SET & sel_ars); // VOID set_selected_arrows(const SET & sel_ars); VOID make_only_first_arrows_selected(USHORT num_of_sel_ars); VOID respond_to_bi_nd_selector(const Point & m_down_pt); VOID respond_to_drag_tool(const Point & m_down_pt); VOID respond_to_open_tool(const Point & m_down_pt); VOID respond_to_no_tool(const Point & m_down_pt); VOID rotate_nd(const Point & m_down_pt); VOID paint_nd(const Point & pt); VOID copy_nd_color(const Point & pt); VOID maybe_add_arrow(const Point & m_down_pt); VOID maybe_change_source_nd_of_ar(const Point & m_down_pt); VOID Click(SMouseDownEvent & inMouseDown); virtual VOID ClickSelf(const SMouseDownEvent & in_mouse_down); virtual VOID AdjustMouseSelf(Point in_port_pt, const EventRecord & in_mac_event, RgnHandle outMouseRgn); VOID translate_pt_from_sel_to_pasting_rect(Point & pt, const Rect & sel_rect); BOOLEAN pasting_should_restore_amps_of(USHORT nd_id); BOOLEAN undeleting_should_restore_amps_of(USHORT nd_id); VOID write_net_stream(LStream & net_stream, NET_STREAM_TYPE stream_type); VOID read_net_stream(LStream & net_stream, NET_STREAM_TYPE stream_type); VOID copy_selection(); VOID paste_clipping(); VOID delete_selection(BOOLEAN sel_is_last); virtual BOOLEAN HandleKeyPress(const EventRecord & in_key_event); virtual BOOLEAN ObeyCommand(CommandT inCommand, VOID * ioParam); virtual VOID FindCommandStatus(CommandT inCommand, BOOLEAN & outEnabled, BOOLEAN & outUsesMark, UInt16 & outMark, Str255 outName_pstr); }; #pragma mark - //****************************************** inline VOID C_MAIN_VIEW::set_net_ptr( QB_NET * net_p) //in { //used only once, in C_DOC constructor its_net_p = net_p; } //****************************************** inline const C_WIND_BDS_RECO & C_MAIN_VIEW::get_pal_bds_reco() const { return its_pal_bds_reco; } //****************************************** inline VOID C_MAIN_VIEW::refresh_pi_wind() { if(its_pi_wind_p!=0)its_pi_wind_p->set_nd_always(); } //****************************************** inline VOID C_MAIN_VIEW::refresh_pi_wind(USHORT nd_id) { if(its_pi_wind_p!=0)its_pi_wind_p->set_nd_always(nd_id); } //****************************************** inline SInt16 C_MAIN_VIEW::get_fnum() const { return its_fnum; } //****************************************** inline SInt16 C_MAIN_VIEW::get_fsize() const { return its_fsize; } //****************************************** inline SInt16 C_MAIN_VIEW::get_image_horiz_inches() { return its_image_horiz_inches; } //****************************************** inline VOID C_MAIN_VIEW::set_image_horiz_inches( SInt16 num) //in { its_image_horiz_inches = num; } //****************************************** inline SInt16 C_MAIN_VIEW::get_image_vert_inches() { return its_image_vert_inches; } //****************************************** inline VOID C_MAIN_VIEW::set_image_vert_inches( SInt16 num) //in { its_image_vert_inches = num; } //****************************************** inline USHORT C_MAIN_VIEW::get_num_of_sel_nds() { return its_num_of_sel_nds; } //****************************************** inline BOOLEAN C_MAIN_VIEW::at_least_one_nd_is_sel() { return (its_num_of_sel_nds > 0); } //****************************************** inline VOID C_MAIN_VIEW::num_of_sel_nds_pp() { its_num_of_sel_nds++; } //****************************************** inline VOID C_MAIN_VIEW::num_of_sel_nds_mm() { SignalIf_(its_num_of_sel_nds==0); its_num_of_sel_nds--; } //****************************************** inline USHORT C_MAIN_VIEW::get_num_of_sel_arrows() { return its_num_of_sel_arrows; } //****************************************** inline BOOLEAN C_MAIN_VIEW::at_least_one_arrow_is_sel() { return (its_num_of_sel_arrows > 0); } //****************************************** inline VOID C_MAIN_VIEW::num_of_sel_arrows_pp() { its_num_of_sel_arrows++; } //****************************************** inline VOID C_MAIN_VIEW::num_of_sel_arrows_mm() { SignalIf_(its_num_of_sel_arrows==0); its_num_of_sel_arrows--; } \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Mac_MainView/C_MVIEW_ACTIONS.cpp b/Legacy/QFog2-MachO/QFogSource/Mac_MainView/C_MVIEW_ACTIONS.cpp new file mode 100644 index 0000000..187849c --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Mac_MainView/C_MVIEW_ACTIONS.cpp @@ -0,0 +1 @@ +#include "C_MVIEW_ACTIONS.h" #include "C_MAIN_VIEW.h" #include "C_DOC.h" /* LAction( ResIDT inStringResID = STRx_RedoEdit, SInt16 inStringIndex = str_RedoUndo, Boolean inAlreadyDone = false); */ //****************************************** C_NET_DEL_OR_CUT_ACTION::C_NET_DEL_OR_CUT_ACTION( USHORT copy_to_scrap, //in C_DOC * doc_p, //in C_MAIN_VIEW * view_p, //in QB_NET * net_p) //in :LAction(my_redo_rid, undel_ind + copy_to_scrap, false), its_copy_to_scrap(copy_to_scrap) { //IMP: we assume that string index for redo_cut is 1 more than that for redo_del set_top_ptrs(doc_p, view_p, net_p); its_num_of_init_sel_arrows = view_p->get_num_of_sel_arrows(); its_init_sel_arrows_are_first = false; its_num_of_init_sel_nds = view_p->get_num_of_sel_nds(); its_mview_p->get_map_with_sel_last(its_map_with_sel_last); its_net_p->reorder_nds(its_map_with_sel_last); its_init_sel_nds_are_last = true; LHandleStream net_stream; its_mview_p->write_net_stream(net_stream, undel_reco);//write_net //detach handle so ~LHandleStream() doesn't destroy it its_undel_reco_h = net_stream.DetachDataHandle(); //create_h: PP creates its_undel_reco_h in DetachDataHandle() with call to ::NewHandle(). //throwif_h: PP throwifs upon creation. //destroy_h: I destroy its_undel_reco_h in ~C_NET_DEL_OR_CUT_ACTION(). if(its_copy_to_scrap==1)its_mview_p->copy_selection(); its_mview_p->set_is_modified(false, mview_del); } //****************************************** C_NET_DEL_OR_CUT_ACTION::~C_NET_DEL_OR_CUT_ACTION() { DisposeHandle_(its_undel_reco_h); } //****************************************** BOOLEAN C_NET_DEL_OR_CUT_ACTION::CanRedo() const { BOOLEAN can_redo = false; if( mIsDone==false && its_mview_p->IsOnDuty() && !its_mview_p->is_modified(mview_del) ){ can_redo = true; } return can_redo; } //****************************************** BOOLEAN C_NET_DEL_OR_CUT_ACTION::CanUndo() const { BOOLEAN can_undo = false; if( mIsDone==true && its_mview_p->IsOnDuty() && !its_mview_p->is_modified(mview_del) ){ can_undo = true; } return can_undo; } //****************************************** VOID C_NET_DEL_OR_CUT_ACTION::RedoSelf() { //This function is called both for first and //subsequent deletes. //If this is called as a consequence of pressing Delete, //selected nodes are last at this point //(because the action's creator reordered net so). //But if it is called as a consequence of pressing Redo Delete, //selected nodes will in general not be last //(because UndoSelf() reordered net so). if(!its_init_sel_nds_are_last){ its_net_p->reorder_nds(its_map_with_sel_last); its_init_sel_nds_are_last = true; //undo any selection done from previous undo to this redo its_mview_p->make_only_last_nds_selected(its_num_of_init_sel_nds); } //If this is called as a consequence of pressing Delete, //selected arrows are not necessarily first at this point. //But if it is called as a consequence of pressing Redo Delete, //selected arrows will be first //(because UndoSelf() restored them at the beginning of //the linked list QB_NET::its_arrows). if(its_init_sel_arrows_are_first){ its_mview_p->make_only_first_arrows_selected(its_num_of_init_sel_arrows); } its_mview_p->delete_selection(true);//calls Refresh() for main view its_mview_p->set_is_modified(false, mview_del); } //****************************************** VOID C_NET_DEL_OR_CUT_ACTION::UndoSelf() { //if(its_copy_to_scrap==1)ThrowIfOSErr_(::ZeroScrap()); //better to zero scrap only immediately before writing new stuff to it. LHandleStream net_stream(its_undel_reco_h); its_mview_p->read_net_stream(net_stream, undel_reco);//read_net its_init_sel_arrows_are_first = true; UI_MAP inv_map; its_map_with_sel_last.get_inverse(inv_map); its_net_p->reorder_nds(inv_map); its_init_sel_nds_are_last = false; //Important: this makes the main view the initial target //rather than some node efield LCommander::SwitchTarget((LCommander *)its_mview_p);//edit field is target if don't include this. its_mview_p->Refresh(); its_mview_p->refresh_pi_wind(0); //detach handle so ~LHandleStream() doesn't destroy it its_undel_reco_h = net_stream.DetachDataHandle(); its_mview_p->set_is_modified(false, mview_del); } \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Mac_MainView/C_MVIEW_ACTIONS.h b/Legacy/QFog2-MachO/QFogSource/Mac_MainView/C_MVIEW_ACTIONS.h new file mode 100644 index 0000000..7a80bac --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Mac_MainView/C_MVIEW_ACTIONS.h @@ -0,0 +1 @@ +//uaction = undoing action //init = initially #include "C_TOP_PTRS.h" #include "UI_MAP.h" #include "SET.h" #pragma once //****************************************** class C_NET_DEL_OR_CUT_ACTION: public LAction, public C_TOP_PTRS { protected: USHORT its_copy_to_scrap; //0 if no, 1 if yes UI_MAP its_map_with_sel_last; USHORT its_num_of_init_sel_nds; BOOLEAN its_init_sel_nds_are_last; USHORT its_num_of_init_sel_arrows; BOOLEAN its_init_sel_arrows_are_first; //undel_reco = long record of selection, used for del followed by undel Handle its_undel_reco_h; public: C_NET_DEL_OR_CUT_ACTION(USHORT copy_to_scrap, C_DOC * doc_p, C_MAIN_VIEW * view_p, QB_NET * net_p); virtual ~C_NET_DEL_OR_CUT_ACTION(); virtual Boolean CanRedo() const; virtual Boolean CanUndo() const; virtual void RedoSelf(); virtual void UndoSelf(); }; \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Mac_MainView/C_ND_EFIELD.cpp b/Legacy/QFog2-MachO/QFogSource/Mac_MainView/C_ND_EFIELD.cpp new file mode 100644 index 0000000..002b9c7 --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Mac_MainView/C_ND_EFIELD.cpp @@ -0,0 +1 @@ +#include "C_ND_EFIELD.h" #include "C_MAIN_VIEW.h" #include "StCPTstate.h" #pragma mark --creation/destruction-- //****************************************** C_ND_EFIELD::C_ND_EFIELD( LStream * inStream) //in :LEditField(inStream) {} //****************************************** C_ND_EFIELD::C_ND_EFIELD() {} //****************************************** C_ND_EFIELD::~C_ND_EFIELD() {} //****************************************** C_ND_EFIELD::C_ND_EFIELD( const SPaneInfo & inPaneInfo, Str255 in_pstr, ResIDT inTextTraitsID, SInt16 inMaxChars, BOOLEAN inHasBox, BOOLEAN inHasWordWrap, TEKeyFilterFunc inKeyFilter, LCommander * inSuper) :LEditField( inPaneInfo, in_pstr, inTextTraitsID, inMaxChars, inHasBox, inHasWordWrap, inKeyFilter, inSuper) {} //****************************************** VOID C_ND_EFIELD::FinishCreateSelf() { //The default number of characters for an LEditfield //created from the stream is //is sizeof(SInt16) = 16. Change this to 31: SetMaxChars(31); C_MAIN_VIEW * view_p = (C_MAIN_VIEW *)GetSuperView(); TextTraitsH text_traits_h = UTextTraits::LoadTextTraits(node_txt_rid);//not destroyed by PP //create_h: PP creates text_traits_h with a call to ::GetResource(). //throwif_h: PP calls SignalIfNil immediately after creation. //destroy_h: PP does NOT release text_traits_h resource. // I delete it below, in this method ThrowIfNil_(text_traits_h); //about mTextEditH //create_h: PP creates mTextEditH in LEditField() with call to ::TENew(). //throwif_h: PP does not call throwif immediately after creation. //destroy_h: PP destroys mTextEditH in ~LEditField() with call to ::TEDispose(mTextEditH). ThrowIfNil_(mTextEditH); (**text_traits_h).fontNumber = view_p->get_fnum(); (**text_traits_h).size = view_p->get_fsize(); ::HLock((Handle)text_traits_h);//no need to save handle state as will be destroying handle soon UTextTraits::SetTETextTraits( *text_traits_h, mTextEditH ); ReleaseResource_((Handle)text_traits_h); UserChangedText(); //If I don't give an undoer to each C_ND_EFIELD, //it will post its actions at the undoer of C_MAIN_VIEW. //This produces a bug if you edit a C_ND_EFIELD, //and then you try to delete the node with that efield. //The bug is that undoing the node deletion is not permitted. LUndoer * undoer_p = new LUndoer; //delete: PP deletes undoer_p via // ~C_ND_EFIELD->~LPane() // ->~LAttachable()->LAttachable::RemoveAllAttachments(). ThrowIfNil_(undoer_p); AddAttachment(undoer_p); } #pragma mark --font-- //****************************************** VOID C_ND_EFIELD::set_fnum( SInt16 fnum) //in { //one needs to do more than just set (**mTextEditH).txFont = fnum; //Let UTextTraits::SetTETextTraits do the extra stuff. TextTraitsH text_traits_h = UTextTraits::LoadTextTraits( node_txt_rid );//not destroyed by PP //create_h: PP creates text_traits_h with a call to ::GetResource(). //throwif_h: PP calls SignalIfNil immediately after creation. //destroy_h: PP does NOT release text_traits_h resource. // I delete it below, in this method ThrowIfNil_(text_traits_h); (**text_traits_h).fontNumber = fnum; (**text_traits_h).size = (**mTextEditH).txSize; ::HLock((Handle)text_traits_h);//no need to save handle state as will be destroying handle soon UTextTraits::SetTETextTraits( *text_traits_h, mTextEditH ); ReleaseResource_((Handle)text_traits_h); UserChangedText(); } //****************************************** VOID C_ND_EFIELD::set_fsize( SInt16 fsize) //in { //one needs to do more than just set (**mTextEditH).txSize = fsize; //Let UTextTraits::SetTETextTraits do the extra stuff. TextTraitsH text_traits_h = UTextTraits::LoadTextTraits( node_txt_rid );//not destroyed by PP //create_h: PP creates text_traits_h with a call to ::GetResource(). //throwif_h: PP calls SignalIfNil immediately after creation. //destroy_h: PP does NOT release text_traits_h resource. // I delete it below, in this method. ThrowIfNil_(text_traits_h); (**text_traits_h).fontNumber = (**mTextEditH).txFont; (**text_traits_h).size = fsize; ::HLock((Handle)text_traits_h);//no need to save handle state as will be destroying handle soon UTextTraits::SetTETextTraits( *text_traits_h, mTextEditH ); ReleaseResource_((Handle)text_traits_h); UserChangedText(); } #pragma mark --about sizes (const functions)-- //****************************************** SInt16 C_ND_EFIELD::get_TE_width() const {// this function was inspired by LEditField::AdjustTextWidth() Point startPoint = ::TEGetPoint(0, mTextEditH); Point endPoint = ::TEGetPoint((**mTextEditH).teLength, mTextEditH); return endPoint.h - startPoint.h; } //****************************************** VOID C_ND_EFIELD::calc_state_cap_frame( Rect & frame) //out const { //The rectangle that is returned will have zero width. //This function is used in NODE::draw_state_cap(). CalcLocalFrameRect(frame); frame.left = frame.left + (frame.right - frame.left)/2; frame.right = frame.left; SInt16 height = frame.bottom - frame.top; frame.top = frame.bottom; frame.bottom = frame.top + height; } #pragma mark --drawing it-- //****************************************** VOID C_ND_EFIELD::UserChangedText() { SDimension16 frame_size; GetFrameSize(frame_size); SInt16 delta_width = get_TE_width() + 2*left_margin - frame_size.width; SInt16 delta_height = 2*get_TE_height() - get_TE_ascent() + 2 - frame_size.height; ResizeFrameBy(delta_width, delta_height, true); //both refreshes are necessary in case box is shrinking MoveBy(-delta_width/2, 0, true); } //****************************************** VOID C_ND_EFIELD::DrawBox() { //drawer //NONTRIVIAL EXCERPT FROM PP //This method takes out some parts from the //method it overrides // Box around an EditField is outset from the Text by 2 pixels. // The box itself is 1 pixel thick, drawn in the foreground color // of the Pane (not necessarily the same as the text color). If // the EditField is disabled, the box draws with a gray pattern. // // The 1 pixel rectangle between the box and the text draws in // the background color of the text. // StColorState saveColors; // Preserve color state StCPTstate saved_st(true, true, false);//diff // Preserve color and pen state Rect frame; CalcLocalFrameRect(frame); ::PenNormal(); // Draw empty area between Box and Text. On entry, the fore // and back colors for the Text are in effect (as set in FocusDraw). // Use Text back color as the fore color for the empty area. ::InsetRect(&frame, 1, 1); RGBColor emptyColor; ::GetBackColor(&emptyColor); ::RGBForeColor(&emptyColor); ::FrameRect(&frame); // Draw border around EditField ::InsetRect(&frame, -1, -1); //Don't want gray box for disabled case. // if (mEnabled != triState_On) { // Disabled EditField has gray border // ::PenPat(&UQDGlobals::GetQDGlobals()->gray); // } ApplyForeAndBackColors(); ::FrameRect(&frame); } //****************************************** VOID C_ND_EFIELD::undraw() {//drawer GetSuperView()->FocusDraw(); Rect frame; CalcLocalFrameRect(frame); // ::EraseRect(&frame); //this works but not as well as what follows // ref. LEditField::DrawSelf(), LEditField::Drawbox() StCPTstate saved_st(true, true, false); saved_st.Normalize(); ::RGBForeColor(&C_COLORS::its_white); if (mHasBox) { ::FrameRect(&frame); ::InsetRect(&frame, 2, 2); } ::TEUpdate(&frame, mTextEditH); } //****************************************** VOID C_ND_EFIELD::EnableSelf() { //NONTRIVIAL EXCERPT FROM PP //This method takes out some parts from the //method it overrides // if (mHasBox && FocusExposed()) { // DrawBox(); // } } //****************************************** VOID C_ND_EFIELD::DisableSelf() { //NONTRIVIAL EXCERPT FROM PP //This method takes out some parts from the //method it overrides if (IsOnDuty()) { // Shouldn't be on duty when disabled SwitchTarget(GetSuperCommander()); } //if (mHasBox && FocusExposed()) { // DrawBox(); //} } #pragma mark --spend time broadcasting-- //****************************************** VOID C_ND_EFIELD::SpendTime( const EventRecord & inMacEvent ) //in { LEditField::SpendTime(inMacEvent); BroadcastMessage(msg_mv_nd_efield, this); } \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Mac_MainView/C_ND_EFIELD.h b/Legacy/QFog2-MachO/QFogSource/Mac_MainView/C_ND_EFIELD.h new file mode 100644 index 0000000..e0dffad --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Mac_MainView/C_ND_EFIELD.h @@ -0,0 +1 @@ +#pragma once #include "QFog_constants.h" //****************************************** class C_ND_EFIELD : public LEditField, public LBroadcaster { protected: USHORT its_nd; enum { left_margin = 5}; // left and right margins will be the same // PowerPlant sets top_magin sets equal to height -ascent public: C_ND_EFIELD(LStream * inStream); C_ND_EFIELD(); virtual ~C_ND_EFIELD(); C_ND_EFIELD( const SPaneInfo & inPaneInfo, Str255 in_pstr, ResIDT inTextTraitsID, SInt16 inMaxChars, BOOLEAN inHasBox, BOOLEAN inHasWordWrap, TEKeyFilterFunc inKeyFilter, LCommander * inSuper); VOID FinishCreateSelf(); USHORT get_nd(); VOID set_nd_always(USHORT nd); SInt16 get_fnum(); VOID set_fnum(SInt16 fnum); SInt16 get_font_size(); VOID set_fsize(SInt16 fsize); SInt16 get_TE_width() const; SInt16 get_TE_height() const; SInt16 get_TE_ascent() const; VOID calc_state_cap_frame(Rect & frame) const; VOID UserChangedText(); VOID DrawBox(); VOID undraw(); VOID EnableSelf(); VOID DisableSelf(); VOID SpendTime( const EventRecord & inMacEvent ); }; #pragma mark - //****************************************** inline USHORT C_ND_EFIELD::get_nd() { return its_nd; } //****************************************** inline VOID C_ND_EFIELD::set_nd_always( USHORT nd) //in { its_nd= nd; } //****************************************** inline SInt16 C_ND_EFIELD::get_fnum() { return (**mTextEditH).txFont; } //****************************************** inline SInt16 C_ND_EFIELD::get_font_size() { return (**mTextEditH).txSize; } //****************************************** inline SInt16 C_ND_EFIELD::get_TE_height() const { return (**mTextEditH).lineHeight; } //****************************************** inline SInt16 C_ND_EFIELD::get_TE_ascent() const { return (**mTextEditH).fontAscent; } \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Mac_MainView/C_PORT_RELATED.cpp b/Legacy/QFog2-MachO/QFogSource/Mac_MainView/C_PORT_RELATED.cpp new file mode 100644 index 0000000..0a4b6b1 --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Mac_MainView/C_PORT_RELATED.cpp @@ -0,0 +1 @@ +#include "C_PORT_RELATED.h" #pragma mark ----C_CIRCLE---- #pragma mark --creation/destruction-- //****************************************** C_CIRCLE::C_CIRCLE() {} //****************************************** C_CIRCLE::C_CIRCLE( const Point & pt, //in USHORT rad) //in :its_center(pt), its_radius(rad) {} #pragma mark --const functions-- //****************************************** BOOLEAN C_CIRCLE::intersects_rect( const Rect & rect) //in const { Rect bigger_rect = rect; ::InsetRect(&bigger_rect, -its_radius, -its_radius); return ::PtInRect(its_center, &bigger_rect); } #pragma mark ----C_PORT_NAME---- #pragma mark --creation/destruction-- //****************************************** C_PORT_NAME::C_PORT_NAME() {} //****************************************** C_PORT_NAME::C_PORT_NAME( USHORT nd_id, //in USHORT sub_nd_id) //in :its_nd_id(nd_id), its_sub_nd_id(sub_nd_id) {} #pragma mark --i/o-- //****************************************** LStream & operator<<( LStream & out_bd, //i-o const C_PORT_NAME & pn) //in { //out_bd= out bound, headed out of cpu out_bd << pn.its_nd_id << pn.its_sub_nd_id; return out_bd; } //****************************************** LStream & operator>> ( LStream & in_bd, //i-o C_PORT_NAME & pn) //in { in_bd >> pn.its_nd_id >> pn.its_sub_nd_id; return in_bd; } \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Mac_MainView/C_PORT_RELATED.h b/Legacy/QFog2-MachO/QFogSource/Mac_MainView/C_PORT_RELATED.h new file mode 100644 index 0000000..c89931c --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Mac_MainView/C_PORT_RELATED.h @@ -0,0 +1 @@ +#pragma once #include "QFog_constants.h" //****************************************** class C_CIRCLE { public: Point its_center; SInt16 its_radius; C_CIRCLE(); C_CIRCLE(const Point & pt, USHORT rad); BOOLEAN pt_is_in(const Point & pt) const; BOOLEAN intersects_rect(const Rect & rect) const; }; //****************************************** /* An s (source) port shoots arrows. A d (destination) port is a target for arrows. An s/d ports is both an s port and a d port. It belongs to the intersection of the set of s and d ports. What constitutes a port: (1) its_center = the location (a Point) of the customs office, which lies at the center of the port. (2) If the port is a d port: its_arriving_nds = A list of the nd_ids for all the arriving nodes. its_cur_s_load = the current number of arriving nodes its_max_s_load (2) If the port is an s port: its_departing_nds = A list of the nd_id's for all the departing nodes. its_cur_d_load = the current number of departing nodes its_max_d_load (3)its_docking_rad = arrow docking radius (4)its_greeting_rad = arrow greeting radius = radius of circle inside of which port notices ships and greets them. If port is an object of C_PORT, then cir = C_CIRCLE(port.its_center, port.its_docking_rad) will be referred to as a docking circle and cir = C_CIRCLE(port.its_center, port.its_greeting_rad) will be referred to as a greeting circle. For the custom node, for example, we will assume that there is an s/d port which can carry s and d loads of any size. For the BEAM_SPL, on the other hand, we will assume that there are two s-only ports and two d-only ports, each of which can carry a maximum load of one. */ //****************************************** class C_PORT_NAME { public: USHORT its_nd_id; // node id number USHORT its_sub_nd_id; //numerical id distinguishing the ports of that node C_PORT_NAME(); C_PORT_NAME(USHORT nd_id, USHORT sub_nd_id); friend BOOLEAN operator==(const C_PORT_NAME & pn1, const C_PORT_NAME & pn2); friend BOOLEAN operator!=(const C_PORT_NAME & pn1, const C_PORT_NAME & pn2); friend LStream & operator<<( LStream & out_bd, const C_PORT_NAME & pn); friend LStream & operator>>( LStream & in_bd, C_PORT_NAME & pn); }; #pragma mark - #pragma mark ----C_CIRCLE---- //****************************************** inline BOOLEAN C_CIRCLE::pt_is_in( const Point & pt) //in const { return( sqrt( pow(DOUBLE(pt.h - its_center.h), 2) + pow(DOUBLE(pt.v - its_center.v), 2) ) <= its_radius ); } #pragma mark ----C_PORT_NAME---- //****************************************** inline BOOLEAN operator==( const C_PORT_NAME & pn1, //in const C_PORT_NAME & pn2) //in { return( (pn1.its_nd_id == pn2.its_nd_id)&& (pn1.its_sub_nd_id == pn2.its_sub_nd_id) ); } //****************************************** inline BOOLEAN operator!=( const C_PORT_NAME & pn1, //in const C_PORT_NAME & pn2) //in { return !(pn1==pn2); } \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Mac_NdProbs/.DS_Store b/Legacy/QFog2-MachO/QFogSource/Mac_NdProbs/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..5008ddfcf53c02e82d7eee2e57c38e5672ef89f6 GIT binary patch literal 6148 zcmeH~Jr2S!425mzP>H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0get_nd_ptr(its_nd); switch(inCell.col){ case 1: ::TextFont(systemFont); if(nd_p->is_active_state(inCell.row -1)){ str= "\p*"; }else{ str = "\p"; } break; case 2: ::TextFont(systemFont); // ::TextFace(bold); nd_p->get_st_name(inCell.row-1).fill_LStr255(str); trunc_pstr_so_it_fits(str, GetColWidth(inCell.col), 8); break; case 3: ::TextFont(systemFont); num = nd_p->get_cum_prob(inCell.row-1); str.Assign(num, FIXEDDECIMAL, 6); break; } ::DrawString(str); draw_cell_frame(inLocalRect);//see GLOBAL_FUN.h } #pragma mark --about many cells-- //****************************************** VOID C_ND_PROBS_TABLE::set_nd_always( USHORT nd_id) //in { its_nd = nd_id; UInt32 num_of_rows, num_of_cols; GetTableSize(num_of_rows, num_of_cols); if(num_of_rows != 0){ RemoveRows( num_of_rows, //how many 1, //starting with row true);//refresh } num_of_rows = its_net_p->get_nd_ptr(its_nd)->get_degen(); InsertRows( num_of_rows,//how many 0, //after which row 0, //data pointer 0, //data size true); //refresh Refresh(); } \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Mac_NdProbs/C_ND_PROBS_TABLE.h b/Legacy/QFog2-MachO/QFogSource/Mac_NdProbs/C_ND_PROBS_TABLE.h new file mode 100644 index 0000000..726dadb --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Mac_NdProbs/C_ND_PROBS_TABLE.h @@ -0,0 +1 @@ +#pragma once #include "QFog_constants.h" #include "C_TOP_PTRS.h" //****************************************** class C_ND_PROBS_TABLE : public LTableView, public C_TOP_PTRS { private: USHORT its_nd; public: C_ND_PROBS_TABLE(LStream * inStream); C_ND_PROBS_TABLE(); virtual ~C_ND_PROBS_TABLE(); VOID DrawCell(const STableCell & inCell, const Rect & inLocalRect); VOID set_nd_always(USHORT nd_id); VOID set_nd_if_diff(USHORT nd_id); }; #pragma mark - //****************************************** inline VOID C_ND_PROBS_TABLE::set_nd_if_diff( USHORT nd_id) //in { if(nd_id!=its_nd) set_nd_always(nd_id); } \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Mac_NdProbs/C_ND_PROBS_WIND.cpp b/Legacy/QFog2-MachO/QFogSource/Mac_NdProbs/C_ND_PROBS_WIND.cpp new file mode 100644 index 0000000..13d2218 --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Mac_NdProbs/C_ND_PROBS_WIND.cpp @@ -0,0 +1 @@ +#include "C_ND_PROBS_WIND.h" #include "C_MAIN_VIEW.h" #include "C_ND_PROBS_TABLE.h" #include "QB_NET.h" #include "EXCEPTIONS.h" #pragma mark --creation/destruction-- //****************************************** C_ND_PROBS_WIND::C_ND_PROBS_WIND( LStream * inStream) //in :LWindow(inStream), its_nd(0) {} //****************************************** C_ND_PROBS_WIND::C_ND_PROBS_WIND() :its_nd(0) {} //****************************************** C_ND_PROBS_WIND::~C_ND_PROBS_WIND() { its_mview_p->finish_nd_probs_wind_closing(); } //****************************************** VOID C_ND_PROBS_WIND::init_popup() { MenuHandle menu_h = its_popup_p->GetMacMenuH(); //destroy_h: by PP ThrowIfNil_(menu_h); // dummy item must be cleared SInt16 num_of_items = ::CountMenuItems(menu_h); for(SInt16 menu_item =1; menu_item<= num_of_items; menu_item++){ ::DeleteMenuItem(menu_h, 1); } NODE * nd_p; for(USHORT nd=0; nd < its_net_p->get_num_of_nds(); nd++){ nd_p = its_net_p->get_nd_ptr(nd); // Add the item // Insert a dummy item, then rename it so special chars are not a problem ::AppendMenu(menu_h, "\pdummy"); LStr255 descriptor_pstr; nd_p->get_name().fill_LStr255(descriptor_pstr); if(descriptor_pstr[0]!=0)::SetMenuItemText( menu_h, nd+1 , descriptor_pstr ); } its_popup_p->SetMinValue(1); its_popup_p->SetMaxValue(its_net_p->get_num_of_nds()); its_popup_p->StopBroadcasting(); its_popup_p->SetValue(1); its_popup_p->StartBroadcasting(); } //****************************************** VOID C_ND_PROBS_WIND::show_owner( const LStr255 & file_name) //in { LStr255 cap = "\pProject: "; cap += (LStr255)file_name; its_owner_cap_p->SetDescriptor(cap); } //****************************************** VOID C_ND_PROBS_WIND::special_finish_create( const LStr255 & file_name, //in USHORT sel_nd) //in { its_owner_cap_p =(LCaption *)FindPaneByID(nd_probs_owner_cap_rid); its_info_cap_p = (LCaption *)FindPaneByID(nd_probs_info_cap_rid); its_popup_p = (LPopupButton *)FindPaneByID(nd_probs_popup_rid); its_first_but_p =(LStdButton *)FindPaneByID(nd_probs_first_but_rid); its_next_but_p =(LStdButton *)FindPaneByID(nd_probs_next_but_rid); its_table_p = (C_ND_PROBS_TABLE *)FindPaneByID(nd_probs_table_rid); // Activate RidL resource. UReanimator::LinkListenerToControls(this, this, nd_probs_wind_ridl); //its SuperCommander is defined in C_MAIN_VIEW::create_nd_probs_wind() ((C_MAIN_VIEW *)GetSuperCommander())->get_top_ptrs(its_doc_p, its_mview_p, its_net_p); // sub-pane initializations that do not depend on sel_nd show_owner(file_name); init_popup(); its_table_p->set_top_ptrs(its_doc_p, its_mview_p, its_net_p); // initializations that depend on sel_nd set_nd_always(sel_nd); Show();//necessary! } #pragma mark --focus node-- //****************************************** VOID C_ND_PROBS_WIND::refresh_info_cap() { NODE * nd_p = its_net_p->get_nd_ptr(its_nd); USHORT degen = nd_p->get_degen(); DOUBLE prob = 0; DOUBLE info = 0; for(USHORT j=0; jget_cum_prob(j); if(prob>probs_floor) info -= prob*log(prob)/nat_log_of_2; } LStr255 str; str.Assign(info, FIXEDDECIMAL, 6); its_info_cap_p->SetDescriptor(str); } //****************************************** VOID C_ND_PROBS_WIND::set_nd_always( USHORT new_nd) //in { its_nd =new_nd; its_popup_p->StopBroadcasting(); its_popup_p->SetValue(new_nd + 1); its_popup_p->StartBroadcasting(); refresh_info_cap(); its_table_p->set_nd_always(new_nd); } #pragma mark --buttons: response center-- //****************************************** VOID C_ND_PROBS_WIND::ListenToMessage( MessageT inMessage, //in VOID * ioParam ) //i-o { //MONITOR_THE_CHANGE_HERE USHORT new_item_num; USHORT num_of_items = its_net_p->get_num_of_nds(); switch ( inMessage ) { case msg_nd_probs_popup: // for nd_popup: inMessage = pane id, *ioParam = current item new_item_num = *((SInt32 *)ioParam); set_nd_if_diff(new_item_num - 1); break; case msg_nd_probs_first_but: set_nd_if_diff(0); break; case msg_nd_probs_next_but: if(its_nd + 1 1Do z&3?R)on0d0^?P$ev?8J&(duAnO=gYN(|*dZ6ctf&OEYto@R1vEG^< z>F4?@O7zlnb*ges*xnp%*SFVI$`x3mq}pBTK13GS%mll>>r;N+gY`MjZ0mjYImWLc ziw_G0LV-{q6bJ>5RKS80EiaDr3wkIJ3Y@+Iay}GDf~DhNs7D7feF6Z#Z=xvc4H#H} zD!!%TV2BnNn=8;<*`FBf7iczj^q0;b49%TbXT~@_^Z0mSzkhR~bmG!5@=zcYI8@-= zsw;{ATl`Anv+|G?wNM}wIAsNRvAN%@u|toozxFDzwm^D95) max_num_of_act_types); } //****************************************** VOID C_ACTION_FLAGS::set_is_modified( BOOLEAN is_mod) //in { for(USHORT i=0; i< its_num_of_act_types; i++){ its_is_modified[i] = is_mod; } //For is_mod==true, could say PostAction(0) here. } \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Mac_Other/C_ACTION_FLAGS.h b/Legacy/QFog2-MachO/QFogSource/Mac_Other/C_ACTION_FLAGS.h new file mode 100644 index 0000000..9534c84 --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Mac_Other/C_ACTION_FLAGS.h @@ -0,0 +1 @@ +#pragma once #include "QFog_constants.h" //act = action //This class should be used as a mixin with any class X that //hosts an LUndoer attachment. This class provides //a Boolean flag is_modified for each possible LAction of X. //In QFog_constants.h, define an index for each action of X. //The indices must be consecutive integers starting at 0. //****************************************** class C_ACTION_FLAGS { protected: BOOLEAN its_is_modified[max_num_of_act_types]; USHORT its_num_of_act_types; public: C_ACTION_FLAGS(USHORT num_of_actions); BOOLEAN is_modified(USHORT act_type) const; VOID set_is_modified(BOOLEAN is_mod, USHORT act_type); VOID set_is_modified(BOOLEAN is_mod); }; #pragma mark - //****************************************** inline BOOLEAN C_ACTION_FLAGS::is_modified( USHORT act_type) //in const { SignalIf_(act_type >= its_num_of_act_types); return its_is_modified[act_type]; } //****************************************** inline VOID C_ACTION_FLAGS::set_is_modified( BOOLEAN is_mod, //in USHORT act_type) //in { SignalIf_(act_type >= its_num_of_act_types); its_is_modified[act_type] = is_mod; //For is_mod==true, could say PostAction(0) here. } \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Mac_Other/C_HOST_VIEW.cpp b/Legacy/QFog2-MachO/QFogSource/Mac_Other/C_HOST_VIEW.cpp new file mode 100644 index 0000000..d6cb232 --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Mac_Other/C_HOST_VIEW.cpp @@ -0,0 +1 @@ +// Class which controls the loading and disposing of a subpane. #include "C_HOST_VIEW.h" #include #include #include #include #pragma mark --creation/destruction-- //---------------------------------------------------------------------------------------- // Default constructor C_HOST_VIEW::C_HOST_VIEW() : mCurrentIncludedPane(nil), mPaneID(PaneIDT_Undefined) { } //---------------------------------------------------------------------------------------- // Does shallow copy; SubPanes are not copied. C_HOST_VIEW::C_HOST_VIEW( const C_HOST_VIEW & inOriginal) //in : LView(inOriginal), mCurrentIncludedPane(nil) { mPaneID = inOriginal.mPaneID; } //---------------------------------------------------------------------------------------- // create C_HOST_VIEW from the passed in data C_HOST_VIEW::C_HOST_VIEW( const SPaneInfo & inPaneInfo, //in const SViewInfo & inViewInfo, //in ResIDT inStartingPane) //in : LView(inPaneInfo, inViewInfo), mCurrentIncludedPane(nil) { mPaneID = inStartingPane; } //---------------------------------------------------------------------------------------- // create an IncludeView from the data in the stream C_HOST_VIEW::C_HOST_VIEW( LStream * inStream) //in : LView(inStream), mCurrentIncludedPane(nil) { //instead of having a custom pane that loads mPaneID initially, //we will just assume mPaneID is undefined. // inStream->ReadData(&mPaneID, sizeof(ResIDT)); mPaneID = PaneIDT_Undefined; } //---------------------------------------------------------------------------------------- // Destructor C_HOST_VIEW::~C_HOST_VIEW() { } //---------------------------------------------------------------------------------------- // When the creation process is compelete, we need to read in the subpane we've been asked to // include initially. We do this now because everything has settled down from the creation // process and everything else is fully constructed. void C_HOST_VIEW::FinishCreateSelf() { if(mPaneID != PaneIDT_Undefined)LoadSubPane(); } #pragma mark --subpane management-- //---------------------------------------------------------------------------------------- // remove the subpane from our subpane list and free it. void C_HOST_VIEW::DisposeSubPane() { delete mCurrentIncludedPane; mCurrentIncludedPane = nil; mPaneID = PaneIDT_Undefined; } //---------------------------------------------------------------------------------------- // Load in a subpane from a a PPob resource, add it to our subpane list and initialize it // as if it was being read in at window creation time void C_HOST_VIEW::LoadSubPane() { LView *defaultView = LPane::GetDefaultView(); LPane::SetDefaultView(this); mCurrentIncludedPane = (LPane*)UReanimator::ReadObjects('PPob', mPaneID); LPane::SetDefaultView(defaultView); mCurrentIncludedPane->FinishCreate(); } //---------------------------------------------------------------------------------------- // This function is called when a pane is to be read in from a PPob resource and added as // this view's subpane. void C_HOST_VIEW::ResetSubPane( ResIDT inPaneID, Boolean inRefresh) //in { if(inPaneID == mPaneID){ if(inRefresh)Refresh(); }else{ //inPaneID != mPaneID if(mCurrentIncludedPane != nil)DisposeSubPane(); // Prevent List and Control Managers from automatically drawing by setting // an empty clipping region StClipRgnState saveClip(nil); mPaneID = inPaneID; LoadSubPane(); if(inRefresh)Refresh(); } } \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Mac_Other/C_HOST_VIEW.h b/Legacy/QFog2-MachO/QFogSource/Mac_Other/C_HOST_VIEW.h new file mode 100644 index 0000000..279f446 --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Mac_Other/C_HOST_VIEW.h @@ -0,0 +1 @@ +//This class, with some minor modifications, is called CIncludeView.h //by Mike Shields. ët comes with his Multi-Panel Dialogs library. // =========================================================================== // File: CIncludeView.h // Version: 1.0 - Feb 1, 1996 // Author: Mike Shields (mshields@inconnect.com) // // Copyright ©1996 Mike Shields. All rights reserved. // =========================================================================== // CIncludeView.cp <- double-click + Command-D to see class declaration // // Class which controls the loading and disposing of a subpane. #pragma once #include #include class C_HOST_VIEW : public LView { public: C_HOST_VIEW(); C_HOST_VIEW(const C_HOST_VIEW & inOriginal); C_HOST_VIEW(const SPaneInfo & inPaneInfo, const SViewInfo & inViewInfo, ResIDT inStartingPane); C_HOST_VIEW(LStream * inStream); virtual ~C_HOST_VIEW(); // virtual void FinishCreateSelf(void); // virtual void DisposeSubPane(void); // virtual void LoadSubPane(void); virtual void ResetSubPane(ResIDT inPaneID, Boolean inRefresh); protected: virtual void FinishCreateSelf(void); virtual void DisposeSubPane(void); virtual void LoadSubPane(void); ResIDT mPaneID; LPane * mCurrentIncludedPane; }; \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Mac_Other/C_KEYS.cpp b/Legacy/QFog2-MachO/QFogSource/Mac_Other/C_KEYS.cpp new file mode 100644 index 0000000..c8c131c --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Mac_Other/C_KEYS.cpp @@ -0,0 +1 @@ +#include "C_KEYS.h" //****************************************** /* Below code comes from TCL 1.1.3. For examples of its use, see Art Class. keycodes: shift_key = 0x38, control_key = 0x3B, option_key=0x3A, command_key = 0X37, space_bar= 0x31; For other keycodes, see Think Reference under "Extended Keyboard". An alternative way of detecting cmdKey: if ( (thisEvent->modifiers & cmdKey) == cmdKey) ) */ //****************************************** // KeyIsDown // // Determine whether or not the specified key is being pressed. Keys // are specified by hardware-specific key code (NOT the character). //****************************************** BOOLEAN C_KEYS::KeyIsDown( SHORT theKeyCode)//in { KeyMap theKeys; ::GetKeys( theKeys); // Get state of each key /* Ordering of bits in a KeyMap is truly bizarre. A KeyMap is a 16-byte (128 bits) array where each bit specifies the start of a key (0 = up, 1 = down). We isolate the bit for the specified key code by first determining the byte position in the KeyMap and then the bit position within that byte. Key codes 0-7 are in the first byte (offset 0 from the start), codes 8-15 are in the second, etc. The BitTst() trap counts bits starting from the high-order bit of the byte. For example, for key code 58 (the option key), we look at the 8th byte (7 offset from the first byte) and the 5th bit within that byte. */ return ( ::BitTst( ((char *) &theKeys) + theKeyCode / 8, (long) 7 - (theKeyCode % 8) ) ); } //****************************************** EKeyStatus C_KEYS::my_PrintingCharField( TEHandle /* inMacTEH */, UInt16 inKeyCode, UInt16 &ioCharCode, EventModifiers /* inModifiers */) { // UKeyFilters::PrintingCharField() accepts ASCII 32, 33, ...126 // Here we accept all these except // # and the blank space (=char_Space=0x20=32) EKeyStatus theKeyStatus = keyStatus_PassUp; if (UKeyFilters::IsTEDeleteKey(inKeyCode)) { theKeyStatus = keyStatus_TEDelete; } else if (UKeyFilters::IsTECursorKey(inKeyCode)) { theKeyStatus = keyStatus_TECursor; } else if (UKeyFilters::IsExtraEditKey(inKeyCode)) { theKeyStatus = keyStatus_ExtraEdit; } else if (UKeyFilters::IsPrintingChar(ioCharCode)) { if (ioCharCode=='#' || ioCharCode==char_Space) { theKeyStatus = keyStatus_Reject; } else { theKeyStatus = keyStatus_Input; } } return theKeyStatus; } //****************************************** \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Mac_Other/C_KEYS.h b/Legacy/QFog2-MachO/QFogSource/Mac_Other/C_KEYS.h new file mode 100644 index 0000000..d903587 --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Mac_Other/C_KEYS.h @@ -0,0 +1 @@ +#pragma once class C_KEYS { public: static BOOLEAN KeyIsDown( SHORT theKeyCode); static EKeyStatus my_PrintingCharField( TEHandle inMacTEH, UInt16 inKeyCode, UInt16 &ioCharCode, EventModifiers inModifiers); }; \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Mac_Other/C_PROJECT_MENU.cpp b/Legacy/QFog2-MachO/QFogSource/Mac_Other/C_PROJECT_MENU.cpp new file mode 100644 index 0000000..edded88 --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Mac_Other/C_PROJECT_MENU.cpp @@ -0,0 +1 @@ +#include "C_PROJECT_MENU.h" //Ref: UTextMenu.cp //Ref: CWindowMenu.cp from chap 15 of PP book LMenu * C_PROJECT_MENU::its_menu_p = 0; MenuHandle C_PROJECT_MENU::its_mac_menu_h = 0; #pragma mark --const functions-- //****************************************** C_DOC * C_PROJECT_MENU::menu_item_to_doc_ptr( SInt16 menu_item )//in { LDocument * a_doc_p = NULL; // Get the doc ptr from the list. LDocument::GetDocumentList().FetchItemAt( menu_item, a_doc_p ); C_DOC * doc_p = dynamic_cast(a_doc_p); //may be zero if list is empty or item is out of range return doc_p; } #pragma mark --modify menu-- //****************************************** VOID C_PROJECT_MENU::init() { its_menu_p = LMenuBar::GetCurrentMenuBar()->FetchMenu(project_menu_rid); ThrowIfNil_(its_menu_p); its_mac_menu_h = its_menu_p->GetMacMenuH(); //create_h: PP creates its_mac_menu_h in LMenu() with call to ::NewMenu() or ::GetMenu() //throwif_h: PP throwifs at creation time. //destroy_h: PP destroys its_mac_menu_h in ~LMenu() //::EnableItem(its_mac_menu_h, 0); apparently un-necessary ThrowIfNil_(its_mac_menu_h); } //****************************************** VOID C_PROJECT_MENU::reset_command_keys() { SInt16 theItem = 1; SInt16 theItemCount = ::CountMenuItems( its_mac_menu_h ); SInt16 theCommand = '1'; while ( theItem <= theItemCount && theCommand <= '9' ) { // Set the menu item command key. ::SetItemCmd( its_mac_menu_h, theItem, theCommand ); ++theItem; ++theCommand; } } //****************************************** VOID C_PROJECT_MENU::insert_doc( const C_DOC * doc_p ) //in { Str255 title_pstr; doc_p->GetDescriptor( title_pstr ); // Insert the window title into the menu as a synthetic item. // First, insert a blank item, since InsertCommand uses // the toolbox InsertMenuItem which interprets metacharacters, // then set the item text manually. its_menu_p->InsertCommand( "\p ", cmd_UseMenuItem, 16000 ); ::SetMenuItemText( its_mac_menu_h, ::CountMenuItems( its_mac_menu_h ), title_pstr ); reset_command_keys(); } //****************************************** VOID C_PROJECT_MENU::rename_doc( const C_DOC * doc_p )//in { Str255 title_pstr; doc_p->GetDescriptor( title_pstr ); ::SetMenuItemText( its_mac_menu_h, doc_ptr_to_menu_item( doc_p ), title_pstr ); } //****************************************** VOID C_PROJECT_MENU::remove_doc( const C_DOC * doc_p )//in { //This method must be used before doc is removed from document list! //Check that the doc is in the list ThrowIf_(LDocument::GetDocumentList().FetchIndexOf( (C_DOC *)doc_p ) == LArray::index_Bad ); // Remove the item from the menu. its_menu_p->RemoveItem(LDocument::GetDocumentList().FetchIndexOf( (C_DOC *)doc_p )); reset_command_keys(); } \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Mac_Other/C_PROJECT_MENU.h b/Legacy/QFog2-MachO/QFogSource/Mac_Other/C_PROJECT_MENU.h new file mode 100644 index 0000000..83fb054 --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Mac_Other/C_PROJECT_MENU.h @@ -0,0 +1 @@ +#pragma once #include "C_DOC.h" class C_PROJECT_MENU { protected: static LMenu * its_menu_p; static MenuHandle its_mac_menu_h; public: static C_DOC * menu_item_to_doc_ptr( SInt16 menu_item ); static SInt16 doc_ptr_to_menu_item(const C_DOC * doc_p ); static VOID init(); static VOID reset_command_keys(); static VOID insert_doc(const C_DOC * doc_p ); static VOID rename_doc(const C_DOC * doc_p ); static VOID remove_doc(const C_DOC * doc_p ); }; #pragma mark - //****************************************** inline SInt16 C_PROJECT_MENU::doc_ptr_to_menu_item( const C_DOC * doc_p )//in { return LDocument::GetDocumentList().FetchIndexOf( (C_DOC *)doc_p ); } \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Mac_Other/C_WIND_BDS_RECO.cpp b/Legacy/QFog2-MachO/QFogSource/Mac_Other/C_WIND_BDS_RECO.cpp new file mode 100644 index 0000000..1bb49da --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Mac_Other/C_WIND_BDS_RECO.cpp @@ -0,0 +1 @@ +#include "C_WIND_BDS_RECO.h" #include "C_DOC.h" #include "UOnyx.h" #pragma mark --creation/destruction-- //****************************************** C_WIND_BDS_RECO::C_WIND_BDS_RECO() { its_bds.top = 0; its_bds.bottom = 0; its_bds.left = 0; its_bds.right = 0; } #pragma mark --this/wind communication-- //****************************************** VOID C_WIND_BDS_RECO::change_wind( LWindow * wind_p) //in const { //if its_bds ={0,0,0,0}, as set by //the WIND_ST constructor, then don't do anything if( (its_bds.bottom-its_bds.top)==0) return; if(wind_p==0)return; if(wind_p->HasAttribute(windAttr_Resizable)){ wind_p->DoSetBounds(its_bds); }else{ wind_p->DoSetPosition(topLeft(its_bds)); } } //****************************************** VOID C_WIND_BDS_RECO::set_reco( LWindow * wind_p) //in { if(wind_p==0)return; wind_p->CalcPortFrameRect(its_bds); wind_p->PortToGlobalPoint(topLeft(its_bds)); wind_p->PortToGlobalPoint(botRight(its_bds)); } //****************************************** VOID C_WIND_BDS_RECO::move_to_top_right_corner_of_screen( LWindow * wind_p) //in { if(wind_p==0)return; Rect old_bds; wind_p->CalcPortFrameRect(old_bds); wind_p->PortToGlobalPoint(topLeft(old_bds)); wind_p->PortToGlobalPoint(botRight(old_bds)); its_bds.left = 4; its_bds.top = 40; its_bds.right = 4 + old_bds.right - old_bds.left; its_bds.bottom = 40 + old_bds.bottom - old_bds.top; if(wind_p->HasAttribute(windAttr_Resizable)){ BitMap screenBits; GetQDGlobalsScreenBits(&screenBits); if (its_bds.right > screenBits.bounds.right-4) its_bds.right = screenBits.bounds.right-4; if (its_bds.bottom > screenBits.bounds.bottom-4) its_bds.bottom = screenBits.bounds.bottom-4; wind_p->DoSetBounds(its_bds); }else{ wind_p->DoSetPosition(topLeft(its_bds)); } } #pragma mark --write/read to resource fork of doc-- //****************************************** void C_WIND_BDS_RECO::write_res( C_DOC * doc_p, //in ResIDT rid) //in { if(doc_p==0)return; if(doc_p->GetFile()==0)return; //We assume that the doc was created with a resource fork doc_p->open_res_fork(fsRdWrPerm); SLDisable_(); Rect * * rect_h = (Rect * *) ::Get1Resource('WBds', rid); //destroy_h: in this method SLEnable_(); //don't use ThrowIfResFail_(rect_h) because handle may be zero ThrowIfResError_(); if ( rect_h != 0 ) { //a resource already exists -- update it **rect_h = its_bds; ::ChangedResource(Handle(rect_h)); } else { //no resource exists -- add one rect_h = (Rect * *) (NewHandle(sizeof(Rect))); //create_h: I create rect_h with call to ::NewHandle(). //throwif_h: I call ThrowIfMemFail_ above. //destroy_h: I call ReleaseResource() below. ThrowIfMemFail_(rect_h); **rect_h = its_bds; ::AddResource( Handle(rect_h), 'WBds', rid, 0); } ::UpdateResFile(doc_p->get_res_fork_ref_num()); ReleaseResource_(Handle(rect_h)); doc_p->close_res_fork(); } //****************************************** VOID C_WIND_BDS_RECO::read_res( C_DOC * doc_p, //in ResIDT rid) //in { if(doc_p==0)return; if(doc_p->GetFile()==0)return; //We assume that the doc was created with a resource fork Rect * * rect_h; doc_p->open_res_fork(fsRdWrPerm); rect_h = (Rect * *) ::Get1Resource('WBds', rid); //destroy_h: in this method ThrowIfResError_(); //Do nothing if there is no resource if ( rect_h != 0 ) { //search for resource succeeded -- retrieve it its_bds = **rect_h; ReleaseResource_(Handle(rect_h)); } doc_p->close_res_fork(); } \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Mac_Other/C_WIND_BDS_RECO.h b/Legacy/QFog2-MachO/QFogSource/Mac_Other/C_WIND_BDS_RECO.h new file mode 100644 index 0000000..3178698 --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Mac_Other/C_WIND_BDS_RECO.h @@ -0,0 +1 @@ +#pragma once class C_DOC; //This class was inspired by UWindowState, //a Metrowerks contributed class. //In C_MAIN_VIEW, where this class is used the most, //the C_WIND_BDS_RECO for a window //and the window's actual bounds may be different for a while. //In such cases, one may wish to distinguish between the //2 sets of bounds by calling: //the actual bounds, the "window bounds" and //the window's C_WIND_BDS_RECO, the "window bounds record". //****************************************** class C_WIND_BDS_RECO { private: Rect its_bds; public: C_WIND_BDS_RECO(); VOID change_wind(LWindow * wind_p) const; VOID set_reco(LWindow * wind_p); VOID move_to_top_right_corner_of_screen(LWindow * wind_p); VOID write_res(C_DOC * doc_p, ResIDT rid); VOID read_res(C_DOC * doc_p, ResIDT rid); }; \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Mac_Other/Mac_EditTable/.DS_Store b/Legacy/QFog2-MachO/QFogSource/Mac_Other/Mac_EditTable/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..3ad8f2dccf0fe1e358f5149b5a52c86adec2fbe6 GIT binary patch literal 12292 zcmeI1&u-H|5XNUi4i!{wT2PgvpP*9Tz|Eh7rL;j!kSIO4N;z;SYA?Xm2VQ}zk&cLLps8*@Mb{vDUfY7S z;>Z?sFdrisNhw1aNU?A=2S|Vf{xt&n?CwY(Pi-I1ZTkF9Wh^JMFBftx*Tv=4#q9EG zhO2d}c!SpcWr8D-?Uf$h&07bZGqvunurB459AiHjBf2Hgv_97S?cKv)EjG(+mSom3 zU%sPFL1`+7(gUYqGnw!mv847}E9`4?TOO(Hi)j02&Jwft5kmnU$1+(G!*j&&Dam1X z4L`M5ERU~=4`(_|@-O8G_hw|#l!!%FPxERyLp)y+Url*6`KrgX2|qW9A73{Ud5O98 z4wZFeEmp#`MQ~aP!I7O;l51~M!#VhHh1eY%5OWdg{!p$HCtulnQQhWKmsIiM?m+73{7<&b>-T&4s`Yj z0Nuv036AvzL2a_A^QbG=I0Ff83hkyLeqsbS$9NX6%cHJbySW6LSvNi#mJq*Cg3XTc zERN@{*^>YX%oBLxKRa6ghs(eJ=Z*M_1W4e&A`sex$)JanVr^YWPHSz3c8;c^*Hx~~ z1YIo0cA%xWi)MmznI1srQCF@p0^y5*VPHoBk4+%f|8A`R_8#!qF>pQ-Ac4P2;KAxY zD!P4+L*M;jh~rGtgU+L_Tw?^n`fnK6kpKyh011!)36KB@kN^pg011!)36KB@kidfy F_zhs{@Z~LEditfield()->~LPane() // ->~LAttachable()->LAttachable::RemoveAllAttachments(). ThrowIfNil_(undoer_p); AddAttachment(undoer_p); } //****************************************** C_CELL_EDITOR::~C_CELL_EDITOR() {} #pragma mark --location-- //****************************************** VOID C_CELL_EDITOR::move_to( SInt16 horz, //in SInt16 vert) //in { Rect rect; CalcLocalFrameRect(rect); MoveBy( SInt32(horz-rect.left), SInt32(vert-rect.top), false); } #pragma mark --command center-- //****************************************** BOOLEAN C_CELL_EDITOR::HandleKeyPress( const EventRecord & in_key_event) //in { //MONITOR_THE_CHANGE_HERE //its SuperCommander defined in C_EDIT_TABLE::init() C_EDIT_TABLE * table_p = (C_EDIT_TABLE *)GetSuperCommander(); SEL_MANAGER sel_mgr = table_p->get_sel_mgr(); if(sel_mgr==editor_mgr){ //LEditField already knows how to handle the delete key, //which is the key that concerns us most return LEditField::HandleKeyPress(in_key_event); }else{//sel_mgr==table_mgr return table_p->HandleKeyPress(in_key_event); } } //****************************************** BOOLEAN C_CELL_EDITOR::ObeyCommand( CommandT inCommand, //in VOID * ioParam) //i-o { //MONITOR_THE_CHANGE_HERE BOOLEAN obeyed = true; BOOLEAN needs_refresh = true; //its SuperCommander defined in C_EDIT_TABLE::init() C_EDIT_TABLE * table_p = (C_EDIT_TABLE *)GetSuperCommander(); SEL_MANAGER sel_mgr = table_p->get_sel_mgr(); switch (inCommand) { case cmd_Paste:{ C_SUB_MATRIX smat; if(smat.absorb_clipping()){ if((smat.its_num_of_cols)*(smat.its_num_of_rows)==1){ obeyed = LEditField::ObeyCommand(inCommand, ioParam); needs_refresh = false; }else{ ioParam = (VOID *)&smat; obeyed = table_p->ObeyCommand(inCommand, ioParam); its_cell=STableCell(0,0); //must call Hide() after call table_p->ObeyCommand() //or else cell editor won't be target inside table_p->ObeyCommand() Hide(); needs_refresh = false; } } break; }//due to compiler bug, get bus error if don't have these braces default: if(sel_mgr==editor_mgr){ obeyed = LEditField::ObeyCommand(inCommand, ioParam); needs_refresh = false; }else{//sel_mgr==table_mgr obeyed = table_p->ObeyCommand(inCommand, ioParam); needs_refresh = false; } break; } if (needs_refresh) Refresh(); return obeyed; } //****************************************** VOID C_CELL_EDITOR::FindCommandStatus( CommandT inCommand, //in BOOLEAN & outEnabled, //out BOOLEAN & outUsesMark, //out UInt16 & outMark, //out Str255 outName_pstr) //out { outEnabled = false; outUsesMark = false; outMark = noMark; //its SuperCommander defined in C_EDIT_TABLE::init() C_EDIT_TABLE * table_p = (C_EDIT_TABLE *)GetSuperCommander(); SEL_MANAGER sel_mgr = table_p->get_sel_mgr(); switch (inCommand) { case cmd_Paste: if(UScrap::HasData('TEXT'))outEnabled = true; break; default: if(sel_mgr==editor_mgr){ LEditField::FindCommandStatus(inCommand, outEnabled, outUsesMark, outMark, outName_pstr); }else{//sel_mgr==table_mgr table_p->FindCommandStatus(inCommand, outEnabled, outUsesMark, outMark, outName_pstr); } break; } } \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Mac_Other/Mac_EditTable/C_CELL_EDITOR.h b/Legacy/QFog2-MachO/QFogSource/Mac_Other/Mac_EditTable/C_CELL_EDITOR.h new file mode 100644 index 0000000..59ea4df --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Mac_Other/Mac_EditTable/C_CELL_EDITOR.h @@ -0,0 +1 @@ +#pragma once //****************************************** class C_CELL_EDITOR : public LEditField { protected: STableCell its_cell; public: C_CELL_EDITOR(LView * super_view_p, LCommander * super_comm_p); virtual ~C_CELL_EDITOR(); const STableCell & get_cell() const; VOID set_cell(const STableCell & cell); VOID move_to(SInt16 horz, SInt16 vert); virtual BOOLEAN HandleKeyPress(const EventRecord & in_key_event); virtual BOOLEAN ObeyCommand(CommandT inCommand, VOID * ioParam); virtual VOID FindCommandStatus(CommandT inCommand, BOOLEAN & outEnabled, BOOLEAN & outUsesMark, UInt16 & outMark, Str255 outName_pstr); }; #pragma mark - //****************************************** inline const STableCell & C_CELL_EDITOR::get_cell() const { return its_cell; } //****************************************** inline VOID C_CELL_EDITOR::set_cell( const STableCell & cell) //in { its_cell= cell; } \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Mac_Other/Mac_EditTable/C_CELL_EDITOR_UNDOER.cpp b/Legacy/QFog2-MachO/QFogSource/Mac_Other/Mac_EditTable/C_CELL_EDITOR_UNDOER.cpp new file mode 100644 index 0000000..40b85a1 --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Mac_Other/Mac_EditTable/C_CELL_EDITOR_UNDOER.cpp @@ -0,0 +1 @@ +#include "C_CELL_EDITOR_UNDOER.h" #include "C_EDIT_TABLE.h" //****************************************** C_CELL_EDITOR_UNDOER::C_CELL_EDITOR_UNDOER(C_CELL_EDITOR * editor_p) { its_editor_p = editor_p; } //****************************************** C_CELL_EDITOR_UNDOER::~C_CELL_EDITOR_UNDOER() { } //****************************************** VOID C_CELL_EDITOR_UNDOER::ExecuteSelf( MessageT inMessage, //in void * ioParam) //i-o { //When an uaction of the cell editor is created, //we delete the uaction of the etable. //Both cell editor and etable //uactions are destroyed when the pi_window is closed. switch (inMessage) { case msg_CommandStatus:{ SCommandStatus * status = (SCommandStatus *) ioParam; if (mAction==0 && status->command == cmd_Undo) { //give etable a chance to handle it its_editor_p->GetSuperCommander()->ProcessCommand(inMessage, ioParam); } else { LUndoer::ExecuteSelf(inMessage, ioParam); } break; } case cmd_Undo: if(mAction==0){ //give etable a chance to handle it its_editor_p->GetSuperCommander()->ProcessCommand(inMessage, ioParam); }else{ LUndoer::ExecuteSelf(inMessage, ioParam); } break; default: LUndoer::ExecuteSelf(inMessage, ioParam); break; } } \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Mac_Other/Mac_EditTable/C_CELL_EDITOR_UNDOER.h b/Legacy/QFog2-MachO/QFogSource/Mac_Other/Mac_EditTable/C_CELL_EDITOR_UNDOER.h new file mode 100644 index 0000000..b33c5c5 --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Mac_Other/Mac_EditTable/C_CELL_EDITOR_UNDOER.h @@ -0,0 +1 @@ +#pragma once #include "C_CELL_EDITOR.h" //****************************************** class C_CELL_EDITOR_UNDOER : public LUndoer { protected: C_CELL_EDITOR * its_editor_p; public: C_CELL_EDITOR_UNDOER(C_CELL_EDITOR * editor_p); virtual ~C_CELL_EDITOR_UNDOER(); VOID ExecuteSelf(MessageT inMessage, VOID * ioParam); }; \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Mac_Other/Mac_EditTable/C_EDIT_TABLE.cpp b/Legacy/QFog2-MachO/QFogSource/Mac_Other/Mac_EditTable/C_EDIT_TABLE.cpp new file mode 100644 index 0000000..69c8d35 --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Mac_Other/Mac_EditTable/C_EDIT_TABLE.cpp @@ -0,0 +1 @@ +#include "C_EDIT_TABLE.h" #include "C_KEYS.h" #include "EXCEPTIONS.h" #include "QFog_constants.h" #include "STRINGY.h" #include "C_ETABLE_ACTIONS.h" #include "C_ETABLE_MULTI_SEL.h" #include "StCPTstate.h" #pragma mark --creation/destruction-- //****************************************** VOID C_EDIT_TABLE::set_text_traits_rid( ResIDT rid) //in { TextTraitsH text_traits_h = UTextTraits::LoadTextTraits(rid);//not destroyed by PP //create_h: PP creates text_traits_h with a call to ::GetResource(). //throwif_h: PP calls SignalIfNil immediately after creation. //destroy_h: PP does NOT release text_traits_h resource. // I delete it below, in this method. ThrowIfNil_(text_traits_h); its_font_size = (**text_traits_h).size; its_font_num = (**text_traits_h).fontNumber; ReleaseResource_((Handle)text_traits_h); if(its_editor_p!=0)its_editor_p->SetTextTraitsID(rid); } //****************************************** VOID C_EDIT_TABLE::init() { mUseDragSelect = true; its_editor_p = new C_CELL_EDITOR((LView *) this, (LCommander *) this);//SuperCommander declared //delete: in ~C_EDIT_TABLE(). ThrowIfNil_(its_editor_p); set_text_traits_rid(Verdana12_rid); its_sel_mgr = editor_mgr; } //****************************************** VOID C_EDIT_TABLE::FinishCreateSelf() { //IMP, about mTableSelector: //With a non-editable LTableView, LTableSingleSelector //may be useful. But with C_EDIT_TABLE it never will be. //The C_CELL_EDITOR and its underlying efield will //take care of all single cell selection duties. //Thus, you should never use LTableSingleSelector with C_EDIT_TABLE. //Instead, use either LTableMultiSelector or no selector. //If you use LTableMultiSelector: //If you subclass C_EDIT_TABLE and add a multi mTableSelector //then you should declare the mTableSelector in the //subclass's constructor. //The subclass's constructor is called before this method. if(mTableSelector!=0){ //I allow uncut, undelete and unpaste. //None of these will ever be done (for more than one cell) //if there is no mTableSelector. LUndoer * undoer_p = new LUndoer; //delete: PP deletes undoer_p via // ~C_EDIT_TABLE()->~LTableView()->~LView()->~LPane() // ->~LAttachable()->LAttachable::RemoveAllAttachments(). ThrowIfNil_(undoer_p); AddAttachment(undoer_p); } } //****************************************** C_EDIT_TABLE::C_EDIT_TABLE( LStream * inStream) //in :LTableView(inStream), C_ACTION_FLAGS(etable_num_of_act_types) { init(); } //****************************************** C_EDIT_TABLE::~C_EDIT_TABLE() { if(its_editor_p != 0){ delete its_editor_p; its_editor_p = 0; } } #pragma mark --about editor-- //****************************************** VOID C_EDIT_TABLE::nullify_editor() { its_editor_p->set_cell(STableCell(0,0)); its_editor_p->Hide(); } #pragma mark --about one cell-- //****************************************** VOID C_EDIT_TABLE::get_cell_data( const STableCell & cell, //in LStr255 & str) //out { //The following assumes that you call //SetTableStorage(new LTableArrayStorage(this, data_size )); //in the constructor. //By the way, //if you use LTableArrayStorage, all data has a COMMON datasize. //The datasize parameter in GetCellData() and SetCellData() is ignored! //If you use your own storage instead of LTableArrayStorage(), then //override this method. // ioDataSize // input: maximum bytes of data to retrieve // output: actual bytes of data passed back UInt32 io_data_size = data_size; GetCellData(cell, str, io_data_size); } //****************************************** VOID C_EDIT_TABLE::set_cell_data( const STableCell & cell, //in const LStr255 & str) //in { //This method changes cell storage and appearance. //read comments that preface get_cell_data(). //Again, if you use your own storage, override this method. SetCellData(cell, str, data_size);//storage RefreshCell(cell);//appearance } //****************************************** VOID C_EDIT_TABLE::delete_cell_data( const STableCell & cell) //in { //This method changes cell storage and appearance. //read comments that preface get_cell_data(). //Again, if you use your own storage, override this method. SetCellData(cell, "\p", data_size);//storage RefreshCell(cell);//appearance } //****************************************** VOID C_EDIT_TABLE::DrawCell( const STableCell & inCell, //in const Rect & inLocalRect) //in {//drawer StCPTstate saved_st(true, false, true); saved_st.Normalize(); ::TextSize(its_font_size); ::TextFont(its_font_num); ::MoveTo(inLocalRect.left + 4, inLocalRect.bottom - 4); LStr255 str; get_cell_data(inCell, str); trunc_pstr_so_it_fits(str, GetColWidth(inCell.col), 8); ::DrawString(str); draw_cell_frame(inLocalRect);//see GLOBAL_FUN.h } #pragma mark --about one cell: clicking it-- //****************************************** BOOLEAN C_EDIT_TABLE::unload_editor() { STableCell cell = its_editor_p->get_cell(); //If possible, you should follow a call //to this function (unload_editor()) by a call //to nullify_editor() so that redundant calls //to this function are aborted by the following line. if(cell.IsNullCell())return true; Str255 pstr; its_editor_p->GetDescriptor(pstr); if(str_is_valid_cell_entry(cell, pstr)){ set_cell_data(cell, pstr); return true; }else{ LCommander::SwitchTarget(its_editor_p); //this fixes small anomally with empty efields if(pstr[0]==0)its_editor_p->SetDescriptor("\p?"); its_editor_p->SelectAll(); return false; } } //****************************************** VOID C_EDIT_TABLE::install_editor_at( const STableCell & cell) //in { its_editor_p->set_cell(cell); Rect cell_rect; GetLocalCellRect( cell, cell_rect ); its_editor_p->move_to(cell_rect.left , cell_rect.top ); its_editor_p->ResizeFrameTo(cell_rect.right - cell_rect.left, cell_rect.bottom - cell_rect.top, false); LStr255 str; get_cell_data( cell, str); its_editor_p->SetDescriptor( str ); } //****************************************** VOID C_EDIT_TABLE::Click( SMouseDownEvent & inMouseDown) //in { //MONITOR_THE_CHANGE_HERE /* Variables affecting response to a click: (1)Was shift key down when mouse went down? N, Y (2)Number of cells selected before click? 0, 1, many (3)Mouse went down on selected cell? N, Y (4)Mouse went up on same cell as it went down? N, Y If shift key up, cell editor does mouse tracking, and if down, LTableMultiSelector::DragClick() does it. */ //See LView::Click() //start with etable as target. Then if install editor, make it the target. LCommander::SwitchTarget(this); BOOLEAN shift_key_is_down = ((inMouseDown.macEvent.modifiers & shiftKey) != 0); if(shift_key_is_down && mTableSelector!=0){ //C_EDIT_TABLE always handles the //click first, even if the cell editor is hit. LPane::Click(inMouseDown);//this function always calls C_EDIT_TABLE::ClickSelf() }else{ //If a subpane (cell_editor) is hit, we let //the cell editor handle the click. If it can't, //C_EDIT_TABLE handles it. LTableView::Click(inMouseDown); //this function calls either C_CELL_EDITOR::ClickSelf() //or C_EDIT_TABLE::ClickSelf() but not both } } //****************************************** VOID C_EDIT_TABLE::ClickSelf( const SMouseDownEvent & inMouseDown) //in { //MONITOR_THE_CHANGE_HERE //NONTRIVIAL EXCERPT FROM PP //See LTableView::ClickSelf() STableCell hitCell; SPoint32 imagePt; LocalToImagePoint(inMouseDown.whereLocal, imagePt); BOOLEAN shift_key_is_down = ((inMouseDown.macEvent.modifiers & shiftKey) != 0); BOOLEAN anchor_and_fin_cells_same; if( GetCellHitBy(imagePt, hitCell)){// Click is inside of a cell if(shift_key_is_down && mTableSelector!=0 && ((C_ETABLE_MULTI_SEL *)mTableSelector)->is_selectable_cell(hitCell)){ if(unload_editor()){ UnselectAllCells();//sets anchor to (0,0) STableCell ed_cell = its_editor_p->get_cell(); if(!ed_cell.IsNullCell()){ ((C_ETABLE_MULTI_SEL *)mTableSelector)->set_anchor_cell(ed_cell); } nullify_editor(); //This ClickSelect() always calls mTableSelector->DragSelect() anchor_and_fin_cells_same = ClickSelect(hitCell, inMouseDown); if(anchor_and_fin_cells_same)ClickCell(hitCell, inMouseDown); } }else{ ClickCell(hitCell, inMouseDown); } }else{// Click is outside of any cell if(unload_editor()){ UnselectAllCells(); nullify_editor(); } } } //****************************************** VOID C_EDIT_TABLE::ClickCell( const STableCell & inCell, //in const SMouseDownEvent & inMouseDown) //in { #pragma unused(inMouseDown) //MONITOR_THE_CHANGE_HERE //original LTableView method is empty if(its_editor_p->get_cell()==inCell)return; //don't want to unload each time click cell so this //should come after check if its_editor_p->get_cell()==inCell. if(unload_editor()){ its_editor_p->Hide(); // All editor changes that depend on inCell are done here: install_editor_at(inCell); LCommander::SwitchTarget(its_editor_p); if(mTableSelector!=0){ UnselectAllCells(); SelectCell(inCell); } its_editor_p->SelectAll(); its_editor_p->PostAction(0); its_editor_p->SetMaxChars(31);//default its_editor_p->Show(); } } #pragma mark --selection-- //****************************************** SEL_MANAGER C_EDIT_TABLE::get_sel_mgr() const { if(mTableSelector==0){ return editor_mgr; }else{ return ((C_ETABLE_MULTI_SEL *)mTableSelector)->get_sel_size()<=1?editor_mgr:table_mgr; } } #pragma mark --write/read sub matrices-- //****************************************** BOOLEAN C_EDIT_TABLE::sub_mat_can_be_pasted( const C_SUB_MATRIX & smat) //in { //Checks that smat fits in table and that //the proposed cell entries are of the expected type. STableCell first_sel_cell = GetFirstSelectedCell(); if(!IsValidCell(first_sel_cell)){ my_gen_alert("Tell me where to paste by selecting at least one table cell."); return false; } if( mCols - first_sel_cell.col + 1get_sel_rect(); smat.its_num_of_rows = r.bottom - r.top; smat.its_num_of_cols = r.right - r.left; smat.its_anchor = GetFirstSelectedCell(); } //****************************************** VOID C_EDIT_TABLE::write_sub_mat( C_SUB_MATRIX & smat) //i-o { //On input, smat MUST have the desired dimensions and anchor. //This method does not check that these are legal! //I usually call //resize_and_anchor_sub_mat_like_sel(smat); //before calling this method. //Called by //C_EDIT_TABLE::copy_selection() //C_ETABLE_DEL_OR_CUT_ACTION::C_ETABLE_DEL_OR_CUT_ACTION() //C_ETABLE_PASTE_ACTION::C_ETABLE_PASTE_ACTION() STableCell cell = smat.its_anchor; ThrowIf_(!IsValidCell(cell)); USHORT first_col = cell.col; LStr255 pstr; LStr255 delim = "\p"; //stress the debug version #if _do_debug const LONG step_size = 32; #else const LONG step_size = 1024; #endif LONG handle_size = 0; LONG data_size = 0; ThrowIf_(::GetHandleSize(smat.its_content_h)!=0); StHandleState saved_h(smat.its_content_h);//preserve handle state for(USHORT r=0; rhandle_size){ //always unlock handle before growing its size ::HUnlock(smat.its_content_h);//saved handle state ::SetHandleSize(smat.its_content_h, handle_size + step_size); ThrowIfMemFail_(smat.its_content_h); handle_size += step_size; } pstr = delim + pstr; ::HLock(smat.its_content_h);//saved handle state ::BlockMoveData(ConstStringPtr(pstr) + 1, *smat.its_content_h + data_size, pstr[0]); ::HUnlock(smat.its_content_h);//saved handle state data_size += pstr[0]; delim = "\p\t"; cell.col++; } delim = "\p\r"; cell.col = first_col; cell.row++; } //make last char a '\0' ::HLock(smat.its_content_h);//saved handle state (*smat.its_content_h)[data_size] = '\0'; ::HUnlock(smat.its_content_h);//saved handle state //reduce handle size //always unlock handle before growing its size ::HUnlock(smat.its_content_h);//saved handle state ::SetHandleSize(smat.its_content_h, data_size + 1); ThrowIfMemFail_(smat.its_content_h); } //****************************************** VOID C_EDIT_TABLE::read_sub_mat( const C_SUB_MATRIX & smat) //in { //does no checking! //called by //C_ETABLE_DEL_OR_CUT_ACTION::UndoSelf() //C_ETABLE_PASTE_ACTION::RedoSelf() //C_ETABLE_PASTE_ACTION::UndoSelf() //Refs. //(1)Think Ref. under String.h //(2)Shammas, Mac C++ programming in 21 days //strtok() modifies its argument string so //must make a non-constant copy of *smat.its_content_h LONG contents_size = ::GetHandleSize(smat.its_content_h); SignalIf_(contents_size==0); CHAR * cstr = new CHAR[contents_size]; //delete: at the end of this method ThrowIfNil_(cstr); StHandleState saved_h(smat.its_content_h); //preserve handle state ::HLock(smat.its_content_h);//saved handle state ::BlockMoveData(*smat.its_content_h, cstr, contents_size); ::HUnlock(smat.its_content_h);//saved handle state //smat.its_content_h, if not empty, should contain a cstr, with null termination SignalIf_(cstr[contents_size-1]!='\0'); STableCell cell=smat.its_anchor; USHORT first_col= cell.col; CHAR * delims = "\t\r"; CHAR * token_cstr; LStr255 pstr; CHAR * ch_p; UnselectAllCells();//only pasted cells should be selected for(USHORT r=0; rget_cell(), pstr); its_editor_p->SetDescriptor( pstr ); delete [] cstr; } #pragma mark --copy, del, cut, paste-- //The methods below do absolutely no checking. //They are used only after extensive checking has been performed. //****************************************** VOID C_EDIT_TABLE::copy_selection( C_SUB_MATRIX & smat, //i-o BOOLEAN fill_smat) //in { //This function is analogous to C_MAIN_VIEW::copy_selection(). //When this function is called, //there is always more than one table cell selected. //Thus, we can't use copying in table with nothing selected to clear //scrap and table's uaction memory. However, closing the nd_pi //window will clear the table's uaction memory. //And copying in the main window with nothing selected //or pressing Go_Forward will clear the scrap. if(fill_smat){ resize_and_anchor_sub_mat_like_sel(smat); write_sub_mat(smat); } UScrap::SetData('TEXT', smat.its_content_h); } //****************************************** VOID C_EDIT_TABLE::delete_selection() { //This method is analogous to C_MAIN_VIEW::delete_selection(). //Next method returns (0,0) if no cell is selected. STableCell cell = GetFirstSelectedCell(); if(!IsValidCell(cell))return; delete_cell_data(cell); while(GetNextSelectedCell(cell)){ delete_cell_data(cell); } // its_editor_p->SetDescriptor("\p"); } #pragma mark --command center-- //****************************************** BOOLEAN C_EDIT_TABLE::HandleKeyPress( const EventRecord & in_key_event) //in { //MONITOR_THE_CHANGE_HERE if( ((in_key_event.message &keyCodeMask)>>8) == 0x33){//delete key was pressed //This is like a combination of ObeyCommand() and FindCommandStatus() if(get_sel_mgr()==table_mgr){ return ProcessCommand(cmd_Clear); }else{ return true; } }else{ return LCommander::HandleKeyPress(in_key_event); } } //****************************************** BOOLEAN C_EDIT_TABLE::ObeyCommand( CommandT inCommand, //in VOID * ioParam) //i-o { //MONITOR_THE_CHANGE_HERE if(mTableSelector==0) return LCommander::ObeyCommand(inCommand, ioParam); BOOLEAN obeyed = true; BOOLEAN needs_refresh = true; //Imp: all checking indicated explicitly in this function C_EDIT_TABLE::ObeyCommand() //and in C_CELL_EDITOR::Obey_Command(). //Also in C_EDIT_TABLE::FindCommandStatus() //and C_CELL_EDITOR::FindCommandStatus() //No checking done inside C_ETABLE_DEL_OR_CUT_ACTION //or C_ETABLE_PASTE_ACTION or copy_selection(). if(!unload_editor())return false; //FindCommandStatus() makes sure that there is at least //one selected cell for the commands marked //** switch (inCommand){ case cmd_Cut:{ //** its_editor_p->PostAction(0); PostAction(new C_ETABLE_DEL_OR_CUT_ACTION(this, (C_ETABLE_MULTI_SEL *)mTableSelector, 1));//= new //delete: break; } case cmd_Copy:{ //** C_SUB_MATRIX smat; copy_selection(smat, true); break; } case cmd_Paste:{ C_SUB_MATRIX x; C_SUB_MATRIX * smat_p; if(!its_editor_p->IsTarget()){//the editor is not target so it can't fill smat. smat_p = &x; if(!smat_p->absorb_clipping())break; if((smat_p->its_num_of_cols)*(smat_p->its_num_of_rows)==1)break;//this case should //be handled by cell editor but he can't because he is not on duty. }else{//editor is target and filled smat_p smat_p = (C_SUB_MATRIX *)ioParam; } if(sub_mat_can_be_pasted(*smat_p)){ smat_p->its_anchor = GetFirstSelectedCell(); its_editor_p->PostAction(0); PostAction(new C_ETABLE_PASTE_ACTION(this, smat_p) );//= new //delete: } break; } case cmd_Clear://** its_editor_p->PostAction(0); PostAction(new C_ETABLE_DEL_OR_CUT_ACTION(this, (C_ETABLE_MULTI_SEL *)mTableSelector, 0));//= new //delete: break; case cmd_SelectAll://** SelectAllCells(); break; default: obeyed = LCommander::ObeyCommand(inCommand, ioParam); needs_refresh = false; break; } if (needs_refresh) Refresh(); return obeyed; } //****************************************** VOID C_EDIT_TABLE::FindCommandStatus( CommandT inCommand, //in BOOLEAN & outEnabled, //out BOOLEAN & outUsesMark, //out UInt16 & outMark, //out Str255 outName_pstr) //out { if(mTableSelector==0){ LCommander::FindCommandStatus(inCommand, outEnabled, outUsesMark, outMark, outName_pstr); return; } outEnabled = false; outUsesMark = false; outMark = noMark; SEL_MANAGER sel_mgr = get_sel_mgr(); switch (inCommand) { case cmd_Cut: if(sel_mgr==table_mgr)outEnabled = true; break; case cmd_Copy: if(sel_mgr==table_mgr)outEnabled = true; break; case cmd_Paste: if(UScrap::HasData('TEXT'))outEnabled = true; break; case cmd_Clear: if(sel_mgr==table_mgr)outEnabled = true; break; case cmd_SelectAll: if(sel_mgr==table_mgr)outEnabled = true; break; default: LCommander::FindCommandStatus(inCommand, outEnabled, outUsesMark, outMark, outName_pstr); break; } } \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Mac_Other/Mac_EditTable/C_EDIT_TABLE.h b/Legacy/QFog2-MachO/QFogSource/Mac_Other/Mac_EditTable/C_EDIT_TABLE.h new file mode 100644 index 0000000..32b5771 --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Mac_Other/Mac_EditTable/C_EDIT_TABLE.h @@ -0,0 +1 @@ +#pragma once #include "C_CELL_EDITOR.h" #include "C_SUB_MATRIX.h" #include "C_ACTION_FLAGS.h" enum SEL_MANAGER {editor_mgr, table_mgr};//selection manager is either the cell editor or the etable //****************************************** class C_EDIT_TABLE : public LTableView, public LCommander, public C_ACTION_FLAGS { protected: C_CELL_EDITOR * its_editor_p; SInt16 its_font_size; SInt16 its_font_num; SEL_MANAGER its_sel_mgr;//sel_mgr = selection manager enum {data_size=32}; public: VOID set_text_traits_rid(ResIDT rid); VOID init(); VOID FinishCreateSelf(); C_EDIT_TABLE(LStream * inStream); virtual ~C_EDIT_TABLE(); VOID set_max_chars_of_cell_editor(USHORT num); BOOLEAN cell_editor_is_target() const; VOID nullify_editor(); virtual VOID get_cell_data(const STableCell & inCell, LStr255 & str); virtual VOID set_cell_data(const STableCell & inCell, const LStr255 & str); virtual BOOLEAN str_is_valid_cell_entry(const STableCell & cell, Str255 pstr); virtual VOID delete_cell_data(const STableCell & inCell); virtual VOID DrawCell(const STableCell & inCell, const Rect & inLocalRect); virtual BOOLEAN unload_editor(); virtual VOID install_editor_at( const STableCell & cell); virtual VOID Click(SMouseDownEvent & inMouseDown); virtual VOID ClickSelf(const SMouseDownEvent & inMouseDown); virtual VOID ClickCell(const STableCell & inCell, const SMouseDownEvent & inMouseDown); SEL_MANAGER get_sel_mgr() const; BOOLEAN sub_mat_can_be_pasted(const C_SUB_MATRIX & smat); VOID resize_and_anchor_sub_mat_like_sel(C_SUB_MATRIX & smat); VOID write_sub_mat(C_SUB_MATRIX & smat); virtual VOID read_sub_mat(const C_SUB_MATRIX & smat); VOID copy_selection(C_SUB_MATRIX & smat, BOOLEAN fill_smat); virtual VOID delete_selection(); virtual BOOLEAN HandleKeyPress(const EventRecord & in_key_event); virtual BOOLEAN ObeyCommand(CommandT inCommand, VOID * ioParam); virtual VOID FindCommandStatus(CommandT inCommand, BOOLEAN & outEnabled, BOOLEAN & outUsesMark, UInt16 & outMark, Str255 outName_pstr); }; #pragma mark - //****************************************** inline VOID C_EDIT_TABLE::set_max_chars_of_cell_editor( USHORT num) //in { its_editor_p->SetMaxChars(num); } //****************************************** inline BOOLEAN C_EDIT_TABLE::cell_editor_is_target() const { return its_editor_p->IsTarget(); } //****************************************** inline BOOLEAN C_EDIT_TABLE::str_is_valid_cell_entry( const STableCell & cell, //in Str255 pstr) //in { // should override this return true; } \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Mac_Other/Mac_EditTable/C_ETABLE_ACTIONS.cpp b/Legacy/QFog2-MachO/QFogSource/Mac_Other/Mac_EditTable/C_ETABLE_ACTIONS.cpp new file mode 100644 index 0000000..56bb112 --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Mac_Other/Mac_EditTable/C_ETABLE_ACTIONS.cpp @@ -0,0 +1 @@ +#include "C_ETABLE_ACTIONS.h" #include "C_EDIT_TABLE.h" #include "C_ETABLE_MULTI_SEL.h" #include "QFog_constants.h" /* LAction( ResIDT inStringResID = STRx_RedoEdit, SInt16 inStringIndex = str_RedoUndo, Boolean inAlreadyDone = false); */ #pragma mark --C_ETABLE_DEL_OR_CUT_ACTION-- #define _act_type etable_del //****************************************** C_ETABLE_DEL_OR_CUT_ACTION::C_ETABLE_DEL_OR_CUT_ACTION( C_EDIT_TABLE * etable_p, //in C_ETABLE_MULTI_SEL * selector_p, //in USHORT copy_to_scrap) //in :LAction(my_redo_rid, undel_ind + copy_to_scrap, false), its_etable_p(etable_p), its_selector_p(selector_p), its_copy_to_scrap(copy_to_scrap) { //IMP: we assume that string index for redo_cut is 1 more than that for redo_del its_etable_p->resize_and_anchor_sub_mat_like_sel(its_undel_reco); its_etable_p->write_sub_mat(its_undel_reco); if(its_copy_to_scrap==1)its_etable_p->copy_selection(its_undel_reco, false); its_saved_sel_rect = its_selector_p->get_sel_rect(); its_etable_p->set_is_modified(false, _act_type); } //****************************************** C_ETABLE_DEL_OR_CUT_ACTION::~C_ETABLE_DEL_OR_CUT_ACTION() { } //****************************************** BOOLEAN C_ETABLE_DEL_OR_CUT_ACTION::CanRedo() const { BOOLEAN can_redo = false; if( mIsDone==false && its_etable_p->IsOnDuty() && !its_etable_p->is_modified(_act_type) ){ can_redo = true; } return can_redo; } //****************************************** BOOLEAN C_ETABLE_DEL_OR_CUT_ACTION::CanUndo() const { BOOLEAN can_undo = false; if( mIsDone==true && its_etable_p->IsOnDuty() && !its_etable_p->is_modified(_act_type) ){ can_undo = true; } return can_undo; } //****************************************** VOID C_ETABLE_DEL_OR_CUT_ACTION::RedoSelf() { if(!its_etable_p->unload_editor())return; its_etable_p->nullify_editor(); its_selector_p->set_sel_rect(its_saved_sel_rect); its_etable_p->delete_selection();//calls Refresh() for main view its_etable_p->set_is_modified(false, _act_type); } //****************************************** VOID C_ETABLE_DEL_OR_CUT_ACTION::UndoSelf() { //if(its_copy_to_scrap==1)ThrowIfOSErr_(::ZeroScrap()); //better to zero scrap only immediately before writing new stuff to it. if(!its_etable_p->unload_editor())return; its_etable_p->nullify_editor(); //this unselects all cells and selects changed ones its_etable_p->read_sub_mat(its_undel_reco); its_etable_p->set_is_modified(false, _act_type); } #pragma mark --C_ETABLE_PASTE_ACTION-- #undef _act_type #define _act_type etable_paste //****************************************** C_ETABLE_PASTE_ACTION::C_ETABLE_PASTE_ACTION( C_EDIT_TABLE * etable_p, //in C_SUB_MATRIX * aft_paste_reco_p) //in :LAction(my_redo_rid, unpaste_ind, false), its_etable_p(etable_p) { //swap info in case *aft_paste_reco_p //goes out of scope before this action does aft_paste_reco_p->swap_info(its_aft_paste_reco); its_bef_paste_reco.its_num_of_cols = its_aft_paste_reco.its_num_of_cols; its_bef_paste_reco.its_num_of_rows = its_aft_paste_reco.its_num_of_rows; its_bef_paste_reco.its_anchor = its_aft_paste_reco.its_anchor; its_etable_p->write_sub_mat(its_bef_paste_reco); its_etable_p->set_is_modified(false, _act_type); } //****************************************** C_ETABLE_PASTE_ACTION::~C_ETABLE_PASTE_ACTION() { } //****************************************** BOOLEAN C_ETABLE_PASTE_ACTION::CanRedo() const { BOOLEAN can_redo = false; if( mIsDone==false && its_etable_p->IsOnDuty() && !its_etable_p->is_modified(_act_type) ){ can_redo = true; } return can_redo; } //****************************************** BOOLEAN C_ETABLE_PASTE_ACTION::CanUndo() const { BOOLEAN can_undo = false; if( mIsDone==true && its_etable_p->IsOnDuty() && !its_etable_p->is_modified(_act_type) ){ can_undo = true; } return can_undo; } //****************************************** VOID C_ETABLE_PASTE_ACTION::RedoSelf() { if(!its_etable_p->unload_editor())return; its_etable_p->nullify_editor(); //this unselects all cells and selects changed ones its_etable_p->read_sub_mat(its_aft_paste_reco); its_etable_p->set_is_modified(false, _act_type); } //****************************************** VOID C_ETABLE_PASTE_ACTION::UndoSelf() { //if(its_copy_to_scrap==1)ThrowIfOSErr_(::ZeroScrap()); //better to zero scrap only immediately before writing new stuff to it. if(!its_etable_p->unload_editor())return; its_etable_p->nullify_editor(); //this unselects all cells and selects changed ones its_etable_p->read_sub_mat(its_bef_paste_reco); its_etable_p->set_is_modified(false, _act_type); } #undef _act_type \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Mac_Other/Mac_EditTable/C_ETABLE_ACTIONS.h b/Legacy/QFog2-MachO/QFogSource/Mac_Other/Mac_EditTable/C_ETABLE_ACTIONS.h new file mode 100644 index 0000000..f2865cc --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Mac_Other/Mac_EditTable/C_ETABLE_ACTIONS.h @@ -0,0 +1 @@ +#pragma once #include "C_SUB_MATRIX.h" class C_EDIT_TABLE; class C_ETABLE_MULTI_SEL; //ETABLE = EDIT_TABLE //uaction = undoing action //****************************************** class C_ETABLE_DEL_OR_CUT_ACTION: public LAction { protected: C_EDIT_TABLE * its_etable_p; C_ETABLE_MULTI_SEL * its_selector_p; USHORT its_copy_to_scrap; //0 if no, 1 if yes C_SUB_MATRIX its_undel_reco; Rect its_saved_sel_rect; public: C_ETABLE_DEL_OR_CUT_ACTION(C_EDIT_TABLE * etable_p, C_ETABLE_MULTI_SEL * selector_p, USHORT copy_to_scrap); virtual ~C_ETABLE_DEL_OR_CUT_ACTION(); virtual Boolean CanRedo() const; virtual Boolean CanUndo() const; virtual void RedoSelf(); virtual void UndoSelf(); }; //****************************************** class C_ETABLE_PASTE_ACTION: public LAction { protected: C_EDIT_TABLE * its_etable_p; C_SUB_MATRIX its_aft_paste_reco; C_SUB_MATRIX its_bef_paste_reco; public: C_ETABLE_PASTE_ACTION(C_EDIT_TABLE * etable_p, C_SUB_MATRIX * aft_paste_reco_p); virtual ~C_ETABLE_PASTE_ACTION(); virtual Boolean CanRedo() const; virtual Boolean CanUndo() const; virtual void RedoSelf(); virtual void UndoSelf(); }; \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Mac_Other/Mac_EditTable/C_ETABLE_MULTI_SEL.cpp b/Legacy/QFog2-MachO/QFogSource/Mac_Other/Mac_EditTable/C_ETABLE_MULTI_SEL.cpp new file mode 100644 index 0000000..8b419a7 --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Mac_Other/Mac_EditTable/C_ETABLE_MULTI_SEL.cpp @@ -0,0 +1 @@ +#include "C_ETABLE_MULTI_SEL.h" //****************************************** C_ETABLE_MULTI_SEL::C_ETABLE_MULTI_SEL( LTableView * tv_p, //in USHORT first_scol, //in USHORT first_srow) //in :LTableMultiSelector(tv_p), its_first_selectable_col(first_scol), its_first_selectable_row(first_srow) { } //****************************************** C_ETABLE_MULTI_SEL::~C_ETABLE_MULTI_SEL() { } #pragma mark --don t draw-- //****************************************** USHORT C_ETABLE_MULTI_SEL::get_sel_size() const { Rect r = mSelectionRgn.Bounds(); //we only use rectangular selection regions return (r.bottom-r.top)*(r.right-r.left); } //****************************************** VOID C_ETABLE_MULTI_SEL::set_sel_rect( const Rect & rect) //in { TableIndexT num_of_rows, num_of_cols; mTableView->GetTableSize(num_of_rows, num_of_cols); STableCell cell(1,1); for(USHORT r=1; r<=num_of_rows; r++){ for(USHORT c=1; c<=num_of_cols; c++){ if( c>=rect.left && c< rect.right && r>=rect.top && rGetTableSize(rows, cols); if ((rows >0) && (cols > 0)) { // Table has some cells // Unhilite existing selection mTableView->HiliteSelection(mTableView->IsActive(), false); // Put all cells in selection ::SetRectRgn(mSelectionRgn, its_first_selectable_col, its_first_selectable_row, //diff SInt16(cols) + 1, SInt16(rows) + 1);//diff mAnchorCell.SetCell(its_first_selectable_row, its_first_selectable_col); //diff mTableView->HiliteSelection(mTableView->IsActive(), true); mTableView->SelectionChanged(); } } //****************************************** void C_ETABLE_MULTI_SEL::ClickSelect( const STableCell & inCell, //in const SMouseDownEvent & inMouseDown) //in { //NONTRIVIAL EXCERPT FROM PP //Too many diffs to mark them. //This function is called inside DragSelect() //Unlike PP, I will not allow disconnected or non-rectangular selection regions. SignalIf_(!is_selectable_cell(inCell)); /* if (inMouseDown.macEvent.modifiers & shiftKey) { if(!is_selectable_cell(mAnchorCell)) { if (!CellIsSelected(inCell)) { UnselectAllCells(); SelectCell(inCell); } mAnchorCell = inCell; }else{// anchor is selectable STableCell saved_anchor = mAnchorCell; UnselectAllCells(); mAnchorCell = saved_anchor; SelectCellBlock(mAnchorCell, inCell); } }else{ // No signficant modifier keys if (!CellIsSelected(inCell)) { UnselectAllCells(); SelectCell(inCell); } mAnchorCell = inCell; } */ //the following code is equivalent but simpler than the commented code if((inMouseDown.macEvent.modifiers & shiftKey) && is_selectable_cell(mAnchorCell)) { STableCell saved_anchor = mAnchorCell; UnselectAllCells(); mAnchorCell = saved_anchor; SelectCellBlock(mAnchorCell, inCell); }else{ if (!CellIsSelected(inCell)) { UnselectAllCells(); SelectCell(inCell); } mAnchorCell = inCell; } } //****************************************** Boolean C_ETABLE_MULTI_SEL::DragSelect( const STableCell & inCell, //in const SMouseDownEvent & inMouseDown) //in { //NONTRIVIAL EXCERPT FROM PP //too many diffs to mark them SignalIf_(!is_selectable_cell(inCell)); //Can't proceed without a selectable anchor. //If inCell is selectable, this will set up a selectable anchor. ClickSelect(inCell, inMouseDown); //I will ignore command key STableCell currCell = inCell; STableCell hitCell = inCell; SPoint32 imageLoc; Point mouseLoc; while (::StillDown()) { mTableView->FocusDraw(); ::GetMouse(&mouseLoc); if (mTableView->AutoScrollImage(mouseLoc)) { mTableView->FocusDraw(); Rect frame; mTableView->CalcLocalFrameRect(frame); SInt32 pt = ::PinRect(&frame, mouseLoc); mouseLoc = *(Point*)&pt; } mTableView->LocalToImagePoint(mouseLoc, imageLoc); mTableView->GetCellHitBy(imageLoc, hitCell); if (currCell != hitCell) { if (is_selectable_cell(hitCell)) { STableCell saved_anchor = mAnchorCell; UnselectAllCells(); mAnchorCell = saved_anchor; SelectCellBlock(mAnchorCell, hitCell); currCell = hitCell; } } } //PP returns whether stayed within inCell all the time. //I return whether ended within anchor cell, //which would mean the final selection is a single cell return mAnchorCell==hitCell; } \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Mac_Other/Mac_EditTable/C_ETABLE_MULTI_SEL.h b/Legacy/QFog2-MachO/QFogSource/Mac_Other/Mac_EditTable/C_ETABLE_MULTI_SEL.h new file mode 100644 index 0000000..e3cb247 --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Mac_Other/Mac_EditTable/C_ETABLE_MULTI_SEL.h @@ -0,0 +1 @@ +#pragma once //****************************************** class C_ETABLE_MULTI_SEL : public LTableMultiSelector { protected: USHORT its_first_selectable_col; USHORT its_first_selectable_row; public: C_ETABLE_MULTI_SEL(LTableView * tv_p, USHORT first_scol, USHORT first_srow); virtual ~C_ETABLE_MULTI_SEL(); VOID set_anchor_cell(const STableCell & cell); BOOLEAN is_selectable_cell(const STableCell & inCell); USHORT get_sel_size() const; Rect get_sel_rect() const; VOID set_sel_rect(const Rect & rect); VOID SelectAllCells(); VOID ClickSelect(const STableCell & inCell, const SMouseDownEvent & inMouseDown); BOOLEAN DragSelect(const STableCell & inCell, const SMouseDownEvent & inMouseDown); }; #pragma mark - //****************************************** inline VOID C_ETABLE_MULTI_SEL::set_anchor_cell( const STableCell & cell) //in { mAnchorCell = cell; } //****************************************** inline BOOLEAN C_ETABLE_MULTI_SEL::is_selectable_cell( const STableCell & cell) //in { //I assume that first N rows and first M columns can be unselectable. //Selectable cells are a subset of valid cells. return mTableView->IsValidCell(cell) && cell.row>=its_first_selectable_row && cell.col>=its_first_selectable_col; } //****************************************** inline Rect C_ETABLE_MULTI_SEL::get_sel_rect() const { return mSelectionRgn.Bounds(); } \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Mac_Other/Mac_EditTable/C_SPEED_LIM_SCROLLER.cpp b/Legacy/QFog2-MachO/QFogSource/Mac_Other/Mac_EditTable/C_SPEED_LIM_SCROLLER.cpp new file mode 100644 index 0000000..5631fbe --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Mac_Other/Mac_EditTable/C_SPEED_LIM_SCROLLER.cpp @@ -0,0 +1 @@ +#include "C_SPEED_LIM_SCROLLER.h" //****************************************** C_SPEED_LIM_SCROLLER::C_SPEED_LIM_SCROLLER( LStream * inStream) //in :LScroller(inStream) {} //****************************************** C_SPEED_LIM_SCROLLER::C_SPEED_LIM_SCROLLER() {} //****************************************** C_SPEED_LIM_SCROLLER::~C_SPEED_LIM_SCROLLER() {} //****************************************** void C_SPEED_LIM_SCROLLER::VertScroll( const SInt16 inPart) //in { long startTicks = ::TickCount(); LScroller::VertScroll(inPart); //this puts an upper limit on scroll rate. while (startTicks + 10>=::TickCount()){} } //****************************************** void C_SPEED_LIM_SCROLLER::HorizScroll( const SInt16 inPart) //in { long startTicks = ::TickCount(); LScroller::HorizScroll(inPart); //this puts an upper limit on scroll rate. while (startTicks + 10>=::TickCount()){} } \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Mac_Other/Mac_EditTable/C_SPEED_LIM_SCROLLER.h b/Legacy/QFog2-MachO/QFogSource/Mac_Other/Mac_EditTable/C_SPEED_LIM_SCROLLER.h new file mode 100644 index 0000000..7a7f560 --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Mac_Other/Mac_EditTable/C_SPEED_LIM_SCROLLER.h @@ -0,0 +1 @@ +#pragma once //****************************************** class C_SPEED_LIM_SCROLLER : public LScroller { protected: public: C_SPEED_LIM_SCROLLER(LStream * inStream); C_SPEED_LIM_SCROLLER(); virtual ~C_SPEED_LIM_SCROLLER(); VOID VertScroll(const SInt16 inPart); VOID HorizScroll(const SInt16 inPart); }; \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Mac_Other/Mac_EditTable/C_SUB_MATRIX.cpp b/Legacy/QFog2-MachO/QFogSource/Mac_Other/Mac_EditTable/C_SUB_MATRIX.cpp new file mode 100644 index 0000000..f398018 --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Mac_Other/Mac_EditTable/C_SUB_MATRIX.cpp @@ -0,0 +1 @@ +#include "C_SUB_MATRIX.h" #include #include "EXCEPTIONS.h" #include "STRINGY.h" //C_SUB_MATRIX is similar to LHandleStream //****************************************** C_SUB_MATRIX::C_SUB_MATRIX() :its_num_of_cols(0), its_num_of_rows(0) { //its_anchor is created as 0,0 automatically its_content_h = ::NewHandle( 0L ); //create_h: I create its_content_h with call to ::NewHandle(). //throwif_h: I call ThrowIfMemFail_ above. //destroy_h: I destroy its_content_h in ~C_SUB_MATRIX(). ThrowIfMemFail_(its_content_h); } //****************************************** C_SUB_MATRIX::~C_SUB_MATRIX() { DisposeHandle_(its_content_h); } //****************************************** BOOLEAN C_SUB_MATRIX::absorb_clipping() { //Refs. //(1)Think Ref. under String.h //(2)Shammas, Mac C++ programming in 21 days if(!get_TEXT_scrap(its_content_h)) return false; //GLOBAL_FUN.h StHandleState saved_h(its_content_h);//preserve handle state //lock its_content_h for the rest of this method ::HLock(its_content_h);//saved handle state //Be nice and ignore any white space //at the end of its_content_h. //byte_len must be at least 1 because //get_TEXT_scrap() added null terminator. LONG byte_len = ::GetHandleSize(its_content_h); LONG pos = byte_len - 1; CHAR * cont_p = *its_content_h; while(pos > -1 && (cont_p[pos]<= 0x20 || cont_p[pos] >= 0x7f)){ cont_p[pos] = '\0'; pos--; } const CHAR * cstr = *its_content_h; its_num_of_rows = 1; //its_num_ofrows= (num of \r + 1) const CHAR * ch_p = cstr; while(1){ ch_p = strchr(ch_p,'\r'); if(ch_p!=0){ its_num_of_rows++; ch_p++; }else{ break; } } its_num_of_cols = 1;// its_num_ofcols = (num of \t + 1) in last row ch_p = cstr; ch_p = strrchr(ch_p, '\r'); while(1){ ch_p = strchr(ch_p,'\t'); if(ch_p!=0){ its_num_of_cols++; ch_p++; }else{ break; } } ch_p = cstr; CHAR * delims = "\t\r"; BOOLEAN clipping_is_rectan=true; for(USHORT r=1; r //---------------------------------------------------------------------------- // C= Color, P= Pen, T=Text class StCPTstate { public: StCPTstate(Boolean saveC, Boolean saveP, Boolean saveT); ~StCPTstate(); void Save(); void Restore(); void Normalize(); private: Boolean mSaveC, mSaveP, mSaveT; RGBColor mForegroundColor; RGBColor mBackgroundColor; PenState mPenState; SInt16 mFontNumber; SInt16 mSize; SInt16 mStyle; SInt16 mMode; }; \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Mac_Other/UModalDialogsPlus.cp b/Legacy/QFog2-MachO/QFogSource/Mac_Other/UModalDialogsPlus.cp new file mode 100644 index 0000000..872bc51 --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Mac_Other/UModalDialogsPlus.cp @@ -0,0 +1 @@ +#include "UModalDialogsPlus.h" //---------------------------------------------------------------------------- // ¥ StDialogHandlerPlus //---------------------------------------------------------------------------- // Constructor StDialogHandlerPlus::StDialogHandlerPlus( ResIDT inDialogResID, // 'PPob' and 'RidL' Resource ID LCommander * inSuper) : StDialogHandler(inDialogResID, inSuper), mParam(0) { } //---------------------------------------------------------------------------- // ¥ DoDialogPlus //---------------------------------------------------------------------------- void StDialogHandlerPlus::DoDialogPlus( MessageT & ioMessage, SInt32 & ioParam) { ioParam = 0; DoDialog(); ioMessage = mMessage; ioParam = mParam; } //---------------------------------------------------------------------------- // ¥ ListenToMessage //---------------------------------------------------------------------------- void StDialogHandlerPlus::ListenToMessage( MessageT inMessage, void * ioParam) { //MONITOR_THE_CHANGE_HERE mMessage = inMessage; mParam = *(SInt32 *)ioParam; // Store message and parameter. DoDialog() will return them both. } // --------------------------------------------------------------------------- // ¥ AskForPermission [static] [public] // --------------------------------------------------------------------------- bool UModalDialogsPlus::AskForPermission( LCommander* inSuper, ResIDT inDialogID, PaneIDT inCaptionID, const LStr255& inMessage) { StDialogHandler theHandler(inDialogID, inSuper); LWindow* theDialog = theHandler.GetDialog(); LCaption* theCaption = dynamic_cast (theDialog->FindPaneByID(inCaptionID)); if (theCaption == nil) { SignalStringLiteral_("No Caption with specified ID"); return false; } theCaption->SetDescriptor(inMessage); theDialog->Show(); bool entryOK = false; while (true) { MessageT hitMessage = theHandler.DoDialog(); if (hitMessage == msg_Cancel) { break; } else if (hitMessage == msg_OK) { entryOK = true; break; } } return entryOK; } \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Mac_Other/UModalDialogsPlus.h b/Legacy/QFog2-MachO/QFogSource/Mac_Other/UModalDialogsPlus.h new file mode 100644 index 0000000..add9be4 --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Mac_Other/UModalDialogsPlus.h @@ -0,0 +1 @@ +#pragma once # include class C_ST_TARGET { private: LCommander * its_target_p; public: C_ST_TARGET(){its_target_p = LCommander::GetTarget();} ~C_ST_TARGET(){LCommander::SwitchTarget(its_target_p);} }; // =========================================================================== class StDialogHandlerPlus: public StDialogHandler { public: StDialogHandlerPlus(ResIDT inDialogResID, LCommander * inSuper); virtual void DoDialogPlus(MessageT & ioMessage, SInt32 & ioParam); virtual void ListenToMessage(MessageT inMessage, void * ioParam); protected: SInt32 mParam; }; // =========================================================================== class UModalDialogsPlus: public UModalDialogs { public: static bool AskForPermission( LCommander* inSuper, ResIDT inDialogID, PaneIDT inCaptionID, const LStr255& inMessage); }; \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Mac_Other/UTextMenus.cpp b/Legacy/QFog2-MachO/QFogSource/Mac_Other/UTextMenus.cpp new file mode 100644 index 0000000..a15c213 --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Mac_Other/UTextMenus.cpp @@ -0,0 +1 @@ +//CW9 last time this file appeared in CW distribution //Used to be under //PP Cookbook Examples/Common f/UTextMenus.h //Cookbook examples: Controls, Hilbert, Menus, PaneView // =========================================================================== // UTextMenus.cp ©1993 Metrowerks Inc. All rights reserved. // =========================================================================== // // This file contains classes and functions to handle the Font, Size and Style // menus. It relies on the fact that the menu IDs of these menus are MENU_Font // MENU_Size, and MENU_Style as defined in PP_Resources.h. // // You can use these functions in your own programs, but bear in mind that // for world-wide code, you may want to alter some of the routines to be // more robust. In particular, USizeMenu::GetFontSize() may need to be revised // to handle non-Roman scripts and USizeMenu::AdjustMenu() should use resources // to display the "Other (nn)É" string. #include #include "UTextMenus.h" LMenu *UTextMenusBase::sFontMenu = nil; MenuHandle UTextMenusBase::sFontMenuH = nil; LMenu *UTextMenusBase::sSizeMenu = nil; MenuHandle UTextMenusBase::sSizeMenuH = nil; LMenu *UTextMenusBase::sStyleMenu = nil; MenuHandle UTextMenusBase::sStyleMenuH = nil; //---------------------------------------------------------------------------- // ¥ UTextMenusBase::XAble (by menu object) //---------------------------------------------------------------------------- // Given a menu handle, enable or disable the entire menu void UTextMenusBase::XAble( LMenu * inMenu, Boolean inEnable) { if (inMenu == nil) return; MenuHandle menuH = inMenu->GetMacMenuH(); XAble(menuH, inEnable); } //---------------------------------------------------------------------------- // ¥ UTextMenusBase::XAble (by menu handle) //---------------------------------------------------------------------------- // Given a menu handle, enable or disable the entire menu void UTextMenusBase::XAble( MenuHandle inMenuH, Boolean inEnable) { if (inMenuH == nil) return ; if (inEnable) ::EnableMenuItem(inMenuH, 0); else ::DisableMenuItem(inMenuH, 0); } //---------------------------------------------------------------------------- // ¥ UTextMenusBase::XAble (by ID) //---------------------------------------------------------------------------- // Given a menu ID, enable or disable the entire menu void UTextMenusBase::XAble( ResIDT inMenuID, Boolean inEnable) { MenuHandle menuH = ::GetMenuHandle(inMenuID); ThrowIfNil_(menuH);//tucci XAble(menuH, inEnable); } //---------------------------------------------------------------------------- // ¥ UTextMenusBase::XAbleEveryItem (by menu object) //---------------------------------------------------------------------------- // Given a menu object, enable or disable all the synthetic items in the menu void UTextMenusBase::XAbleEveryItem( LMenu * inMenu, Boolean inEnable, Boolean inUnmarkAll, Boolean inSetStyleNormal) { if (inMenu == nil) return; XAbleEveryItem(inMenu->GetMacMenuH(), inEnable, inUnmarkAll, inSetStyleNormal); } //---------------------------------------------------------------------------- // ¥ UTextMenusBase::XAbleEveryItem (by menu handle) //---------------------------------------------------------------------------- // Given a menu handle, enable or disable all the items in the menu void UTextMenusBase::XAbleEveryItem( MenuHandle inMenuH, Boolean inEnable, Boolean inUnmarkAll, Boolean inSetStyleNormal) { if (inMenuH == nil) return ; SInt16 itemCount = ::CountMenuItems(inMenuH); for (short i = 1; i <= itemCount; i++) { if (inEnable) ::EnableMenuItem(inMenuH, i); else ::DisableMenuItem(inMenuH, i); if (inUnmarkAll) ::SetItemMark(inMenuH, i, noMark); if (inSetStyleNormal) ::SetItemStyle(inMenuH, i, normal); } } //---------------------------------------------------------------------------- // ¥ UTextMenusBase::XAbleEveryItem (by ID) //---------------------------------------------------------------------------- // Given a menu ID, enable or disable all the items in the menu void UTextMenusBase::XAbleEveryItem( ResIDT inMenuID, Boolean inEnable, Boolean inUnmarkAll, Boolean inSetStyleNormal) { XAbleEveryItem(LMenuBar::GetCurrentMenuBar()->FetchMenu(inMenuID), inEnable, inUnmarkAll, inSetStyleNormal); } #pragma mark ==font== //---------------------------------------------------------------------------- // ¥ UFontMenu::Initialize //---------------------------------------------------------------------------- // Set up the Font menu. Call this function from your application's // constructor. void UFontMenu::Initialize(Boolean inEnabled) { MenuHandle menuH = ::GetMenuHandle(MENU_Font); SignalIf_(menuH == nil); AppendResMenu(menuH, 'FONT'); sFontMenu = LMenuBar::GetCurrentMenuBar()->FetchMenu(MENU_Font); sFontMenuH = menuH; if (inEnabled) EnableMenu(); else DisableMenu(); } //---------------------------------------------------------------------------- // ¥ UFontMenu::AdjustMenu //---------------------------------------------------------------------------- // Place a check mark next to the font name that corresponds to the given // font item number. Turns off marks for all other font names. void UFontMenu::AdjustMenu( SInt16 inCurrentFontItem) { SignalIf_(sFontMenuH == nil); SInt16 itemCount = ::CountMenuItems(sFontMenuH); for (short i = 1; i <= itemCount; i++) { ::EnableMenuItem(sFontMenuH, i); ::CheckMenuItem(sFontMenuH, i, i == inCurrentFontItem); } } //---------------------------------------------------------------------------- // ¥ UFontMenu::DisableMenu //---------------------------------------------------------------------------- // Disable the font menu. void UFontMenu::DisableMenu() // +++ possible inline { XAble(sFontMenuH, false); } //---------------------------------------------------------------------------- // ¥ UFontMenu::EnableMenu //---------------------------------------------------------------------------- // Enable the font menu. void UFontMenu::EnableMenu() // +++ possible inline { XAble(sFontMenuH, true); } //---------------------------------------------------------------------------- // ¥ UFontMenu::DisableEveryItem //---------------------------------------------------------------------------- // Disable each item in the font menu. // Because the Menu Manager uses a long word for the enable/disable flags, // only the first 31 items will be disabled. void UFontMenu::DisableEveryItem() // +++ possible inline { XAbleEveryItem(sFontMenuH, false, true, true); } //---------------------------------------------------------------------------- // ¥ UFontMenu::EnableItems //---------------------------------------------------------------------------- // Enable each item in the font menu. void UFontMenu::EnableEveryItem() // +++ possible inline { XAbleEveryItem(sFontMenuH, true, true, true); } //---------------------------------------------------------------------------- // ¥ UFontMenu::GetFontNumber //---------------------------------------------------------------------------- // Given an item number in the Font menu, return the corresponding font number. SInt16 UFontMenu::GetFontNumber( SInt16 inMenuItem) { Str255 fontName; SInt16 fontNumber; SignalIf_(sFontMenuH == nil); ::GetMenuItemText(sFontMenuH, inMenuItem, fontName); ::GetFNum(fontName, &fontNumber); return fontNumber; } //---------------------------------------------------------------------------- // ¥ UFontMenu::GetFontNumber //---------------------------------------------------------------------------- // Given a font number, return the item number of the font's name in the Font // menu. SInt16 UFontMenu::GetFontItemNumber( SInt16 inFontNumber) { if (sFontMenuH == nil) return 0; SInt16 itemCount = ::CountMenuItems(sFontMenuH); for (short i = 1; i <= itemCount; i++) { Str255 fontName; SInt16 fontNumber; ::GetMenuItemText(sFontMenuH, i, fontName); ::GetFNum(fontName, &fontNumber); if (fontNumber == inFontNumber) return i; } return -1; } #pragma mark ==size== //---------------------------------------------------------------------------- // ¥ USizeMenu::Initialize //---------------------------------------------------------------------------- // Initialize the Size menu by specifying how many items at the end of the size // menu are not font sizes. The default, kDefaultReservedItems, is based on // the Size menu illustrated in Inside Macintosh:Macintosh Toolbox Essentials // page 3-82. Note that the Size menu given there includes the commands "Larger" // and "Smaller" as well as the "Other" command. The Size menu given in the // Macintosh Human Interface Guidlines (pg 122) has only the "Other" command. // The USizeMenu class assumes that all items except the last reserved items // are point sizes. If there is at least one reserved items, it is assumed // to be the "Other" command. SInt16 USizeMenu::mReservedItems = kDefaultReservedItems; void USizeMenu::Initialize( SInt16 inReservedItems, Boolean inEnabled) { MenuHandle menuH = GetMenuHandle(MENU_Size); SignalIf_(menuH == nil); sSizeMenu = LMenuBar::GetCurrentMenuBar()->FetchMenu(MENU_Size); sSizeMenuH = menuH; mReservedItems = inReservedItems; if (inEnabled) EnableMenu(); else DisableMenu(); } //---------------------------------------------------------------------------- // ¥ myStringToNum [static] //---------------------------------------------------------------------------- // Utility used the USizeMenu routines to convert strings to numbers that // ignores anything that's not a number #define IsNumber_(x) ((x) >= '0' && (x) <= '9') static void myStringToNum(Str255 inString, SInt32 * outNum) { SInt16 i; for (i = 1; i <= inString[0]; i++) if (!IsNumber_(inString[i])) break; inString[0] = i-1; ::StringToNum(inString, outNum); } //---------------------------------------------------------------------------- // ¥ USizeMenu::AdjustMenu //---------------------------------------------------------------------------- // Call this function from the FindCommandStatus() function of the commander // that uses the Size menu. // // Places a check mark next to the item that corresponds to the given size. // If there is a "real font" of that size for the given font, use outline style // for the menu item. (Note that we change the style manually here since style is // not one of the parameters that FindCommandStatus() returns.) // // The application's UpdateMenus() function calls FindCommandStatus() for each // menu after it goes through each command number. You can detect this case // when the item number is 0. That's when we take the opportunity to put a check mark // on the "Other" item at the end of the menu and to place the current size in // parentheses if it's not one of the standard sizes. // (See the comment above for USizeMenu::Initialize about reserved items.) void USizeMenu::AdjustMenu( SInt16 inMenuItem, SInt16 inCurrentSize, SInt16 inCurrentFont, Boolean & outEnabled, Boolean & outUsesMark, UInt16 & outMark) { SignalIf_(sSizeMenuH == nil); Str255 itemString; static Boolean sizeItemChecked = 0; if (inMenuItem == 1) sizeItemChecked = 0; ::GetMenuItemText(sSizeMenuH, inMenuItem, itemString); if (inMenuItem > 0) { SInt32 size; outEnabled = true; outUsesMark = true; myStringToNum(itemString, &size); outMark = (size == inCurrentSize ? checkMark : noMark); sizeItemChecked |= (size == inCurrentSize); ::SetItemStyle(sSizeMenuH, inMenuItem, RealFont(inCurrentFont, size) ? outline : normal); } else { if (mReservedItems <= 0) return ; SInt16 numItems = ::CountMenuItems(sSizeMenuH); ::CheckMenuItem(sSizeMenuH, numItems, !sizeItemChecked); LString::CopyPStr("\pOther", itemString); if (!sizeItemChecked) { Str255 sizeString; NumToString(inCurrentSize, sizeString); LString::AppendPStr(itemString, "\p ("); LString::AppendPStr(itemString, sizeString); LString::AppendPStr(itemString, "\p)"); } LString::AppendPStr(itemString, "\pÉ"); ::SetMenuItemText(sSizeMenuH, numItems, itemString); } } //---------------------------------------------------------------------------- // ¥ USizeMenu::DisableMenu //---------------------------------------------------------------------------- // Disable the font menu. void USizeMenu::DisableMenu() // +++ possible inline { XAble(sSizeMenuH, false); } //---------------------------------------------------------------------------- // ¥ USizeMenu::EnableMenu //---------------------------------------------------------------------------- // Enable the font menu. void USizeMenu::EnableMenu() // +++ possible inline { XAble(sSizeMenuH, true); } //---------------------------------------------------------------------------- // ¥ USizeMenu::DisableEveryItem //---------------------------------------------------------------------------- // Disable each item in the size menu. void USizeMenu::DisableEveryItem() // +++ possible inline { XAbleEveryItem(sSizeMenuH, false, true, true); } //---------------------------------------------------------------------------- // ¥ USizeMenu::EnableItems //---------------------------------------------------------------------------- // Enable each item in the size menu. void USizeMenu::EnableEveryItem() // +++ possible inline { XAbleEveryItem(sSizeMenuH, true, true, true); } //---------------------------------------------------------------------------- // ¥ USizeMenu::GetFontSize //---------------------------------------------------------------------------- // Given a menu item in the Size menu, return the corresponding font size. SInt16 USizeMenu::GetFontSize( SInt16 inMenuItem) { Str255 sizeString; SInt32 fontSize; SignalIf_(sSizeMenuH == nil); GetMenuItemText(sSizeMenuH, inMenuItem, sizeString); myStringToNum(sizeString, &fontSize); return fontSize; } #pragma mark ==style== //---------------------------------------------------------------------------- // ¥ UStyleMenu::Initialize //---------------------------------------------------------------------------- // Set up the Style menu. Call this function from your application's // constructor. void UStyleMenu::Initialize(Boolean inEnabled) { MenuHandle menuH = GetMenuHandle(MENU_Style); SignalIf_(menuH == nil); sStyleMenu = LMenuBar::GetCurrentMenuBar()->FetchMenu(MENU_Style); sStyleMenuH = menuH; if (inEnabled) EnableMenu(); else DisableMenu(); } //---------------------------------------------------------------------------- // ¥ UStyleMenu::DisableMenu //---------------------------------------------------------------------------- // Disable the style menu. void UStyleMenu::DisableMenu() // +++ possible inline { XAble(sStyleMenuH, false); } //---------------------------------------------------------------------------- // ¥ UStyleMenu::EnableMenu //---------------------------------------------------------------------------- // Enable the style menu. void UStyleMenu::EnableMenu() // +++ possible inline { XAble(sStyleMenuH, true); } \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Mac_Other/UTextMenus.h b/Legacy/QFog2-MachO/QFogSource/Mac_Other/UTextMenus.h new file mode 100644 index 0000000..4e9122b --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Mac_Other/UTextMenus.h @@ -0,0 +1 @@ +// =========================================================================== // UTextMenus.h ©1993 Metrowerks Inc. All rights reserved. // =========================================================================== // // This file contains classes to handle the Font, Size and Style menus // It relies on the fact that the menu IDs of these menus are MENU_Font // MENU_Size, and MENU_Style as defined in PP_Resources.h. // #pragma once #include #include class LMenu; //****************************************** class UTextMenusBase { protected: static void XAble(LMenu * inMenu, Boolean inEnable); static void XAble(ResIDT inMenuID, Boolean inEnable); static void XAble(MenuHandle inMenuH, Boolean inEnable); static void XAbleEveryItem(LMenu * inMenu, Boolean inEnable, Boolean inUnmarkAll, Boolean inSetStyleNormal); static void XAbleEveryItem(ResIDT inMenuID, Boolean inEnable, Boolean inUnmarkAll, Boolean inSetStyleNormal); static void XAbleEveryItem(MenuHandle inMenuH, Boolean inEnable, Boolean inUnmarkAll, Boolean inSetStyleNormal); static LMenu *sFontMenu; static MenuHandle sFontMenuH; static LMenu *sSizeMenu; static MenuHandle sSizeMenuH; static LMenu *sStyleMenu; static MenuHandle sStyleMenuH; }; //****************************************** class UFontMenu : public UTextMenusBase { public: static void Initialize(Boolean inEnabled = true); static void AdjustMenu(SInt16 inCurrentFont); static void DisableMenu(); static void EnableMenu(); static void DisableEveryItem(); static void EnableEveryItem(); static SInt16 GetFontNumber(SInt16 inMenuItem); static SInt16 GetFontItemNumber(SInt16 inFontNumber); }; //****************************************** class USizeMenu : public UTextMenusBase { public: static void Initialize(SInt16 inReservedItems, Boolean inEnabled = true); static void AdjustMenu(SInt16 inMenuItem, SInt16 inCurrentSize, SInt16 inCurrentFont, Boolean & outEnabled, Boolean & outUsesMark, UInt16 & outMark); static void DisableMenu(); static void EnableMenu(); static void DisableEveryItem(); static void EnableEveryItem(); static SInt16 GetFontSize(SInt16 inMenuItem); private: static SInt16 mReservedItems; }; const SInt16 kDefaultReservedItems = 5; //****************************************** class UStyleMenu : public UTextMenusBase { public: static void Initialize(Boolean inEnabled = true); static void DisableMenu(); static void EnableMenu(); }; \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Mac_Palette/.DS_Store b/Legacy/QFog2-MachO/QFogSource/Mac_Palette/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..5008ddfcf53c02e82d7eee2e57c38e5672ef89f6 GIT binary patch literal 6148 zcmeH~Jr2S!425mzP>H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0portBits, //destination bitmap &icon_map.bounds, // source frame &frame, // destination frame srcCopy, //transfer mode 0); // clip region; 0= not needed ReleaseResource_(icon_h); */ //learned about ::PlotIconID() from LSmallIconTable::DrawCell() if(in_cell.row!=mRows){ ::PlotIconID(&frame, atNone, ttNone, 1100 + 10*in_cell.row); }else{//in_cell.row==mRows C_PALETTE * pal_p = (C_PALETTE *)GetSuperView(); USHORT popup_item = pal_p->get_cur_popup_item();//1 based ::PlotIconID(&frame, atNone, ttNone, 1100 + 10*(mRows + popup_item -1 )); } } //****************************************** VOID C_ICON_TABLE::SelectCell( const TableCellT & in_cell) //in { LTable::SelectCell(in_cell); C_PALETTE * pal_p = (C_PALETTE *)GetSuperView(); if(in_cell.row!=mRows){ pal_p->set_cur_tool((PALETTE_TOOL)in_cell.row); }else{//in_cell.row==mRows USHORT popup_item = pal_p->get_cur_popup_item();//1 based pal_p->set_cur_tool((PALETTE_TOOL)(SHORT(first_nd_tool) + popup_item -1 )); } } \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Mac_Palette/C_ICON_TABLE.h b/Legacy/QFog2-MachO/QFogSource/Mac_Palette/C_ICON_TABLE.h new file mode 100644 index 0000000..82773c7 --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Mac_Palette/C_ICON_TABLE.h @@ -0,0 +1 @@ +#pragma once #include "QFog_constants.h" //****************************************** class C_ICON_TABLE : public LTable { protected: public: C_ICON_TABLE(LStream * inStream); VOID DrawCell( const TableCellT & in_cell); VOID SelectCell(const TableCellT & in_cell); }; \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Mac_Palette/C_PALETTE.cpp b/Legacy/QFog2-MachO/QFogSource/Mac_Palette/C_PALETTE.cpp new file mode 100644 index 0000000..7cfeff6 --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Mac_Palette/C_PALETTE.cpp @@ -0,0 +1 @@ +#include "C_PALETTE.h" #include "C_APP.h" #pragma mark --creation/destruction-- //****************************************** C_PALETTE::C_PALETTE( LStream * inStream) //in :LWindow(inStream), its_popup_p(0), its_table_p(0), its_swatch_p(0), its_cur_tool(selection_tool) {} //****************************************** C_PALETTE::C_PALETTE() :its_popup_p(0), its_table_p(0), its_swatch_p(0), its_cur_tool(selection_tool) {} //****************************************** VOID C_PALETTE::FinishCreateSelf() { its_table_p = (LTable *)FindPaneByID(pal_icon_table_rid); its_popup_p = (LPopupButton *)FindPaneByID(pal_nd_tool_popup_rid); its_swatch_p = (C_COLOR_SWATCH *)FindPaneByID(pal_swatch_rid); // Activate RidL resource. UReanimator::LinkListenerToControls(this, this, pal_ridl); } //****************************************** C_PALETTE::~C_PALETTE() { //its SuperCommander defined in C_APP::create_pal() ((C_APP *)GetSuperCommander())->finish_palette_closing(); } #pragma mark --popup related-- //****************************************** USHORT C_PALETTE::get_cur_popup_item() const { if(its_popup_p!=0){ return its_popup_p->GetValue(); }else{ return 1; } } //****************************************** VOID C_PALETTE::ListenToMessage( MessageT inMessage, //in VOID * ioParam ) //i-o { //MONITOR_THE_CHANGE_HERE switch(inMessage){ case msg_pal_nd_tool_popup: // for standard popup: inMessage = pane id, *ioParam = current item USHORT item = *((SInt32 *)ioParam); its_cur_tool = (PALETTE_TOOL)(SHORT(first_nd_tool) + item -1); TableCellT cell; its_table_p->GetTableSize(cell.row, cell.col); //no need to do C_ICON_TABLE::SelectCell() and reset cur tool its_table_p->LTable::SelectCell(cell); //last call won't redraw if cell already selected its_table_p->Refresh(); break; } } \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Mac_Palette/C_PALETTE.h b/Legacy/QFog2-MachO/QFogSource/Mac_Palette/C_PALETTE.h new file mode 100644 index 0000000..cfac0a6 --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Mac_Palette/C_PALETTE.h @@ -0,0 +1 @@ +#pragma once #include "QFog_constants.h" #include "C_COLOR_SWATCH.h" enum PALETTE_TOOL { no_tool=0, selection_tool=1, drag_tool, open_tool, rotation_tool, paint_tool, copy_color_tool, arrow_tool, arrow_source_tool, beam_spl_tool, custom_nd_tool, det_nd_tool, pol_rot_tool, polarizer_tool, qbit_rot_tool, sg_magnet_tool }; //bi_nd selector is NOT a palette tool: //a palette tool is global over documents, but a bi node tool isn't! const PALETTE_TOOL first_nd_tool = beam_spl_tool; //For inspiration, see CSimplePalette in WindDiag PP example //****************************************** class C_PALETTE : public LWindow, public LListener { protected: LTable * its_table_p; LPopupButton * its_popup_p; C_COLOR_SWATCH * its_swatch_p; PALETTE_TOOL its_cur_tool; public: C_PALETTE(LStream * inStream); C_PALETTE(); VOID FinishCreateSelf(); virtual ~C_PALETTE(); PALETTE_TOOL get_cur_tool(); VOID set_cur_tool(PALETTE_TOOL tool); const RGBColor & get_cur_color(); VOID set_cur_color(const RGBColor & color); USHORT get_cur_popup_item() const; VOID ListenToMessage(MessageT inMessage, VOID * ioParam ); }; #pragma mark - //****************************************** inline PALETTE_TOOL C_PALETTE::get_cur_tool() { return its_cur_tool; } //****************************************** inline VOID C_PALETTE::set_cur_tool( PALETTE_TOOL tool) //in { its_cur_tool = tool; } //****************************************** inline const RGBColor & C_PALETTE::get_cur_color() { return its_swatch_p->get_cur_color(); } //****************************************** inline VOID C_PALETTE::set_cur_color( const RGBColor & color) //in { its_swatch_p->set_cur_color(color); } \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Mac_PiWind/.DS_Store b/Legacy/QFog2-MachO/QFogSource/Mac_PiWind/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..5008ddfcf53c02e82d7eee2e57c38e5672ef89f6 GIT binary patch literal 6148 zcmeH~Jr2S!425mzP>H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0get_nd_ptr(its_nd); USHORT r = cell.row -1; COMPLEX z; switch(cell.col){ case 1: if(nd_p->is_active_state(r)){ str= "\p*"; }else{ str = "\p"; } break; case 2: nd_p->get_st_name(r).fill_LStr255(str); break; case 3: z = nd_p->get_tm_amps().read_ele(r, its_in_st); if(its_coord_sys == rect_cs){ //The Assign's in this method are not being used to truncate_so_fits_box. str.Assign(real(z), FIXEDDECIMAL, 15); }else{//its_coord_sys == polar_cs str.Assign(abs(z), FIXEDDECIMAL, 15); } str[0] = 15; //we only let the cell editor store 15 chars for decimals break; case 4: z = nd_p->get_tm_amps().read_ele(r, its_in_st); if(its_coord_sys == rect_cs){ str.Assign(imag(z), FIXEDDECIMAL, 15); }else{//its_coord_sys == polar_cs DOUBLE degs = arg(z)*180/my_pi; if(isnan(degs)) degs = 0; limited_degrees(degs); str.Assign(degs, FIXEDDECIMAL, 15); str[0] = 15; //we only let the cell editor store 15 chars for decimals } break; } } //****************************************** VOID C_PI_AMPS_TABLE::set_cell_data( const STableCell & cell, //in const LStr255 & str) //in { NODE * nd_p = its_net_p->get_nd_ptr(its_nd); DOUBLE dec, x, y, radius, theta; COMPLEX z; USHORT r = cell.row -1; switch(cell.col){ case 1: if(str[0]==0){ //str=="\p" nd_p->deactivate_state(r); }else if(str[0]==1){ //str=="\p*" nd_p->activate_state(r); } break; case 2: nd_p->set_st_name(r, STRINGY(str)); break; case 3: dec = double_t(str); z = nd_p->get_tm_amps().read_ele(r, its_in_st); if(its_coord_sys == rect_cs){ x = dec; y = imag(z); }else{//its_coord_sys == polar_cs radius = dec; theta = arg(z); if(isnan(theta)) theta = 0; x = radius*cos(theta); y = radius*sin(theta); } nd_p->set_tm_amp(r, its_in_st, COMPLEX(x, y)); break; case 4: dec = double_t(str); z = nd_p->get_tm_amps().read_ele(r, its_in_st); if(its_coord_sys == rect_cs){ x = real(z); y = dec; }else{//its_coord_sys == polar_cs radius = abs(z); theta = dec*my_pi/180; x = radius*cos(theta); y = radius*sin(theta); } nd_p->set_tm_amp(r, its_in_st, COMPLEX(x, y)); break; } RefreshCell(cell); } //****************************************** BOOLEAN C_PI_AMPS_TABLE::str_is_valid_cell_entry( const STableCell & cell, //in Str255 pstr) //in { DOUBLE dec; USHORT r = cell.row -1; switch(cell.col){ case 1: SignalIf_(pstr[0]>1); break; case 2: if(pstr[0]==0){ my_gen_alert("Empty node-state names are not allowed."); return false; } if(!STRINGY(pstr).is_legal_name()){ my_gen_alert("You are trying to enter an illegal string for the name of a node state."); return false; } break; case 3://fall to next one case 4: if(pstr[0]==0){ my_gen_alert("Empty amplitude cells are not allowed."); return false; } if(!STRINGY(pstr).is_double(dec)){ my_gen_alert("You are trying to enter a non-numeric string for an amplitude."); return false; } break; } return true; /* this code used to check that magnitude of a row was less than one: NODE * nd_p = its_net_p->get_nd_ptr(its_nd); COMPLEX z = nd_p->get_tm_amps().read_ele(cell.row -1, its_in_st); DOUBLE x, y, mag; if(cell.col==3){ if(its_coord_sys == rect_cs){ x = dec; y = imag(z); mag = abs(COMPLEX(x,y)); }else{//its_coord_sys == polar_cs mag = dec; } } if(cell.col==4){ if(its_coord_sys == rect_cs){ x = real(z); y = dec; mag = abs(COMPLEX(x,y)); }else{//its_coord_sys == polar_cs mag = 1; // actually mag = abs(z) but there is no need to check again. } } if(mag>1){ my_gen_alert("Illegal table-entry. Your entry would create an inadmissible amplitude with magnitude greater than 1. Please fix before continuing."); return false; } */ } //****************************************** VOID C_PI_AMPS_TABLE::delete_cell_data( const STableCell & cell) //in { NODE * nd_p = its_net_p->get_nd_ptr(its_nd); DOUBLE x, y; COMPLEX z; USHORT r = cell.row -1; switch(cell.col){ case 1: nd_p->deactivate_state(r); break; case 2: nd_p->set_st_name(r, STRINGY("x")); break; case 3: z = nd_p->get_tm_amps().read_ele(r, its_in_st); if(its_coord_sys == rect_cs){ x = 0; y = imag(z); }else{//its_coord_sys == polar_cs x = 0; y = 0; } nd_p->set_tm_amp(r, its_in_st, COMPLEX(x, y)); break; case 4: z = nd_p->get_tm_amps().read_ele(r, its_in_st); if(its_coord_sys == rect_cs){ x = real(z); y = 0; }else{//its_coord_sys == polar_cs x = abs(z); y = 0; } nd_p->set_tm_amp(r, its_in_st, COMPLEX(x, y)); break; } RefreshCell(cell); } //****************************************** VOID C_PI_AMPS_TABLE::DrawCell( const STableCell & inCell, //in const Rect & inLocalRect) //in {//drawer StCPTstate saved_st(true, false, true); saved_st.Normalize(); ::TextSize(its_font_size); ::TextFont(its_font_num); ::MoveTo(inLocalRect.left + 4, inLocalRect.bottom - 4); LStr255 str; get_cell_data(inCell, str); switch(inCell.col){ case 1: break; case 2: trunc_pstr_so_it_fits(str, GetColWidth(inCell.col), 8); break; case 3: case 4: str[0] = 8; break; } ::DrawString(str); draw_cell_frame(inLocalRect);//see GLOBAL_FUN.h } //****************************************** VOID C_PI_AMPS_TABLE::ClickCell( const STableCell & inCell, //in const SMouseDownEvent & inMouseDown) //in { //MONITOR_THE_CHANGE_HERE //If click on a cell out of bounds for the editor (col =1) //or on an area outside the table //(see C_PI_WIND::Click()), //editor's cell is set to nullcell. //If the editor's cell is null, //unload_editor() does nothing and returns true switch(inCell.col){ case 1: //Can't have this: //if(its_editor_p->get_cell()==inCell)return; //because clicking a second time on the same cell //should toggle the activity of the state. if(!unload_editor())break; nullify_editor(); UnselectAllCells(); USHORT r = inCell.row - 1; NODE * nd_p = its_net_p->get_nd_ptr(its_nd); if(nd_p->is_active_state(r)){ nd_p->deactivate_state(r); }else{ nd_p->activate_state(r); } RefreshCell(inCell); BroadcastMessage(msg_pi_refresh_num_of_rows_cap); break; case 2: C_EDIT_TABLE::ClickCell(inCell, inMouseDown); break; case 3: case 4: C_EDIT_TABLE::ClickCell(inCell, inMouseDown); //Note that C_EDIT_TABLE::ClickCell() //sets to 31 //the max num of characters that //the cell editor will accept. //In the case of columns 3 and 4, //we don't want the default value //so we change it. set_max_chars_of_cell_editor(15); BroadcastMessage(msg_pi_clear_total_prob_cap); break; } } #pragma mark --about many cells-- //****************************************** VOID C_PI_AMPS_TABLE::set_in_st( TM_COL_NUM new_in_st) //in { nullify_editor(); UnselectAllCells(); its_in_st =new_in_st; STableCell cell; for(USHORT r=0; rget_nd_ptr(its_nd)->get_degen(); r++){ cell.row = r + 1; cell.col = 3; RefreshCell(cell); cell.col = 4; RefreshCell(cell); } } //****************************************** VOID C_PI_AMPS_TABLE::set_nd_always( USHORT new_nd) //in { nullify_editor(); UnselectAllCells(); its_nd =new_nd; UInt32 num_of_rows, num_of_cols; GetTableSize(num_of_rows, num_of_cols); if(num_of_rows != 0){ RemoveRows( num_of_rows, //how many 1, //starting with row true);//refresh } USHORT degen = its_net_p->get_nd_ptr(its_nd)->get_degen(); InsertRows( degen, //how many 0, //after which row 0, //data pointer 0, //data size true); //refresh STableCell cell; for(USHORT r=0; rget_nd_ptr(its_nd); STableCell cell; cell.col = 1; for(USHORT r=0; rget_degen(); r++){ cell.row = r + 1; if(!nd_p->is_active_state(r)){ nd_p->activate_state(r); RefreshCell(cell); } } } //****************************************** VOID C_PI_AMPS_TABLE::deactivate_all_states() { NODE * nd_p = its_net_p->get_nd_ptr(its_nd); STableCell cell; cell.col = 1; for(USHORT r=0; rget_degen(); r++){ cell.row = r + 1; if(nd_p->is_active_state(r)){ nd_p->deactivate_state(r); RefreshCell(cell); } } } #pragma mark --notifying total_prob_caption-- //****************************************** VOID C_PI_AMPS_TABLE::read_sub_mat( const C_SUB_MATRIX & smat) //in { BroadcastMessage(msg_pi_clear_total_prob_cap); C_EDIT_TABLE::read_sub_mat(smat); } //****************************************** VOID C_PI_AMPS_TABLE::delete_selection() { BroadcastMessage(msg_pi_clear_total_prob_cap); C_EDIT_TABLE::delete_selection(); } \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Mac_PiWind/C_PI_AMPS_TABLE.h b/Legacy/QFog2-MachO/QFogSource/Mac_PiWind/C_PI_AMPS_TABLE.h new file mode 100644 index 0000000..2056be6 --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Mac_PiWind/C_PI_AMPS_TABLE.h @@ -0,0 +1 @@ +#pragma once #include "QFog_constants.h" #include "C_EDIT_TABLE.h" #include "TRANS_MAT.h" #include "C_TOP_PTRS.h" //****************************************** class C_PI_AMPS_TABLE : public C_EDIT_TABLE, public LBroadcaster, public C_TOP_PTRS { protected: USHORT its_nd; TM_COL_NUM its_in_st; COORD_SYSTEM its_coord_sys; //COORD_SYS defined in "QFog_constants.h" public: C_PI_AMPS_TABLE(LStream * inStream); virtual ~C_PI_AMPS_TABLE(); virtual VOID get_cell_data(const STableCell & inCell, LStr255 & str); virtual VOID set_cell_data(const STableCell & inCell, const LStr255 & str); virtual BOOLEAN str_is_valid_cell_entry(const STableCell & cell, Str255 pstr); virtual VOID delete_cell_data(const STableCell & inCell); VOID DrawCell(const STableCell & inCell, const Rect & inLocalRect); VOID ClickCell(const STableCell & inCell, const SMouseDownEvent & inMouseDown); VOID set_in_st(TM_COL_NUM new_in_st); VOID set_nd_always(USHORT new_nd); VOID set_coord_sys(COORD_SYSTEM sys); VOID activate_all_states(); VOID deactivate_all_states(); VOID read_sub_mat(const C_SUB_MATRIX & smat); VOID delete_selection(); }; \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Mac_PiWind/C_PI_ND_EFIELD.cpp b/Legacy/QFog2-MachO/QFogSource/Mac_PiWind/C_PI_ND_EFIELD.cpp new file mode 100644 index 0000000..56f13b0 --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Mac_PiWind/C_PI_ND_EFIELD.cpp @@ -0,0 +1 @@ +#include "C_PI_ND_EFIELD.h" #pragma mark --creation/destruction-- //****************************************** C_PI_ND_EFIELD::C_PI_ND_EFIELD( LStream * inStream) //in :LEditField(inStream) {} //****************************************** C_PI_ND_EFIELD::C_PI_ND_EFIELD() {} //****************************************** C_PI_ND_EFIELD::~C_PI_ND_EFIELD() {} #pragma mark --spend time broadcasting-- //****************************************** VOID C_PI_ND_EFIELD::SpendTime( const EventRecord & inMacEvent ) //in { LEditField::SpendTime(inMacEvent); BroadcastMessage(msg_pi_nd_efield, this); } \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Mac_PiWind/C_PI_ND_EFIELD.h b/Legacy/QFog2-MachO/QFogSource/Mac_PiWind/C_PI_ND_EFIELD.h new file mode 100644 index 0000000..7db1e7c --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Mac_PiWind/C_PI_ND_EFIELD.h @@ -0,0 +1 @@ +#pragma once #include "QFog_constants.h" #include "C_KEYS.h" //****************************************** class C_PI_ND_EFIELD : public LEditField, public LBroadcaster { protected: USHORT its_nd; public: C_PI_ND_EFIELD(LStream * inStream); C_PI_ND_EFIELD(); virtual ~C_PI_ND_EFIELD(); VOID FinishCreateSelf(); USHORT get_nd(); VOID set_nd_always(USHORT nd); VOID SpendTime( const EventRecord & inMacEvent ); VOID scroll_to_home(); }; #pragma mark - //****************************************** inline VOID C_PI_ND_EFIELD::FinishCreateSelf() { SetKeyFilter(C_KEYS::my_PrintingCharField); } //****************************************** inline USHORT C_PI_ND_EFIELD::get_nd() { return its_nd; } //****************************************** inline VOID C_PI_ND_EFIELD::set_nd_always( USHORT nd) //in { its_nd = nd; } //****************************************** inline VOID C_PI_ND_EFIELD::scroll_to_home() { //Ref: LEditField::HandleKeyPress() ::TESetSelect(0, 0, mTextEditH); } \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Mac_PiWind/C_PI_ND_POPUP.cpp b/Legacy/QFog2-MachO/QFogSource/Mac_PiWind/C_PI_ND_POPUP.cpp new file mode 100644 index 0000000..284b953 --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Mac_PiWind/C_PI_ND_POPUP.cpp @@ -0,0 +1 @@ +#include "C_PI_ND_POPUP.h" #include "C_PI_WIND.h" #include "QB_NET.h" #pragma mark --creation/destruction-- //****************************************** C_PI_ND_POPUP::C_PI_ND_POPUP( LStream * inStream) //in :LPopupButton(inStream) {} //****************************************** C_PI_ND_POPUP::~C_PI_ND_POPUP() {} #pragma mark --refresh-- //****************************************** VOID C_PI_ND_POPUP::change_items() { MenuHandle menu_h = GetMacMenuH(); //destroy_h: by PP ThrowIfNil_(menu_h); SInt16 num_of_items = ::CountMenuItems(menu_h); for(SInt16 menu_item =1; menu_item<= num_of_items; menu_item++){ ::DeleteMenuItem(menu_h, 1); } //replacing the above by DeleteAllMenus() caused crash (maybe because //must stop broadcasting while calling it? NODE * nd_p; for(USHORT nd=0; nd < its_net_p->get_num_of_nds(); nd++){ nd_p = its_net_p->get_nd_ptr(nd); // Add the item // Insert a dummy item, then rename it so special chars are not a problem ::AppendMenu(menu_h, "\pdummy"); LStr255 descriptor_pstr; nd_p->get_name().fill_LStr255(descriptor_pstr); if(descriptor_pstr[0]!=0)::SetMenuItemText( menu_h, nd+1 , descriptor_pstr ); } SetMinValue(1); SetMaxValue(its_net_p->get_num_of_nds()); C_PI_WIND * wind_p = (C_PI_WIND *)GetSuperView(); StopBroadcasting(); SetValue( wind_p->get_nd() +1); StartBroadcasting(); } //****************************************** VOID C_PI_ND_POPUP::ClickSelf( const SMouseDownEvent & inMouseDown) //in { //MONITOR_THE_CHANGE_HERE change_items(); LPopupButton::ClickSelf(inMouseDown); } \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Mac_PiWind/C_PI_ND_POPUP.h b/Legacy/QFog2-MachO/QFogSource/Mac_PiWind/C_PI_ND_POPUP.h new file mode 100644 index 0000000..8db49d1 --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Mac_PiWind/C_PI_ND_POPUP.h @@ -0,0 +1 @@ +#pragma once #include "QFog_constants.h" #include "C_TOP_PTRS.h" //****************************************** class C_PI_ND_POPUP : public LPopupButton, public C_TOP_PTRS { protected: public: C_PI_ND_POPUP(LStream * inStream); virtual ~C_PI_ND_POPUP(); VOID change_items(); VOID ClickSelf(const SMouseDownEvent & inMouseDown); }; \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Mac_PiWind/C_PI_PARENTS_TABLE.cpp b/Legacy/QFog2-MachO/QFogSource/Mac_PiWind/C_PI_PARENTS_TABLE.cpp new file mode 100644 index 0000000..02f902f --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Mac_PiWind/C_PI_PARENTS_TABLE.cpp @@ -0,0 +1 @@ +#include "C_PI_PARENTS_TABLE.h" #include "STRETCH_OR_FOLD.h" #include "QB_NET.h" #include "GLOBAL_FUN.h" #include "C_PI_PA_ST_POPUP.h" #include "C_PI_WIND.h" #include "StCPTstate.h" #pragma mark --creation/destruction-- //****************************************** C_PI_PARENTS_TABLE::C_PI_PARENTS_TABLE( LStream * inStream) //in :LTableView(inStream) { LTableMonoGeometry * geo_p = new LTableMonoGeometry(this, 132 /* cell width */, 20/*cell height*/); //delete: in ~LTableView(). ThrowIfNil_(geo_p); SetTableGeometry(geo_p); // total width = 264 = 2(132) InsertCols( 2, //how many 0, //after which col 0, //data pointer 0, //data size false); //refresh its_popups_p_p = 0; mRows=0; } //****************************************** C_PI_PARENTS_TABLE::C_PI_PARENTS_TABLE() {} //****************************************** C_PI_PARENTS_TABLE::~C_PI_PARENTS_TABLE() { for(USHORT i=0; iFinishCreate(); popup_p->Show(); LView * view_p = this; do{ view_p = view_p->GetSuperView(); }while(view_p->GetSuperView()!=0); popup_p->AddListener( (LListener *)(C_PI_WIND *)view_p ); return popup_p; } #pragma mark --const fun-- //****************************************** USHORT C_PI_PARENTS_TABLE::get_in_nd_st( USHORT row) //in const { NODE * nd_p = its_net_p->get_nd_ptr(its_nd); STRETCH_OR_FOLD sof_in(nd_p->get_in_nd_degens()); return sof_in.vec_label(its_in_st)[row - 1]; } #pragma mark --draw one cell-- //****************************************** VOID C_PI_PARENTS_TABLE::DrawCell( const STableCell & inCell, //in const Rect & inLocalRect) //in {//drawer StCPTstate saved_st(true, false, true); saved_st.Normalize(); ::TextFont(systemFont); ::MoveTo(inLocalRect.left + 4, inLocalRect.bottom - 4); LStr255 str; NODE * nd_p = its_net_p->get_nd_ptr(its_nd); USHORT in_nd = nd_p->get_in_nds()[inCell.row-1]; if(inCell.col == 1){ its_net_p->get_nd_ptr(in_nd)->get_name().fill_LStr255(str); //pixs_for_margins = 8 trunc_pstr_so_it_fits(str, GetColWidth(1), 8); //see GLOBAL_FUN.h }else if(inCell.col == 2){ STRETCH_OR_FOLD sof_in(nd_p->get_in_nd_degens()); USHORT in_nd_st = sof_in.vec_label(its_in_st)[inCell.row-1]; its_net_p->get_nd_ptr(in_nd)->get_st_name(in_nd_st).fill_LStr255(str); //add extra 18 pixs to pixs_for_margins to create room for popup trunc_pstr_so_it_fits(str, GetColWidth(2), 8 + 18); } ::DrawString(str); draw_cell_frame(inLocalRect);//see GLOBAL_FUN.h } #pragma mark --functions that call RefreshCell()-- //****************************************** VOID C_PI_PARENTS_TABLE::set_in_st( TM_COL_NUM new_in_st) //in { its_in_st =new_in_st; STableCell cell; cell.col = 2; USHORT num_of_rows = its_net_p->get_nd_ptr(its_nd)->get_num_of_in_nds(); for(USHORT r=0; rget_nd_ptr(its_nd); UInt32 new_num_of_rows = nd_p->get_num_of_in_nds(); InsertRows( new_num_of_rows,//how many 0, //after which row 0, //data pointer 0, //data size true); //refresh //col 1 STableCell cell; cell.col = 1; for(USHORT r=0; rset_nd_always(nd_p->get_in_nds()[i]); } } //****************************************** VOID C_PI_PARENTS_TABLE::rename_a_nd( USHORT nd) //in { USHORT in_nd; STableCell cell; cell.col = 1; USHORT num_of_rows = its_net_p->get_nd_ptr(its_nd)->get_num_of_in_nds(); for(USHORT r=0; rget_nd_ptr(its_nd)->get_in_nds()[r]; if(in_nd==nd){ RefreshCell(cell); return; } } } \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Mac_PiWind/C_PI_PARENTS_TABLE.h b/Legacy/QFog2-MachO/QFogSource/Mac_PiWind/C_PI_PARENTS_TABLE.h new file mode 100644 index 0000000..4037025 --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Mac_PiWind/C_PI_PARENTS_TABLE.h @@ -0,0 +1 @@ +#pragma once #include "QFog_constants.h" #include "TRANS_MAT.h"//contains TM_COL_NUM #include "C_TOP_PTRS.h" class C_PI_PA_ST_POPUP; //****************************************** class C_PI_PARENTS_TABLE : public LTableView, public C_TOP_PTRS { protected: USHORT its_nd; TM_COL_NUM its_in_st; C_PI_PA_ST_POPUP * * its_popups_p_p; public: C_PI_PARENTS_TABLE(LStream * inStream); C_PI_PARENTS_TABLE(); virtual ~C_PI_PARENTS_TABLE(); VOID reset_num_of_popups(USHORT new_num_of_rows, USHORT old_num_of_rows); C_PI_PA_ST_POPUP * create_popup_in_this_row(USHORT table_row); USHORT get_in_nd_st(USHORT row) const; VOID DrawCell(const STableCell & inCell, const Rect & inLocalRect); VOID set_in_st(TM_COL_NUM new_in_st); VOID set_nd_always(USHORT new_nd); VOID rename_a_nd(USHORT nd); }; \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Mac_PiWind/C_PI_PA_ST_POPUP.cpp b/Legacy/QFog2-MachO/QFogSource/Mac_PiWind/C_PI_PA_ST_POPUP.cpp new file mode 100644 index 0000000..f15cabb --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Mac_PiWind/C_PI_PA_ST_POPUP.cpp @@ -0,0 +1 @@ +#include "C_PI_PA_ST_POPUP.h" #include "C_PI_PARENTS_TABLE.h" #include "QB_NET.h" #pragma mark --creation/destruction-- //****************************************** C_PI_PA_ST_POPUP::C_PI_PA_ST_POPUP( LStream * inStream) //in :LPopupButton(inStream) {} //****************************************** C_PI_PA_ST_POPUP::C_PI_PA_ST_POPUP( const SPaneInfo& inPaneInfo, //in MessageT inValueMessage, //in SInt16 inTitleOptions, //in ResIDT inMENUid, //in SInt16 inTitleWidth, //in SInt16 inKind, //in ResIDT inTextTraitsID, //in ConstStringPtr inTitle, //in OSType inResTypeMENU, //in SInt16 inInitialMenuItem, //in ClassIDT inImpID, //in USHORT table_row, //in C_DOC * doc_p, //in C_MAIN_VIEW * mview_p, //in QB_NET * net_p) //in :LPopupButton( inPaneInfo, inValueMessage, inTitleOptions, inMENUid, inTitleWidth, inKind, inTextTraitsID, inTitle, inResTypeMENU, inInitialMenuItem, inImpID), its_table_row(table_row) { set_top_ptrs(doc_p, mview_p, net_p); } //****************************************** C_PI_PA_ST_POPUP::~C_PI_PA_ST_POPUP() {} #pragma mark --refresh-- //****************************************** VOID C_PI_PA_ST_POPUP::change_items() { MenuHandle menu_h = GetMacMenuH(); //destroy_h: by PP ThrowIfNil_(menu_h); SInt16 num_of_items = ::CountMenuItems(menu_h); for(SInt16 menu_item =1; menu_item<= num_of_items; menu_item++){ ::DeleteMenuItem(menu_h, 1); } NODE * nd_p = its_net_p->get_nd_ptr(its_nd); USHORT degen = nd_p->get_degen(); LStr255 descriptor; for(USHORT i=0; i < degen; i++){ // Add the item // Insert a dummy item, then rename it so special chars are not a problem ::AppendMenu(menu_h, "\pdummy"); nd_p->get_st_name(i).fill_LStr255(descriptor); if(descriptor[0]!=0)::SetMenuItemText( menu_h, i+1 , descriptor ); } SetMinValue(1); SetMaxValue(degen); C_PI_PARENTS_TABLE * table_p = (C_PI_PARENTS_TABLE *)GetSuperView(); StopBroadcasting(); SetValue( table_p->get_in_nd_st(its_table_row) + 1); //mValue is 1 based StartBroadcasting(); } //****************************************** VOID C_PI_PA_ST_POPUP::ClickSelf( const SMouseDownEvent & inMouseDown) //in { //MONITOR_THE_CHANGE_HERE change_items(); LPopupButton::ClickSelf(inMouseDown); } \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Mac_PiWind/C_PI_PA_ST_POPUP.h b/Legacy/QFog2-MachO/QFogSource/Mac_PiWind/C_PI_PA_ST_POPUP.h new file mode 100644 index 0000000..1ad0e5b --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Mac_PiWind/C_PI_PA_ST_POPUP.h @@ -0,0 +1 @@ +#pragma once #include "QFog_constants.h" #include "C_TOP_PTRS.h" //****************************************** class C_PI_PA_ST_POPUP : public LPopupButton, public C_TOP_PTRS { //PI_PA_ST = prior-info parent state protected: USHORT its_table_row; //its_popup row is mValue USHORT its_nd; //the particular in_nd of the focus node public: C_PI_PA_ST_POPUP(LStream * inStream); C_PI_PA_ST_POPUP( const SPaneInfo& inPaneInfo, MessageT inValueMessage, SInt16 inTitleOptions, ResIDT inMENUid, SInt16 inTitleWidth, SInt16 inKind, ResIDT inTextTraitsID, ConstStringPtr inTitle, OSType inResTypeMENU, SInt16 inInitialMenuItem, ClassIDT inImpID, USHORT table_row, C_DOC * doc_p, C_MAIN_VIEW * mview_p, QB_NET * net_p); VOID set_nd_always(USHORT nd); virtual ~C_PI_PA_ST_POPUP(); VOID change_items(); VOID ClickSelf(const SMouseDownEvent & inMouseDown); }; #pragma mark - //****************************************** inline VOID C_PI_PA_ST_POPUP::set_nd_always( USHORT nd) //in { its_nd= nd; } \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Mac_PiWind/C_PI_WIND.cpp b/Legacy/QFog2-MachO/QFogSource/Mac_PiWind/C_PI_WIND.cpp new file mode 100644 index 0000000..ddf94f8 --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Mac_PiWind/C_PI_WIND.cpp @@ -0,0 +1 @@ +#include "EXCEPTIONS.h" #include "C_DOC.h" #include "C_PI_WIND.h" #include "C_EFIELD_PASTE_ATMENT.h" #include "C_MAIN_VIEW.h" #include "C_KEYS.h" #include "C_NET_QTABLE.h" #include "MY_FSTREAMS.h" #include "STRINGY.h" #include "TRANS_MAT.h" #include #include "BEAM_SPL.h" #include "CUSTOM_ND.h" #include "DET_ND.h" #include "POL_ROTATOR.h" #include "POLARIZER.h" #include "SG_MAGNET.h" #pragma mark --creation/destruction-- //****************************************** C_PI_WIND::C_PI_WIND( LStream * inStream) //in :LWindow(inStream), its_coord_sys(rect_cs) {} //****************************************** C_PI_WIND::C_PI_WIND() {} //****************************************** C_PI_WIND::~C_PI_WIND() { its_mview_p->finish_pi_wind_closing(); } //****************************************** VOID C_PI_WIND::show_owner( const LStr255 & file_name) //in { LStr255 cap = "\pProject: "; cap += (LStr255)file_name; its_owner_cap_p->SetDescriptor(cap); } //****************************************** VOID C_PI_WIND::special_finish_create( const LStr255 & file_name, //in USHORT sel_nd) //in { its_owner_cap_p = (LCaption *)FindPaneByID(pi_owner_cap_rid); its_nd_efield_p = (C_PI_ND_EFIELD *)FindPaneByID(pi_nd_efield_rid); its_nd_popup_p = (C_PI_ND_POPUP *)FindPaneByID(pi_nd_popup_rid); its_first_nd_but_p = (LStdButton *)FindPaneByID(pi_first_nd_but_rid); its_next_nd_but_p = (LStdButton *)FindPaneByID(pi_next_nd_but_rid); //in_st = incoming state = parent state its_first_in_st_but_p = (LStdButton *)FindPaneByID(pi_first_in_st_but_rid); its_prev_in_st_but_p = (LStdButton *)FindPaneByID(pi_prev_in_st_but_rid); its_next_in_st_but_p = (LStdButton *)FindPaneByID(pi_next_in_st_but_rid); its_parents_table_p = (C_PI_PARENTS_TABLE *)FindPaneByID(pi_parents_table_rid); its_all_act_but_p = (LStdButton *)FindPaneByID(pi_all_act_but_rid); its_none_act_but_p = (LStdButton *)FindPaneByID(pi_none_act_but_rid); its_polar_radio_p = (LStdRadioButton *)FindPaneByID(pi_polar_radio_rid); its_rect_radio_p = (LStdRadioButton *)FindPaneByID(pi_rect_radio_rid); its_rad_re_cap_p = (LCaption *)FindPaneByID(pi_rad_re_cap_rid); its_ang_im_cap_p = (LCaption *)FindPaneByID(pi_ang_im_cap_rid); its_amps_table_p = (C_PI_AMPS_TABLE *)FindPaneByID(pi_amps_table_rid); its_num_of_rows_cap_p = (LCaption *)FindPaneByID(pi_num_of_rows_cap_rid); its_num_of_rows_but_p = (LStdButton *)FindPaneByID(pi_num_of_rows_but_rid); its_total_prob_but_p = (LStdButton *)FindPaneByID(pi_total_prob_but_rid); its_total_prob_cap_p = (LCaption *)FindPaneByID(pi_total_prob_cap_rid); its_gen_amps_but_p = (LStdButton *)FindPaneByID(pi_gen_amps_but_rid); its_nd_efield_p->AddAttachment(new C_ND_NAME_PASTE_ATMENT());//= new //delete: // Activate RidL resource. UReanimator::LinkListenerToControls(this, this, pi_wind_ridl); //its_nd_efield is a broadcaster but not a control. its_nd_efield_p->AddListener(this); //its_amps_table is a broadcaster but not a control. its_amps_table_p->AddListener(this); //its SuperCommander defined in C_MAIN_VIEW::create_pi_wind() ((C_MAIN_VIEW *)GetSuperCommander())->get_top_ptrs(its_doc_p, its_mview_p, its_net_p); its_nd_popup_p->set_top_ptrs(its_doc_p, its_mview_p, its_net_p); its_parents_table_p->set_top_ptrs(its_doc_p, its_mview_p, its_net_p); its_amps_table_p->set_top_ptrs(its_doc_p, its_mview_p, its_net_p); show_owner(file_name); //use set_nd_always() instead of set_nd_if_diff() to avoid checking set_nd_always(sel_nd); Show();//necessary! } //****************************************** VOID C_PI_WIND::AttemptClose() { if(!its_amps_table_p->unload_editor())return; //calls delete this LWindow::AttemptClose(); } //****************************************** VOID C_PI_WIND::DoClose() { //DoClose() is called iff user closes window directly. //AttemptClose() is called at other times. For example, if //window closes as a result of a quit. if(!its_amps_table_p->unload_editor())return; //calls delete this LWindow::DoClose(); } #pragma mark --focus node and in state-- //****************************************** VOID C_PI_WIND::set_nd_always( USHORT new_nd) //in { its_amps_table_p->set_is_modified(true); its_nd =new_nd; its_in_st = 0; its_nd_efield_p->set_nd_always(new_nd); LStr255 descriptor_pstr; its_net_p->get_nd_ptr(new_nd)->get_name().fill_LStr255(descriptor_pstr); its_nd_efield_p->SetDescriptor(descriptor_pstr); its_parents_table_p->set_nd_always(new_nd); its_amps_table_p->set_nd_always(new_nd); refresh_num_of_rows_cap(); refresh_total_prob_cap(); ND_CLASS_ID cid = its_net_p->get_nd_class_id(new_nd); if(cid==CUSTOM_ND_id){ its_gen_amps_but_p->Disable(); }else{ its_gen_amps_but_p->Enable(); } } //****************************************** VOID C_PI_WIND::set_in_st( TM_COL_NUM new_in_st) //in { its_amps_table_p->set_is_modified(true); its_in_st =new_in_st; its_parents_table_p->set_in_st(new_in_st); its_amps_table_p->set_in_st(new_in_st); refresh_total_prob_cap(); } #pragma mark --button: coord sys-- //****************************************** VOID C_PI_WIND::toggle_coord_sys() { its_amps_table_p->set_is_modified(true); if(its_coord_sys==rect_cs){ its_coord_sys = polar_cs; its_amps_table_p->set_coord_sys(polar_cs); its_rad_re_cap_p->SetDescriptor("\pRadius "); its_ang_im_cap_p->SetDescriptor("\pAngle(degs.) "); }else{ its_coord_sys = rect_cs; its_amps_table_p->set_coord_sys(rect_cs); its_rad_re_cap_p->SetDescriptor("\pReal Part "); its_ang_im_cap_p->SetDescriptor("\pImag. Part "); } } #pragma mark --button: total prob-- //****************************************** VOID C_PI_WIND::refresh_total_prob_cap() { DOUBLE tot_prob = its_net_p->get_nd_ptr(its_nd)->get_col_prob(its_in_st); LStr255 str; str.Assign(tot_prob, FIXEDDECIMAL, 6); its_total_prob_cap_p->SetDescriptor(str); } #pragma mark --button: num_of_rows-- //****************************************** VOID C_PI_WIND::refresh_num_of_rows_cap() { NODE * nd_p = its_net_p->get_nd_ptr(its_nd); USHORT num_of_rows = nd_p->get_degen(); USHORT num_of_act_sts = nd_p->get_num_of_active_states(); SignalIf_(num_of_act_sts > num_of_rows); LStr255 num_of_rows_str; ::NumToString(num_of_rows, num_of_rows_str); LStr255 num_of_act_sts_str; ::NumToString(num_of_act_sts, num_of_act_sts_str); LStr255 descriptor = num_of_rows_str + "\p Rows (" + num_of_act_sts_str + "\p active)"; its_num_of_rows_cap_p->SetDescriptor(descriptor); } //****************************************** BOOLEAN C_PI_WIND::handle_num_of_rows_dialog() { //This is a trivial generalization of UModalDialogs::AskForOneNumber //We don't use AskForOneNumber because we want to check //that illegal an entry has not been been pasted into efield. //I am allowing a maximum of 4 characters ->max number of rows is 9,999. //This is smaller than max_ushort = 2^16 - 1 = 65,535 StDialogHandler d_handler(rows_wind_rid, this);//SuperCommander declared LWindow * dialog_p = d_handler.GetDialog(); LEditField * efield_p = (LEditField *)dialog_p->FindPaneByID(rows_wind_efield_rid); USHORT degen = its_net_p->get_degen_of_a_nd(its_nd); USHORT new_degen = degen; efield_p->SetValue(degen); efield_p->SelectAll(); dialog_p->SetLatentSub(efield_p); dialog_p->Show(); Str255 pstr; while (true) { MessageT hit_message = d_handler.DoDialog(); switch(hit_message){ case msg_Cancel: return false; break; case msg_OK: efield_p->GetDescriptor(pstr); if(!STRINGY(pstr).is_ushort(new_degen)|| new_degen==0){ my_gen_alert("Your entry for the number of rows must be a positive integer."); break; } if(new_degen!=degen && new_degen!=0){ its_net_p->set_degen_of_a_nd(its_nd, new_degen); its_amps_table_p->activate_all_states(); its_amps_table_p->set_nd_always(its_nd); refresh_num_of_rows_cap(); refresh_total_prob_cap(); } return true; break; } } } /* same as above, but without checking for pasting induced errors: //****************************************** VOID C_PI_WIND::handle_num_of_rows_dialog() { USHORT degen = its_net_p->get_degen_of_a_nd(its_nd); SInt32 new_degen = degen; UModalDialogs::AskForOneNumber( this, //in, ptr to supercommander rows_wind_rid, //in, dialog window rid rows_wind_efield_rid, //in, efield rid new_degen); //i-o, efield value if(new_degen!=degen && new_degen!=0){ its_net_p->set_degen_of_a_nd(its_nd, new_degen); its_amps_table_p->set_nd_always(its_nd); refresh_num_of_rows_cap(); refresh_total_prob_cap(); } } */ #pragma mark --button: gen_st_names-- //****************************************** BOOLEAN C_PI_WIND::gen_st_names_dialog_entries_are_legal( ST_NAMES_GENERATOR_DATA & v) //i-o { //num_of_comps >=1 and <=31 //min_char: 0 to 9 and a to z //max_char: 0 to 9 and a to z, must have min_char<=max_char. //if v.its_has_commas=true, check that 2*num_of_comps + 1 <=31 if(v.its_num_of_comps==0 || v.its_num_of_comps>31){ my_gen_alert("Must have: 1 <= Number Of Components <= 31."); return false; } if(v.its_min_char>v.its_max_char){ my_gen_alert("Must have: Smallest <= Largest."); return false; } if(v.its_has_commas && (2*v.its_num_of_comps + 1 >31)){ //my_gen_alert("To include commas and parentheses, must have \(Number Of Components\) <= 15.");// dpo my_gen_alert("To include commas and parentheses, must have (Number Of Components) <= 15."); return false; } //key filters make sure that v.its_min_char and v.its_max_char //are alpha-numeric. //Change upper case to lower case. SHORT n_A = 'A'; SHORT n_a = 'a'; if('A'<=v.its_min_char && v.its_min_char<='Z'){ v.its_min_char += n_a - n_A; } if('A'<=v.its_max_char && v.its_max_char<='Z'){ v.its_max_char += n_a - n_A; } return true; } //****************************************** BOOLEAN C_PI_WIND::handle_gen_st_names_dialog() { //This is a trivial generalization of UModalDialogs::AskForOneNumber StDialogHandler d_handler(gn_wind_rid, this);//SuperCommander declared LWindow * dialog_p = d_handler.GetDialog(); LEditField * num_of_comps_efield_p = (LEditField *)dialog_p->FindPaneByID(gn_num_of_comps_efield_rid); LEditField * min_char_efield_p = (LEditField *)dialog_p->FindPaneByID(gn_min_char_efield_rid); LEditField * max_char_efield_p = (LEditField *)dialog_p->FindPaneByID(gn_max_char_efield_rid); LStdCheckBox * commas_check_box_p = (LStdCheckBox *)dialog_p->FindPaneByID(gn_commas_check_box_rid); NODE * nd_p = its_net_p->get_nd_ptr(its_nd); //SetValue() only works for efields with integer values LStr255 x_str; ST_NAMES_GENERATOR_DATA v(its_st_names_gen_data); num_of_comps_efield_p->SetValue(v.its_num_of_comps); x_str = v.its_min_char; min_char_efield_p->SetDescriptor(x_str); x_str = v.its_max_char; max_char_efield_p->SetDescriptor(x_str); commas_check_box_p->SetValue(v.its_has_commas?1:0); num_of_comps_efield_p->SelectAll(); dialog_p->SetLatentSub(num_of_comps_efield_p); dialog_p->Show(); while (true) { MessageT hit_message = d_handler.DoDialog(); switch(hit_message){ case msg_Cancel: return false; break; case msg_OK: v.its_num_of_comps = num_of_comps_efield_p->GetValue(); min_char_efield_p->GetDescriptor(x_str); v.its_min_char = x_str[1]; max_char_efield_p->GetDescriptor(x_str); v.its_max_char = x_str[1]; v.its_has_commas = (commas_check_box_p->GetValue()); if(!gen_st_names_dialog_entries_are_legal(v)){ // don't return yet break; } its_st_names_gen_data = v; nd_p->set_st_names(v); set_nd_always(its_nd); return true; break; } } } #pragma mark --buttons: reordering: nds, parent nds, nd_amps-- //****************************************** BOOLEAN C_PI_WIND::handle_reorder_nds_dialog() { //pi wind won't open unless there is at least one node ThrowIf_(its_net_p->get_num_of_nds()==0); //this is a trivial generalization of UModalDialogs::AskForOneNumber StDialogHandler d_handler(q_wind_rid, this);//SuperCommander declared LWindow * dialog_p = d_handler.GetDialog(); dialog_p->SetDescriptor("\pReorder Nodes"); C_NET_QTABLE * table_p = (C_NET_QTABLE *)dialog_p->FindPaneByID(qtable_rid); table_p->finish_create( its_net_p->get_num_of_nds(), its_nd, nd_qttype, its_doc_p, its_mview_p, its_net_p); while (true) { MessageT hit_message = d_handler.DoDialog(); switch(hit_message){ case msg_Cancel: return false; break; case msg_q_abc_but: table_p->alphabetize_q(); //don't return yet break; case msg_OK: its_net_p->reorder_nds(table_p->get_map()); set_nd_always(table_p->get_map().its_newfo[its_nd]); return true; break; } } } //****************************************** BOOLEAN C_PI_WIND::handle_reorder_in_nds_dialog() { if(its_net_p->get_nd_ptr(its_nd)->get_num_of_in_nds()==0)return true; //this is a trivial generalization of UModalDialogs::AskForOneNumber StDialogHandler d_handler(q_wind_rid, this);//SuperCommander declared LWindow * dialog_p = d_handler.GetDialog(); dialog_p->SetDescriptor("\pReorder Parent Nodes"); C_NET_QTABLE * table_p = (C_NET_QTABLE *)dialog_p->FindPaneByID(qtable_rid); table_p->finish_create( its_net_p->get_nd_ptr(its_nd)->get_num_of_in_nds(), its_nd, parent_qttype, its_doc_p, its_mview_p, its_net_p); while (true) { MessageT hit_message = d_handler.DoDialog(); switch(hit_message){ case msg_Cancel: return false; break; case msg_q_abc_but: table_p->alphabetize_q(); //don't return yet break; case msg_OK: its_net_p->get_nd_ptr(its_nd)->reorder_in_nds(table_p->get_map(), true); set_nd_always(its_nd); return true; break; } } } //****************************************** BOOLEAN C_PI_WIND::handle_reorder_nd_sts_dialog() { if(its_net_p->get_nd_ptr(its_nd)->get_degen()==0)return true; // this is a trivial generalization of UModalDialogs::AskForOneNumber StDialogHandler d_handler(q_wind_rid, this);//SuperCommander declared LWindow * dialog_p = d_handler.GetDialog(); dialog_p->SetDescriptor("\pReorder Node States"); C_NET_QTABLE * table_p = (C_NET_QTABLE *)dialog_p->FindPaneByID(qtable_rid); table_p->finish_create( its_net_p->get_nd_ptr(its_nd)->get_degen(), its_nd, nd_state_qttype, its_doc_p, its_mview_p, its_net_p); while (true) { MessageT hit_message = d_handler.DoDialog(); switch(hit_message){ case msg_Cancel: return false; break; case msg_q_abc_but: table_p->alphabetize_q(); //don't return yet break; case msg_OK: its_net_p->reorder_nd_sts(its_nd, table_p->get_map()); its_amps_table_p->Refresh(); return true; break; } } } #pragma mark --button: gen_amps: check_parents-- //****************************************** BOOLEAN C_PI_WIND::focus_nd_has_this_many_parents( USHORT num) //in { //if num = max_ushort, just checks that num_of_in_nds>0 NODE * nd_p = its_net_p->get_nd_ptr(its_nd); STRINGY sgy; if(num==max_ushort){ if(nd_p->get_num_of_in_nds()==0){ my_gen_alert("Inadmissible parents. This button works only if focus node has at least one parent."); return false; } }else{ if(nd_p->get_num_of_in_nds()!=num){ sgy = STRINGY("Inadmissible parents. This button works only if the focus node has exactly ") && num; if(num==1){ sgy = sgy && " parent."; }else{ sgy = sgy && " parents."; } my_gen_alert(sgy); return false; } } return true; } //****************************************** BOOLEAN C_PI_WIND::focus_nd_parents_are_binary() { BOOLEAN is_ok = true; NODE * nd_p = its_net_p->get_nd_ptr(its_nd); USHORT num_of_in_nds = nd_p->get_num_of_in_nds(); USHORT j; STRINGY stringy0, stringy1; for(j=0; jget_in_nds()[j]; NODE * in_nd_p = its_net_p->get_nd_ptr(in_nd); if(in_nd_p->get_degen()!=2){ is_ok = false; goto ending; } stringy0 = in_nd_p->get_st_name(0); stringy1 = in_nd_p->get_st_name(1); if(!(stringy0=="0" && stringy1=="1")){ is_ok = false; goto ending; } } ending:; if(!is_ok){ my_gen_alert("Inadmissible parents. This button works only if the states of each parent are precisely 0, 1, in that order."); } return is_ok; } #pragma mark --buttons: response center-- //****************************************** VOID C_PI_WIND::ListenToMessage( MessageT inMessage, //in VOID * ioParam ) //i-o { //MONITOR_THE_CHANGE_HERE //doc: marked modified in C_PI_WIND::Click() BOOLEAN tell_mview_uaction = false;//mview = main view BOOLEAN tell_table_uaction = false;//table = amplitudes table switch (inMessage){ case msg_pi_nd_efield: //let the main view handle it its_mview_p->ListenToMessage(inMessage, ioParam); break; case msg_pi_nd_popup: // for nd_popup: inMessage = pane id, *ioParam = current item USHORT item = *((SInt32 *)ioParam); set_nd_if_diff(item - 1); break; case msg_pi_first_nd_but: set_nd_if_diff(0); break; case msg_pi_next_nd_but: if(its_nd + 1 get_num_of_nds() ){ set_nd_if_diff(its_nd + 1); }else{ ::SysBeep(0); } break; case msg_pi_reorder_nds_but: tell_mview_uaction = true; handle_reorder_nds_dialog(); break; case msg_pi_reorder_in_nds_but: tell_mview_uaction = true; handle_reorder_in_nds_dialog(); break; case msg_pi_reorder_nd_sts_but: tell_mview_uaction = true; handle_reorder_nd_sts_dialog(); break; case msg_pi_first_in_st_but: set_in_st_if_diff( 0); break; case msg_pi_prev_in_st_but: if(its_in_st > 0 ){ set_in_st_if_diff(its_in_st - 1); }else{ ::SysBeep(0); } break; case msg_pi_next_in_st_but: if(its_in_st + 1 get_nd_ptr(its_nd)->get_num_of_in_sts() ){ set_in_st_if_diff(its_in_st + 1); }else{ ::SysBeep(0); } break; case msg_pi_all_act_but: its_amps_table_p->activate_all_states(); refresh_num_of_rows_cap(); break; case msg_pi_none_act_but: its_amps_table_p->deactivate_all_states(); refresh_num_of_rows_cap(); break; case msg_pi_polar_radio: tell_table_uaction = true; toggle_coord_sys(); break; case msg_pi_refresh_num_of_rows_cap: refresh_num_of_rows_cap(); break; case msg_pi_total_prob_but: refresh_total_prob_cap(); break; case msg_pi_clear_total_prob_cap: clear_total_prob_cap(); break; case msg_pi_num_of_rows_but: tell_mview_uaction = true; tell_table_uaction = true; handle_num_of_rows_dialog(); break; case msg_pi_gen_st_names_but: tell_mview_uaction = true; tell_table_uaction = true; handle_gen_st_names_dialog(); break; case msg_pi_gen_amps_but: tell_mview_uaction = true; tell_table_uaction = true; (its_net_p->get_nd_ptr(its_nd))->call_amp_gen(its_net_p, this); break; default: //handle parent states popups here TableIndexT num_of_rows, num_of_cols; its_parents_table_p->GetTableSize(num_of_rows, num_of_cols); SInt32 broadcasting_row = inMessage - first_pi_pa_st_popup_PPob_rid + 1; if( broadcasting_row>=1 && broadcasting_row<=num_of_rows){ // for popup: inMessage = pane id, *ioParam = current item USHORT item = *((SInt32 *)ioParam); NODE * nd_p = its_net_p->get_nd_ptr(its_nd); STRETCH_OR_FOLD sof_in(nd_p->get_in_nd_degens()); VECTOR in_st_vec(sof_in.vec_label(its_in_st)); in_st_vec[broadcasting_row-1] = item-1; set_in_st(sof_in.int_label(in_st_vec)); } break; } if(tell_mview_uaction) its_mview_p->set_is_modified(true, mview_del); if(tell_table_uaction) its_amps_table_p->set_is_modified(true); } #pragma mark --other-- //****************************************** VOID C_PI_WIND::Click( SMouseDownEvent & inMouseDown) //in { //MONITOR_THE_CHANGE_HERE its_doc_p->SetModified(true); its_mview_p->set_is_modified(true, mview_del); //Superview of amps table is its scroller. LScroller * scr_p = dynamic_cast(its_amps_table_p->GetSuperView()); if(!scr_p->IsHitBy(inMouseDown.wherePort.h, inMouseDown.wherePort.v)){ //If click outside of amps table scroller, //unload editor and unselect all cells. if(!its_amps_table_p->unload_editor())return; its_amps_table_p->nullify_editor(); its_amps_table_p->UnselectAllCells(); //Make pi_wind the target. //Do this only if //click outside amps table scroller //or will loose selection. //This stops focus node efield from //repeating (if it was repeating). //Despite this call to SwitchTarget(), //if click inside subpane //that is a commander, she will become //target when we call LWindow::Click(). SwitchTarget(this); } //If I don't do this, reorder node states dialog //may show different names than amps table. LButton * reorder_nd_sts_but_p = dynamic_cast(scr_p->FindPaneByID(pi_reorder_nd_sts_but_rid)); if(reorder_nd_sts_but_p->IsHitBy(inMouseDown.wherePort.h, inMouseDown.wherePort.v)){ if(!its_amps_table_p->unload_editor())return; its_amps_table_p->nullify_editor(); its_amps_table_p->UnselectAllCells(); } //This scrolls the node name efield to the home position. if(!its_nd_efield_p->IsHitBy(inMouseDown.wherePort.h, inMouseDown.wherePort.v)){ its_nd_efield_p->scroll_to_home(); } LWindow::Click(inMouseDown); } //****************************************** VOID C_PI_WIND::ClickSelf( const SMouseDownEvent & in_mouse_down) //in { #pragma unused(in_mouse_down) //MONITOR_THE_CHANGE_HERE //doc marked modified in C_PI_WIND::Click() //overrrides empty method LPane::ClickSelf(in_mouse_down) } //****************************************** VOID C_PI_WIND::rename_a_nd( USHORT nd, //in Str255 new_name_pstr) //in { if(its_nd == nd){ its_nd_efield_p->SetDescriptor(new_name_pstr); }else{ its_parents_table_p->rename_a_nd(nd); } } #pragma mark --command center-- /*command owner conflicts: when one or more commanders can handle (own) a command with the same name. This is specially true for: cmd_Undo cmd_Cut cmd_Copy cmd_Paste cmd_Clear (both as menu item and delete key) cmd_SelectAll In such cases the active window should take precedence. --amps table | mview--pi_wind-- | --focus node efield To prevent the above commands from trickling down to mview when pi_wind is active, must disable them in a FindCommandStatus() for the pi_wind */ //****************************************** BOOLEAN C_PI_WIND::HandleKeyPress( const EventRecord & in_key_event) //in { //MONITOR_THE_CHANGE_HERE //doc: no change if( ((in_key_event.message &keyCodeMask)>>8) == 0x33){//delete key was pressed //This is like a combination of ObeyCommand() and FindCommandStatus() //always do nothing return true; }else{ return LWindow::HandleKeyPress(in_key_event); } } //****************************************** BOOLEAN C_PI_WIND::ObeyCommand( CommandT inCommand, //in VOID * ioParam) //i-o { //MONITOR_THE_CHANGE_HERE //doc: no change BOOLEAN obeyed = true; BOOLEAN needs_refresh = true; switch (inCommand){ default: obeyed = LWindow::ObeyCommand(inCommand, ioParam); needs_refresh = false; break; } if (needs_refresh) Refresh(); return obeyed; } //****************************************** VOID C_PI_WIND::FindCommandStatus( CommandT inCommand, //in BOOLEAN & outEnabled, //out BOOLEAN & outUsesMark, //out UInt16 & outMark, //out Str255 outName_pstr) //out { outEnabled = false; outUsesMark = false; outMark = noMark; switch (inCommand) { case cmd_Undo: case cmd_Cut: case cmd_Copy: case cmd_Paste: case cmd_Clear: case cmd_SelectAll: outEnabled = false; break; default: LWindow::FindCommandStatus(inCommand, outEnabled, outUsesMark, outMark, outName_pstr); break; } } \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Mac_PiWind/C_PI_WIND.h b/Legacy/QFog2-MachO/QFogSource/Mac_PiWind/C_PI_WIND.h new file mode 100644 index 0000000..b1ead26 --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Mac_PiWind/C_PI_WIND.h @@ -0,0 +1 @@ +#pragma once #include "QFog_constants.h" #include "QB_NET.h" #include "C_PI_ND_EFIELD.h" #include "C_PI_ND_POPUP.h" #include "C_PI_PARENTS_TABLE.h" #include "C_PI_AMPS_TABLE.h" #include "BEAM_SPL.h" #include "C_HOST_VIEW.h" #include "UModalDialogsPlus.h" #include "QBIT_ROT.h" #include "C_TOP_PTRS.h" //PI_WIND = Prior Information Window //****************************************** class C_PI_WIND : public LWindow, public LListener, public C_TOP_PTRS { protected: USHORT its_nd; TM_COL_NUM its_in_st; //in_st = in state = parents' state COORD_SYSTEM its_coord_sys; //COORD_SYS defined in "QFog_constants.h" LCaption * its_owner_cap_p; C_PI_ND_EFIELD * its_nd_efield_p; C_PI_ND_POPUP * its_nd_popup_p; LStdButton * its_first_nd_but_p; LStdButton * its_next_nd_but_p; //in_st = incomming state = parent state LStdButton * its_first_in_st_but_p; LStdButton * its_prev_in_st_but_p; LStdButton * its_next_in_st_but_p; C_PI_PARENTS_TABLE * its_parents_table_p; LStdButton * its_all_act_but_p; LStdButton * its_none_act_but_p; LStdRadioButton * its_polar_radio_p; LStdRadioButton * its_rect_radio_p; LCaption * its_rad_re_cap_p; LCaption * its_ang_im_cap_p; C_PI_AMPS_TABLE * its_amps_table_p; LCaption * its_num_of_rows_cap_p; LStdButton * its_num_of_rows_but_p; LStdButton * its_total_prob_but_p; LCaption * its_total_prob_cap_p; ST_NAMES_GENERATOR_DATA its_st_names_gen_data; LStdButton * its_gen_amps_but_p; public: C_PI_WIND(LStream * inStream); C_PI_WIND(); virtual ~C_PI_WIND(); VOID show_owner( const LStr255 & file_name); VOID special_finish_create(const LStr255 & file_name, USHORT sel_nd); BOOLEAN save_pi(); VOID AttemptClose(); VOID DoClose(); USHORT get_nd(); VOID set_nd_always(USHORT new_nd); VOID set_nd_always(); VOID set_nd_if_diff(USHORT new_nd); VOID set_in_st(TM_COL_NUM new_in_st); VOID set_in_st_if_diff(TM_COL_NUM new_in_st); VOID toggle_coord_sys(); VOID refresh_total_prob_cap(); VOID clear_total_prob_cap(); VOID refresh_num_of_rows_cap(); BOOLEAN handle_num_of_rows_dialog(); BOOLEAN gen_st_names_dialog_entries_are_legal(ST_NAMES_GENERATOR_DATA & v); BOOLEAN handle_gen_st_names_dialog(); BOOLEAN handle_reorder_nds_dialog(); BOOLEAN handle_reorder_in_nds_dialog(); BOOLEAN handle_reorder_nd_sts_dialog(); BOOLEAN focus_nd_has_this_many_parents(USHORT num); BOOLEAN focus_nd_parents_are_binary(); VOID ListenToMessage(MessageT inMessage, VOID * ioParam ); VOID Click(SMouseDownEvent & inMouseDown); VOID ClickSelf(const SMouseDownEvent & inMouseDown); VOID rename_a_nd(USHORT nd, Str255 new_name_pstr); virtual BOOLEAN HandleKeyPress(const EventRecord & in_key_event); virtual BOOLEAN ObeyCommand(CommandT inCommand, VOID * ioParam); virtual VOID FindCommandStatus(CommandT inCommand, BOOLEAN & outEnabled, BOOLEAN & outUsesMark, UInt16 & outMark, Str255 outName_pstr); }; #pragma mark - //****************************************** inline BOOLEAN C_PI_WIND::save_pi() { return its_amps_table_p->unload_editor(); } //****************************************** inline USHORT C_PI_WIND::get_nd() { return its_nd; } //****************************************** inline VOID C_PI_WIND::set_nd_always() { set_nd_always(its_nd); } //****************************************** inline VOID C_PI_WIND::set_nd_if_diff( USHORT new_nd) //in { if(its_nd!=new_nd) set_nd_always(new_nd); } //****************************************** inline VOID C_PI_WIND::set_in_st_if_diff( TM_COL_NUM new_in_st) //in { if(its_in_st!=new_in_st) set_in_st(new_in_st); } //****************************************** inline VOID C_PI_WIND::clear_total_prob_cap() { its_total_prob_cap_p->SetDescriptor("\p"); } \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Mac_QBNetAndNode/.DS_Store b/Legacy/QFog2-MachO/QFogSource/Mac_QBNetAndNode/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..5008ddfcf53c02e82d7eee2e57c38e5672ef89f6 GIT binary patch literal 6148 zcmeH~Jr2S!425mzP>H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0= mask_rad. // Both sel_rad and mask_rad will be taken to be class constants of // the specific classes derived from NODE. // docking_rad = data member of C_DOCK. // greeting_rad = data member of C_DOCK. //****************************************** #pragma mark --creation/destruction-- NODE::NODE( const Point & center) //in :its_degen(1), its_st_names("x", 1), its_st_name_dict_p(0), its_num_of_in_sts(1), its_center(center), its_is_selected(false), its_efield_p(0), its_state_num_for_cap(max_ushort), its_amp_gen_p(0) { its_active_states.insert(0); // note that the default TRANS_MAT constructor creates a 1 X 1 zero matrix ; //due to bug in LEditField constructor, the nd_efield is created and destroyed by the main view } #pragma mark --port related-- //****************************************** BOOLEAN NODE::pt_is_in_greeting_cir_of_avail_s_port( const Point & pt, //in USHORT & sub_nd_id) //out { C_CIRCLE cir(its_center, get_sel_rad()); sub_nd_id=0; return cir.pt_is_in(pt); } //****************************************** BOOLEAN NODE::pt_is_in_greeting_cir_of_avail_d_port( const Point & pt, //in USHORT & sub_nd_id) //out { C_CIRCLE cir(its_center, get_sel_rad()); sub_nd_id=0; return cir.pt_is_in(pt); } #pragma mark --selection-- //****************************************** Boolean NODE::select( C_MAIN_VIEW * mview_p) //in { // This function is used inside the select() method of // the classes derived from NODE. // It draws the four node handles in a specified color // and sets the selection status to true. if(its_is_selected) return false; its_is_selected = true; draw_sel_handles( ); mview_p->num_of_sel_nds_pp(); return true; } //****************************************** Boolean NODE::unselect( C_MAIN_VIEW * mview_p) //in { // This function is used inside the unselect() method of // the classes derived from NODE. // It draws the four node handles in white // and sets the selection status to false. if(!its_is_selected) return false; its_is_selected = false; undraw_sel_handles(); mview_p->num_of_sel_nds_mm(); return true; } //****************************************** VOID NODE::toggle_select( C_MAIN_VIEW * mview_p) //in { if(its_is_selected){ unselect(mview_p); }else{ select(mview_p); } } #pragma mark --sel handles-- //****************************************** VOID NODE::draw_sel_handles_wkr() { //drawer //wkr = weaker. If had an even weaker method, would suffix it _wkr_wkr, etc. //This is a private function used only by //NODE::draw_sel_handles() and NODE::undraw_sel_handles() //These 2 functions call //if(!its_efield_p->GetSuperView()->FocusDraw())return; //They also preserve the CTP state Rect nw, ne, se, sw; //nw = northwest, ... SInt16 cx = its_center.h, cy = its_center.v; //cx = center's x SInt16 radius = get_sel_rad() -2; SInt16 d = 2; // handles are squares of side length = 2d+1 ::SetRect(&nw, cx -radius -d, cy - radius -d, cx -radius +d, cy - radius +d); ::SetRect(&ne, cx +radius -d, cy - radius -d, cx +radius +d, cy - radius +d); ::SetRect(&se, cx +radius -d, cy + radius -d, cx +radius +d, cy + radius +d); ::SetRect(&sw, cx -radius -d, cy + radius -d, cx -radius +d, cy + radius +d); ::PaintRect(&nw); ::PaintRect(&ne); ::PaintRect(&se); ::PaintRect(&sw); } //****************************************** VOID NODE::draw_sel_handles() { //drawer if(!its_efield_p->GetSuperView()->FocusDraw())return; StCPTstate saved_st(true, true, false); saved_st.Normalize(); ::RGBForeColor(&C_COLORS::its_red); draw_sel_handles_wkr(); } //****************************************** VOID NODE::undraw_sel_handles() { //drawer if(!its_efield_p->GetSuperView()->FocusDraw())return; StCPTstate saved_st(true, true, false); saved_st.Normalize(); ::RGBForeColor(&C_COLORS::its_white); draw_sel_handles_wkr(); } #pragma mark --state caption-- //****************************************** VOID NODE::draw_state_cap() { //drawer if(!its_efield_p->GetSuperView()->FocusDraw())return; StCPTstate saved_st(true, true, true); saved_st.Normalize(); ::TextFont(its_efield_p->get_fnum()); ::TextSize(its_efield_p->get_font_size()); LStr255 pstr; its_st_names[its_state_num_for_cap].fill_LStr255(pstr); SInt16 box_width = ::StringWidth(pstr) + 4; its_efield_p->calc_state_cap_frame(its_state_cap_frame); its_state_cap_frame.left = its_state_cap_frame.left - box_width/2; its_state_cap_frame.right = its_state_cap_frame.right + box_width/2; its_state_cap_frame.top = its_state_cap_frame.top +2; its_state_cap_frame.bottom = its_state_cap_frame.bottom +2; ::TETextBox( StringPtr(pstr) +1, pstr[0], &its_state_cap_frame, teJustCenter); its_state_cap_frame.top = its_state_cap_frame.top -2; its_state_cap_frame.bottom = its_state_cap_frame.bottom -2; ::FrameRect(&its_state_cap_frame); } //****************************************** VOID NODE::undraw_state_cap() { //drawer if(!its_efield_p->GetSuperView()->FocusDraw())return; ::EraseRect(&its_state_cap_frame); } #pragma mark --draw all except sel handles-- //****************************************** VOID NODE::undraw(SInt16 radius) {//drawer its_efield_p->undraw(); if(!its_efield_p->GetSuperView()->FocusDraw())return; if(its_state_num_for_cap!=max_ushort) undraw_state_cap(); StCPTstate saved_st(true, true, false); saved_st.Normalize(); ::RGBForeColor(&C_COLORS::its_white); Rect r; ::SetRect(&r, its_center.h -radius, its_center.v -radius, its_center.h +radius, its_center.v +radius); ::PaintOval(&r); } #pragma mark --move-- //****************************************** VOID NODE::move_by( const Point & delta) //in { undraw();// this undraws circle, efield and state_cap but not sel_handles if(its_is_selected) undraw_sel_handles(); its_center.h += delta.h; its_center.v += delta.v; its_efield_p->MoveBy(SInt32(delta.h), SInt32(delta.v), false); draw();// this draws circle, efield and state_cap but not sel_handles if(its_is_selected) draw_sel_handles(); } #endif //_mac_gui_app \\............................................// \ No newline at end of file diff --git a/Legacy/QFog2-MachO/QFogSource/Mac_QBNetAndNode/QB_NET(mac).cpp b/Legacy/QFog2-MachO/QFogSource/Mac_QBNetAndNode/QB_NET(mac).cpp new file mode 100644 index 0000000..e1aa684 --- /dev/null +++ b/Legacy/QFog2-MachO/QFogSource/Mac_QBNetAndNode/QB_NET(mac).cpp @@ -0,0 +1 @@ +#include "QB_NET.h" #include "C_DOC.h" #include "EXCEPTIONS.h" #include "MY_FSTREAMS.h" #include #include "BEAM_SPL.h" #include "CUSTOM_ND.h" #include "DET_ND.h" #include "POL_ROTATOR.h" #include "POLARIZER.h" #include "QBIT_ROT.h" #include "SG_MAGNET.h" // template is defined, but not matching these: links but doesn't compile. // so I defined them explicitly here as free functions. //dpo /* LStream & operator<<( LStream & out_bd, //i-o const VECTOR & v) //in { out_bd << v.its_len; for(USHORT i=0; i>( LStream & in_bd, //i-o VECTOR & v) //in { USHORT len; in_bd >> len; USHORT x; v.resize(x, len); for(USHORT i=0; i> v[i]; } return in_bd; } */ //rrt: template problem fixed following advice from newsgroup post by Dave Meyer #ifdef _mac_gui_app //''''''''''''''''''''''''''''''''''''''''''''\\. #include "C_MAIN_VIEW.h" #endif //_mac_gui_app \\............................................// #pragma mark ---------used only with macgui-------- #ifdef _mac_gui_app //''''''''''''''''''''''''''''''''''''''''''''\\. #pragma mark --creation/destruction-- //****************************************** VOID QB_NET::set_doc_and_mview_ptrs( C_DOC * doc_p, //in C_MAIN_VIEW * view_p) //in { //used only by C_DOC, in its constructor its_doc_p = doc_p; its_mview_p = view_p; } #pragma mark --reorder nodes, parent_nds, nd_sts-- //****************************************** VOID QB_NET::reorder_nds( const UI_MAP & map) //in { its_mview_p->set_is_modified(true, mview_del); if(its_num_of_nds==0)return; SignalIf_(map.its_oldfn.get_len()!=its_num_of_nds); SignalIf_(map.its_newfo.get_len()!=its_num_of_nds); if(map.is_identity_map())return; USHORT i; NODE * * old_nds_p_p = new NODE * [its_num_of_nds];//new[] //delete: in this method ThrowIfNil_(old_nds_p_p); for(i=0; irenumber_in_nds(map); its_nds_p_p[i]->renumber_out_nds(map); its_nds_p_p[i]->get_efield_ptr()->set_nd_always(i); its_nds_p_p[i]->renumber_nds_of_port_glists(map); } //there shouldn't be any node name dictionary around ThrowIf_(its_nd_name_dict_p!=0); DIR_DATA * dir_bi_nd_p = its_bi_nds.get_first_p(); while(dir_bi_nd_p){ dir_bi_nd_p->its_data.renumber_nds(map); dir_bi_nd_p = dir_bi_nd_p->its_next_p; } for(USHORT time=0; time * dir_arrow_p = its_arrows.get_first_p(); while(dir_arrow_p){ dir_arrow_p->its_data.renumber_nds(map); dir_arrow_p = dir_arrow_p->its_next_p; } } //****************************************** VOID QB_NET::reorder_nd_sts( USHORT nd_id, //in const UI_MAP & map) //in { its_mview_p->set_is_modified(true, mview_del); NODE * nd_p = its_nds_p_p[nd_id]; nd_p->reorder_sts(map); VECTOR out_nds = nd_p->get_out_nds(); for(USHORT i=0; ichange_tm_as_part_of_reordering_nd_sts_of_a_pa(nd_id, map); } } #pragma mark --delete nodes and arrows-- //****************************************** VOID QB_NET::del_int_arrow( USHORT s, //in USHORT d, //in BOOLEAN try_to_sort) //in { its_mview_p->set_is_modified(true, mview_del); // del = delete, s = source, d= destination //there are no delete methods (del arrow, nd or bi-nd) in the ansi program // int = internal its_nds_p_p[s]->del_out_nd(d); its_nds_p_p[d]->del_in_nd(s); its_nds_p_p[s]->remove_nd_from_all_port_glists(d); its_nds_p_p[d]->remove_nd_from_all_port_glists(s); C_ARROW * ar_p; DIR_DATA * dir_arrow_p = its_arrows.get_first_p(); while(dir_arrow_p){ ar_p = &(dir_arrow_p->its_data); if( (ar_p->get_s_port_name().its_nd_id==s)&&(ar_p->get_d_port_name().its_nd_id==d) ){ ar_p->undraw(); //Erase handles, if present. Also decrement num of sel arrows. ar_p->unselect(its_mview_p); its_arrows.extract_target(dir_arrow_p);// delete arrow's record and set dir_arrow_p=0 goto stop_looking; } dir_arrow_p = dir_arrow_p->its_next_p; } stop_looking:; if(try_to_sort)chrono_sort(); } //****************************************** VOID QB_NET::del_nd( USHORT nd_id, //in BOOLEAN try_to_sort) //in { its_mview_p->set_is_modified(true, mview_del); //reorder if selected node is not in last position if(nd_id != its_num_of_nds -1){ UI_MAP map(its_num_of_nds); //map is identity map immediately after creation map.its_newfo[nd_id] = its_num_of_nds - 1; for(USHORT i=nd_id+1; iget_in_nds().get_len(); for(i= 0; iget_in_nds()[0], its_num_of_nds-1, false); } //Must calculate this outside of for() statement //because it will change each time we loop. USHORT out_nds_len = nd_p->get_out_nds().get_len(); for(i = 0; i < out_nds_len; i++){ del_int_arrow(its_num_of_nds-1, nd_p->get_out_nds()[0], false); } nd_p->undraw(); //Erase handles, if present. Also decrement num of sel nds. nd_p->unselect(its_mview_p); //%%%%%%%%%%%%%%%%%%%%% //due to LEditField bug, must create and destroy nd and nd_efield separately its_mview_p->destroy_nd_efield(its_num_of_nds-1); delete nd_p; nd_p = 0; //%%%%%%%%%%%%%%%%%%%%% del_all_bi_nds_with_this_nd(its_num_of_nds-1); its_nds_p_p[its_num_of_nds-1]=0; --its_num_of_nds; if(try_to_sort){ chrono_sort(); its_dyn_story.set_to_default_vec(0, its_num_of_nds); } } //****************************************** VOID QB_NET::del_bi_nd( USHORT xed_position) //in { USHORT pos=0; DIR_DATA * dir_bi_nd_p = its_bi_nds.get_first_p(); while(dir_bi_nd_p){ if(pos==xed_position){ //this deletes memory pointed to by dir_bi_nd_p and sets dir_bi_nd_p=0: its_bi_nds.extract_target(dir_bi_nd_p); return; } pos++; dir_bi_nd_p = dir_bi_nd_p->its_next_p; } } //****************************************** VOID QB_NET::del_all_bi_nds_with_this_nd( USHORT nd_id) //in { BI_NODE * bi_nd_p; DIR_DATA * dir_bi_nd_p; begin_list: ; dir_bi_nd_p= its_bi_nds.get_first_p(); while(dir_bi_nd_p){ bi_nd_p = &(dir_bi_nd_p->its_data); if(bi_nd_p->has(nd_id)){ //this deletes memory pointed to by dir_bi_nd_p and sets dir_bi_nd_p=0: its_bi_nds.extract_target(dir_bi_nd_p); goto begin_list; } dir_bi_nd_p = dir_bi_nd_p->its_next_p; } } #pragma mark --add nodes and arrows-- //****************************************** BOOLEAN QB_NET::calc_closest_pts( const C_CIRCLE & cir1, //in const C_CIRCLE & cir2, //in Point & pt1, //out Point & pt2) //out { // pt1 and pt2 are elements of // the circles cir1 and cir2, respectively. // These points are the unique endpoints of the shortest segment // between the two circles. // This function returns false iff the 2 circles intersect. Point cen1 = cir1.its_center; SInt16 r1 = cir1.its_radius; Point cen2 = cir2.its_center; SInt16 r2 = cir2.its_radius; DOUBLE dist = sqrt( pow(DOUBLE(cen1.h-cen2.h), 2) + pow(DOUBLE(cen1.v-cen2.v), 2) ); if( dist<=DOUBLE(r1+r2))return false; DOUBLE ss= DOUBLE( cen2.v - cen1.v)/dist; DOUBLE cc= DOUBLE( cen2.h - cen1.h)/dist; pt1.h = nearest_int16(cen1.h + r1*cc); pt1.v = nearest_int16(cen1.v + r1*ss); pt2.h = nearest_int16(cen2.h - r2*cc); pt2.v = nearest_int16(cen2.v - r2*ss); return true; } //****************************************** C_ARROW * QB_NET::mac_add_int_arrow( const C_PORT_NAME & s_port_name, //in const C_PORT_NAME & d_port_name, //in BOOLEAN try_to_sort) //in { its_mview_p->set_is_modified(true, mview_del); NODE * s_nd_p = its_nds_p_p[s_port_name.its_nd_id]; NODE * d_nd_p = its_nds_p_p[d_port_name.its_nd_id]; // check that the source and destination nodes aren't the same if( s_nd_p == d_nd_p ) return 0; // check that this arrow hasn't been added before if( ( s_nd_p->get_out_nds().loc_of_target(d_port_name.its_nd_id) != max_ushort ) || ( d_nd_p->get_in_nds().loc_of_target(s_port_name.its_nd_id) != max_ushort ) ) return 0; C_CIRCLE s_cir = s_nd_p->get_docking_cir(s_port_name.its_sub_nd_id); C_CIRCLE d_cir = d_nd_p->get_docking_cir(d_port_name.its_sub_nd_id); Point init_pt, fin_pt; // check that nodes don't intersect if(!calc_closest_pts(s_cir, d_cir, init_pt, fin_pt))return 0; C_ARROW ar((LView *)its_mview_p, s_port_name, d_port_name, init_pt, fin_pt); ar.draw(); its_arrows.insert_first(ar); s_nd_p->add_out_nd(d_port_name.its_nd_id); d_nd_p->add_in_nd(s_port_name.its_nd_id, s_nd_p->get_degen()); s_nd_p->add_nd_to_port_glist(d_port_name.its_nd_id, s_port_name.its_sub_nd_id); d_nd_p->add_nd_to_port_glist(s_port_name.its_nd_id, d_port_name.its_sub_nd_id); if(try_to_sort){ if(!chrono_sort() ){ del_int_arrow(s_port_name.its_nd_id, d_port_name.its_nd_id, false); warn_user_about_cycle(); return 0; } } return &(its_arrows.get_first_p()->its_data); } //****************************************** USHORT QB_NET::mac_add_nd( ND_CLASS_ID nd_class_id, //in const Point & m_down_pt, //in BOOLEAN try_to_sort) //in { its_mview_p->set_is_modified(true, mview_del); if( its_num_of_nds == its_num_of_nd_ptrs ) grow_num_of_nd_ptrs(); its_num_of_nds++; NODE * nd_p=0; //%%%%%%%%%%%%%%%%%%%%% //due to LEditField bug, must create and destroy nd and nd_efield separately switch(nd_class_id){ case BEAM_SPL_id: nd_p = new BEAM_SPL( m_down_pt); //delete: by class destructor. See also QB_NET::clear_nds() and QB_NET::del_nd() break; case CUSTOM_ND_id: nd_p = new CUSTOM_ND( m_down_pt); //delete: by class destructor break; case DET_ND_id: nd_p = new DET_ND( m_down_pt); //delete: by class destructor. break; case POL_ROTATOR_id: nd_p = new POL_ROTATOR( m_down_pt); //delete: by class destructor break; case POLARIZER_id: nd_p = new POLARIZER( m_down_pt); //delete: by class destructor break; case QBIT_ROT_id: nd_p = new QBIT_ROT(m_down_pt); //delete: by class destructor break; case SG_MAGNET_id: nd_p = new SG_MAGNET( m_down_pt); //delete: by class destructor break; } ThrowIfNil_(nd_p); its_nds_p_p[its_num_of_nds-1] = nd_p; its_mview_p->create_nd_efield(m_down_pt, its_num_of_nds -1); //%%%%%%%%%%%%%%%%%%%%% nd_p->draw(); if(try_to_sort){ chrono_sort(); its_dyn_story.set_to_default_vec(0, its_num_of_nds); } return its_num_of_nds-1; // the returned number will become the node id. } #pragma mark --change arrow s source-- //****************************************** BOOLEAN QB_NET::nodes_have_same_state_set( USHORT nd1, //in USHORT nd2) //in { NODE * nd1_p = its_nds_p_p[nd1]; NODE * nd2_p = its_nds_p_p[nd2]; USHORT degen1 = nd1_p->get_degen(); USHORT degen2 = nd2_p->get_degen(); if(degen1!=degen2)return false; for(USHORT i=0; i< degen1; i++){ if(nd1_p->get_st_name(i)!=nd2_p->get_st_name(i))return false; } return true; } //****************************************** BOOLEAN QB_NET::change_source_nd_of_ar( C_ARROW * ar_p, //in const C_PORT_NAME & new_s_port_name) //in { //this function is similar to QB_NET::mac_add_int_arrow() its_mview_p->set_is_modified(true, mview_del); NODE * new_s_nd_p = its_nds_p_p[new_s_port_name.its_nd_id]; C_PORT_NAME old_s_port_name = ar_p->get_s_port_name(); NODE * old_s_nd_p = its_nds_p_p[old_s_port_name.its_nd_id]; C_PORT_NAME d_port_name = ar_p->get_d_port_name(); NODE * d_nd_p = its_nds_p_p[d_port_name.its_nd_id]; // check that the source and destination nodes aren't the same if( new_s_nd_p == d_nd_p ) return false; // check that this arrow hasn't been added before if( ( new_s_nd_p->get_out_nds().loc_of_target(d_port_name.its_nd_id) != max_ushort ) || ( d_nd_p->get_in_nds().loc_of_target(new_s_port_name.its_nd_id) != max_ushort ) ) return false; //check that the two s nodes have the same state set if(!nodes_have_same_state_set(new_s_port_name.its_nd_id, old_s_port_name.its_nd_id)){ my_gen_alert("New source node is incompatible with old one. To change an arrow's source node from node A to node B, A and B must have the same number of states, the states must have the same names, and the names must be listed in the same order."); return false; } C_CIRCLE s_cir =new_s_nd_p->get_docking_cir(new_s_port_name.its_sub_nd_id); C_CIRCLE d_cir =d_nd_p->get_docking_cir(d_port_name.its_sub_nd_id); Point init_pt, fin_pt; // check that nodes don't intersect if(!calc_closest_pts(s_cir, d_cir, init_pt, fin_pt))return false; new_s_nd_p->add_out_nd(d_port_name.its_nd_id); old_s_nd_p->del_out_nd(d_port_name.its_nd_id); d_nd_p->change_in_nd_to_compatible_one(old_s_port_name.its_nd_id, new_s_port_name.its_nd_id); if(!chrono_sort() ){ new_s_nd_p->del_out_nd(d_port_name.its_nd_id); old_s_nd_p->add_out_nd(d_port_name.its_nd_id); d_nd_p->change_in_nd_to_compatible_one(new_s_port_name.its_nd_id, old_s_port_name.its_nd_id); warn_user_about_cycle(); return false; } ar_p->change_source_nd(new_s_port_name, init_pt, fin_pt); old_s_nd_p->remove_nd_from_all_port_glists(d_port_name.its_nd_id); d_nd_p->remove_nd_from_all_port_glists(old_s_port_name.its_nd_id); new_s_nd_p->add_nd_to_port_glist(d_port_name.its_nd_id, new_s_port_name.its_sub_nd_id); d_nd_p->add_nd_to_port_glist(new_s_port_name.its_nd_id, d_port_name.its_sub_nd_id); return true; } #pragma mark --write/read net-- //****************************************** VOID QB_NET::write_net_stream( LStream & net_stream, //i-o NET_STREAM_TYPE stream_type) //in { USHORT i; USHORT num_of_sel_nds = its_mview_p->get_num_of_sel_nds(); USHORT num_of_unsel_nds = its_num_of_nds - num_of_sel_nds; /* if(stream_type==open_reco){ net_stream<get_sel_rect();//write_net } RGBColor color; Point center; STRINGY nd_class_str; UInt16 UInt16_nd_class_id; STRINGY nd_name; NODE * nd_p; BOOLEAN store; for(i=0; iis_selected(); } if(store){ nd_class_str = get_nd_class_str(i); UInt16_nd_class_id = (UInt16)get_nd_class_id(i); center = nd_p->get_center(); nd_name = nd_p->get_name(); if(its_doc_p->get_vers_int32()<= k_vers_160){ net_stream<has_color()){ color = nd_p->get_color(); net_stream<has_icon_dir()){ net_stream<get_icon_dir();//write_net } } } USHORT num_of_arrows = its_arrows.get_len(); USHORT num_of_stored_arrows = 0; VECTOR store_arrow(1, num_of_arrows);//0=don't store it, 1=do store it USHORT ar_counter = 0; if(stream_type!=open_reco){ C_ARROW * ar_p; DIR_DATA * dir_arrow_p = get_arrows_first_p(); while(dir_arrow_p){ ar_p = &(dir_arrow_p->its_data); if(stream_type==undel_reco){ if(its_mview_p->s_or_d_or_ar_selected(ar_p)){ //store_arrow[ar_counter] = 1 by default num_of_stored_arrows++; }else{ store_arrow[ar_counter] = 0; } } if(stream_type==paste_reco){ if(its_mview_p->s_and_d_and_ar_selected(ar_p)){ //store_arrow[ar_counter] = 1 by default num_of_stored_arrows++; }else{ store_arrow[ar_counter] = 0; } } dir_arrow_p = dir_arrow_p->its_next_p; ar_counter++; } } net_stream<<(stream_type==open_reco?num_of_arrows:num_of_stored_arrows);//write_net C_PORT_NAME s_port_name, d_port_name; C_ARROW * ar_p; DIR_DATA * dir_arrow_p = get_arrows_first_p(); ar_counter = 0; while(dir_arrow_p){ ar_p = &(dir_arrow_p->its_data); s_port_name = ar_p->get_s_port_name(); d_port_name = ar_p->get_d_port_name(); if(store_arrow[ar_counter]){ if(stream_type==paste_reco){ s_port_name.its_nd_id -= num_of_unsel_nds; d_port_name.its_nd_id -= num_of_unsel_nds; } net_stream<< s_port_name;//write_net net_stream<< d_port_name;//write_net } dir_arrow_p = dir_arrow_p->its_next_p; ar_counter++; } //In the case of undel_reco and delete, C_MAIN_VIEW::delete_selection() calls //QB_NET::del_nd(), which calls QB_NET::del_all_bi_nds_with_this_nd() if(stream_type==open_reco){ net_stream< * dir_bi_nd_p = its_bi_nds.get_first_p(); while(dir_bi_nd_p){ bi_nd_p = &(dir_bi_nd_p->its_data); net_stream<get_nd1()<get_nd2();//write_net dir_bi_nd_p = dir_bi_nd_p->its_next_p; } } for(i=0; iis_selected(); } if(store){ net_stream << nd_p->get_degen() << nd_p->get_active_states();//write_net; for(USHORT r=0; rget_degen(); r++){ net_stream << nd_p->get_st_name(r);//write_net } } } USHORT max_n_sum; SHORT spin; DOUBLE64 theta, phi, tau_mag, tau_ang, rho_ang;//store machine indep doubles BOOLEAN empty, store_the_store_flag; VECTOR in_nds; USHORT len; for(i=0; iundeleting_should_restore_amps_of(i); //Store the store flag for all nodes, //since may need to remember tm for some unselected nodes. store_the_store_flag = true; break; case paste_reco: //Store tm for subset of selected nodes: store = its_mview_p->pasting_should_restore_amps_of(i); //Store the store flag only for selected nodes, //since need to remember tm for subset of selected nodes. store_the_store_flag = nd_p->is_selected(); break; } if(store_the_store_flag) net_stream<get_in_nds(); if(stream_type==paste_reco){ len = in_nds.get_len(); for(USHORT j =0; jwrite_net_stream(net_stream);//write_net if(its_doc_p->get_vers_int32()<= k_vers_160){ switch(get_nd_class_id(i)){ case BEAM_SPL_id: tau_mag=0; tau_ang=0; rho_ang=0; max_n_sum=0; net_stream<get_num_of_in_nds(); loc++){ spin = 0; theta = 0; phi = 0; net_stream<

^kN*cCz=uW!D#GV~GIG({b!)`hNviei1tY#Rt+ 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